From 117c8bcc95dd581c8a8c45cc9dbd6e087af8a3ad Mon Sep 17 00:00:00 2001 From: Sagar Parsawar <sagar.parsawar@eurecom.fr> Date: Thu, 4 Aug 2022 14:37:05 +0200 Subject: [PATCH] Merge remote-tracking branch 'origin/develop' into nr_prs --- ci-scripts/Jenkinsfile-GitLab-Container | 20 + ci-scripts/Jenkinsfile-push-registry | 2 +- ci-scripts/Jenkinsfile-tmp-multi-enb | 187 +- ci-scripts/Jenkinsfile-trig-nsa | 30 +- ci-scripts/checkCodingFormattingRules.sh | 4 +- ci-scripts/ci_ueinfra.yaml | 6 +- ci-scripts/cls_containerize.py | 123 +- ci-scripts/cls_physim.py | 4 +- ci-scripts/cls_static_code_analysis.py | 203 + ci-scripts/conf_files/benetel-5g.conf | 2 - ...sci_gnb.band78.sa.fr1.106PRB.usrpn310.conf | 1 - .../episci_rcc.band78.tm1.106PRB.nfapi.conf | 1 - ...oxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf | 1 - .../proxy_rcc.band78.tm1.106PRB.nfapi.conf | 1 - ci-scripts/conf_files/gNB_SA_CU.conf | 1 - ci-scripts/conf_files/gNB_SA_DU.conf | 1 - .../gNB_SA_n78_106PRB.2x2_usrpn310.conf | 3 +- .../gNB_SA_n78_133PRB.2x2_usrpn310.conf | 3 +- .../gnb.band261.tm1.32PRB.usrpn300.conf | 1 - .../gnb.band66.tm1.106PRB.usrpn300.conf | 1 - .../gnb.band78.nsa_2x2.106PRB.usrpn310.conf | 3 +- ...and78.sa.fr1.106PRB.2x2.usrpn310.asue.conf | 1 - ...gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf | 3 +- ...nd78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf | 1 - .../gnb.band78.sa.fr1.106PRB.usrpn310.conf | 1 - ...gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf | 3 +- .../gnb.band78.tm1.106PRB.usrpn300.conf | 3 +- .../gnb.band78.tm1.fr1.106PRB.usrpb210.conf | 1 - .../gnb.band78.tm1.fr1.106PRB.usrpn310.conf | 1 - .../gnb.sa.band66.fr1.106PRB.usrpn300.conf | 1 - .../gnb.sa.band78.fr1.106PRB.usrpb210.conf | 344 + .../gnb.sa.band78.fr1.24PRB.usrpb210.conf | 3 - ci-scripts/datalog_rt_stats.2x2.yaml | 4 +- ci-scripts/datalog_rt_stats.default.yaml | 7 +- .../docker/Dockerfile.formatting.bionic | 31 + ci-scripts/epc.py | 21 +- ci-scripts/main.py | 15 +- ci-scripts/ran.py | 24 +- ci-scripts/ran_dashboard/Hdashboard.py | 6 +- ci-scripts/sshconnection.py | 17 +- ci-scripts/stats_monitor_conf.yaml | 4 +- ci-scripts/xml_class_list.yml | 2 + .../xml_files/container_5g_l2sim_proxy.xml | 42 + .../xml_files/container_nsa_b200_quectel.xml | 5 +- .../xml_files/container_sa_b200_quectel.xml | 168 + .../xml_files/container_sa_b200_terminate.xml | 42 + ci-scripts/xml_files/formatting_check.xml | 37 + ci-scripts/xml_files/fr1_5gc_closure.xml | 37 + ci-scripts/xml_files/fr1_5gc_start.xml | 38 + ci-scripts/xml_files/fr1_gnb_build.xml | 2 +- ci-scripts/xml_files/fr1_multi_node_build.xml | 2 +- ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml | 1 + .../fr1_nsa_2x2_quectel_attach_detach.xml | 1 + ci-scripts/xml_files/fr1_nsa_quectel.xml | 38 +- ci-scripts/xml_files/fr1_sa_quectel.xml | 1 + .../xml_files/fr1_sa_quectel_162prb.xml | 1 + .../xml_files/fr1_sa_quectel_stages.xml | 1 + ci-scripts/xml_files/gnb_phytest_usrp_run.xml | 4 +- ci-scripts/xml_files/gnb_usrp_build.xml | 2 +- ci-scripts/xml_files/ldpc_gpu_test.xml | 2 +- ci-scripts/xml_files/lte_2x2_tm1_quectel.xml | 5 +- ci-scripts/xml_files/lte_2x2_tm2_quectel.xml | 5 +- .../yaml_files/sa_b200_gnb/docker-compose.yml | 44 + cmake_targets/CMakeLists.txt | 78 +- cmake_targets/autotests/test_case_list.xml | 77 +- cmake_targets/build_oai | 27 +- cmake_targets/tools/build_helper | 24 +- common/utils/nr/nr_common.c | 67 +- common/utils/nr/nr_common.h | 8 +- common/utils/ocp_itti/intertask_interface.cpp | 1 + common/utils/threadPool/thread-pool.h | 2 +- common/utils/time_meas.c | 65 +- common/utils/time_meas.h | 11 +- doc/BUILD.md | 1 + doc/FEATURE_SET.md | 16 +- doc/NR_SA_CN5G_gNB_B210_COTS_UE_Tutorial.md | 227 + doc/NR_SA_CN5G_gNB_N300_COTS_UE_Tutorial.md | 244 + doc/RUNMODEM.md | 17 + doc/RUN_NR_multiple_BWPs.md | 51 + doc/TESTBenches.md | 206 +- doc/TESTING_5GSA_setup.md | 38 +- doc/UL_MIMO.txt | 31 + doc/images/mimo_antenna_ports.png | Bin 0 -> 18753 bytes .../4g-faraday-bench.pdf | Bin 0 -> 53079 bytes .../4g-faraday-bench.png | Bin 0 -> 92377 bytes .../4g-faraday-bench.tex | 59 + .../5g-nsa-faraday-bench.pdf | Bin 0 -> 337509 bytes .../5g-nsa-faraday-bench.png | Bin 0 -> 89413 bytes .../5g-nsa-faraday-bench.tex | 55 + .../5g-ota-bench.pdf | Bin 0 -> 232400 bytes .../5g-ota-bench.png | Bin 0 -> 96734 bytes .../5g-ota-bench.tex | 68 + doc/testbenches_doc_resources/antenna.pdf | Bin 0 -> 4886 bytes doc/testbenches_doc_resources/b200-mini.png | Bin 0 -> 238906 bytes doc/testbenches_doc_resources/b210.jpg | Bin 0 -> 32877 bytes doc/testbenches_doc_resources/indoor_live.jpg | Bin 254133 -> 0 bytes doc/testbenches_doc_resources/legacy1.jpg | Bin 107882 -> 0 bytes doc/testbenches_doc_resources/legacy2.jpg | Bin 122055 -> 0 bytes doc/testbenches_doc_resources/n310.png | Bin 0 -> 120716 bytes doc/testbenches_doc_resources/next_ci.jpg | Bin 157592 -> 0 bytes doc/testbenches_doc_resources/next_dev.jpg | Bin 185772 -> 0 bytes .../outdoor_live.jpg | Bin 167702 -> 0 bytes doc/testbenches_doc_resources/phone.pdf | Bin 0 -> 4358 bytes doc/testbenches_doc_resources/quectel.png | Bin 0 -> 88455 bytes doc/testbenches_doc_resources/server.pdf | Bin 0 -> 4366 bytes doc/testbenches_doc_resources/x310.jpg | Bin 0 -> 11188 bytes doc/testing_gnb_w_cots_ue_resources/gnb.conf | 2 - .../docker-compose-basic-nrf.yaml | 360 + doc/tutorial_resources/oai_db.sql | 328 + docker/Dockerfile.build.rhel8.2 | 2 +- docker/Dockerfile.build.ubuntu18 | 2 +- docker/Dockerfile.phySim.rhel8.2 | 2 +- docker/scripts/generateTemplate.py | 1 + docker/scripts/gnb_entrypoint.sh | 1 + docker/scripts/gnb_parameters.yaml | 30 + executables/main-ocp.c | 2 +- executables/nr-gnb.c | 49 +- executables/nr-ru.c | 24 +- executables/nr-softmodem-common.h | 1 + executables/nr-softmodem.c | 2 +- executables/nr-softmodem.h | 5 +- executables/nr-ue.c | 44 +- executables/nr-uesoftmodem.c | 10 +- executables/nr-uesoftmodem.h | 14 +- executables/softmodem-common.c | 3 + executables/softmodem-common.h | 23 +- ...384_rate_1-3_block_length_8448_maxit_5.txt | 64 + nfapi/oai_integration/nfapi_vnf.c | 4 +- .../nfapi/public_inc/fapi_nr_ue_constants.h | 4 +- .../nfapi/public_inc/fapi_nr_ue_interface.h | 48 +- .../nfapi/public_inc/nfapi_nr_interface_scf.h | 96 +- nfapi/open-nFAPI/nfapi/src/nfapi_p7.c | 4 - .../CODING/3gpplte_turbo_decoder_sse_8bit.c | 6 +- openair1/PHY/CODING/coding_defs.h | 23 +- openair1/PHY/CODING/crc_byte.c | 4 +- .../CODING/nrLDPC_decoder/doc/nrLDPC/logo.png | Bin 3723 -> 0 bytes .../nrLDPC_decoder/doc/nrLDPC/nrLDPC.pdf | Bin 281923 -> 0 bytes .../nrLDPC_decoder/doc/nrLDPC/nrLDPC.tex | 960 - .../nrLDPC_decoder/doc/nrLDPC/references.bib | 105 - .../CODING/nrLDPC_decoder/doc/nrLDPC_doxyCfg | 2427 - .../PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h | 2 +- .../PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h | 81 +- .../nrLDPC_decoder/nrLDPC_cnProc_avx512.h | 865 + .../CODING/nrLDPC_decoder/nrLDPC_decoder.c | 599 +- .../CODING/nrLDPC_decoder/nrLDPC_init_mem.h | 83 + .../PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h | 46 +- .../nrLDPC_tools/CMakeLists.txt | 19 + .../generator_bnProc/CMakeLists.txt | 36 + .../generator_bnProc/bnProcPc_gen_BG1_avx2.c | 1789 + .../generator_bnProc/bnProcPc_gen_BG2_avx2.c | 1789 + .../generator_bnProc/bnProc_gen_BG1_avx2.c | 1112 + .../generator_bnProc/bnProc_gen_BG2_avx2.c | 1108 + .../nrLDPC_tools/generator_bnProc/main.c | 55 + .../generator_bnProc_avx512/CMakeLists.txt | 36 + .../bnProcPc_gen_BG1_avx512.c | 1790 + .../bnProcPc_gen_BG2_avx512.c | 1793 + .../bnProc_gen_BG1_avx512.c | 1112 + .../bnProc_gen_BG2_avx512.c | 1108 + .../generator_bnProc_avx512/main.c | 56 + .../generator_cnProc/CMakeLists.txt | 25 + .../generator_cnProc/cnProc_gen_BG1_avx2.c | 693 + .../generator_cnProc/cnProc_gen_BG2_avx2.c | 436 + .../nrLDPC_tools/generator_cnProc/main.c | 50 + .../generator_cnProc_avx512/CMakeLists.txt | 25 + .../cnProc_gen_BG1_avx512.c | 597 + .../cnProc_gen_BG2_avx512.c | 414 + .../generator_cnProc_avx512/main.c | 50 + .../nrLDPC_tools/run_ldpc_generators.sh | 11 + .../PHY/CODING/nrLDPC_decoder/nrLDPC_types.h | 6 +- .../nrLDPC_decoder/nrLDPCdecoder_defs.h | 10 + openair1/PHY/CODING/nr_rate_matching.c | 16 +- openair1/PHY/INIT/nr_init.c | 146 +- openair1/PHY/INIT/nr_init_ru.c | 16 +- openair1/PHY/INIT/nr_init_ue.c | 100 +- .../lte_ul_channel_estimation.c | 34 +- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 4 +- openair1/PHY/LTE_TRANSPORT/dci_tools_common.c | 146 +- openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h | 2 +- openair1/PHY/LTE_TRANSPORT/dlsch_coding.c | 2 +- openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c | 21 +- .../PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c | 2 +- .../linear_preprocessing_rec.c | 2 +- .../PHY/LTE_UE_TRANSPORT/transport_proto_ue.h | 8 - openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h | 2 +- openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c | 47 +- openair1/PHY/MODULATION/nr_modulation.c | 36 +- openair1/PHY/MODULATION/ofdm_mod.c | 44 +- openair1/PHY/MODULATION/slot_fep_nr.c | 97 +- .../PHY/NR_ESTIMATION/nr_measurements_gNB.c | 51 +- .../NR_ESTIMATION/nr_ul_channel_estimation.c | 435 +- openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h | 30 +- openair1/PHY/NR_REFSIG/dmrs_nr.c | 146 +- openair1/PHY/NR_REFSIG/dmrs_nr.h | 7 +- openair1/PHY/NR_REFSIG/nr_dmrs_rx.c | 11 +- openair1/PHY/NR_REFSIG/nr_gold.c | 27 - openair1/PHY/NR_REFSIG/nr_refsig.h | 4 +- openair1/PHY/NR_REFSIG/pss_nr.h | 2 - openair1/PHY/NR_REFSIG/ptrs_nr.c | 9 +- openair1/PHY/NR_REFSIG/ptrs_nr.h | 1 - openair1/PHY/NR_REFSIG/refsig_defs_ue.h | 1 + openair1/PHY/NR_REFSIG/ss_pbch_nr.h | 2 - .../dlsch_pdu_rel15.time_alloc_list_flag | 0 .../dlsch_pdu_rel15.time_allocation_type | 0 openair1/PHY/NR_TRANSPORT/nr_csi_rs.c | 230 +- openair1/PHY/NR_TRANSPORT/nr_dci.c | 41 +- openair1/PHY/NR_TRANSPORT/nr_dci.h | 2 +- openair1/PHY/NR_TRANSPORT/nr_dci_tools.c | 151 +- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 16 +- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 5 - openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 30 +- openair1/PHY/NR_TRANSPORT/nr_pbch.c | 6 +- openair1/PHY/NR_TRANSPORT/nr_prach.c | 506 +- openair1/PHY/NR_TRANSPORT/nr_scrambling.c | 1 + .../NR_TRANSPORT/nr_transport_common_proto.h | 8 - .../PHY/NR_TRANSPORT/nr_transport_proto.h | 50 +- openair1/PHY/NR_TRANSPORT/nr_ulsch.c | 45 +- openair1/PHY/NR_TRANSPORT/nr_ulsch.h | 6 + openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 68 +- .../PHY/NR_TRANSPORT/nr_ulsch_demodulation.c | 1331 +- .../NR_TRANSPORT/nr_ulsch_llr_computation.c | 42 +- openair1/PHY/NR_TRANSPORT/pucch_rx.c | 34 +- openair1/PHY/NR_TRANSPORT/srs_rx.c | 15 +- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c | 21 +- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h | 6 + .../nr_dl_channel_estimation.c | 103 +- openair1/PHY/NR_UE_TRANSPORT/csi_rx.c | 969 + openair1/PHY/NR_UE_TRANSPORT/dci_nr.c | 10 +- .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 36 +- .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 173 +- .../nr_dlsch_llr_computation.c | 11 +- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 2 + openair1/PHY/NR_UE_TRANSPORT/nr_prach.c | 1042 +- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 39 +- .../PHY/NR_UE_TRANSPORT/nr_transport_ue.h | 19 +- .../PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c | 7 +- .../PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c | 80 +- openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 235 +- openair1/PHY/NR_UE_TRANSPORT/pss_nr.c | 130 - openair1/PHY/TOOLS/calibration_scope.c | 4 +- openair1/PHY/TOOLS/cmult_sv.c | 247 +- openair1/PHY/TOOLS/lte_ue_scope.c | 6 +- openair1/PHY/TOOLS/nr_phy_scope.c | 4 +- openair1/PHY/TOOLS/tools_defs.h | 141 +- openair1/PHY/defs_common.h | 8 +- openair1/PHY/defs_gNB.h | 52 +- openair1/PHY/defs_nr_UE.h | 30 +- openair1/PHY/defs_nr_common.h | 35 +- openair1/SCHED/ru_procedures.c | 14 +- openair1/SCHED/sched_common_extern.h | 2 + openair1/SCHED_NR/fapi_nr_l1.c | 1 - openair1/SCHED_NR/nr_ru_procedures.c | 3 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 184 +- openair1/SCHED_NR_UE/defs.h | 6 +- openair1/SCHED_NR_UE/fapi_nr_ue_l1.c | 23 +- openair1/SCHED_NR_UE/harq_nr.c | 13 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 120 +- .../SCHED_NR_UE/phy_sch_processing_time.h | 34 +- openair1/SCHED_UE/phy_procedures_lte_ue.c | 2 +- openair1/SIMULATION/LTE_PHY/dlsim.c | 16 +- openair1/SIMULATION/LTE_PHY/mbmssim.c | 18 +- openair1/SIMULATION/LTE_PHY/ulsim.c | 14 +- openair1/SIMULATION/NR_PHY/dlschsim.c | 45 +- openair1/SIMULATION/NR_PHY/dlsim.c | 296 +- .../SIMULATION/NR_PHY/nr_dummy_functions.c | 4 +- openair1/SIMULATION/NR_PHY/pbchsim.c | 27 +- openair1/SIMULATION/NR_PHY/prachsim.c | 39 +- openair1/SIMULATION/NR_PHY/pucchsim.c | 5 +- openair1/SIMULATION/NR_PHY/ulschsim.c | 55 +- openair1/SIMULATION/NR_PHY/ulsim.c | 612 +- .../NR_UE_PHY/unit_tests/build/CMakeCache.txt | 313 + .../CMakeFiles/2.8.12.2/CMakeCCompiler.cmake | 56 + .../2.8.12.2/CMakeCXXCompiler.cmake | 57 + .../2.8.12.2/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 8392 bytes .../CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 8408 bytes .../CMakeFiles/2.8.12.2/CMakeSystem.cmake | 15 + .../2.8.12.2/CompilerIdC/CMakeCCompilerId.c | 389 + .../CMakeFiles/2.8.12.2/CompilerIdC/a.out | Bin 0 -> 8488 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 377 + .../CMakeFiles/2.8.12.2/CompilerIdCXX/a.out | Bin 0 -> 8496 bytes .../build/CMakeFiles/CMakeOutput.log | 247 + .../build/CMakeFiles/cmake.check_cache | 1 + .../build/testlogs/frame_config_test.txt | 0 .../unit_tests/build/testlogs/harq_test.txt | 0 .../unit_tests/build/testlogs/pbch_test.txt | 0 .../unit_tests/build/testlogs/pss_test.txt | 0 .../build/testlogs/pucch_uci_test.txt | 0 .../unit_tests/build/testlogs/srs_test.txt | 0 .../unit_tests/build/testlogs/sss_test.txt | 0 .../NR_UE_PHY/unit_tests/src/pucch_uci_test.c | 96 +- openair1/SIMULATION/TOOLS/rangen_double.c | 2 +- openair2/COMMON/commonDef.h | 21 - openair2/COMMON/f1ap_messages_def.h | 2 + openair2/COMMON/f1ap_messages_types.h | 72 +- openair2/COMMON/gtpv1_u_messages_def.h | 3 +- openair2/COMMON/gtpv1_u_messages_types.h | 9 + openair2/COMMON/mac_messages_types.h | 2 +- openair2/COMMON/mac_rlc_primitives.h | 2 +- openair2/COMMON/platform_types.h | 61 +- openair2/COMMON/rrc_messages_types.h | 3 +- openair2/ENB_APP/enb_config.c | 38 +- openair2/ENB_APP/enb_config_eMTC.c | 122 +- openair2/ENB_APP/enb_paramdef_emtc.h | 4 +- openair2/ENB_APP/flexran_agent_ran_api.c | 8 +- openair2/F1AP/dummy_enb.c | 26 +- openair2/F1AP/f1ap_common.h | 7 - openair2/F1AP/f1ap_cu_task.c | 6 + openair2/F1AP/f1ap_cu_ue_context_management.c | 1356 +- openair2/F1AP/f1ap_cu_ue_context_management.h | 3 +- openair2/F1AP/f1ap_decoder.c | 8 + openair2/F1AP/f1ap_default_values.h | 2 +- openair2/F1AP/f1ap_du_interface_management.c | 15 +- openair2/F1AP/f1ap_du_rrc_message_transfer.c | 25 +- openair2/F1AP/f1ap_du_task.c | 9 +- openair2/F1AP/f1ap_du_ue_context_management.c | 909 +- openair2/F1AP/f1ap_du_ue_context_management.h | 2 +- openair2/F1AP/f1ap_encoder.c | 2 +- openair2/F1AP/f1ap_handlers.c | 2 +- openair2/F1AP/f1ap_itti_messaging.c | 2 +- openair2/GNB_APP/L1_nr_paramdef.h | 5 +- openair2/GNB_APP/MACRLC_nr_paramdef.h | 76 +- openair2/GNB_APP/RRC_nr_paramsvalues.h | 61 +- openair2/GNB_APP/gnb_config.c | 426 +- openair2/GNB_APP/gnb_paramdef.h | 33 +- openair2/LAYER2/MAC/config.c | 14 +- openair2/LAYER2/MAC/defs_NB_IoT.h | 11 +- openair2/LAYER2/MAC/eNB_scheduler.c | 44 +- openair2/LAYER2/MAC/eNB_scheduler_RA.c | 2 +- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 2 +- openair2/LAYER2/MAC/eNB_scheduler_fairRR.c | 24 +- .../LAYER2/MAC/eNB_scheduler_primitives.c | 40 +- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 20 +- openair2/LAYER2/MAC/mac.h | 44 +- openair2/LAYER2/MAC/mac_extern.h | 2 +- openair2/LAYER2/MAC/mac_proto.h | 17 +- openair2/LAYER2/MAC/pre_processor.c | 2 +- openair2/LAYER2/MAC/ue_procedures.c | 28 +- .../NR_MAC_COMMON/nr_compute_tbs_common.c | 60 +- openair2/LAYER2/NR_MAC_COMMON/nr_mac.h | 34 + openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c | 658 +- openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h | 65 +- openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h | 2 +- openair2/LAYER2/NR_MAC_UE/config_ue.c | 119 +- openair2/LAYER2/NR_MAC_UE/mac_defs.h | 20 +- openair2/LAYER2/NR_MAC_UE/mac_proto.h | 51 +- openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h | 1 + openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 14 +- .../NR_MAC_UE/nr_ue_dci_configuration.c | 92 +- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 386 +- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 342 +- openair2/LAYER2/NR_MAC_gNB/config.c | 177 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c | 181 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 489 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 82 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 525 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 160 +- .../NR_MAC_gNB/gNB_scheduler_primitives.c | 1158 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c | 69 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 882 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 746 +- openair2/LAYER2/NR_MAC_gNB/mac_proto.h | 116 +- openair2/LAYER2/NR_MAC_gNB/main.c | 186 +- openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h | 161 +- openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 208 +- openair2/LAYER2/PDCP_v10.1.0/pdcp.h | 127 +- .../LAYER2/PDCP_v10.1.0/pdcp_primitives.c | 33 +- .../LAYER2/PDCP_v10.1.0/pdcp_primitives.h | 19 +- .../PDCP_v10.1.0/pdcp_sequence_manager.c | 36 +- .../PDCP_v10.1.0/pdcp_sequence_manager.h | 16 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c | 6 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h | 4 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c | 2 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h | 8 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c | 10 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c | 10 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h | 4 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c | 82 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h | 24 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c | 35 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h | 6 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c | 11 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h | 4 +- .../RLC/AM_v9.3.0/rlc_am_status_report.c | 16 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c | 2 +- .../AM_v9.3.0/rlc_am_timer_poll_retransmit.c | 2 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c | 12 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h | 13 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h | 7 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c | 7 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h | 17 +- .../RLC/UM_v9.3.0/rlc_um_control_primitives.c | 2 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h | 11 +- openair2/LAYER2/RLC/rlc.c | 15 +- openair2/LAYER2/RLC/rlc.h | 2 +- openair2/LAYER2/RLC/rlc_mac.c | 4 +- openair2/LAYER2/RLC/rlc_rrc.c | 10 +- openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c | 20 +- .../LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c | 66 + .../LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.h | 34 + openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c | 154 +- openair2/LAYER2/nr_rlc/nr_rlc_entity.c | 51 +- openair2/LAYER2/nr_rlc/nr_rlc_entity.h | 2 + openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c | 6 + openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h | 1 + openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c | 6 + openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.h | 1 + openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c | 6 + openair2/LAYER2/nr_rlc/nr_rlc_entity_um.h | 1 + openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c | 34 +- openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h | 6 +- openair2/LAYER2/nr_rlc/tests/test14.txt.gz | Bin 799 -> 787 bytes openair2/LAYER2/nr_rlc/tests/test15.txt.gz | Bin 554 -> 547 bytes openair2/LAYER2/nr_rlc/tests/test8.txt.gz | Bin 319 -> 319 bytes openair2/LAYER2/nr_rlc/tests/test9.txt.gz | Bin 316 -> 316 bytes openair2/LAYER2/rlc_v2/rlc_oai_api.c | 12 + openair2/M2AP/m2ap_common.h | 5 - openair2/NETWORK_DRIVER/MESH/device.c | 9 +- openair2/NETWORK_DRIVER/UE_IP/device.c | 8 +- openair2/NR_PHY_INTERFACE/NR_IF_Module.c | 41 +- openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 265 +- openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h | 37 +- openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c | 183 + openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h | 68 + openair2/PHY_INTERFACE/phy_stub_UE.c | 2 +- openair2/PHY_INTERFACE/phy_stub_UE.h | 2 +- openair2/RRC/LITE/rrc_common.c | 2 +- openair2/RRC/LTE/L2_interface.c | 2 +- openair2/RRC/LTE/L2_interface_common.c | 4 +- openair2/RRC/LTE/L2_interface_ue.c | 2 +- openair2/RRC/LTE/MESSAGES/asn1_msg.c | 18 +- openair2/RRC/LTE/defs_NB_IoT.h | 4 +- openair2/RRC/LTE/rrc_UE.c | 9 +- openair2/RRC/LTE/rrc_defs.h | 8 +- openair2/RRC/LTE/rrc_eNB.c | 187 +- openair2/RRC/LTE/rrc_eNB_GTPV1U.c | 48 +- openair2/RRC/LTE/rrc_eNB_GTPV1U.h | 19 +- openair2/RRC/LTE/rrc_eNB_S1AP.c | 52 +- openair2/RRC/LTE/rrc_proto.h | 4 +- openair2/RRC/NR/L2_nr_interface.c | 234 +- openair2/RRC/NR/MESSAGES/asn1_msg.c | 998 +- openair2/RRC/NR/MESSAGES/asn1_msg.h | 20 +- openair2/RRC/NR/nr_rrc_config.c | 595 +- openair2/RRC/NR/nr_rrc_config.h | 25 +- openair2/RRC/NR/nr_rrc_defs.h | 20 +- openair2/RRC/NR/nr_rrc_proto.h | 78 +- openair2/RRC/NR/rrc_gNB.c | 887 +- openair2/RRC/NR/rrc_gNB_NGAP.c | 74 +- openair2/RRC/NR/rrc_gNB_nsa.c | 10 +- openair2/RRC/NR/rrc_gNB_reconfig.c | 1350 +- openair2/RRC/NR_UE/L2_interface_ue.c | 2 +- openair2/RRC/NR_UE/rrc_UE.c | 17 +- openair2/SDAP/nr_sdap/nr_sdap.c | 52 +- openair2/SDAP/nr_sdap/nr_sdap.h | 27 +- openair2/SDAP/nr_sdap/nr_sdap_entity.c | 36 +- openair2/SDAP/nr_sdap/nr_sdap_entity.h | 35 +- openair2/UTIL/OMG/defs.h | 6 - openair2/UTIL/OPT/opt.h | 5 +- openair2/UTIL/OPT/probe.c | 8 + openair2/X2AP/x2ap_common.h | 5 - openair3/M3AP/m3ap_common.h | 5 - openair3/NAS/COMMON/UTIL/nas_timer.c | 20 +- openair3/NAS/COMMON/UTIL/socket.c | 8 +- openair3/NAS/COMMON/UTIL/stty.c | 14 +- openair3/NAS/NR_UE/nr_nas_msg_sim.h | 1 - openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c | 16 +- openair3/NAS/TEST/NETWORK/network_simulator.c | 8 +- openair3/NAS/TEST/USER/user_simulator.c | 4 +- openair3/NAS/UE/API/USER/at_command.c | 18 +- openair3/NAS/UE/API/USER/at_error.c | 6 +- openair3/NAS/UE/API/USER/at_response.c | 6 +- openair3/NAS/UE/EMM/Attach.c | 36 +- openair3/NAS/UE/EMM/Authentication.c | 12 +- openair3/NAS/UE/EMM/Detach.c | 9 +- openair3/NAS/UE/EMM/EmmStatusHdl.c | 3 +- openair3/NAS/UE/EMM/Identification.c | 3 +- openair3/NAS/UE/EMM/IdleMode.c | 28 +- openair3/NAS/UE/EMM/LowerLayer.c | 8 +- openair3/NAS/UE/EMM/LowerLayer.h | 2 +- openair3/NAS/UE/EMM/LowerLayer_defs.h | 2 +- .../SAP/EmmDeregisteredAttemptingToAttach.c | 2 +- .../EMM/SAP/EmmDeregisteredLimitedService.c | 2 +- .../UE/EMM/SAP/EmmDeregisteredNormalService.c | 2 +- openair3/NAS/UE/EMM/SAP/EmmRegistered.c | 2 +- .../NAS/UE/EMM/SAP/EmmRegisteredInitiated.c | 2 +- openair3/NAS/UE/EMM/SAP/emm_as.c | 6 +- openair3/NAS/UE/EMM/SAP/emm_asDef.h | 4 +- openair3/NAS/UE/EMM/SAP/emm_esmDef.h | 4 +- openair3/NAS/UE/EMM/SAP/emm_regDef.h | 4 +- openair3/NAS/UE/EMM/SecurityModeControl.c | 8 +- openair3/NAS/UE/EMM/emmData.h | 6 +- openair3/NAS/UE/EMM/emm_main.c | 36 +- openair3/NAS/UE/EMM/emm_main.h | 4 +- openair3/NAS/UE/EMM/emm_proc.h | 6 +- .../ESM/DedicatedEpsBearerContextActivation.c | 18 +- .../ESM/DefaultEpsBearerContextActivation.c | 22 +- .../NAS/UE/ESM/EpsBearerContextDeactivation.c | 20 +- openair3/NAS/UE/ESM/EsmStatusHdl.c | 6 +- openair3/NAS/UE/ESM/PdnConnectivity.c | 28 +- openair3/NAS/UE/ESM/PdnDisconnect.c | 10 +- openair3/NAS/UE/ESM/SAP/esm_sap.c | 40 +- openair3/NAS/UE/ESM/SAP/esm_sapDef.h | 6 +- openair3/NAS/UE/ESM/SAP/esm_send.c | 2 +- openair3/NAS/UE/ESM/SAP/esm_send.h | 4 +- openair3/NAS/UE/ESM/esmData.h | 9 +- openair3/NAS/UE/ESM/esm_ebr.c | 17 +- openair3/NAS/UE/ESM/esm_ebr.h | 8 +- openair3/NAS/UE/ESM/esm_ebr_context.c | 26 +- openair3/NAS/UE/ESM/esm_ebr_context.h | 2 +- openair3/NAS/UE/ESM/esm_main.c | 28 +- openair3/NAS/UE/ESM/esm_main.h | 7 +- openair3/NAS/UE/ESM/esm_proc.h | 37 +- openair3/NAS/UE/ESM/esm_pt.c | 8 +- openair3/NAS/UE/ESM/esm_pt.h | 4 +- openair3/NAS/UE/UEprocess.c | 4 +- openair3/NAS/UE/nas_proc.c | 80 +- openair3/NAS/UE/nas_proc.h | 8 +- openair3/NAS/UE/nas_proc_defs.h | 4 +- openair3/NAS/UE/nas_ue_task.c | 6 +- openair3/NAS/UE/nas_user.c | 22 +- openair3/NAS/UE/nas_user.h | 2 +- openair3/NGAP/ngap_common.h | 7 - openair3/S1AP/s1ap_common.h | 7 - openair3/S1AP/s1ap_eNB_trace.c | 2 +- openair3/SCTP/sctp_eNB_task.c | 6 +- openair3/UTILS/conversions.h | 18 +- openair3/ocp-gtpu/gtp_itf.cpp | 400 +- openair3/ocp-gtpu/gtp_itf.h | 65 +- rxsigF0.m | 57345 +++++++++++++++ targets/ARCH/COMMON/common_lib.h | 5 +- targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp | 2 +- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 51 +- targets/ARCH/iqplayer/iqplayer_lib.c | 2 +- targets/ARCH/rfsimulator/README.md | 18 +- targets/ARCH/rfsimulator/simulator.c | 21 +- targets/ARCH/rfsimulator/stored_node.c | 2 +- .../GENERIC-LTE-EPC/CONF/benetel-5g.conf | 1 - .../CONF/gnb.band257.tm1.32PRB.usrpn300.conf | 1 - .../CONF/gnb.band257.tm1.32PRB.usrpx300.conf | 1 - .../CONF/gnb.band257.tm1.66PRB.usrpn300.conf | 2 - .../CONF/gnb.band261.tm1.32PRB.usrpn300.conf | 1 - .../CONF/gnb.band66.tm1.106PRB.usrpn300.conf | 1 - .../CONF/gnb.band66.tm1.106PRB.usrpx300.conf | 2 - .../CONF/gnb.band66.tm1.25PRB.usrpn300.conf | 263 + .../gnb.band78.106PRB.30kHz,usrpb2x0.conf | 1 - .../CONF/gnb.band78.106PRB.slave.conf | 1 - .../CONF/gnb.band78.slave.conf | 2 - .../gnb.band78.tm1.106PRB.PTRS.usrpx300.conf | 2 - .../CONF/gnb.band78.tm1.106PRB.usrpb210.conf | 2 - .../CONF/gnb.band78.tm1.106PRB.usrpn300.conf | 13 +- .../CONF/gnb.band78.tm1.106PRB.usrpx300.conf | 2 - .../CONF/gnb.band78.tm1.217PRB.usrpn300.conf | 2 - .../CONF/gnb.band78.tm1.217PRB.usrpx300.conf | 1 - .../CONF/gnb.band78.tm1.24PRB.usrpb210.conf | 1 - .../CONF/gnb.band78.tm1.24PRB.usrpn300.conf | 1 - .../CONF/gnb.band78.tm1.24PRB.usrpx300.conf | 1 - .../CONF/gnb.band78.tm1.273PRB.usrpn300.conf | 1 - .../CONF/rcc.band78.tm1.106PRB.nfapi.conf | 1 - .../GENERIC-LTE-EPC/CONF/testing_gnb.conf | 2 - .../CONF/testing_gnb_24PRB.conf | 2 - .../CONF/testing_gnb_n310.conf | 2 - .../CONF/testing_gnb_nsa_n310.conf | 1 - .../PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf | 1 - .../PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf | 1 - ...b.band78.tm1.106PRB.usrpn300.gtp-itti.conf | 1 - .../gnb.sa.band41.fr1.106PRB.usrpb210.conf | 63 +- .../gnb.sa.band66.fr1.106PRB.usrpn300.conf | 3 - ...gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf | 63 +- ....sa.band78.fr1.106PRB.usrpb210.4layer.conf | 297 + .../gnb.sa.band78.fr1.106PRB.usrpb210.conf | 64 +- ...b.sa.band78.fr1.106PRB.usrpb210.sabox.conf | 1 - ...gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf | 49 +- ...gnb.sa.band78.fr1.217PRB.2x2.usrpn300.conf | 320 + .../gnb.sa.band78.fr1.24PRB.usrpb210.conf | 3 - ...gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf | 320 + .../GENERIC-NR-5GC/CONF/ue_nr_prs.conf | 14 +- targets/RT/USER/lte-enb.c | 6 +- targets/RT/USER/lte-ru.c | 15 +- targets/RT/USER/lte-softmodem.h | 17 +- targets/RT/USER/lte-uesoftmodem.c | 7 +- targets/TEST/PDCP/test_pdcp.c | 66 +- targets/TEST/PDCP/test_pdcp.h | 14 +- targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c | 12 +- txsig0.m | 61441 ++++++++++++++++ 583 files changed, 156367 insertions(+), 16297 deletions(-) create mode 100644 ci-scripts/conf_files/gnb.sa.band78.fr1.106PRB.usrpb210.conf create mode 100644 ci-scripts/docker/Dockerfile.formatting.bionic create mode 100644 ci-scripts/xml_files/container_5g_l2sim_proxy.xml create mode 100644 ci-scripts/xml_files/container_sa_b200_quectel.xml create mode 100644 ci-scripts/xml_files/container_sa_b200_terminate.xml create mode 100644 ci-scripts/xml_files/formatting_check.xml create mode 100644 ci-scripts/xml_files/fr1_5gc_closure.xml create mode 100644 ci-scripts/xml_files/fr1_5gc_start.xml create mode 100644 ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml create mode 100644 doc/NR_SA_CN5G_gNB_B210_COTS_UE_Tutorial.md create mode 100644 doc/NR_SA_CN5G_gNB_N300_COTS_UE_Tutorial.md create mode 100644 doc/RUN_NR_multiple_BWPs.md create mode 100644 doc/UL_MIMO.txt create mode 100644 doc/images/mimo_antenna_ports.png create mode 100644 doc/testbenches_doc_resources/4g-faraday-bench.pdf create mode 100644 doc/testbenches_doc_resources/4g-faraday-bench.png create mode 100644 doc/testbenches_doc_resources/4g-faraday-bench.tex create mode 100644 doc/testbenches_doc_resources/5g-nsa-faraday-bench.pdf create mode 100644 doc/testbenches_doc_resources/5g-nsa-faraday-bench.png create mode 100644 doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex create mode 100644 doc/testbenches_doc_resources/5g-ota-bench.pdf create mode 100644 doc/testbenches_doc_resources/5g-ota-bench.png create mode 100644 doc/testbenches_doc_resources/5g-ota-bench.tex create mode 100644 doc/testbenches_doc_resources/antenna.pdf create mode 100644 doc/testbenches_doc_resources/b200-mini.png create mode 100644 doc/testbenches_doc_resources/b210.jpg delete mode 100755 doc/testbenches_doc_resources/indoor_live.jpg delete mode 100755 doc/testbenches_doc_resources/legacy1.jpg delete mode 100755 doc/testbenches_doc_resources/legacy2.jpg create mode 100644 doc/testbenches_doc_resources/n310.png delete mode 100755 doc/testbenches_doc_resources/next_ci.jpg delete mode 100755 doc/testbenches_doc_resources/next_dev.jpg delete mode 100755 doc/testbenches_doc_resources/outdoor_live.jpg create mode 100644 doc/testbenches_doc_resources/phone.pdf create mode 100644 doc/testbenches_doc_resources/quectel.png create mode 100644 doc/testbenches_doc_resources/server.pdf create mode 100644 doc/testbenches_doc_resources/x310.jpg create mode 100644 doc/tutorial_resources/docker-compose-basic-nrf.yaml create mode 100644 doc/tutorial_resources/oai_db.sql create mode 100644 ldpctest_BG_1_Zc_384_rate_1-3_block_length_8448_maxit_5.txt delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/logo.png delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.pdf delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.tex delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/references.bib delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC_doxyCfg create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc_avx512.h create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/CMakeLists.txt create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/main.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/CMakeLists.txt create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG2_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG1_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG2_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/main.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/CMakeLists.txt create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG1_avx2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG2_avx2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/main.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/CMakeLists.txt create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG2_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/main.c create mode 100755 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/run_ldpc_generators.sh create mode 100644 openair1/PHY/NR_TRANSPORT/dlsch_pdu_rel15.time_alloc_list_flag create mode 100644 openair1/PHY/NR_TRANSPORT/dlsch_pdu_rel15.time_allocation_type create mode 100644 openair1/PHY/NR_UE_TRANSPORT/csi_rx.c create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeCache.txt create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake create mode 100755 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin create mode 100755 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_CXX.bin create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c create mode 100755 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100755 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeOutput.log create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/cmake.check_cache create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/frame_config_test.txt create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/harq_test.txt create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pbch_test.txt create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pss_test.txt create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pucch_uci_test.txt create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/srs_test.txt create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/sss_test.txt mode change 100755 => 100644 openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h create mode 100644 openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c create mode 100644 openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.h create mode 100644 openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c create mode 100644 openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h create mode 100644 rxsigF0.m create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.2x2.usrpn300.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf create mode 100644 txsig0.m diff --git a/ci-scripts/Jenkinsfile-GitLab-Container b/ci-scripts/Jenkinsfile-GitLab-Container index c22e6fabec7..b37c9d4f4b3 100644 --- a/ci-scripts/Jenkinsfile-GitLab-Container +++ b/ci-scripts/Jenkinsfile-GitLab-Container @@ -278,6 +278,26 @@ pipeline { } } } + stage ("SA B200 Sanity Check") { + when { expression {doMandatoryTests} } + steps { + script { + triggerSlaveJob ('RAN-SA-B200-Module-SABOX-Container', 'Test-SA-B200') + } + } + post { + always { + script { + finalizeSlaveJob('RAN-SA-B200-Module-SABOX-Container') + } + } + failure { + script { + currentBuild.result = 'FAILURE' + } + } + } + } stage ("Test OAI NR UE - OAI gNB - TDD - Band 78 - N300") { when { expression {doMandatoryTests} } steps { diff --git a/ci-scripts/Jenkinsfile-push-registry b/ci-scripts/Jenkinsfile-push-registry index bc1a80ba614..feb1807c912 100644 --- a/ci-scripts/Jenkinsfile-push-registry +++ b/ci-scripts/Jenkinsfile-push-registry @@ -66,7 +66,7 @@ pipeline { withCredentials([ [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.DH_Credentials}", usernameVariable: 'DH_Username', passwordVariable: 'DH_Password'] ]) { - def listOfImages = ["oai-enb", "oai-gnb", "oai-lte-ue", "oai-nr-ue"] + def listOfImages = ["oai-enb", "oai-gnb", "oai-lte-ue", "oai-nr-ue", "proxy"] sh "docker login -u ${DH_Username} -p ${DH_Password} > /dev/null 2>&1" listOfImages.eachWithIndex { item, iindex -> sh "docker image tag ${item}:develop ${DH_Account}/${item}:develop" diff --git a/ci-scripts/Jenkinsfile-tmp-multi-enb b/ci-scripts/Jenkinsfile-tmp-multi-enb index c3b825ec062..fb523169201 100644 --- a/ci-scripts/Jenkinsfile-tmp-multi-enb +++ b/ci-scripts/Jenkinsfile-tmp-multi-enb @@ -36,6 +36,9 @@ def testStageName = params.pipelineTestStageName // Name of the phone resource def ciSmartPhoneResource = params.smartphonesResource +// Name of the phone resource +def ciEpcResource = params.epcResource + // Global Parameters. Normally they should be populated when the master job // triggers the slave job with parameters def eNB_Repository @@ -51,7 +54,7 @@ pipeline { options { disableConcurrentBuilds() ansiColor('xterm') - lock (ciSmartPhoneResource) + lock(extra: [[resource: ciEpcResource]], resource: ciSmartPhoneResource) } stages { stage ("Verify Parameters") { @@ -216,6 +219,76 @@ pipeline { } } } + stage ("Terminate") { + parallel { + stage('Terminate UE') { + // Bypassing this stage if there are no abd server defined + when { + expression { params.ADB_IPAddress != "none" } + } + steps { + echo '\u2705 \u001B[32mTerminate UE\u001B[0m' + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password'] + ]) { + sh "python3 ci-scripts/main.py --mode=TerminateUE --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password}" + } + } + } + stage('Terminate eNB') { + steps { + echo '\u2705 \u001B[32mTerminate eNB\u001B[0m' + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'] + ]) { + sh "python3 ci-scripts/main.py --mode=TerminateeNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}" + } + } + } + stage('Terminate SPGW') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + echo '\u2705 \u001B[32mTerminate SPGW\u001B[0m' + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + sh "python3 ci-scripts/main.py --mode=TerminateSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}" + } + } + } + stage('Terminate MME') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + echo '\u2705 \u001B[32mTerminate MME\u001B[0m' + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + sh "python3 ci-scripts/main.py --mode=TerminateMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}" + } + } + } + stage('Terminate HSS') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + echo '\u2705 \u001B[32mTerminate HSS\u001B[0m' + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + sh "python3 ci-scripts/main.py --mode=TerminateHSS --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}" + } + } + } + } + } stage('Log Collection') { parallel { stage('Log Collection (eNB - Build)') { @@ -242,7 +315,7 @@ pipeline { [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'] ]) { echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m' - sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}" + sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --BuildId=${env.BUILD_ID}" echo '\u2705 \u001B[32mLog Transfer (eNB - Run)\u001B[0m' sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/enb.log.zip ./enb.log.${env.BUILD_ID}.zip || true" @@ -259,6 +332,116 @@ pipeline { } } } + stage('Log Collection (SPGW)') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + echo '\u2705 \u001B[32mLog Collection (SPGW)\u001B[0m' + sh "python3 ci-scripts/main.py --mode=LogCollectSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}" + + echo '\u2705 \u001B[32mLog Transfer (SPGW)\u001B[0m' + sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/spgw.log.zip ./spgw.log.${env.BUILD_ID}.zip || true" + } + script { + if(fileExists("spgw.log.${env.BUILD_ID}.zip")) { + archiveArtifacts "spgw.log.${env.BUILD_ID}.zip" + } + } + } + } + stage('Log Collection (MME)') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + echo '\u2705 \u001B[32mLog Collection (MME)\u001B[0m' + sh "python3 ci-scripts/main.py --mode=LogCollectMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}" + + echo '\u2705 \u001B[32mLog Transfer (MME)\u001B[0m' + sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/mme.log.zip ./mme.log.${env.BUILD_ID}.zip || true" + } + script { + if(fileExists("mme.log.${env.BUILD_ID}.zip")) { + archiveArtifacts "mme.log.${env.BUILD_ID}.zip" + } + } + } + } + stage('Log Collection (HSS)') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + echo '\u2705 \u001B[32mLog Collection (HSS)\u001B[0m' + sh "python3 ci-scripts/main.py --mode=LogCollectHSS --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}" + + echo '\u2705 \u001B[32mLog Transfer (HSS)\u001B[0m' + sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/hss.log.zip ./hss.log.${env.BUILD_ID}.zip || true" + } + script { + if(fileExists("hss.log.${env.BUILD_ID}.zip")) { + archiveArtifacts "hss.log.${env.BUILD_ID}.zip" + } + } + } + } + stage('Log Collection (Ping)') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + echo '\u2705 \u001B[32mLog Collection (Ping)\u001B[0m' + sh "python3 ci-scripts/main.py --mode=LogCollectPing --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}" + + echo '\u2705 \u001B[32mLog Transfer (Ping)\u001B[0m' + sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/ping.log.zip ./ping.log.${env.BUILD_ID}.zip || true" + } + script { + if(fileExists("ping.log.${env.BUILD_ID}.zip")) { + archiveArtifacts "ping.log.${env.BUILD_ID}.zip" + } + } + } + } + stage('Log Collection (Iperf)') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + echo '\u2705 \u001B[32mLog Collection (Iperf)\u001B[0m' + sh "python3 ci-scripts/main.py --mode=LogCollectIperf --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}" + + echo '\u2705 \u001B[32mLog Transfer (Iperf)\u001B[0m' + sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/iperf.log.zip ./iperf.log.${env.BUILD_ID}.zip || true" + } + script { + if(fileExists("iperf.log.${env.BUILD_ID}.zip")) { + archiveArtifacts "iperf.log.${env.BUILD_ID}.zip" + } + } + } + } } } } diff --git a/ci-scripts/Jenkinsfile-trig-nsa b/ci-scripts/Jenkinsfile-trig-nsa index 772b34231ab..8e81b75e58e 100644 --- a/ci-scripts/Jenkinsfile-trig-nsa +++ b/ci-scripts/Jenkinsfile-trig-nsa @@ -20,6 +20,9 @@ * contact@openairinterface.org */ +// necessary for reading JSON +import groovy.json.JsonSlurper + // Template Jenkins Declarative Pipeline script to run Test w/ RF HW // Location of the python executor node shall be in the same subnet as the others servers @@ -37,12 +40,12 @@ pipeline { stages { stage ("Launcher") { steps { - script { - //retrieve MR that are opened nd with tag NSA - MR_LIST= sh returnStdout: true, script: 'curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100&labels=NSA" | jq ".[].iid" || true ' - echo "List of selected MR:\n${MR_LIST}" - def MR_ARRAY = MR_LIST.split('\n') - //for every selected MR, retrieve the branch name and the latest commit + script { + // retrieve MR that are opened nd with tag NSA + MR_LIST = sh returnStdout: true, script: 'curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100&labels=NSA" | jq -cj "[.[].iid]"' + echo "List of selected MRs: ${MR_LIST.trim()}" + def MR_ARRAY = new JsonSlurper().parseText(MR_LIST.trim()) + // for every selected MR, retrieve the branch name and the latest commit for (MR in MR_ARRAY) { SRC_BRANCH=sh returnStdout: true, script: """curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests/${MR}" | jq ".source_branch" || true """ SRC_BRANCH=SRC_BRANCH.trim() @@ -113,6 +116,21 @@ pipeline { GitPostArgs += jobName + ' ' + build_url + ' ' + build_id + ' ' + jobResult + ' ' echo GitPostArgs + //calling SA-AmariS + jobName = "RAN-SA-AmariS-CN5G" + jobStatus = build job: jobName, wait : true, propagate : false, parameters: [ + string(name: 'eNB_MR', value: String.valueOf(MR)), + string(name: 'eNB_Branch', value: String.valueOf(SRC_BRANCH)), + string(name: 'eNB_CommitID', value: String.valueOf(COMMIT_ID)), + string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)), + booleanParam(name: 'eNB_mergeRequest', value: Boolean.valueOf(ALLOW_MERGE)) + ] + jobResult = jobStatus.getResult() + build_url = jobStatus.getAbsoluteUrl() + build_id = jobStatus.getNumber().toString() + GitPostArgs += jobName + ' ' + build_url + ' ' + build_id + ' ' + jobResult + ' ' + echo GitPostArgs + //calling OAIUE N310-X300 jobName = "RAN-SA-OAIUE-N310-X300-CN5G" jobStatus = build job: jobName, wait : true, propagate : false, parameters: [ diff --git a/ci-scripts/checkCodingFormattingRules.sh b/ci-scripts/checkCodingFormattingRules.sh index a805f765dfb..c29941cade3 100755 --- a/ci-scripts/checkCodingFormattingRules.sh +++ b/ci-scripts/checkCodingFormattingRules.sh @@ -59,7 +59,7 @@ if [ $# -eq 0 ] then echo " ---- Checking the whole repository ----" echo "" - NB_FILES_TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt --recursive *.c *.h | grep -c Formatted || true` + NB_FILES_TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt --recursive --exclude=ci-scripts --exclude=cmake_targets *.c *.h | grep -c Formatted || true` echo "Nb Files that do NOT follow OAI rules: $NB_FILES_TO_FORMAT" echo $NB_FILES_TO_FORMAT > ./oai_rules_result.txt @@ -136,7 +136,7 @@ fi # Merge request scenario MERGE_COMMMIT=`git log -n1 --pretty=format:%H` -TARGET_INIT_COMMIT=`cat .git/refs/remotes/origin/$TARGET_BRANCH` +TARGET_INIT_COMMIT=`git log -n1 --pretty=format:%H origin/$TARGET_BRANCH` echo " ---- Checking the modified files by the merge request ----" echo "" diff --git a/ci-scripts/ci_ueinfra.yaml b/ci-scripts/ci_ueinfra.yaml index b888f6bb59f..76ebaf0f975 100644 --- a/ci-scripts/ci_ueinfra.yaml +++ b/ci-scripts/ci_ueinfra.yaml @@ -50,12 +50,12 @@ amarisoft_ue_1: WakeupScript : none DetachScript : none #end - Cmd : /root/NV17-12-21/ue/lteue + Cmd : /root/NV18-06-2022/ue/lteue Config : /root/NV17-12-21/ue/config/oaicicd-ue-Ping-SATest.cfg Duration : 60 Ping : /tmp/test_ue1.log UELog : /tmp/ue1.log - HostIPAddress : 192.168.18.89 + HostIPAddress : 172.21.16.144 HostUsername : root HostPassword : toor HostSourceCodePath : /tmp @@ -71,7 +71,7 @@ amarisoft_ue_2: WakeupScript : none DetachScript : none #end - Cmd : /root/NV17-12-21/ue/lteue + Cmd : /root/NV18-06-2022/ue/lteue Config : /root/NV17-12-21/ue/config/xxxxxxx.cfg #to be updated for an other scenario Duration : 60 Ping : diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py index 259db7bffe6..8f992689e20 100644 --- a/ci-scripts/cls_containerize.py +++ b/ci-scripts/cls_containerize.py @@ -74,6 +74,7 @@ class Containerize(): self.eNB2SourceCodePath = '' self.forcedWorkspaceCleanup = False self.imageKind = '' + self.proxyCommit = None self.eNB_instance = 0 self.eNB_serverId = ['', '', ''] self.yamlPath = ['', '', ''] @@ -421,6 +422,124 @@ class Containerize(): HTML.CreateHtmlTabFooter(False) sys.exit(1) + def BuildProxy(self, HTML): + if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '': + HELP.GenericHelp(CONST.Version) + sys.exit('Insufficient Parameter') + if self.eNB_serverId[self.eNB_instance] == '0': + lIpAddr = self.eNBIPAddress + lUserName = self.eNBUserName + lPassWord = self.eNBPassword + lSourcePath = self.eNBSourceCodePath + elif self.eNB_serverId[self.eNB_instance] == '1': + lIpAddr = self.eNB1IPAddress + lUserName = self.eNB1UserName + lPassWord = self.eNB1Password + lSourcePath = self.eNB1SourceCodePath + elif self.eNB_serverId[self.eNB_instance] == '2': + lIpAddr = self.eNB2IPAddress + lUserName = self.eNB2UserName + lPassWord = self.eNB2Password + lSourcePath = self.eNB2SourceCodePath + if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '': + HELP.GenericHelp(CONST.Version) + sys.exit('Insufficient Parameter') + if self.proxyCommit is None: + HELP.GenericHelp(CONST.Version) + sys.exit('Insufficient Parameter (need proxyCommit for proxy build)') + logging.debug('Building on server: ' + lIpAddr) + mySSH = SSH.SSHConnection() + mySSH.open(lIpAddr, lUserName, lPassWord) + + # Check that we are on Ubuntu + mySSH.command('hostnamectl', '\$', 5) + result = re.search('Ubuntu', mySSH.getBefore()) + self.host = result.group(0) + if self.host != 'Ubuntu': + logging.error('\u001B[1m Can build proxy only on Ubuntu server\u001B[0m') + mySSH.close() + sys.exit(1) + + self.cli = 'docker' + self.cliBuildOptions = '--no-cache' + + # Workaround for some servers, we need to erase completely the workspace + if self.forcedWorkspaceCleanup: + mySSH.command('echo ' + lPassWord + ' | sudo -S rm -Rf ' + lSourcePath, '\$', 15) + + oldRanCommidID = self.ranCommitID + oldRanRepository = self.ranRepository + oldRanAllowMerge = self.ranAllowMerge + self.ranCommitID = self.proxyCommit + self.ranRepository = 'https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy.git' + self.ranAllowMerge = False + self._createWorkspace(mySSH, lPassWord, lSourcePath) + # to prevent accidentally overwriting data that might be used later + self.ranCommitID = oldRanCommidID + self.ranRepository = oldRanRepository + self.ranAllowMerge = oldRanAllowMerge + + # Let's remove any previous run artifacts if still there + mySSH.command(self.cli + ' image prune --force', '\$', 30) + # Remove any previous proxy image + mySSH.command(self.cli + ' image rm oai-lte-multi-ue-proxy:latest || true', '\$', 30) + + tag = self.proxyCommit + logging.debug('building L2sim proxy image for tag ' + tag) + # check if the corresponding proxy image with tag exists. If not, build it + mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' proxy:' + tag, '\$', 5) + buildProxy = mySSH.getBefore().count('o such image') != 0 + if buildProxy: + mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target oai-lte-multi-ue-proxy --tag proxy:' + tag + ' --file docker/Dockerfile.ubuntu18.04 . > cmake_targets/log/proxy-build.log 2>&1', '\$', 180) + # Note: at this point, OAI images are flattened, but we cannot do this + # here, as the flatten script is not in the proxy repo + mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' proxy:' + tag, '\$', 5) + if mySSH.getBefore().count('o such image') != 0: + logging.error('\u001B[1m Build of L2sim proxy failed\u001B[0m') + mySSH.close() + HTML.CreateHtmlTestRow('commit ' + tag, 'KO', CONST.ALL_PROCESSES_OK) + HTML.CreateHtmlTabFooter(False) + sys.exit(1) + else: + logging.debug('L2sim proxy image for tag ' + tag + ' already exists, skipping build') + + # retag the build images to that we pick it up later + mySSH.command('docker image tag proxy:' + tag + ' oai-lte-multi-ue-proxy:latest', '\$', 5) + + # no merge: is a push to develop, tag the image so we can push it to the registry + if not self.ranAllowMerge: + mySSH.command('docker image tag proxy:' + tag + ' proxy:develop', '\$', 5) + + # we assume that the host on which this is built will also run the proxy. The proxy + # currently requires the following command, and the docker-compose up mechanism of + # the CI does not allow to run arbitrary commands. Note that the following actually + # belongs to the deployment, not the build of the proxy... + logging.warning('the following command belongs to deployment, but no mechanism exists to exec it there!') + mySSH.command('sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up', '\$', 5) + + # Analyzing the logs + if buildProxy: + self.testCase_id = HTML.testCase_id + mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5) + mySSH.command('mkdir -p proxy_build_log_' + self.testCase_id, '\$', 5) + mySSH.command('mv log/* ' + 'proxy_build_log_' + self.testCase_id, '\$', 5) + if (os.path.isfile('./proxy_build_log_' + self.testCase_id + '.zip')): + os.remove('./proxy_build_log_' + self.testCase_id + '.zip') + if (os.path.isdir('./proxy_build_log_' + self.testCase_id)): + shutil.rmtree('./proxy_build_log_' + self.testCase_id) + mySSH.command('zip -r -qq proxy_build_log_' + self.testCase_id + '.zip proxy_build_log_' + self.testCase_id, '\$', 5) + mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/build_log_' + self.testCase_id + '.zip', '.') + # don't delete such that we might recover the zips + #mySSH.command('rm -f build_log_' + self.testCase_id + '.zip','\$', 5) + + # Cleaning any created tmp volume + mySSH.command(self.cli + ' volume prune --force || true','\$', 15) + mySSH.close() + + logging.info('\u001B[1m Building L2sim Proxy Image Pass\u001B[0m') + HTML.CreateHtmlTestRow('commit ' + tag, 'OK', CONST.ALL_PROCESSES_OK) + HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize) + def Copy_Image_to_Test_Server(self, HTML): imageTag = 'develop' if (self.ranAllowMerge): @@ -567,8 +686,10 @@ class Containerize(): if status: HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK) else: + self.exitStatus = 1 HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK) + def UndeployObject(self, HTML, RAN): if self.eNB_serverId[self.eNB_instance] == '0': lIpAddr = self.eNBIPAddress @@ -588,7 +709,7 @@ class Containerize(): if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '': HELP.GenericHelp(CONST.Version) sys.exit('Insufficient Parameter') - logging.debug('\u001B[1m Deploying OAI Object on server: ' + lIpAddr + '\u001B[0m') + logging.debug('\u001B[1m Undeploying OAI Object from server: ' + lIpAddr + '\u001B[0m') mySSH = SSH.SSHConnection() mySSH.open(lIpAddr, lUserName, lPassWord) mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5) diff --git a/ci-scripts/cls_physim.py b/ci-scripts/cls_physim.py index ecd8f63af12..0342333c060 100644 --- a/ci-scripts/cls_physim.py +++ b/ci-scripts/cls_physim.py @@ -168,7 +168,7 @@ class PhySim: mySSH.close() #check build status and update HTML object - lHTML = html.HTMLManagement() + lHTML = cls_oai_html.HTMLManagement() lHTML=self.__CheckBuild_PhySim(htmlObj,constObj) return lHTML @@ -186,6 +186,6 @@ class PhySim: mySSH.command(self.__workSpacePath+'ran_build/build/ldpctest ' + self.runargs + ' >> '+self.__runLogFile, '\$', 30) mySSH.close() #return updated HTML to main - lHTML = html.HTMLManagement() + lHTML = cls_oai_html.HTMLManagement() lHTML=self.__CheckResults_PhySim(htmlObj,constObj,testcase_id) return lHTML diff --git a/ci-scripts/cls_static_code_analysis.py b/ci-scripts/cls_static_code_analysis.py index d6796ad414e..5b45b48ba67 100644 --- a/ci-scripts/cls_static_code_analysis.py +++ b/ci-scripts/cls_static_code_analysis.py @@ -37,6 +37,7 @@ import logging import os from pathlib import Path import time +from multiprocessing import Process, Lock, SimpleQueue #----------------------------------------------------------- # OAI Testing modules @@ -237,3 +238,205 @@ class StaticCodeAnalysis(): return 0 + def LicenceAndFormattingCheck(self, HTML): + if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '': + HELP.GenericHelp(CONST.Version) + sys.exit('Insufficient Parameter') + lIpAddr = self.eNBIPAddress + lUserName = self.eNBUserName + lPassWord = self.eNBPassword + lSourcePath = self.eNBSourceCodePath + + if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '': + HELP.GenericHelp(CONST.Version) + sys.exit('Insufficient Parameter') + logging.debug('Building on server: ' + lIpAddr) + mySSH = SSH.SSHConnection() + mySSH.open(lIpAddr, lUserName, lPassWord) + + self.testCase_id = HTML.testCase_id + + # on RedHat/CentOS .git extension is mandatory + result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository) + if result is not None: + full_ran_repo_name = self.ranRepository.replace('git/', 'git') + else: + full_ran_repo_name = self.ranRepository + '.git' + mySSH.command('mkdir -p ' + lSourcePath, '\$', 5) + mySSH.command('cd ' + lSourcePath, '\$', 5) + mySSH.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + full_ran_repo_name + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600) + # Raphael: here add a check if git clone or git fetch went smoothly + mySSH.command('git config user.email "jenkins@openairinterface.org"', '\$', 5) + mySSH.command('git config user.name "OAI Jenkins"', '\$', 5) + + mySSH.command('echo ' + lPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30) + mySSH.command('mkdir -p cmake_targets/log', '\$', 5) + # if the commit ID is provided use it to point to it + if self.ranCommitID != '': + mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 30) + # if the branch is not develop, then it is a merge request and we need to do + # the potential merge. Note that merge conflicts should already been checked earlier + argToPass = '' + if (self.ranAllowMerge): + argToPass = '--build-arg MERGE_REQUEST=true --build-arg SRC_BRANCH=' + self.ranBranch + if self.ranTargetBranch == '': + if (self.ranBranch != 'develop') and (self.ranBranch != 'origin/develop'): + mySSH.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 5) + argToPass += ' --build-arg TARGET_BRANCH=develop ' + else: + logging.debug('Merging with the target branch: ' + self.ranTargetBranch) + mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5) + argToPass += ' --build-arg TARGET_BRANCH=' + self.ranTargetBranch + ' ' + + mySSH.command('docker image rm oai-formatting-check:latest || true', '\$', 60) + mySSH.command('docker build --target oai-formatting-check --tag oai-formatting-check:latest ' + argToPass + '--file ci-scripts/docker/Dockerfile.formatting.bionic . > cmake_targets/log/oai-formatting-check.txt 2>&1', '\$', 600) + + mySSH.command('docker image rm oai-formatting-check:latest || true', '\$', 60) + mySSH.command('docker image prune --force', '\$', 60) + mySSH.command('docker volume prune --force', '\$', 60) + + # Analyzing the logs + mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5) + mySSH.command('mkdir -p build_log_' + self.testCase_id, '\$', 5) + mySSH.command('mv log/* ' + 'build_log_' + self.testCase_id, '\$', 5) + mySSH.close() + + mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/build_log_' + self.testCase_id + '/*', '.') + + finalStatus = 0 + if (os.path.isfile('./oai-formatting-check.txt')): + analyzed = False + nbFilesNotFormatted = 0 + listFiles = False + listFilesNotFormatted = [] + circularHeaderDependency = False + circularHeaderDependencyFiles = [] + gnuGplLicence = False + gnuGplLicenceFiles = [] + suspectLicence = False + suspectLicenceFiles = [] + with open('./oai-formatting-check.txt', 'r') as logfile: + for line in logfile: + ret = re.search('./ci-scripts/checkCodingFormattingRules.sh', str(line)) + if ret is not None: + analyzed = True + if analyzed: + ret = re.search('Nb Files that do NOT follow OAI rules: (?P<nb_errors>[0-9\.]+)', str(line)) + if ret is not None: + nbFilesNotFormatted = int(ret.group('nb_errors')) + + if re.search('=== Files not properly formatted ===', str(line)) is not None: + listFiles = True + if listFiles: + if re.search('Removing intermediate container', str(line)) is not None: + listFiles = False + elif re.search('Running in|Files not properly formatted', str(line)) is not None: + pass + else: + listFilesNotFormatted.append(str(line).strip()) + + if re.search('=== Files with incorrect define protection ===', str(line)) is not None: + circularHeaderDependency = True + if circularHeaderDependency: + if re.search('Removing intermediate container', str(line)) is not None: + circularHeaderDependency = False + elif re.search('Running in|Files with incorrect define protection', str(line)) is not None: + pass + else: + circularHeaderDependencyFiles.append(str(line).strip()) + + if re.search('=== Files with a GNU GPL licence Banner ===', str(line)) is not None: + gnuGplLicence = True + if gnuGplLicence: + if re.search('Removing intermediate container', str(line)) is not None: + gnuGplLicence = False + elif re.search('Running in|Files with a GNU GPL licence Banner', str(line)) is not None: + pass + else: + gnuGplLicenceFiles.append(str(line).strip()) + + if re.search('=== Files with a suspect Banner ===', str(line)) is not None: + suspectLicence = True + if suspectLicence: + if re.search('Removing intermediate container', str(line)) is not None: + suspectLicence = False + elif re.search('Running in|Files with a suspect Banner', str(line)) is not None: + pass + else: + suspectLicenceFiles.append(str(line).strip()) + + logfile.close() + if analyzed: + logging.debug('files not formatted properly: ' + str(nbFilesNotFormatted)) + if nbFilesNotFormatted == 0: + HTML.CreateHtmlTestRow('File(s) Format', 'OK', CONST.ALL_PROCESSES_OK) + else: + html_queue = SimpleQueue() + html_cell = '<pre style="background-color:white">\n' + html_cell += 'Number of files not following OAI Rules: ' + str(nbFilesNotFormatted) + '\n' + for nFile in listFilesNotFormatted: + html_cell += str(nFile).strip() + '\n' + html_cell += '</pre>' + html_queue.put(html_cell) + HTML.CreateHtmlTestRowQueue('File(s) Format', 'KO', 1, html_queue) + del(html_cell) + del(html_queue) + + logging.debug('header files not respecting the circular dependency protection: ' + str(len(circularHeaderDependencyFiles))) + if len(circularHeaderDependencyFiles) == 0: + HTML.CreateHtmlTestRow('Header Circular Dependency', 'OK', CONST.ALL_PROCESSES_OK) + else: + html_queue = SimpleQueue() + html_cell = '<pre style="background-color:white">\n' + html_cell += 'Number of files not respecting: ' + str(len(circularHeaderDependencyFiles)) + '\n' + for nFile in circularHeaderDependencyFiles: + html_cell += str(nFile).strip() + '\n' + html_cell += '</pre>' + html_queue.put(html_cell) + HTML.CreateHtmlTestRowQueue('Header Circular Dependency', 'KO', 1, html_queue) + del(html_cell) + del(html_queue) + finalStatus = -1 + + logging.debug('files with a GNU GPL license: ' + str(len(gnuGplLicenceFiles))) + if len(gnuGplLicenceFiles) == 0: + HTML.CreateHtmlTestRow('Files w/ GNU GPL License', 'OK', CONST.ALL_PROCESSES_OK) + else: + html_queue = SimpleQueue() + html_cell = '<pre style="background-color:white">\n' + html_cell += 'Number of files not respecting: ' + str(len(gnuGplLicenceFiles)) + '\n' + for nFile in gnuGplLicenceFiles: + html_cell += str(nFile).strip() + '\n' + html_cell += '</pre>' + html_queue.put(html_cell) + HTML.CreateHtmlTestRowQueue('Files w/ GNU GPL License', 'KO', 1, html_queue) + del(html_cell) + del(html_queue) + finalStatus = -1 + + logging.debug('files with a suspect license: ' + str(len(suspectLicenceFiles))) + if len(suspectLicenceFiles) == 0: + HTML.CreateHtmlTestRow('Files with suspect license', 'OK', CONST.ALL_PROCESSES_OK) + else: + html_queue = SimpleQueue() + html_cell = '<pre style="background-color:white">\n' + html_cell += 'Number of files not respecting: ' + str(len(suspectLicenceFiles)) + '\n' + for nFile in suspectLicenceFiles: + html_cell += str(nFile).strip() + '\n' + html_cell += '</pre>' + html_queue.put(html_cell) + HTML.CreateHtmlTestRowQueue('Files with suspect license', 'KO', 1, html_queue) + del(html_cell) + del(html_queue) + finalStatus = -1 + + else: + finalStatus = -1 + HTML.htmleNBFailureMsg = 'Could not fully analyze oai-formatting-check.txt file' + HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE) + else: + finalStatus = -1 + HTML.htmleNBFailureMsg = 'Could not access oai-formatting-check.txt file' + HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE) + + return finalStatus diff --git a/ci-scripts/conf_files/benetel-5g.conf b/ci-scripts/conf_files/benetel-5g.conf index 8f3b03fddc5..3b872e56e96 100644 --- a/ci-scripts/conf_files/benetel-5g.conf +++ b/ci-scripts/conf_files/benetel-5g.conf @@ -21,8 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; - servingCellConfigCommon = ( { #spCellConfigCommon diff --git a/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf index 51ffb1d5cd2..a648db0efec 100644 --- a/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf @@ -32,7 +32,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( { diff --git a/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf b/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf index eac0b746336..0db6ac9036b 100644 --- a/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf +++ b/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( diff --git a/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf index f80ce3751a9..84cb18d435f 100644 --- a/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf @@ -32,7 +32,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( diff --git a/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf b/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf index f61039ff173..270ad758457 100644 --- a/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf +++ b/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; servingCellConfigCommon = ( diff --git a/ci-scripts/conf_files/gNB_SA_CU.conf b/ci-scripts/conf_files/gNB_SA_CU.conf index 9d64ae1976f..f6d3e8575a7 100644 --- a/ci-scripts/conf_files/gNB_SA_CU.conf +++ b/ci-scripts/conf_files/gNB_SA_CU.conf @@ -44,7 +44,6 @@ gNBs = local_s_portd = 2152; remote_s_portc = 500; remote_s_portd = 2152; - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( diff --git a/ci-scripts/conf_files/gNB_SA_DU.conf b/ci-scripts/conf_files/gNB_SA_DU.conf index f95bdf91aee..4309c13dd39 100644 --- a/ci-scripts/conf_files/gNB_SA_DU.conf +++ b/ci-scripts/conf_files/gNB_SA_DU.conf @@ -36,7 +36,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( diff --git a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf index d6edc092865..49383072ed1 100644 --- a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf +++ b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf @@ -37,8 +37,7 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts_N1 = 2; + pdsch_AntennaPorts_XP = 2; pusch_AntennaPorts = 2; pdcch_ConfigSIB1 = ( diff --git a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf index 7f4b11c35d8..610485fc924 100644 --- a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf +++ b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf @@ -38,8 +38,7 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts_N1 = 2; + pdsch_AntennaPorts_XP = 2; pusch_AntennaPorts = 2; pdcch_ConfigSIB1 = ( diff --git a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf index dcb3dd89b76..24ec8f17f8d 100644 --- a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf +++ b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; servingCellConfigCommon = ( diff --git a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf index 1019ec75ade..b3c7d7d1da5 100644 --- a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf +++ b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; servingCellConfigCommon = ( diff --git a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf index fa7c1905385..c668601c063 100644 --- a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf @@ -19,8 +19,7 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; - pdsch_AntennaPorts_N1 = 2; + pdsch_AntennaPorts_XP = 2; pusch_AntennaPorts = 2; ul_prbblacklist = "51,52,53,54" diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf index 5e6b3fb217b..92c3a7a2e98 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf @@ -41,7 +41,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; pusch_AntennaPorts = 2; ul_prbblacklist = "51,52,53,54" do_SRS = 1; diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf index 8489008300d..672713d5042 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf @@ -37,8 +37,7 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts_N1 = 2; + pdsch_AntennaPorts_XP = 2; pusch_AntennaPorts = 2; ul_prbblacklist = "51,52,53,54" do_SRS = 1; diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf index 18ca7b5d1e8..5bd8b26e054 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf @@ -37,7 +37,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; pusch_AntennaPorts = 2; ul_prbblacklist = "51,52,53,54" do_SRS = 1; diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf index 9e1f499f034..e1264bd069e 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf @@ -37,7 +37,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; #pusch_TargetSNRx10 = 200; #pucch_TargetSNRx10 = 200; ul_prbblacklist = "51,52,53,54" diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf index ce63578dd37..f92242138c7 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf @@ -37,8 +37,7 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts_N1 = 2; + pdsch_AntennaPorts_XP = 2; pusch_AntennaPorts = 2; #pusch_TargetSNRx10 = 200; #pucch_TargetSNRx10 = 200; diff --git a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf index 0c750803985..9334f2cf591 100644 --- a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf +++ b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; servingCellConfigCommon = ( @@ -219,7 +218,7 @@ RUs = ( ## beamforming 4x4 matrix: #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; - sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2,mgmt_addr=192.168.18.85"; + sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2"; } ); diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf index f3515d38824..cd3ab6278e0 100644 --- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf +++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf @@ -19,7 +19,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; servingCellConfigCommon = ( { diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf index 8f480d37571..371753eccc3 100644 --- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf @@ -20,7 +20,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; min_rxtxtime = 6; servingCellConfigCommon = ( diff --git a/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf index b78ca916f3c..197e1d211cd 100644 --- a/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf +++ b/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf @@ -32,7 +32,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( diff --git a/ci-scripts/conf_files/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.sa.band78.fr1.106PRB.usrpb210.conf new file mode 100644 index 00000000000..2a6053ab461 --- /dev/null +++ b/ci-scripts/conf_files/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -0,0 +1,344 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 222; + mnc = 01; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + #sd = 0x1; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + min_rxtxtime = 2; + do_CSIRS = 1; + do_SRS = 1; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 12; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) + absoluteFrequencySSB = 641280; + dl_frequencyBand = 78; + # this is 3600 MHz + dl_absoluteFrequencyPointA = 640008; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 106; + #initialDownlinkBWP + #genericParameters + # this is RBstart=27,L=48 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 106; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 28875; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 13; + preambleReceivedTargetPower = -96; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -90; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + +# Dedicated Serving Cell Configuration +servingCellConfigDedicated = ({ + # BWP-Downlink + # BWP 1 Configuration + dl_bwp-Id_1 = 1; + dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp1_subcarrierSpacing = 1; + + # BWP 2 Configuration + dl_bwp-Id_2 = 2; + dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp2_subcarrierSpacing = 1; + + # BWP 3 Configuration + dl_bwp-Id_3 = 3; + dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp3_subcarrierSpacing = 1; + + firstActiveDownlinkBWP-Id = 1; #BWP-Id + defaultDownlinkBWP-Id = 1; #BWP-Id + + # bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, + # ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500, + # ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8, + # spare7, spare6, spare5, spare4, spare3, spare2, spare1 } + + # UplinkConfig + # BWP-Uplink + # BWP 1 Configuration + ul_bwp-Id_1 = 1; + ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp1_subcarrierSpacing = 1; + + # BWP 2 Configuration + ul_bwp-Id_2 = 2; + ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp2_subcarrierSpacing = 1; + + # BWP 3 Configuration + ul_bwp-Id_3 = 3; + ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp3_subcarrierSpacing = 1; + + firstActiveUplinkBWP-Id = 1; #BWP-Id + } +); + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "172.21.16.136"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.137/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.137/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 200; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 0; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 100; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 10; + att_rx = 10; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + clock_src = "internal"; +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + +log_config : +{ + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + ngap_log_level ="debug"; + f1ap_log_level ="debug"; +}; + diff --git a/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf index bd3076a014c..ad1471339a2 100644 --- a/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf +++ b/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf @@ -32,9 +32,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts = 1; - pusch_AntennaPorts = 1; sib1_tda = 15; min_rxtxtime = 6; diff --git a/ci-scripts/datalog_rt_stats.2x2.yaml b/ci-scripts/datalog_rt_stats.2x2.yaml index a93ef6aa8c8..eccde746cc7 100644 --- a/ci-scripts/datalog_rt_stats.2x2.yaml +++ b/ci-scripts/datalog_rt_stats.2x2.yaml @@ -16,7 +16,7 @@ Ref : L1 Rx processing : 175.0 PUSCH inner-receiver : 100.0 PUSCH decoding : 180.0 - DL & UL scheduling timing stats : 37.0 + DL & UL scheduling timing : 37.0 UL Indication : 38.0 Threshold : feprx : 1.25 @@ -28,5 +28,5 @@ Threshold : L1 Rx processing : 1.25 PUSCH inner-receiver : 1.25 PUSCH decoding : 1.25 - DL & UL scheduling timing stats : 1.25 + DL & UL scheduling timing : 1.25 UL Indication : 1.25 diff --git a/ci-scripts/datalog_rt_stats.default.yaml b/ci-scripts/datalog_rt_stats.default.yaml index 02a90c86f4e..97591a766dc 100644 --- a/ci-scripts/datalog_rt_stats.default.yaml +++ b/ci-scripts/datalog_rt_stats.default.yaml @@ -15,8 +15,9 @@ Ref : DLSCH encoding : 230.0 L1 Rx processing : 175.0 PUSCH inner-receiver : 100.0 - PUSCH decoding : 180.0 - DL & UL scheduling timing stats : 37.0 + #PUSCH decoding : 180.0 + PUSCH decoding : 240.0 + DL & UL scheduling timing : 37.0 UL Indication : 38.0 Threshold : feprx : 1.25 @@ -28,5 +29,5 @@ Threshold : L1 Rx processing : 1.25 PUSCH inner-receiver : 1.25 PUSCH decoding : 1.25 - DL & UL scheduling timing stats : 1.25 + DL & UL scheduling timing : 1.25 UL Indication : 1.25 diff --git a/ci-scripts/docker/Dockerfile.formatting.bionic b/ci-scripts/docker/Dockerfile.formatting.bionic new file mode 100644 index 00000000000..01417a3bdb3 --- /dev/null +++ b/ci-scripts/docker/Dockerfile.formatting.bionic @@ -0,0 +1,31 @@ +FROM ubuntu:bionic AS oai-formatting-check + +ARG MERGE_REQUEST +ARG SRC_BRANCH +ARG TARGET_BRANCH +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \ + DEBIAN_FRONTEND=noninteractive apt-get install --yes \ + astyle \ + gawk \ + git + +WORKDIR /oai-ran +COPY . . + +RUN /bin/bash -c "if [[ -v MERGE_REQUEST ]]; then echo 'Source Branch = $SRC_BRANCH'; echo 'Target Branch = $TARGET_BRANCH'; else echo 'Push to develop'; fi" +RUN /bin/bash -c "if [[ -v MERGE_REQUEST ]]; then ./ci-scripts/checkCodingFormattingRules.sh --src-branch $SRC_BRANCH --target-branch $TARGET_BRANCH; else ./ci-scripts/checkCodingFormattingRules.sh; fi" + +RUN echo "=== Files not properly formatted ===" && \ + /bin/bash -c "if [[ -f oai_rules_result_list.txt ]]; then cat oai_rules_result_list.txt; fi" + +RUN echo "=== Files with incorrect define protection ===" && \ + /bin/bash -c "if [[ -f header-files-w-incorrect-define.txt ]]; then cat header-files-w-incorrect-define.txt; fi" + +RUN echo "=== Files with a GNU GPL licence Banner ===" && \ + /bin/bash -c "if [[ -f files-w-gnu-gpl-license-banner.txt ]]; then cat files-w-gnu-gpl-license-banner.txt; fi" + +RUN echo "=== Files with a suspect Banner ===" && \ + /bin/bash -c "if [[ -f files-w-suspect-banner.txt ]]; then cat files-w-suspect-banner.txt; fi" diff --git a/ci-scripts/epc.py b/ci-scripts/epc.py index 0fc37d4ead7..9113d29ac9b 100644 --- a/ci-scripts/epc.py +++ b/ci-scripts/epc.py @@ -255,16 +255,19 @@ class EPCManagement(): mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts', '\$', 5) mySSH.command('cd /opt/oai-cn5g-fed-v1.3/docker-compose', '\$', 5) mySSH.command('python3 ./core-network.py '+self.cfgDeploy, '\$', 60) - time.sleep(2) - mySSH.command('docker-compose -p 5gcn ps -a', '\$', 60) + if re.search('start-mini-as-ue', self.cfgDeploy): + dFile = 'docker-compose-mini-nrf-asue.yaml' + else: + dFile = 'docker-compose-mini-nrf.yaml' + mySSH.command('docker-compose -p 5gcn -f ' + dFile + ' ps -a', '\$', 60) if mySSH.getBefore().count('Up (healthy)') != 6: logging.error('Not all container healthy') else: - logging.debug('OK') - mySSH.command('docker-compose config | grep --colour=never image', '\$', 10) + logging.debug('OK --> all containers are healthy') + mySSH.command('docker-compose -p 5gcn -f ' + dFile + ' config | grep --colour=never image', '\$', 10) listOfImages = mySSH.getBefore() for imageLine in listOfImages.split('\\r\\n'): - res1 = re.search('image: (?P<name>[a-zA-Z0-9\-]+):(?P<tag>[a-zA-Z0-9\-]+)', str(imageLine)) + res1 = re.search('image: (?P<name>[a-zA-Z0-9\-/]+):(?P<tag>[a-zA-Z0-9\-]+)', str(imageLine)) res2 = re.search('mysql', str(imageLine)) if res1 is not None and res2 is None: html_cell += res1.group('name') + ':' + res1.group('tag') + ' ' @@ -308,6 +311,8 @@ class EPCManagement(): tmp = str(response[0],'utf-8') self.MmeIPAddress = tmp.rstrip() logging.debug('AMF IP Address ' + self.MmeIPAddress) + else: + logging.error('no container with name oai-amf found, could not retrieve AMF IP address') mySSH.close() def CheckHSSProcess(self, status_queue): @@ -536,7 +541,7 @@ class EPCManagement(): mySSH.command('python3 ./core-network.py '+self.cfgUnDeploy, '\$', 60) mySSH.command('docker volume prune --force || true', '\$', 60) time.sleep(2) - mySSH.command('tshark -r /tmp/oai-cn5g.pcap | egrep --colour=never "Tracking area update" ','\$', 30) + mySSH.command('tshark -r /tmp/oai-cn5g-v1.3.pcap | egrep --colour=never "Tracking area update" ','\$', 30) result = re.search('Tracking area update request', mySSH.getBefore()) if result is not None: message = 'UE requested ' + str(mySSH.getBefore().count('Tracking area update request')) + 'Tracking area update request(s)' @@ -830,8 +835,8 @@ class EPCManagement(): mySSH.command('zip mme.log.zip mme_check_run.*', '\$', 60) elif re.match('OAICN5G', self.Type, re.IGNORECASE): mySSH.command('cd ' + self.SourceCodePath + '/logs','\$', 5) - mySSH.command('cp -f /tmp/oai-cn5g.pcap .','\$', 30) - mySSH.command('zip mme.log.zip oai-amf.log oai-nrf.log oai-cn5g.pcap','\$', 30) + mySSH.command('cp -f /tmp/oai-cn5g-v1.3.pcap .','\$', 30) + mySSH.command('zip mme.log.zip oai-amf.log oai-nrf.log oai-cn5g*.pcap','\$', 30) mySSH.command('mv mme.log.zip ' + self.SourceCodePath + '/scripts','\$', 30) elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE): mySSH.command('zip mme.log.zip mme*.log', '\$', 60) diff --git a/ci-scripts/main.py b/ci-scripts/main.py index 03947bdfc96..baed6a60119 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -102,7 +102,7 @@ def AssignParams(params_dict): def GetParametersFromXML(action): - if action == 'Build_eNB' or action == 'Build_Image': + if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy': RAN.Build_eNB_args=test.findtext('Build_eNB_args') CONTAINERS.imageKind=test.findtext('kind') forced_workspace_cleanup = test.findtext('forced_workspace_cleanup') @@ -138,6 +138,9 @@ def GetParametersFromXML(action): RAN.backgroundBuild=True else: RAN.backgroundBuild=False + proxy_commit = test.findtext('proxy_commit') + if proxy_commit is not None: + CONTAINERS.proxyCommit = proxy_commit elif action == 'WaitEndBuild_eNB': RAN.Build_eNB_args=test.findtext('Build_eNB_args') @@ -799,7 +802,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re HTML.startTime=int(round(time.time() * 1000)) while CiTestObj.FailReportCnt < CiTestObj.repeatCounts[0] and RAN.prematureExit: RAN.prematureExit=False - # At every iteratin of the retry loop, a separator will be added + # At every iteration of the retry loop, a separator will be added # pass CiTestObj.FailReportCnt as parameter of HTML.CreateHtmlRetrySeparator HTML.CreateHtmlRetrySeparator(CiTestObj.FailReportCnt) for test_case_id in todo_tests: @@ -915,14 +918,22 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re HTML=ldpc.Run_PhySim(HTML,CONST,id) elif action == 'Build_Image': CONTAINERS.BuildImage(HTML) + elif action == 'Build_Proxy': + CONTAINERS.BuildProxy(HTML) elif action == 'Copy_Image_to_Test': CONTAINERS.Copy_Image_to_Test_Server(HTML) elif action == 'Deploy_Object': CONTAINERS.DeployObject(HTML, EPC) + if CONTAINERS.exitStatus==1: + RAN.prematureExit = True elif action == 'Undeploy_Object': CONTAINERS.UndeployObject(HTML, RAN) elif action == 'Cppcheck_Analysis': SCA.CppCheckAnalysis(HTML) + elif action == 'LicenceAndFormattingCheck': + ret = SCA.LicenceAndFormattingCheck(HTML) + if ret != 0: + RAN.prematureExit = True elif action == 'Deploy_Run_PhySim': PHYSIM.Deploy_PhySim(HTML, RAN) elif action == 'DeployGenObject': diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py index 97c5b9696ee..680763d247d 100644 --- a/ci-scripts/ran.py +++ b/ci-scripts/ran.py @@ -383,17 +383,19 @@ class RANManagement(): # If tracer options is on, running tshark on EPC side and capture traffic b/ EPC and eNB - localEpcIpAddr = EPC.IPAddress - localEpcUserName = EPC.UserName - localEpcPassword = EPC.Password - mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword) - eth_interface = 'any' - fltr = 'sctp' - logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m') - self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap' - mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5) - mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5) - mySSH.close() + if EPC.IPAddress != "none": + localEpcIpAddr = EPC.IPAddress + localEpcUserName = EPC.UserName + localEpcPassword = EPC.Password + mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword) + eth_interface = 'any' + fltr = 'sctp' + logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m') + self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap' + mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5) + mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5) + mySSH.close() + mySSH.open(lIpAddr, lUserName, lPassWord) mySSH.command('cd ' + lSourcePath, '\$', 5) # Initialize_eNB_args usually start with -O and followed by the location in repository diff --git a/ci-scripts/ran_dashboard/Hdashboard.py b/ci-scripts/ran_dashboard/Hdashboard.py index 1b65c7af4f0..bfa07557bde 100644 --- a/ci-scripts/ran_dashboard/Hdashboard.py +++ b/ci-scripts/ran_dashboard/Hdashboard.py @@ -528,15 +528,15 @@ class Dashboard: editable_mr = project.mergerequests.get(int(mr)) mr_notes = editable_mr.notes.list(all=True) - body = '<a href="https://oaitestdashboard.s3.eu-west-1.amazonaws.com/MR'+mr+'/index.html">Consolidated Test Results</a><br>'+\ - 'Tested CommitID: ' + commit + '<br>' + body = '[Consolidated Test Results](https://oaitestdashboard.s3.eu-west-1.amazonaws.com/MR'+mr+'/index.html)\\\n' + body += 'Tested CommitID: ' + commit for i in range(0,n_tests): jobname = args[4*i] buildurl = args[4*i+1] buildid = args[4*i+2] status = args[4*i+3] - body += jobname+', status is <b>'+status+'</b>, (<a href="'+buildurl+'">'+buildid+'</a>)<br>' + body += '\\\n' + jobname + ': **'+status+'** ([' + buildid + '](' + buildurl + '))' #create new note mr_note = editable_mr.notes.create({ diff --git a/ci-scripts/sshconnection.py b/ci-scripts/sshconnection.py index dca3daa817c..035da71426a 100644 --- a/ci-scripts/sshconnection.py +++ b/ci-scripts/sshconnection.py @@ -60,7 +60,7 @@ class SSHConnection(): count = 0 connect_status = False while count < 4: - self.ssh = pexpect.spawn('ssh -o PubkeyAuthentication=no {}@{}'.format(username,ipaddress)) + self.ssh = pexpect.spawn('ssh -o PubkeyAuthentication=yes {}@{}'.format(username,ipaddress)) # Longer timeout at connection due to asterix slowness self.ssh.timeout = 25 self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT]) @@ -84,14 +84,11 @@ class SSHConnection(): else: logging.debug('self.sshresponse = ' + str(self.sshresponse)) elif self.sshresponse == 2: - # Checking if we are really on the remote client defined by its IP address - self.command('stdbuf -o0 ifconfig | egrep --color=never "inet addr:|inet "', prompt, 5) - result = re.search(str(ipaddress), str(self.ssh.before)) - if result is None: - self.close() - else: - count = 10 - connect_status = True + # We directly ended up on the remote server because of pubkey auth + count = 10 + connect_status = True + # this expect() seems to be necessary to advance the read buffer until the prompt, or getBefore() will not return the last command + self.sshresponse = self.ssh.expect([prompt]) else: # debug output logging.debug(str(self.ssh.before)) @@ -272,4 +269,4 @@ class SSHConnection(): sys.exit('SCP failed') def getBefore(self): - return str(self.ssh.before) + return self.ssh.before.decode('utf-8') diff --git a/ci-scripts/stats_monitor_conf.yaml b/ci-scripts/stats_monitor_conf.yaml index 9a2ececd183..4e1f87ed176 100644 --- a/ci-scripts/stats_monitor_conf.yaml +++ b/ci-scripts/stats_monitor_conf.yaml @@ -25,7 +25,7 @@ gnb : L1 Rx processing: PUSCH inner-receiver: PUSCH decoding: - DL & UL scheduling timing stats: + DL & UL scheduling timing: UL Indication: graph : page1: @@ -45,5 +45,5 @@ gnb : page4: rt.PUSCH inner-receiver: rt.PUSCH decoding: - rt.DL & UL scheduling timing stats: + rt.DL & UL scheduling timing: rt.UL Indication: diff --git a/ci-scripts/xml_class_list.yml b/ci-scripts/xml_class_list.yml index d6f75191a8d..2c5f04b11fa 100755 --- a/ci-scripts/xml_class_list.yml +++ b/ci-scripts/xml_class_list.yml @@ -1,3 +1,4 @@ + - Build_Proxy - Build_PhySim - Run_PhySim - Build_eNB @@ -47,3 +48,4 @@ - PingFromContainer - IperfFromContainer - StatsFromGenObject + - LicenceAndFormattingCheck diff --git a/ci-scripts/xml_files/container_5g_l2sim_proxy.xml b/ci-scripts/xml_files/container_5g_l2sim_proxy.xml new file mode 100644 index 00000000000..af1715d7936 --- /dev/null +++ b/ci-scripts/xml_files/container_5g_l2sim_proxy.xml @@ -0,0 +1,42 @@ +<!-- + + Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The OpenAirInterface Software Alliance licenses this file to You under + the OAI Public License, Version 1.1 (the "License"); you may not use this file + except in compliance with the License. + You may obtain a copy of the License at + + http://www.openairinterface.org/?page_id=698 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + For more information about the OpenAirInterface (OAI) Software Alliance: + contact@openairinterface.org + +--> +<testCaseList> + <htmlTabRef>l2sim-5gnr-proxy-build</htmlTabRef> + <htmlTabName>Build L2sim proxy image</htmlTabName> + <htmlTabIcon>wrench</htmlTabIcon> + <repeatCount>1</repeatCount> + <TestCaseRequestedList> + 000001 + </TestCaseRequestedList> + <TestCaseExclusionList></TestCaseExclusionList> + + <testCase id="000001"> + <class>Build_Proxy</class> + <desc>Build L2sim Proxy Image</desc> + <eNB_instance>1</eNB_instance> + <eNB_serverId>1</eNB_serverId> + <forced_workspace_cleanup>True</forced_workspace_cleanup> + <proxy_commit>56cfdc0</proxy_commit> + </testCase> + +</testCaseList> diff --git a/ci-scripts/xml_files/container_nsa_b200_quectel.xml b/ci-scripts/xml_files/container_nsa_b200_quectel.xml index 47a939f63c5..51e6668cf00 100644 --- a/ci-scripts/xml_files/container_nsa_b200_quectel.xml +++ b/ci-scripts/xml_files/container_nsa_b200_quectel.xml @@ -53,7 +53,6 @@ <class>Initialize_UE</class> <desc>Initialize Quectel</desc> <id>idefix</id> - <UE_Trace>yes</UE_Trace> </testCase> @@ -142,8 +141,8 @@ <iperf_args>-u -b 125M -t 60 -i 1 -fm</iperf_args> <direction>DL</direction> <id>idefix</id> - <iperf_packetloss_threshold>1</iperf_packetloss_threshold> - <iperf_bitrate_threshold>95</iperf_bitrate_threshold> + <iperf_packetloss_threshold>25</iperf_packetloss_threshold> + <iperf_bitrate_threshold>80</iperf_bitrate_threshold> <iperf_profile>single-ue</iperf_profile> </testCase> diff --git a/ci-scripts/xml_files/container_sa_b200_quectel.xml b/ci-scripts/xml_files/container_sa_b200_quectel.xml new file mode 100644 index 00000000000..7f0475629de --- /dev/null +++ b/ci-scripts/xml_files/container_sa_b200_quectel.xml @@ -0,0 +1,168 @@ +<!-- + + Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The OpenAirInterface Software Alliance licenses this file to You under + the OAI Public License, Version 1.1 (the "License"); you may not use this file + except in compliance with the License. + You may obtain a copy of the License at + + http://www.openairinterface.org/?page_id=698 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + For more information about the OpenAirInterface (OAI) Software Alliance: + contact@openairinterface.org + +--> +<testCaseList> + <htmlTabRef>TEST-SA-FR1-B200</htmlTabRef> + <htmlTabName>SA SanityCheck with QUECTEL</htmlTabName> + <htmlTabIcon>tasks</htmlTabIcon> + <repeatCount>1</repeatCount> + <TestCaseRequestedList> + 010002 + 030000 + 030101 + 000001 + 010000 + 000001 + 050000 + 050001 + 010002 + 000001 + 030201 + </TestCaseRequestedList> + <!-- + 070001 + 070000 + 070002 + 050002 + 050003 + --> + <TestCaseExclusionList></TestCaseExclusionList> + + <testCase id="010000"> + <class>Initialize_UE</class> + <desc>Initialize Quectel</desc> + <id>idefix</id> + </testCase> + + + <testCase id="010002"> + <class>Terminate_UE</class> + <desc>Terminate Quectel</desc> + <id>idefix</id> + </testCase> + + <testCase id="030000"> + <class>Copy_Image_to_Test</class> + <desc>Copy gNB image to test server</desc> + <image_name>oai-gnb</image_name> + <registry_svr_id>1</registry_svr_id> + <test_svr_id>0</test_svr_id> + </testCase> + + <testCase id="030101"> + <class>Deploy_Object</class> + <desc>Deploy gNB (TDD/Band78/40MHz/B200) in a container</desc> + <yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path> + <eNB_instance>0</eNB_instance> + <eNB_serverId>0</eNB_serverId> + </testCase> + + <testCase id="000001"> + <class>IdleSleep</class> + <desc>Sleep</desc> + <idle_sleep_time_in_sec>5</idle_sleep_time_in_sec> + </testCase> + + <testCase id="000002"> + <class>IdleSleep</class> + <desc>Sleep</desc> + <idle_sleep_time_in_sec>20</idle_sleep_time_in_sec> + </testCase> + + + <testCase id="050000"> + <class>Ping</class> + <desc>Ping: 20pings in 20sec</desc> + <id>idefix</id> + <ping_args>-c 20</ping_args> + <ping_packetloss_threshold>1</ping_packetloss_threshold> + <ping_rttavg_threshold>15</ping_rttavg_threshold> + </testCase> + + <testCase id="050001"> + <class>Ping</class> + <desc>Ping: 100pings in 20sec</desc> + <id>idefix</id> + <ping_args>-c 100 -i 0.2</ping_args> + <ping_packetloss_threshold>1</ping_packetloss_threshold> + <ping_rttavg_threshold>15</ping_rttavg_threshold> + </testCase> + + <testCase id="050002"> + <class>Ping</class> + <desc>Ping: 20pings in 20sec</desc> + <id>idefix</id> + <ping_args>-c 20</ping_args> + <ping_packetloss_threshold>1</ping_packetloss_threshold> + <ping_rttavg_threshold>15</ping_rttavg_threshold> + </testCase> + + <testCase id="050003"> + <class>Ping</class> + <desc>Ping: 100pings in 20sec</desc> + <id>idefix</id> + <ping_args>-c 100 -i 0.2</ping_args> + <ping_packetloss_threshold>1</ping_packetloss_threshold> + <ping_rttavg_threshold>15</ping_rttavg_threshold> + </testCase> + + <testCase id="070000"> + <class>Iperf</class> + <desc>iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile)</desc> + <iperf_args>-u -b 125M -t 60 -i 1 -fm</iperf_args> + <direction>DL</direction> + <id>idefix</id> + <iperf_packetloss_threshold>25</iperf_packetloss_threshold> + <iperf_bitrate_threshold>80</iperf_bitrate_threshold> + <iperf_profile>single-ue</iperf_profile> + </testCase> + + <testCase id="070001"> + <class>Iperf</class> + <desc>iperf (UL/8Mbps/UDP)(60 sec)(single-ue profile)</desc> + <iperf_args>-u -b 8M -t 60 -i 1 -fm</iperf_args> + <direction>UL</direction> + <id>idefix</id> + <iperf_packetloss_threshold>1</iperf_packetloss_threshold> + <iperf_bitrate_threshold>95</iperf_bitrate_threshold> + <iperf_profile>single-ue</iperf_profile> + </testCase> + + <testCase id="070002"> + <class>Iperf</class> + <desc>iperf (BIDIR TCP)(10 sec)(single-ue profile)</desc> + <iperf_args>-t 10 --bidir</iperf_args> + <direction>BIDIR</direction> + <id>idefix</id> + <iperf_profile>single-ue</iperf_profile> + </testCase> + + <testCase id="030201"> + <class>Undeploy_Object</class> + <desc>Undeploy gNB</desc> + <yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path> + <eNB_instance>0</eNB_instance> + <eNB_serverId>0</eNB_serverId> + </testCase> + +</testCaseList> + diff --git a/ci-scripts/xml_files/container_sa_b200_terminate.xml b/ci-scripts/xml_files/container_sa_b200_terminate.xml new file mode 100644 index 00000000000..5a2b6bd4543 --- /dev/null +++ b/ci-scripts/xml_files/container_sa_b200_terminate.xml @@ -0,0 +1,42 @@ +<!-- + + Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The OpenAirInterface Software Alliance licenses this file to You under + the OAI Public License, Version 1.1 (the "License"); you may not use this file + except in compliance with the License. + You may obtain a copy of the License at + + http://www.openairinterface.org/?page_id=698 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + For more information about the OpenAirInterface (OAI) Software Alliance: + contact@openairinterface.org + +--> +<testCaseList> + <htmlTabRef>TEST-SA-FR1-B200-terminate</htmlTabRef> + <htmlTabName>SA tear-down in case of problem</htmlTabName> + <htmlTabIcon>tasks</htmlTabIcon> + <repeatCount>1</repeatCount> + <TestCaseRequestedList> + 030201 + </TestCaseRequestedList> + <TestCaseExclusionList></TestCaseExclusionList> + + <testCase id="030201"> + <class>Undeploy_Object</class> + <desc>Undeploy gNB</desc> + <yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path> + <eNB_instance>1</eNB_instance> + <eNB_serverId>1</eNB_serverId> + <image_tag>sa-test</image_tag> + </testCase> + +</testCaseList> diff --git a/ci-scripts/xml_files/formatting_check.xml b/ci-scripts/xml_files/formatting_check.xml new file mode 100644 index 00000000000..bdf47af65d2 --- /dev/null +++ b/ci-scripts/xml_files/formatting_check.xml @@ -0,0 +1,37 @@ +<!-- + + Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The OpenAirInterface Software Alliance licenses this file to You under + the OAI Public License, Version 1.1 (the "License"); you may not use this file + except in compliance with the License. + You may obtain a copy of the License at + + http://www.openairinterface.org/?page_id=698 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + For more information about the OpenAirInterface (OAI) Software Alliance: + contact@openairinterface.org + +--> +<testCaseList> + <htmlTabRef>formatting-tab</htmlTabRef> + <htmlTabName>License and Formatting Checks</htmlTabName> + <htmlTabIcon>wrench</htmlTabIcon> + <TestCaseRequestedList> + 000002 + </TestCaseRequestedList> + <TestCaseExclusionList></TestCaseExclusionList> + + <testCase id="000002"> + <class>LicenceAndFormattingCheck</class> + <desc>License and Formatting Checks</desc> + </testCase> + +</testCaseList> diff --git a/ci-scripts/xml_files/fr1_5gc_closure.xml b/ci-scripts/xml_files/fr1_5gc_closure.xml new file mode 100644 index 00000000000..e5e57fa694b --- /dev/null +++ b/ci-scripts/xml_files/fr1_5gc_closure.xml @@ -0,0 +1,37 @@ +<!-- + + Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The OpenAirInterface Software Alliance licenses this file to You under + the OAI Public License, Version 1.1 (the "License"); you may not use this file + except in compliance with the License. + You may obtain a copy of the License at + + http://www.openairinterface.org/?page_id=698 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + For more information about the OpenAirInterface (OAI) Software Alliance: + contact@openairinterface.org + +--> +<testCaseList> + <htmlTabRef>5gc-closure</htmlTabRef> + <htmlTabName>5GC-Closure</htmlTabName> + <htmlTabIcon>log-out</htmlTabIcon> + <TestCaseRequestedList> +060000 + </TestCaseRequestedList> + <TestCaseExclusionList></TestCaseExclusionList> + + <testCase id="060000"> + <class>Terminate_5GCN</class> + <desc>Terminate 5GC</desc> + </testCase> + +</testCaseList> diff --git a/ci-scripts/xml_files/fr1_5gc_start.xml b/ci-scripts/xml_files/fr1_5gc_start.xml new file mode 100644 index 00000000000..8758b761cd1 --- /dev/null +++ b/ci-scripts/xml_files/fr1_5gc_start.xml @@ -0,0 +1,38 @@ +<!-- + + Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The OpenAirInterface Software Alliance licenses this file to You under + the OAI Public License, Version 1.1 (the "License"); you may not use this file + except in compliance with the License. + You may obtain a copy of the License at + + http://www.openairinterface.org/?page_id=698 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + For more information about the OpenAirInterface (OAI) Software Alliance: + contact@openairinterface.org + +--> +<testCaseList> + <htmlTabRef>5gc-start-tab</htmlTabRef> + <htmlTabName>5GC-Start</htmlTabName> + <htmlTabIcon>log-in</htmlTabIcon> + <TestCaseRequestedList> + 000100 + </TestCaseRequestedList> + <TestCaseExclusionList> + </TestCaseExclusionList> + + <testCase id="000100"> + <class>Initialize_5GCN</class> + <desc>Initialize 5GC</desc> + </testCase> + +</testCaseList> diff --git a/ci-scripts/xml_files/fr1_gnb_build.xml b/ci-scripts/xml_files/fr1_gnb_build.xml index 13d85fccc4e..1ddc5b56821 100644 --- a/ci-scripts/xml_files/fr1_gnb_build.xml +++ b/ci-scripts/xml_files/fr1_gnb_build.xml @@ -32,7 +32,7 @@ <testCase id="000001"> <class>Build_eNB</class> <desc>Build gNB</desc> - <Build_eNB_args>-w USRP -c --gNB --ninja</Build_eNB_args> + <Build_eNB_args>-w USRP -c --gNB --ninja --noavx512</Build_eNB_args> <eNB_instance>0</eNB_instance> <eNB_serverId>0</eNB_serverId> <forced_workspace_cleanup>True</forced_workspace_cleanup> diff --git a/ci-scripts/xml_files/fr1_multi_node_build.xml b/ci-scripts/xml_files/fr1_multi_node_build.xml index 60bc734e65d..2dbdfb2f9d3 100644 --- a/ci-scripts/xml_files/fr1_multi_node_build.xml +++ b/ci-scripts/xml_files/fr1_multi_node_build.xml @@ -50,7 +50,7 @@ <testCase id="000002"> <class>Build_eNB</class> <desc>Build gNB</desc> - <Build_eNB_args>-w USRP -c --gNB --ninja</Build_eNB_args> + <Build_eNB_args>-w USRP -c --gNB --ninja --noavx512</Build_eNB_args> <eNB_instance>1</eNB_instance> <eNB_serverId>1</eNB_serverId> <backgroundBuild>True</backgroundBuild> diff --git a/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml b/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml index 2ef2b7d7ce7..459a16c3237 100644 --- a/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml +++ b/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml @@ -26,6 +26,7 @@ <htmlTabIcon>tasks</htmlTabIcon> <repeatCount>1</repeatCount> <TestCaseRequestedList> + 010002 030000 040000 000002 diff --git a/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml b/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml index 335fe873a16..c8e0659330d 100644 --- a/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml +++ b/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml @@ -26,6 +26,7 @@ <htmlTabIcon>tasks</htmlTabIcon> <repeatCount>1</repeatCount> <TestCaseRequestedList> + 010002 031000 041000 000002 diff --git a/ci-scripts/xml_files/fr1_nsa_quectel.xml b/ci-scripts/xml_files/fr1_nsa_quectel.xml index 0f8c90abdf1..c72c61c0a28 100644 --- a/ci-scripts/xml_files/fr1_nsa_quectel.xml +++ b/ci-scripts/xml_files/fr1_nsa_quectel.xml @@ -26,6 +26,7 @@ <htmlTabIcon>tasks</htmlTabIcon> <repeatCount>1</repeatCount> <TestCaseRequestedList> + 010002 030000 040000 000002 @@ -34,8 +35,8 @@ 050000 050001 000001 - 070003 - 070002 + 070000 + 070001 000001 050000 050001 @@ -52,14 +53,12 @@ <UE_Trace>yes</UE_Trace> </testCase> - <testCase id="010002"> <class>Terminate_UE</class> <desc>Terminate Quectel</desc> <id>idefix</id> </testCase> - <testCase id="030000"> <class>Initialize_eNB</class> <desc>Initialize eNB</desc> @@ -70,7 +69,6 @@ <eNB_Trace>yes</eNB_Trace> </testCase> - <testCase id="040000"> <class>Initialize_eNB</class> <desc>Initialize gNB</desc> @@ -92,7 +90,6 @@ <idle_sleep_time_in_sec>20</idle_sleep_time_in_sec> </testCase> - <testCase id="050000"> <class>Ping</class> <desc>Ping: 20pings in 20sec</desc> @@ -112,39 +109,17 @@ </testCase> <testCase id="070000"> - <class>Iperf</class> - <desc>iperf (DL/30Mbps/UDP)(30 sec)(single-ue profile)</desc> - <iperf_args>-u -b 30M -t 30</iperf_args> - <direction>DL</direction> - <id>idefix</id> - <iperf_packetloss_threshold>1</iperf_packetloss_threshold> - <iperf_bitrate_threshold>95</iperf_bitrate_threshold> - <iperf_profile>single-ue</iperf_profile> - </testCase> - - <testCase id="070001"> - <class>Iperf</class> - <desc>iperf (DL/90Mbps/UDP)(30 sec)(single-ue profile)</desc> - <iperf_args>-u -b 90M -t 30</iperf_args> - <direction>DL</direction> - <id>idefix</id> - <iperf_packetloss_threshold>1</iperf_packetloss_threshold> - <iperf_bitrate_threshold>95</iperf_bitrate_threshold> - <iperf_profile>single-ue</iperf_profile> - </testCase> - - <testCase id="070002"> <class>Iperf</class> <desc>iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile)</desc> <iperf_args>-u -b 125M -t 60</iperf_args> <direction>DL</direction> <id>idefix</id> - <iperf_packetloss_threshold>1</iperf_packetloss_threshold> - <iperf_bitrate_threshold>95</iperf_bitrate_threshold> + <iperf_packetloss_threshold>25</iperf_packetloss_threshold> + <iperf_bitrate_threshold>80</iperf_bitrate_threshold> <iperf_profile>single-ue</iperf_profile> </testCase> - <testCase id="070003"> + <testCase id="070001"> <class>Iperf</class> <desc>iperf (UL/8Mbps/UDP)(60 sec)(single-ue profile)</desc> <iperf_args>-u -b 8M -t 60</iperf_args> @@ -155,7 +130,6 @@ <iperf_profile>single-ue</iperf_profile> </testCase> - <testCase id="080000"> <class>Terminate_eNB</class> <desc>Terminate eNB</desc> diff --git a/ci-scripts/xml_files/fr1_sa_quectel.xml b/ci-scripts/xml_files/fr1_sa_quectel.xml index 2b215479c24..fd983d8835b 100644 --- a/ci-scripts/xml_files/fr1_sa_quectel.xml +++ b/ci-scripts/xml_files/fr1_sa_quectel.xml @@ -26,6 +26,7 @@ <htmlTabIcon>tasks</htmlTabIcon> <repeatCount>1</repeatCount> <TestCaseRequestedList> + 010002 040000 000002 010000 diff --git a/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml b/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml index 23eaccfcfd2..f426bd60354 100644 --- a/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml +++ b/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml @@ -26,6 +26,7 @@ <htmlTabIcon>tasks</htmlTabIcon> <repeatCount>1</repeatCount> <TestCaseRequestedList> + 010002 042000 000002 010000 diff --git a/ci-scripts/xml_files/fr1_sa_quectel_stages.xml b/ci-scripts/xml_files/fr1_sa_quectel_stages.xml index 603f3f919b4..48a9b60e7db 100644 --- a/ci-scripts/xml_files/fr1_sa_quectel_stages.xml +++ b/ci-scripts/xml_files/fr1_sa_quectel_stages.xml @@ -26,6 +26,7 @@ <htmlTabIcon>tasks</htmlTabIcon> <repeatCount>1</repeatCount> <TestCaseRequestedList> + 011002 041000 000002 011000 diff --git a/ci-scripts/xml_files/gnb_phytest_usrp_run.xml b/ci-scripts/xml_files/gnb_phytest_usrp_run.xml index 5705533ab48..e7eb651d507 100644 --- a/ci-scripts/xml_files/gnb_phytest_usrp_run.xml +++ b/ci-scripts/xml_files/gnb_phytest_usrp_run.xml @@ -24,7 +24,7 @@ <htmlTabRef>gNB-PHY-Test</htmlTabRef> <htmlTabName>Run-gNB-PHY-Test</htmlTabName> <htmlTabIcon>tasks</htmlTabIcon> - <repeatCount>3</repeatCount> + <repeatCount>1</repeatCount> <TestCaseRequestedList> 090101 000001 090109 </TestCaseRequestedList> @@ -33,7 +33,7 @@ <testCase id="090101"> <class>Initialize_eNB</class> <desc>Initialize gNB USRP</desc> - <Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test -q -U 787200 -T 106 -t 28 -D 130175 -m 28 -M 106 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args> + <Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test -q -U 787200 -T 106 -t 28 -D 130175 -m 28 -M 106 --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args> <air_interface>NR</air_interface> <USRP_IPAddress>192.168.20.2</USRP_IPAddress> </testCase> diff --git a/ci-scripts/xml_files/gnb_usrp_build.xml b/ci-scripts/xml_files/gnb_usrp_build.xml index 97f85c6a339..81c7d4e24ec 100644 --- a/ci-scripts/xml_files/gnb_usrp_build.xml +++ b/ci-scripts/xml_files/gnb_usrp_build.xml @@ -34,7 +34,7 @@ <mode>TesteNB</mode> <class>Build_eNB</class> <desc>Build gNB (USRP)</desc> - <Build_eNB_args>--gNB -w USRP --ninja --cmake-opt -DBoost_INCLUDE_DIR=/usr/include/boost169</Build_eNB_args> + <Build_eNB_args>--gNB -w USRP --ninja --cmake-opt -DBoost_INCLUDE_DIR=/usr/include/boost169 --noavx512</Build_eNB_args> <forced_workspace_cleanup>True</forced_workspace_cleanup> </testCase> diff --git a/ci-scripts/xml_files/ldpc_gpu_test.xml b/ci-scripts/xml_files/ldpc_gpu_test.xml index a0191fbd768..c17bc082d5b 100644 --- a/ci-scripts/xml_files/ldpc_gpu_test.xml +++ b/ci-scripts/xml_files/ldpc_gpu_test.xml @@ -32,7 +32,7 @@ <testCase id="000001"> <class>Build_PhySim</class> <desc>Build for physical simulator</desc> - <physim_build_args>--phy_simulators --ninja</physim_build_args> + <physim_build_args>--phy_simulators --ninja --noavx512</physim_build_args> <forced_workspace_cleanup>FALSE</forced_workspace_cleanup> </testCase> diff --git a/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml b/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml index 6aa53200c85..b6388eede25 100644 --- a/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml +++ b/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml @@ -26,6 +26,7 @@ <htmlTabIcon>tasks</htmlTabIcon> <repeatCount>1</repeatCount> <TestCaseRequestedList> + 010002 030000 000002 010000 @@ -88,7 +89,7 @@ <id>nrmodule2_quectel</id> <ping_args>-c 20</ping_args> <ping_packetloss_threshold>1</ping_packetloss_threshold> - <ping_rttavg_threshold>40</ping_rttavg_threshold> + <ping_rttavg_threshold>60</ping_rttavg_threshold> </testCase> <testCase id="050001"> <class>Ping</class> @@ -96,7 +97,7 @@ <id>nrmodule2_quectel</id> <ping_args>-c 100 -s 1024 -i 0,2</ping_args> <ping_packetloss_threshold>1</ping_packetloss_threshold> - <ping_rttavg_threshold>40</ping_rttavg_threshold> + <ping_rttavg_threshold>60</ping_rttavg_threshold> </testCase> diff --git a/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml b/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml index 84aa87aa235..99c8f75e06f 100644 --- a/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml +++ b/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml @@ -26,6 +26,7 @@ <htmlTabIcon>tasks</htmlTabIcon> <repeatCount>1</repeatCount> <TestCaseRequestedList> + 010002 030001 000002 010000 @@ -88,7 +89,7 @@ <id>nrmodule2_quectel</id> <ping_args>-c 20</ping_args> <ping_packetloss_threshold>1</ping_packetloss_threshold> - <ping_rttavg_threshold>40</ping_rttavg_threshold> + <ping_rttavg_threshold>60</ping_rttavg_threshold> </testCase> <testCase id="050003"> <class>Ping</class> @@ -96,7 +97,7 @@ <id>nrmodule2_quectel</id> <ping_args>-c 100 -s 1024 -i 0,2</ping_args> <ping_packetloss_threshold>1</ping_packetloss_threshold> - <ping_rttavg_threshold>40</ping_rttavg_threshold> + <ping_rttavg_threshold>60</ping_rttavg_threshold> </testCase> diff --git a/ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml b/ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml new file mode 100644 index 00000000000..9ea52c12477 --- /dev/null +++ b/ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml @@ -0,0 +1,44 @@ +version: '3.8' + +services: + gnb_mono_tdd: + image: oai-gnb:latest + privileged: true + container_name: sa-b200-gnb + environment: + USE_SA_TDD_MONO_B2XX: 'yes' + USE_B2XX: 'yes' + GNB_NAME: gNB-in-docker + MCC: '222' + MNC: '01' + MNC_LENGTH: 2 + TAC: 1 + NSSAI_SST: 1 + NSSAI_SD0: 1 + AMF_IP_ADDRESS: 172.21.16.136 + GNB_NGA_IF_NAME: eth0 + GNB_NGA_IP_ADDRESS: 192.168.68.194 + GNB_NGU_IF_NAME: eth0 + GNB_NGU_IP_ADDRESS: 192.168.68.194 + USE_ADDITIONAL_OPTIONS: --sa -E -q --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx --log_config.global_log_options level,nocolor,time,line_num,function + volumes: + - /dev:/dev + networks: + public_net: + ipv4_address: 192.168.68.194 + #entrypoint: /bin/bash -c "sleep infinity" + healthcheck: + # pgrep does NOT work + test: /bin/bash -c "ps aux | grep -v grep | grep -c softmodem" + interval: 10s + timeout: 5s + retries: 5 + +networks: + public_net: + name: sa-b200-gnb-net + ipam: + config: + - subnet: 192.168.68.192/26 + driver_opts: + com.docker.network.bridge.name: "sa-gnb-net" diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 99d94b6a672..2145376fcf5 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -203,17 +203,23 @@ if (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l") else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l") if(EXISTS "/proc/cpuinfo") file(STRINGS "/proc/cpuinfo" CPUINFO REGEX flags LIMIT_COUNT 1) - if (CPUINFO MATCHES "avx2") - set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2") + message("NOAVX512 is ${NOAVX512}") + if (CPUINFO MATCHES "avx512bw" AND "${NOAVX512}" STREQUAL "False") + set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx512bw -march=skylake-avx512 -mtune=skylake-avx512 " ) set(COMPILATION_AVX2 "True") else() - set(COMPILATION_AVX2 "False") - endif() - if (CPUINFO MATCHES "sse4_1") - set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1 -mpclmul") - endif() - if (CPUINFO MATCHES "ssse3") - set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mssse3") + if (CPUINFO MATCHES "avx2") + set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2") + set(COMPILATION_AVX2 "True") + else() + set(COMPILATION_AVX2 "False") + endif() + if (CPUINFO MATCHES "sse4_1") + set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1 -mpclmul") + endif() + if (CPUINFO MATCHES "ssse3") + set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mssse3") + endif() endif() else() Message("/proc/cpuinfo does not exit. We will use manual CPU flags") @@ -224,11 +230,11 @@ set(C_FLAGS_PROCESSOR " ${C_FLAGS_PROCESSOR} ${CFLAGS_PROCESSOR_USER}") Message("C_FLAGS_PROCESSOR is ${C_FLAGS_PROCESSOR}") -if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86") - if ( (NOT( C_FLAGS_PROCESSOR MATCHES "ssse3")) OR (NOT( C_FLAGS_PROCESSOR MATCHES "msse4.1")) ) - Message(FATAL_ERROR "For x86 Architecture, you must have following flags: -mssse3 -msse4.1. The current detected flags are: ${C_FLAGS_PROCESSOR}. You can pass the flags manually in build script, for example: ./build_oai --cflags_processor \"-mssse3 -msse4.1 -mavx2\" ") - endif() -endif() +#if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86") +# if ( (NOT( C_FLAGS_PROCESSOR MATCHES "ssse3")) OR (NOT( C_FLAGS_PROCESSOR MATCHES "msse4.1")) ) +# Message(FATAL_ERROR "For x86 Architecture, you must have following flags: -mssse3 -msse4.1. The current detected flags are: ${C_FLAGS_PROCESSOR}. You can pass the flags manually in build script, for example: ./build_oai --cflags_processor \"-mssse3 -msse4.1 -mavx2\" ") +# endif() +#endif() # # add autotools definitions that were maybe used! @@ -247,6 +253,28 @@ add_boolean_option(SANITIZE_ADDRESS False "enable the address sanitizer (ASan)") if (SANITIZE_ADDRESS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fno-common") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fno-common") + # There seems to be some incompatibility with pthread_create and the RT scheduler, which + # results in pthread_create hanging. + # + # When we switch from Ubuntu 16.04 to 18.04, we found that running with the address sanitizer, + # the pthread_create function calls were not working. The inital thought was that we were + # trying to create a thread that was not-blocking and would eventually crash the machine during + # the run. After more debugging, we found that we would never even start the thread. We narrowed + # down the first two instances of pthread_create in the gNB and NR UE to be sctp_eNB_task and + # one_thread, respectively. We found that adding sleeps, and various other pauses to the threads + # had not effect. From there, we found that if we add an abort(); prior to the thread loop, we + # do not execute that. This indicated to us that the problem is not likely to be a non-blocking + # thread, but perhaps and issue with pthread_create itself. From there we begain to research the + # issue on the web. See: https://github.com/google/sanitizers/issues/1125 + # + # Google searching indicates this appears to be a problem since at least 2018. This could be something + # wrong in the pthread library, or something subtly wrong in this CMakeLists.txt. Use Ubuntu 20.04 instead. +endif () + +add_boolean_option(SANITIZE_UNDEFINED False "enable the undefined behavior sanitizer (UBSan)") +if (SANITIZE_UNDEFINED) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all") endif () add_definitions("-DASN_DISABLE_OER_SUPPORT") @@ -1410,8 +1438,11 @@ set(PHY_NR_CODINGIF ) add_library(ldpc_orig MODULE ${PHY_LDPC_ORIG_SRC} ) +target_link_libraries(ldpc_orig PRIVATE ldpc_gen_HEADERS) add_library(ldpc_optim MODULE ${PHY_LDPC_OPTIM_SRC} ) +target_link_libraries(ldpc_optim PRIVATE ldpc_gen_HEADERS) add_library(ldpc_optim8seg MODULE ${PHY_LDPC_OPTIM8SEG_SRC} ) +target_link_libraries(ldpc_optim8seg PRIVATE ldpc_gen_HEADERS) add_library(ldpc_cl MODULE ${PHY_LDPC_CL_SRC} ) target_link_libraries(ldpc_cl OpenCL) add_dependencies(ldpc_cl nrLDPC_decoder_kernels_CL) @@ -1423,6 +1454,7 @@ if (CUDA_FOUND) endif (CUDA_FOUND) add_library(ldpc MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} ) +target_link_libraries(ldpc PRIVATE ldpc_gen_HEADERS) add_library(coding MODULE ${PHY_TURBOSRC} ) @@ -1568,9 +1600,10 @@ set(PHY_SRC_UE set(PHY_NR_SRC_COMMON ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prach_common.c - ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c + ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_csi_rs.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_scrambling.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/scrambling_luts.c + ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c ) set(PHY_NR_SRC @@ -1595,7 +1628,6 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_dmrs_rx.c - ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_csi_rs.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gen_mod_table.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/dmrs_nr.c @@ -1643,6 +1675,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_tools_nr.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/pucch_nr.c + ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/csi_rx.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_uci_tools_common.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c @@ -1804,7 +1837,15 @@ set(NR_PDCP_SRC ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_timer_thread.c ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_security_nea2.c ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c + ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c ${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c + #hack: include these files to compile the nr phy simulators + #these files should not be here, will be removed at some point when the + #computation is done directly inside nr_pdcp_integrity_nia1.c instead + #of reusing code of osa_stream_eia.c + ${OPENAIR2_DIR}/UTIL/OSA/osa_stream_eia.c + ${OPENAIR2_DIR}/UTIL/OSA/osa_snow3g.c + ${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c ) set(NR_SDAP_SRC @@ -1952,6 +1993,7 @@ set (MAC_SRC_UE set (MAC_NR_SRC_UE ${NR_UE_PHY_INTERFACE_DIR}/NR_IF_Module.c + ${NR_UE_PHY_INTERFACE_DIR}/NR_Packet_Drop.c ${NR_UE_MAC_DIR}/config_ue.c ${NR_UE_MAC_DIR}/mac_vars.c ${NR_UE_MAC_DIR}/main_ue_nr.c @@ -2869,6 +2911,7 @@ target_link_libraries(ldpctest add_executable(nr_dlschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c + ${OPENAIR_DIR}/executables/softmodem-common.c ${T_SOURCE} ${SHLIB_LOADER_SOURCES} ) @@ -2892,6 +2935,7 @@ target_link_libraries(nr_pbchsim add_executable(nr_pucchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c + ${OPENAIR_DIR}/executables/softmodem-common.c ${T_SOURCE} ${SHLIB_LOADER_SOURCES} ) @@ -2936,6 +2980,7 @@ target_link_libraries(nr_prachsim add_executable(nr_ulschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c + ${OPENAIR_DIR}/executables/softmodem-common.c ${PHY_INTERFACE_DIR}/queue_t.c ${T_SOURCE} ${SHLIB_LOADER_SOURCES} @@ -3177,3 +3222,4 @@ ADD_CUSTOM_TARGET(oarf ) include (${OPENAIR_DIR}/common/utils/telnetsrv/telnetsrv_CMakeLists.txt) +include(${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index b55228bdc92..88654ac9b54 100755 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1062,7 +1062,8 @@ (Test3: PBCH-only, 217 PRB), (Test4: PBCH and synchronization, 217 RPB), (Test5: PBCH-only, 273 PRB), - (Test6: PBCH and synchronization, 273 PRB)</desc> + (Test6: PBCH and synchronization, 273 PRB), + (Test7: PBCH and synchronization, 106PBR, SSB SC OFFSET 6)</desc> <pre_compile_prog></pre_compile_prog> <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog> <compile_prog_args> --phy_simulators -c </compile_prog_args> @@ -1074,8 +1075,9 @@ -s-11 -S-8 -n10 -R217 -s-11 -S-8 -n10 -o8000 -I -R217 -s-11 -S-8 -n10 -R273 - -s-11 -S-8 -n10 -o8000 -I -R273</main_exec_args> - <tags>nr_pbchsim.test1 nr_pbchsim.test2 nr_pbchsim.test3 nr_pbchsim.test4 nr_pbchsim.test5 nr_pbchsim.test6</tags> + -s-11 -S-8 -n10 -o8000 -I -R273 + -s-11 -S-8 -n10 -R106 -O6</main_exec_args> + <tags>nr_pbchsim.test1 nr_pbchsim.test2 nr_pbchsim.test3 nr_pbchsim.test4 nr_pbchsim.test5 nr_pbchsim.test6 nr_pbchsim.test7</tags> <search_expr_true>PBCH test OK</search_expr_true> <search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false> <nruns>3</nruns> @@ -1104,7 +1106,9 @@ (Test19: Mapping type A, 3 DMRS Symbols), (Test20: Mapping type B, 4 DMRS Symbols), (Test21: 4x4 MIMO, 1 Layer), - (Test22: 4x4 MIMO, 2 Layers)</desc> + (Test22: 4x4 MIMO, 2 Layers), + (Test23: 25 PRBs, 15 kHz SCS) + (Test24: MCS 0, low SNR performance)</desc> <pre_compile_prog></pre_compile_prog> <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog> <compile_prog_args> --phy_simulators -c </compile_prog_args> @@ -1132,8 +1136,10 @@ -n100 -s2 -U 2 0 2 -n100 -s2 -U 2 1 3 -n10 -s20 -U 3 0 0 2 -gR -x1 -y4 -z4 - -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4</main_exec_args> - <tags>nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22</tags> + -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4 + -n100 -m0 -e0 -R25 -b25 -i 2 1 0 + -n100 -e0 -t95 -S-1.0 -i 2 1 0</main_exec_args> + <tags>nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22 nr_dlsim.test23 nr_dlsim.test24</tags> <search_expr_true>PDSCH test OK</search_expr_true> <search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false> <nruns>3</nruns> @@ -1184,9 +1190,10 @@ <testCase id="015108"> <class>execution</class> - <desc>nr_ulschsim Test cases. (Test1: 106 PRB), - (Test2: 217 PRB), - (Test3: 273 PRB)</desc> + <desc>nr_ulschsim Test cases. (Test1: 106 PRBs), + (Test2: 217 PRBs), + (Test3: 273 PRBs) + (Test4: 106 PRBs 4-layer MIMO)</desc> <pre_compile_prog></pre_compile_prog> <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog> <compile_prog_args> --phy_simulators -c </compile_prog_args> @@ -1195,8 +1202,9 @@ <main_exec> $OPENAIR_DIR/targets/bin/nr_ulschsim.Rel15</main_exec> <main_exec_args>-R 106 -m9 -s13 -n100 -R 217 -m15 -s15 -n100 - -R 273 -m19 -s20 -n100</main_exec_args> - <tags>nr_ulschsim.test1 nr_ulschsim.test2 nr_ulschsim.test3</tags> + -R 273 -m19 -s20 -n100 + -R 106 -m9 -s13 -n100 -y4 -z4 -W4</main_exec_args> + <tags>nr_ulschsim.test1 nr_ulschsim.test2 nr_ulschsim.test3 nr_ulschsim.test4</tags> <search_expr_true>PUSCH test OK</search_expr_true> <search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false> <nruns>3</nruns> @@ -1304,7 +1312,14 @@ (Test12: SC-FDMA, 216 PRBs), (Test13: SC-FDMA, 273 PRBs), (Test14: SC-FDMA, 3 DMRS), - (Test15: MCS 16 50 PRBs 2 RX_Antenna)</desc> + (Test15: MCS 19 50 PRBs 2 RX_Antenna), + (Test16: MCS 9 106 PRBs MIMO 2 layers), + (Test17: MCS 9 106 PRBs MIMO 4 layers), + (Test18: 25 PRBs, 15 kHz SCS), + (Test19: 3GPP G-FR1-A4-13 2 RX Antennas Requirements Test), + (Test20: 3GPP G-FR1-A4-13 4 RX Antennas Requirements Test), + (Test21: 3GPP G-FR1-A4-13 8 RX Antennas Requirements Test), + (Test22: MCS 0, low SNR performance)</desc> <pre_compile_prog></pre_compile_prog> <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog> <compile_prog_args> --phy_simulators -c </compile_prog_args> @@ -1316,18 +1331,24 @@ -n100 -m28 -s20 -n100 -m9 -R217 -r217 -s5 -n100 -m9 -R273 -r273 -s5 - -n100 -s5 -U 2 0 1 - -n100 -s5 -T 2 1 2 -U 2 0 2 - -n100 -s5 -T 2 2 2 -U 2 1 2 - -n100 -s5 -a4 -b8 -T 2 1 2 -U 2 1 3 + -n100 -s5 -U 4 0 1 1 1 + -n100 -s5 -T 2 1 2 -U 4 0 2 1 1 + -n100 -s5 -T 2 2 2 -U 4 1 2 1 1 + -n100 -s5 -a4 -b8 -T 2 1 2 -U 4 1 3 1 1 -n100 -s5 -Z -n100 -s5 -Z -r75 -n50 -s5 -Z -r216 -R217 -n50 -s5 -Z -r270 -R273 - -n100 -s5 -Z -U 2 0 2 - -n100 -m16 -s10 -z2</main_exec_args> - - <tags>nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14 nr_ulsim.test15</tags> + -n100 -s5 -Z -U 4 0 2 1 2 + -n100 -m19 -s10 -S15 -z2 + -n100 -m9 -r106 -s10 -W2 -y2 -z2 + -n100 -m9 -r106 -s20 -W4 -y4 -z4 + -n100 -u0 -m0 -R25 -r25 -i 2 1 0 + -m16 -r106 -s8.8 -S9.4 -z2 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0 + -m16 -r106 -s5.4 -S6 -z4 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0 + -m16 -r106 -s3.4 -S3.8 -z8 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0 + -n100 -m0 -S -0.6 -i 2 1 0</main_exec_args> + <tags>nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14 nr_ulsim.test15 nr_ulsim.test16 nr_ulsim.test17 nr_ulsim.test18 nr_ulsim.test19 nr_ulsim.test20 nr_ulsim.test21 nr_ulsim.test22</tags> <search_expr_true>PUSCH test OK</search_expr_true> <search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false> <nruns>3</nruns> @@ -1338,10 +1359,11 @@ <desc>nr_prachsim Test cases. (Test1: 30kHz SCS, 106 PRBs, Prach format A2), (Test2: 30kHz SCS, 217 PRBs, Prach format A2), (Test3: 30kHz SCS, 273 PRBs, Prach format A2), - (Test4: 30kHz SCS, 106 PRBs, Prach format 0), + (Test4: 30kHz SCS, 106 PRBs, Prach format 0), (Test5: 120kHz SCS, 32 PRBs, Prach format A2), (Test6: 120kHz SCS, 66 PRBs, Prach format A2), - (Test7: 120kHz SCS, 66 PRBs, High Speed Enabled)</desc> + (Test7: 120kHz SCS, 66 PRBs, High Speed Enabled), + (Test8: 15kHz SCS, 25 PRBs)</desc> <pre_compile_prog></pre_compile_prog> <compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog> <compile_prog_args> --phy_simulators -c </compile_prog_args> @@ -1351,11 +1373,12 @@ <main_exec_args>-a -s -30 -n 100 -p 63 -R 106 -a -s -30 -n 100 -p 63 -R 217 -a -s -30 -n 100 -p 63 -R 273 - -a -s -30 -n 100 -p 63 -R 106 -c 4 - -a -s -30 -n 100 -p 32 -R 32 -m 3 -c52 - -a -s -30 -n 100 -p 32 -R 66 -m 3 -c52 - -a -s -30 -n 100 -R 66 -m 3 -c52 -H</main_exec_args> - <tags>nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4 nr_prachsim.test5 nr_prachsim.test6 nr_prachsim.test7</tags> + -a -s -30 -n 100 -p 63 -R 106 -c 4 + -a -s -30 -n 100 -p 32 -R 32 -m 3 -c52 + -a -s -30 -n 100 -p 32 -R 66 -m 3 -c52 + -a -s -30 -n 100 -R 66 -m 3 -c52 -H + -a -s -30 -n 100 -p 99 -R 25 -m 0</main_exec_args> + <tags>nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4 nr_prachsim.test5 nr_prachsim.test6 nr_prachsim.test7 nr_prachsim.test8</tags> <search_expr_true>PRACH test OK</search_expr_true> <search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false> <nruns>3</nruns> diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 5cafb95cba6..16a0d559dd7 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -55,6 +55,7 @@ BUILD_COVERITY_SCAN=0 DISABLE_HARDWARE_DEPENDENCY="False" CMAKE_BUILD_TYPE="RelWithDebInfo" CMAKE_CMD="$CMAKE" +NOAVX512="False" BUILD_ECLIPSE=0 NR="False" OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope" @@ -164,12 +165,18 @@ Options: Build optional shared library, <libraries> can be one or several of $OPTIONAL_LIBRARIES or \"all\" --usrp-recplay Build for I/Q record-playback modes +--noavx512 + Build without AVX512 if it is present on CPU -k | --skip-shared-libraries Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes --ninja Tell cmake to use the Ninja build system. Without, will generate make files +--sanitize + Shortcut for usage of --sanitize-address --sanitize-undefined --sanitize-address | -fsanitize=address - Enable the address sanitizer on all targets + Enable the address sanitizer on all targets +--sanitize-undefined | -fsanitize=undefined + Enable the undefined behavior sanitizer on all targets --ittiSIM Makes the itti simulator -h | --help @@ -436,6 +443,10 @@ function main() { fi fi shift 2;; + --noavx512) + NOAVX512="True" + echo_info "Disabling AVX512" + shift 1;; -k | --skip-shared-libraries) SKIP_SHARED_LIB_FLAG="True" echo_info "Skipping build of shared libraries, rfsimulator and transport protocol libraries" @@ -444,9 +455,16 @@ function main() { CMAKE_CMD="$CMAKE_CMD -GNinja" MAKE_CMD=ninja shift;; + --sanitize) + CMAKE_CMD="$CMAKE_CMD -DSANITIZE_ADDRESS=True -DSANITIZE_UNDEFINED=True" + shift;; --sanitize-address | -fsanitize=address) + grep -sq "Ubuntu 18.04" /etc/os-release && echo_error "Bug in OS with this option, see CMakeLists.txt" CMAKE_CMD="$CMAKE_CMD -DSANITIZE_ADDRESS=True" shift;; + --sanitize-undefined | -fundefined=address) + CMAKE_CMD="$CMAKE_CMD -DSANITIZE_UNDEFINED=True" + shift;; --ittiSIM) ittiSIM=1 CMAKE_CMD="$CMAKE_CMD -DITTI_SIM=True" @@ -624,6 +642,7 @@ function main() { cd $DIR/$BUILD_DIR/build if [[ ${#CMAKE_C_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_C_FLAGS=\"${CMAKE_C_FLAGS[*]}\""; fi if [[ ${#CMAKE_CXX_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_CXX_FLAGS=\"${CMAKE_CXX_FLAGS[*]}\""; fi + CMAKE_CMD="$CMAKE_CMD -DNOAVX512=\"${NOAVX512[*]}\"" echo_info "running $CMAKE_CMD" eval $CMAKE_CMD ../.. @@ -713,11 +732,11 @@ function main() { # simlist="ldpctest" for f in $simlist ; do compilations \ - ran_build $f \ + $BUILD_DIR $f \ $f $dbin/$f.$REL done compilations \ - ran_build coding \ + $BUILD_DIR coding \ libcoding.so $dbin/libcoding.so fi @@ -729,7 +748,7 @@ function main() { simlist="secu_knas_encrypt_eia1 secu_kenb aes128_ctr_encrypt aes128_ctr_decrypt secu_knas_encrypt_eea2 secu_knas secu_knas_encrypt_eea1 kdf aes128_cmac_encrypt secu_knas_encrypt_eia2" for f in $simlist ; do compilations \ - ran_build test_$f \ + $BUILD_DIR test_$f \ test_$f $dbin/test_$f.$REL done fi diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 554f3ccfe52..d35f90fcce2 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -109,6 +109,7 @@ check_supported_distribution() { "ubuntu18.04") return 0 ;; "ubuntu16.04") return 0 ;; "fedora35") return 0 ;; + "fedora36") return 0 ;; "rhel7") return 0 ;; "rhel7.6") return 0 ;; "rhel7.7") return 0 ;; @@ -196,8 +197,8 @@ check_warnings() { #argument: # $1: log file check_errors() { - #we look for 'warning:' in the compilation log file - error_count=`grep "error:" "$1" | wc -l` + #we look for 'error:' in the compilation log file + error_count=`grep -c "error:" "$1"` if [ $error_count -gt 0 ]; then echo_error "ERROR: $error_count error. See $1" fi @@ -381,7 +382,7 @@ check_install_usrp_uhd_driver(){ $SUDO apt-get remove libuhd3.14.1 -y || true $SUDO apt-get remove libuhd3.15.0 -y || true local distribution=$(get_distribution_release) - if [[ "$distribution" == "ubuntu18.04" ]]; then + if [[ "$distribution" == "ubuntu18.04" || "$distribution" == "ubuntu20.04" || "$distribution" == "ubuntu22.04" ]]; then $SUDO apt-get remove libuhd4.0.0 -y || true $SUDO apt-get remove libuhd4.1.0 -y || true fi @@ -410,13 +411,15 @@ check_install_usrp_uhd_driver(){ x=$((x + 1)) done $SUDO apt-get update - $SUDO apt-get -y install python python-tk libboost-all-dev libusb-1.0-0-dev - if [[ "$distribution" == "ubuntu16.04" ]]; then + $SUDO apt-get -y install python-tk libboost-all-dev libusb-1.0-0-dev + case "$(get_distribution_release)" in + "ubuntu16.04") $SUDO apt-get -y install libuhd-dev libuhd3.15.0 uhd-host - fi - if [[ "$distribution" == "ubuntu18.04" ]]; then - $SUDO apt-get -y install libuhd-dev libuhd4.1.0 uhd-host - fi + ;; + "ubuntu18.04" | "ubuntu20.04" | "ubuntu22.04") + $SUDO apt-get -y install libuhd-dev libuhd4.2.0 uhd-host + ;; + esac elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then if [ $IS_CONTAINER -eq 0 ] then @@ -621,7 +624,6 @@ check_install_additional_tools (){ android-tools-adb \ wvdial \ sshpass \ - nscd \ bc \ ntp" elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then @@ -646,7 +648,6 @@ check_install_additional_tools (){ wvdial \ numpy \ sshpass \ - nscd \ python2-paramiko \ python-pyroute2 \ python-netifaces \ @@ -674,7 +675,6 @@ check_install_additional_tools (){ wvdial \ python-numpy \ sshpass \ - nscd \ python-paramiko \ python-pyroute2 \ python-netifaces \ diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c index 0aeeaf3afdd..6add03c324d 100644 --- a/common/utils/nr/nr_common.c +++ b/common/utils/nr/nr_common.c @@ -191,65 +191,17 @@ int PRBalloc_to_locationandbandwidth(int NPRB,int RBstart) { return(PRBalloc_to_locationandbandwidth0(NPRB,RBstart,275)); } -/// Target code rate tables indexed by Imcs -/* TS 38.214 table 5.1.3.1-1 - MCS index table 1 for PDSCH */ -uint16_t nr_target_code_rate_table1[29] = {120, 157, 193, 251, 308, 379, 449, 526, 602, 679, 340, 378, 434, 490, 553, \ - 616, 658, 438, 466, 517, 567, 616, 666, 719, 772, 822, 873, 910, 948}; - -/* TS 38.214 table 5.1.3.1-2 - MCS index table 2 for PDSCH */ -// Imcs values 20 and 26 have been multiplied by 2 to avoid the floating point -uint16_t nr_target_code_rate_table2[28] = {120, 193, 308, 449, 602, 378, 434, 490, 553, 616, 658, 466, 517, 567, \ - 616, 666, 719, 772, 822, 873, 1365, 711, 754, 797, 841, 885, 1833, 948}; - -/* TS 38.214 table 5.1.3.1-3 - MCS index table 3 for PDSCH */ -uint16_t nr_target_code_rate_table3[29] = {30, 40, 50, 64, 78, 99, 120, 157, 193, 251, 308, 379, 449, 526, 602, 340, \ - 378, 434, 490, 553, 616, 438, 466, 517, 567, 616, 666, 719, 772}; - -uint16_t nr_tbs_table[93] = {24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 208, 224, 240, 256, 272, 288, 304, 320, \ - 336, 352, 368, 384, 408, 432, 456, 480, 504, 528, 552, 576, 608, 640, 672, 704, 736, 768, 808, 848, 888, 928, 984, 1032, 1064, 1128, 1160, 1192, 1224, 1256, \ - 1288, 1320, 1352, 1416, 1480, 1544, 1608, 1672, 1736, 1800, 1864, 1928, 2024, 2088, 2152, 2216, 2280, 2408, 2472, 2536, 2600, 2664, 2728, 2792, 2856, 2976, \ - 3104, 3240, 3368, 3496, 3624, 3752, 3824}; - -uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx) { - switch(table_idx) { - case 1: - return (((Imcs<10)||(Imcs==29))?2:((Imcs<17)||(Imcs==30))?4:((Imcs<29)||(Imcs==31))?6:-1); - break; - - case 2: - return (((Imcs<5)||(Imcs==28))?2:((Imcs<11)||(Imcs==29))?4:((Imcs<20)||(Imcs==30))?6:((Imcs<28)||(Imcs==31))?8:-1); - break; - - case 3: - return (((Imcs<15)||(Imcs==29))?2:((Imcs<21)||(Imcs==30))?4:((Imcs<29)||(Imcs==31))?6:-1); - break; - - default: - AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx); - return(0); - break; - } -} +int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs) { -uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) { - switch(table_idx) { - case 1: - return (nr_target_code_rate_table1[Imcs]); - break; - - case 2: - return (nr_target_code_rate_table2[Imcs]); - break; - - case 3: - return (nr_target_code_rate_table3[Imcs]); - break; - - default: - AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx); - return(0); - break; + int f; // interleaving function + if(R==0) + f = k; + else { + int c = k/R; + int r = k%R; + f = (r*C + c + n_shift)%(N_regs/L); } + return f; } void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset) { @@ -503,7 +455,6 @@ int get_nr_table_idx(int nr_bandP, uint8_t scs_index) { return i; } - int get_subband_size(int NPRB,int size) { // implements table 5.2.1.4-2 from 36.214 // diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h index a09532a5652..5f7f670ce92 100644 --- a/common/utils/nr/nr_common.h +++ b/common/utils/nr/nr_common.h @@ -57,7 +57,7 @@ static inline int get_num_dmrs(uint16_t dmrs_mask ) { return(num_dmrs); } - +int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs); int get_SLIV(uint8_t S, uint8_t L); void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset); uint16_t config_bandwidth(int mu, int nb_rb, int nr_band); @@ -69,12 +69,6 @@ int NRRIV2BW(int locationAndBandwidth,int N_RB); int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB); int PRBalloc_to_locationandbandwidth0(int NPRB,int RBstart,int BWPsize); int PRBalloc_to_locationandbandwidth(int NPRB,int RBstart); -extern uint16_t nr_target_code_rate_table1[29]; -extern uint16_t nr_target_code_rate_table2[28]; -extern uint16_t nr_target_code_rate_table3[29]; -extern uint16_t nr_tbs_table[93]; -uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx); -uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx); int get_subband_size(int NPRB,int size); void SLIV2SL(int SLIV,int *S,int *L); int get_dmrs_port(int nl, uint16_t dmrs_ports); diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp index 44fae9f7888..43001ec95b2 100644 --- a/common/utils/ocp_itti/intertask_interface.cpp +++ b/common/utils/ocp_itti/intertask_interface.cpp @@ -450,6 +450,7 @@ extern "C" { void itti_wait_tasks_end(void) { shutting_down = false; signal(SIGTERM, catch_sigterm); + //signal(SIGINT, catch_sigterm); while (! shutting_down) { sleep(24 * 3600); diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h index d06f2195ee7..e448117385a 100644 --- a/common/utils/threadPool/thread-pool.h +++ b/common/utils/threadPool/thread-pool.h @@ -80,7 +80,7 @@ static inline notifiedFIFO_elt_t *newNotifiedFIFO_elt(int size, notifiedFIFO_t *reponseFifo, void (*processingFunc)(void *)) { notifiedFIFO_elt_t *ret; - AssertFatal( NULL != (ret=(notifiedFIFO_elt_t *) malloc(sizeof(notifiedFIFO_elt_t)+size+32)), ""); + AssertFatal( NULL != (ret=(notifiedFIFO_elt_t *) calloc(1, sizeof(notifiedFIFO_elt_t)+size+32)), ""); ret->next=NULL; ret->key=key; ret->reponseFifo=reponseFifo; diff --git a/common/utils/time_meas.c b/common/utils/time_meas.c index df2bfd64de3..9d1215b5e5b 100644 --- a/common/utils/time_meas.c +++ b/common/utils/time_meas.c @@ -111,13 +111,15 @@ void print_meas(time_stats_t *ts, } } -int print_meas_log(time_stats_t *ts, - const char *name, - time_stats_t *total_exec_time, - time_stats_t *sf_exec_time, - char *output) +size_t print_meas_log(time_stats_t *ts, + const char *name, + time_stats_t *total_exec_time, + time_stats_t *sf_exec_time, + char *output, + size_t outputlen) { - int stroff = 0; + const char *begin = output; + const char *end = output + outputlen; static int first_time = 0; static double cpu_freq_GHz = 0.0; @@ -128,30 +130,49 @@ int print_meas_log(time_stats_t *ts, first_time=1; if ((total_exec_time == NULL) || (sf_exec_time== NULL)) - stroff += sprintf(output, "%25s %25s %25s %25s %25s %6f\n","Name","Total","Per Trials", "Num Trials","CPU_F_GHz", cpu_freq_GHz); + output += snprintf(output, + end - output, + "%25s %25s %25s %25s %25s %6f\n", + "Name", + "Total", + "Per Trials", + "Num Trials", + "CPU_F_GHz", + cpu_freq_GHz); else - stroff += sprintf(output+stroff, "%25s %25s %25s %20s %15s %6f\n","Name","Total","Average/Frame","Trials", "CPU_F_GHz", cpu_freq_GHz); + output += snprintf(output, + end - output, + "%25s %25s %25s %20s %15s %6f\n", + "Name", + "Total", + "Average/Frame", + "Trials", + "CPU_F_GHz", + cpu_freq_GHz); } if (ts->trials>0) { - //printf("%20s: total: %10.3f ms, average: %10.3f us (%10d trials)\n", name, ts->diff/cpu_freq_GHz/1000000.0, ts->diff/ts->trials/cpu_freq_GHz/1000.0, ts->trials); if ((total_exec_time == NULL) || (sf_exec_time== NULL)) { - stroff += sprintf(output+stroff, "%25s: %15.3f us; %15d; %15.3f us;\n", - name, - (ts->diff/ts->trials/cpu_freq_GHz/1000.0), - ts->trials, - ts->max/cpu_freq_GHz/1000.0); + output += snprintf(output, + end - output, + "%25s: %15.3f us; %15d; %15.3f us;\n", + name, + ts->diff / ts->trials / cpu_freq_GHz / 1000.0, + ts->trials, + ts->max / cpu_freq_GHz / 1000.0); } else { - stroff += sprintf(output+stroff, "%25s: %15.3f ms (%5.2f%%); %15.3f us (%5.2f%%); %15d;\n", - name, - (ts->diff/cpu_freq_GHz/1000000.0), - ((ts->diff/cpu_freq_GHz/1000000.0)/(total_exec_time->diff/cpu_freq_GHz/1000000.0))*100, // percentage - (ts->diff/ts->trials/cpu_freq_GHz/1000.0), - ((ts->diff/ts->trials/cpu_freq_GHz/1000.0)/(sf_exec_time->diff/sf_exec_time->trials/cpu_freq_GHz/1000.0))*100, // percentage - ts->trials); + output += snprintf(output, + end - output, + "%25s: %15.3f ms (%5.2f%%); %15.3f us (%5.2f%%); %15d;\n", + name, + ts->diff / cpu_freq_GHz / 1000000.0, + ((ts->diff / cpu_freq_GHz / 1000000.0) / (total_exec_time->diff / cpu_freq_GHz / 1000000.0))*100, // percentage + ts->diff / ts->trials / cpu_freq_GHz / 1000.0, + ((ts->diff / ts->trials / cpu_freq_GHz / 1000.0) / (sf_exec_time->diff / sf_exec_time->trials / cpu_freq_GHz / 1000.0)) * 100, // percentage + ts->trials); } } - return stroff; + return output - begin; } double get_time_meas_us(time_stats_t *ts) diff --git a/common/utils/time_meas.h b/common/utils/time_meas.h index 382dd7455a0..eb81d09434c 100644 --- a/common/utils/time_meas.h +++ b/common/utils/time_meas.h @@ -62,7 +62,7 @@ typedef struct time_stats { oai_cputime_t in; /*!< \brief time at measure starting point */ oai_cputime_t diff; /*!< \brief average difference between time at starting point and time at endpoint*/ oai_cputime_t p_time; /*!< \brief absolute process duration */ - oai_cputime_t diff_square; /*!< \brief process duration square */ + double diff_square; /*!< \brief process duration square */ oai_cputime_t max; /*!< \brief maximum difference between time at starting point and time at endpoint*/ int trials; /*!< \brief number of start point - end point iterations */ int meas_flag; /*!< \brief 1: stop_meas not called (consecutive calls of start_meas) */ @@ -83,7 +83,12 @@ static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline)); void print_meas_now(time_stats_t *ts, const char *name, FILE *file_name); void print_meas(time_stats_t *ts, const char *name, time_stats_t *total_exec_time, time_stats_t *sf_exec_time); -int print_meas_log(time_stats_t *ts, const char *name, time_stats_t *total_exec_time, time_stats_t *sf_exec_time, char *output); +size_t print_meas_log(time_stats_t *ts, + const char *name, + time_stats_t *total_exec_time, + time_stats_t *sf_exec_time, + char *output, + size_t outputlen); double get_time_meas_us(time_stats_t *ts); double get_cpu_freq_GHz(void); @@ -151,7 +156,7 @@ static inline void stop_meas(time_stats_t *ts) { ts->diff += (out-ts->in); /// process duration is the difference between two clock points ts->p_time = (out-ts->in); - ts->diff_square += (out-ts->in)*(out-ts->in); + ts->diff_square += ((double)out-ts->in)*((double)out-ts->in); if ((out-ts->in) > ts->max) ts->max = out-ts->in; diff --git a/doc/BUILD.md b/doc/BUILD.md index a52ce98cb53..70d69f5afde 100644 --- a/doc/BUILD.md +++ b/doc/BUILD.md @@ -193,6 +193,7 @@ Using the help option of the build script you can get the list of available opti | --UE | maintained and tested in CI | build `lte-uesoftmodem` the LTE UE | | --gNB | maintained and tested in CI | build `nr-softmodem` the 5G gNodeB | | --nrUE | maintained and tested in CI | build `nr-uesoftmodem` the 5G UE | +| --arch-native | maintained | build with native architecture optimization | | --usrp-recplay | deprecated | use the USRP configuration parameters to use the record player. | | --build-lib | maintained | build optional shared library(ies), which can then be loaded at run time via command line option. Use the --help option to get the list of supported optional libraries. `all` can be used to build all available optional libraries. | | --UE-conf-nvram | maintained | Specifies the path to the input file used by the conf2uedata utility. defaults to [openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf](../openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf) | diff --git a/doc/FEATURE_SET.md b/doc/FEATURE_SET.md index a289c6d17eb..5db6e44d8d2 100644 --- a/doc/FEATURE_SET.md +++ b/doc/FEATURE_SET.md @@ -332,6 +332,9 @@ The following features are valid for the gNB and the 5G-NR UE. - evalution of RSRP report - evaluation of CQI report - MAC scheduling of SR reception +- Bandwidth part (BWP) operation + - Handle multiple dedicated BWPs + - BWP switching through RRCReconfiguration method **gNB RLC** - Send/Receive operations according to 38.322 Rel.16 @@ -437,6 +440,10 @@ The following features are valid for the gNB and the 5G-NR UE. - PTRS support - Support for 1, 2 and 4 RX antennas - Support for up to 2 layers (currently limited to DMRS configuration type 2) +* Measurements based on NR-CSIRS + - RI, PMI and CQI computation + - Support for 1 and 2 RX antennas + - Support for up to 2 layers * NR-PUSCH (including Segmentation, LDPC encoding, rate matching, scrambling, modulation, RB mapping, etc). - PUSCH mapping type A and B - DMRS configuration type 1 and 2 @@ -485,14 +492,19 @@ The following features are valid for the gNB and the 5G-NR UE. * UCI processing - ACK/NACK processing - Triggering periodic SR - - CSI measurement reporting (SSB RSRP only) -* DLSH scheduler + - CSI measurement reporting +* DLSCH scheduler - Configuration of fapi PDU according to DCI - HARQ procedures * ULSCH scheduler - Configuration of fapi PDU according to DCI +* NR-CSIRS scheduler + - Scheduling of NR-CSIRS reception + - Fill UCI for CSI measurement reporting * Scheduler procedures for SRS transmission - Periodic SRS transmission +* Bandwidth part (BWP) operation + - Operation in configured dedicated BWP through RRCSetup or RRCReconfiguration **UE RLC** diff --git a/doc/NR_SA_CN5G_gNB_B210_COTS_UE_Tutorial.md b/doc/NR_SA_CN5G_gNB_B210_COTS_UE_Tutorial.md new file mode 100644 index 00000000000..fc0700c6994 --- /dev/null +++ b/doc/NR_SA_CN5G_gNB_B210_COTS_UE_Tutorial.md @@ -0,0 +1,227 @@ +<table style="border-collapse: collapse; border: none;"> + <tr style="border-collapse: collapse; border: none;"> + <td style="border-collapse: collapse; border: none;"> + <a href="http://www.openairinterface.org/"> + <img src="./images/oai_final_logo.png" alt="" border=3 height=50 width=150> + </img> + </a> + </td> + <td style="border-collapse: collapse; border: none; vertical-align: center;"> + <b><font size = "5">OAI 5G SA tutorial</font></b> + </td> + </tr> +</table> + +**TABLE OF CONTENTS** + +1. [Scenario](#1-scenario) +2. [OAI CN5G](#2-oai-cn5g) + 1. [OAI CN5G pre-requisites](#21-oai-cn5g-pre-requisites) + 2. [OAI CN5G Setup](#22-oai-cn5g-setup) + 3. [OAI CN5G Configuration files](#23-oai-cn5g-configuration-files) + 4. [SIM Card](#24-sim-card) +3. [OAI gNB](#3-oai-gnb) + 1. [OAI gNB pre-requisites](#31-oai-gnb-pre-requisites) + 2. [Build OAI gNB](#32-build-oai-gnb) +4. [Run OAI CN5G and OAI gNB with USRP B210](#4-run-oai-cn5g-and-oai-gnb-with-usrp-b210) + 1. [Run OAI CN5G](#41-run-oai-cn5g) + 2. [Run OAI gNB](#42-run-oai-gnb) +5. [Testing with QUECTEL RM500Q](#5-testing-with-quectel-rm500q) + 1. [Setup QUECTEL](#51-setup-quectel) + 2. [Ping test](#52-ping-test) + 3. [Downlink iPerf test](#53-downlink-iperf-test) + + +# 1. Scenario +In this tutorial we describe how to configure and run a 5G end-to-end setup with OAI CN5G, OAI gNB and COTS UE. + +Minimum hardware requirements: +- Laptop/Desktop/Server for OAI CN5G and OAI gNB + - Operating System: [Ubuntu 20.04.4 LTS](https://releases.ubuntu.com/20.04.4/ubuntu-20.04.4-desktop-amd64.iso) + - CPU: 8 cores x86_64 @ 3.5 GHz + - RAM: 32 GB +- Laptop for UE + - Operating System: Microsoft Windows 10 x64 + - CPU: 4 cores x86_64 + - RAM: 8 GB + - Windows driver for Quectel MUST be equal or higher than version **2.2.4** +- [USRP B210](https://www.ettus.com/all-products/ub210-kit/) +- Quectel RM500Q + - Module, M.2 to USB adapter, antennas and SIM card + - Firmware version of Quectel MUST be equal or higher than **RM500QGLABR11A06M4G** + + +# 2. OAI CN5G + +## 2.1 OAI CN5G pre-requisites + +```bash +sudo apt install -y git net-tools putty + +sudo apt install -y apt-transport-https ca-certificates curl software-properties-common +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" +sudo apt update +sudo apt install -y docker docker-ce + +# Add your username to the docker group, otherwise you will have to run in sudo mode. +sudo usermod -a -G docker $(whoami) +reboot + +# https://docs.docker.com/compose/install/ +sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose +sudo chmod +x /usr/local/bin/docker-compose +``` + +## 2.2 OAI CN5G Setup + +```bash +# Git oai-cn5g-fed repository +git clone https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git ~/oai-cn5g-fed + +# Pull docker images +docker pull oaisoftwarealliance/oai-amf:develop +docker pull oaisoftwarealliance/oai-nrf:develop +docker pull oaisoftwarealliance/oai-smf:develop +docker pull oaisoftwarealliance/oai-udr:develop +docker pull oaisoftwarealliance/oai-udm:develop +docker pull oaisoftwarealliance/oai-ausf:develop +docker pull oaisoftwarealliance/oai-spgwu-tiny:develop +docker pull oaisoftwarealliance/trf-gen-cn5g:latest + +# Tag docker images +docker image tag oaisoftwarealliance/oai-amf:develop oai-amf:develop +docker image tag oaisoftwarealliance/oai-nrf:develop oai-nrf:develop +docker image tag oaisoftwarealliance/oai-smf:develop oai-smf:develop +docker image tag oaisoftwarealliance/oai-udr:develop oai-udr:develop +docker image tag oaisoftwarealliance/oai-udm:develop oai-udm:develop +docker image tag oaisoftwarealliance/oai-ausf:develop oai-ausf:develop +docker image tag oaisoftwarealliance/oai-spgwu-tiny:develop oai-spgwu-tiny:develop +docker image tag oaisoftwarealliance/trf-gen-cn5g:latest trf-gen-cn5g:latest +``` + +## 2.3 OAI CN5G Configuration files +Download and copy configuration files: +- Copy [docker-compose-basic-nrf.yaml](tutorial_resources/docker-compose-basic-nrf.yaml) to `~/oai-cn5g-fed/docker-compose` +- Copy [oai_db.sql](tutorial_resources/oai_db.sql) to `~/oai-cn5g-fed/docker-compose/database` + +Change permissions on oai_db.sql to prevent mysql permission denied error: +```bash +chmod 644 ~/oai-cn5g-fed/docker-compose/database/oai_db.sql +``` + +## 2.4 SIM Card +Program SIM Card with [Open Cells Project](https://open-cells.com/) application [uicc-v2.6](https://open-cells.com/d5138782a8739209ec5760865b1e53b0/uicc-v2.6.tgz). + +```bash +sudo ./program_uicc --adm 12345678 --imsi 208990000000001 --isdn 00000001 --acc 0001 --key fec86ba6eb707ed08905757b1bb44b8f --opc C42449363BBAD02B66D16BC975D77CC1 -spn "OpenAirInterface" --authenticate +``` + + +# 3. OAI gNB + +## 3.1 OAI gNB pre-requisites + +### Build UHD from source +```bash +sudo apt install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-ruamel.yaml python3-setuptools cmake build-essential + +git clone https://github.com/EttusResearch/uhd.git ~/uhd +cd ~/uhd +git checkout v4.0.0.0 +cd host +mkdir build +cd build +cmake ../ +make -j 4 +make test # This step is optional +sudo make install +sudo ldconfig +sudo uhd_images_downloader +``` + +## 3.2 Build OAI gNB + +```bash +# Get openairinterface5g source code +git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git ~/openairinterface5g +cd ~/openairinterface5g +git checkout develop + +# Install dependencies in Ubuntu 20.04 +cd ~/openairinterface5g +source oaienv +cd cmake_targets +./build_oai -I + +# Build OAI gNB +cd ~/openairinterface5g +source oaienv +cd cmake_targets +./build_oai -w USRP --nrUE --gNB --build-lib all -c +``` + + +# 4. Run OAI CN5G and OAI gNB with USRP B210 + +## 4.1 Run OAI CN5G + +```bash +cd ~/oai-cn5g-fed/docker-compose +python3 core-network.py --type start-basic --scenario 1 +``` + +## 4.2 Run OAI gNB + +```bash +cd ~/openairinterface5g +source oaienv +cd cmake_targets/ran_build/build +sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --sa -E --continuous-tx +``` + +Make sure that during USRP initialization, it shows that USB 3 is used. + +# 5. Testing with Quectel RM500Q + +## 5.1 Setup Quectel +With [PuTTY](https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe), send the following AT commands to the module using a serial interface (ex: COM2) at 115200 bps: +```bash +# MUST be sent at least once everytime there is a firmware upgrade! +AT+QMBNCFG="Select","ROW_Commercial" +AT+QMBNCFG="AutoSel",0 +AT+CFUN=1,1 +AT+CGDCONT=1 +AT+CGDCONT=2 +AT+CGDCONT=3 +AT+CGDCONT=1,"IP","oai" + +# (Optional, debug only, AT commands) Activate PDP context, retrieve IP address and test with ping +AT+CGACT=1,1 +AT+CGPADDR=1 +AT+QPING=1,"openairinterface.org" +``` + +## 5.2 Ping test +- UE host +```bash +ping 192.168.70.135 -n 1000 -S 12.1.1.2 +``` +- CN5G host +```bash +docker exec -it oai-ext-dn ping 12.1.1.2 +``` + +## 5.3 Downlink iPerf test +- UE host + - Download iPerf for Microsoft Windows from [here](https://iperf.fr/download/windows/iperf-2.0.9-win64.zip). + - Extract to Desktop and run with Command Prompt: +```bash +cd C:\Users\User\Desktop\iPerf\iperf-2.0.9-win64\iperf-2.0.9-win64 +iperf -s -u -i 1 -B 12.1.1.2 +``` + +- CN5G host +```bash +docker exec -it oai-ext-dn iperf -u -t 86400 -i 1 -fk -B 192.168.70.135 -b 125M -c 12.1.1.2 +``` diff --git a/doc/NR_SA_CN5G_gNB_N300_COTS_UE_Tutorial.md b/doc/NR_SA_CN5G_gNB_N300_COTS_UE_Tutorial.md new file mode 100644 index 00000000000..d68057fd084 --- /dev/null +++ b/doc/NR_SA_CN5G_gNB_N300_COTS_UE_Tutorial.md @@ -0,0 +1,244 @@ +<table style="border-collapse: collapse; border: none;"> + <tr style="border-collapse: collapse; border: none;"> + <td style="border-collapse: collapse; border: none;"> + <a href="http://www.openairinterface.org/"> + <img src="./images/oai_final_logo.png" alt="" border=3 height=50 width=150> + </img> + </a> + </td> + <td style="border-collapse: collapse; border: none; vertical-align: center;"> + <b><font size = "5">OAI 5G SA tutorial</font></b> + </td> + </tr> +</table> + +**TABLE OF CONTENTS** + +1. [Scenario](#1-scenario) +2. [OAI CN5G](#2-oai-cn5g) + 1. [OAI CN5G pre-requisites](#21-oai-cn5g-pre-requisites) + 2. [OAI CN5G Setup](#22-oai-cn5g-setup) + 3. [OAI CN5G Configuration files](#23-oai-cn5g-configuration-files) + 4. [SIM Card](#24-sim-card) +3. [OAI gNB](#3-oai-gnb) + 1. [OAI gNB pre-requisites](#31-oai-gnb-pre-requisites) + 2. [Build OAI gNB](#32-build-oai-gnb) + 3. [N300 Ethernet Tuning](#33-n300-ethernet-tuning) +4. [Run OAI CN5G and OAI gNB with USRP N300](#4-run-oai-cn5g-and-oai-gnb-with-usrp-n300) + 1. [Run OAI CN5G](#41-run-oai-cn5g) + 2. [Run OAI gNB](#42-run-oai-gnb) +5. [Testing with QUECTEL RM500Q](#5-testing-with-quectel-rm500q) + 1. [Setup QUECTEL](#51-setup-quectel) + 2. [Ping test](#52-ping-test) + 3. [Downlink iPerf test](#53-downlink-iperf-test) + + +# 1. Scenario +In this tutorial we describe how to configure and run a 5G end-to-end setup with OAI CN5G, OAI gNB and COTS UE. + +Minimum hardware requirements: +- Laptop/Desktop/Server for OAI CN5G and OAI gNB + - Operating System: [Ubuntu 20.04.4 LTS](https://releases.ubuntu.com/20.04.4/ubuntu-20.04.4-desktop-amd64.iso) + - CPU: 8 cores x86_64 @ 3.5 GHz + - RAM: 32 GB +- Laptop for UE + - Operating System: Microsoft Windows 10 x64 + - CPU: 4 cores x86_64 + - RAM: 8 GB + - Windows driver for Quectel MUST be equal or higher than version **2.2.4** +- [USRP N300](https://www.ettus.com/all-products/USRP-N300/): Please identify the network interface(s) on which the N300 is connected. +- Quectel RM500Q + - Module, M.2 to USB adapter, antennas and SIM card + - Firmware version of Quectel MUST be equal or higher than **RM500QGLABR11A06M4G** + + +# 2. OAI CN5G + +## 2.1 OAI CN5G pre-requisites + +```bash +sudo apt install -y git net-tools putty + +sudo apt install -y apt-transport-https ca-certificates curl software-properties-common +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" +sudo apt update +sudo apt install -y docker docker-ce + +# Add your username to the docker group, otherwise you will have to run in sudo mode. +sudo usermod -a -G docker $(whoami) +reboot + +# https://docs.docker.com/compose/install/ +sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose +sudo chmod +x /usr/local/bin/docker-compose +``` + +## 2.2 OAI CN5G Setup + +```bash +# Git oai-cn5g-fed repository +git clone https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git ~/oai-cn5g-fed + +# Pull docker images +docker pull oaisoftwarealliance/oai-amf:develop +docker pull oaisoftwarealliance/oai-nrf:develop +docker pull oaisoftwarealliance/oai-smf:develop +docker pull oaisoftwarealliance/oai-udr:develop +docker pull oaisoftwarealliance/oai-udm:develop +docker pull oaisoftwarealliance/oai-ausf:develop +docker pull oaisoftwarealliance/oai-spgwu-tiny:develop +docker pull oaisoftwarealliance/trf-gen-cn5g:latest + +# Tag docker images +docker image tag oaisoftwarealliance/oai-amf:develop oai-amf:develop +docker image tag oaisoftwarealliance/oai-nrf:develop oai-nrf:develop +docker image tag oaisoftwarealliance/oai-smf:develop oai-smf:develop +docker image tag oaisoftwarealliance/oai-udr:develop oai-udr:develop +docker image tag oaisoftwarealliance/oai-udm:develop oai-udm:develop +docker image tag oaisoftwarealliance/oai-ausf:develop oai-ausf:develop +docker image tag oaisoftwarealliance/oai-spgwu-tiny:develop oai-spgwu-tiny:develop +docker image tag oaisoftwarealliance/trf-gen-cn5g:latest trf-gen-cn5g:latest +``` + +## 2.3 OAI CN5G Configuration files +Download and copy configuration files: +- Copy [docker-compose-basic-nrf.yaml](tutorial_resources/docker-compose-basic-nrf.yaml) to `~/oai-cn5g-fed/docker-compose` +- Copy [oai_db.sql](tutorial_resources/oai_db.sql) to `~/oai-cn5g-fed/docker-compose/database` + +Change permissions on oai_db.sql to prevent mysql permission denied error: +```bash +chmod 644 ~/oai-cn5g-fed/docker-compose/database/oai_db.sql +``` + +## 2.4 SIM Card +Program SIM Card with [Open Cells Project](https://open-cells.com/) application [uicc-v2.6](https://open-cells.com/d5138782a8739209ec5760865b1e53b0/uicc-v2.6.tgz). + +```bash +sudo ./program_uicc --adm 12345678 --imsi 208990000000001 --isdn 00000001 --acc 0001 --key fec86ba6eb707ed08905757b1bb44b8f --opc C42449363BBAD02B66D16BC975D77CC1 -spn "OpenAirInterface" --authenticate +``` + + +# 3. OAI gNB + +## 3.1 OAI gNB pre-requisites + +### Build UHD from source +```bash +sudo apt install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-ruamel.yaml python3-setuptools cmake build-essential + +git clone https://github.com/EttusResearch/uhd.git ~/uhd +cd ~/uhd +git checkout v4.0.0.0 +cd host +mkdir build +cd build +cmake ../ +make -j 4 +make test # This step is optional +sudo make install +sudo ldconfig +sudo uhd_images_downloader +``` + +## 3.2 Build OAI gNB + +```bash +# Get openairinterface5g source code +git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git ~/openairinterface5g +cd ~/openairinterface5g +git checkout develop + +# Install dependencies in Ubuntu 20.04 +cd ~/openairinterface5g +source oaienv +cd cmake_targets +./build_oai -I + +# Build OAI gNB +cd ~/openairinterface5g +source oaienv +cd cmake_targets +./build_oai -w USRP --nrUE --gNB --build-lib all -c +``` + +## 3.3 N300 Ethernet Tuning + +Please also refer to the official [USRP Host Performance Tuning Tips and Tricks](https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks) tuning guide. + +The following steps are recommended. Please change the network interface(s) as required. Also, you should have 10Gbps interface(s): if you use two cables, you should have the XG interface. Refer to the [N300 Getting Started Guide](https://kb.ettus.com/USRP_N300/N310/N320/N321_Getting_Started_Guide) for more information. + +* Use an MTU of 9000: how to change this depends on the network management tool. In the case of Network Manager, this can be done from the GUI. +* Increase the kernel socket buffer (also done by the USRP driver in OAI): + ``` + sysctl -w net.core.rmem_max=8388608 + sysctl -w net.core.wmem_max=8388608 + sysctl -w net.core.rmem_default=65536 + sysctl -w net.core.wmem_default=65536 + ``` +* Increase Ethernet Ring Buffers: `sudo ethtool -G <ifname> rx 4096 tx 4096` +* Disable hyper-threading in the BIOS +* Disable KPTI Protections for Spectre/Meltdown for more performance. **This is a security risk.** Add `mitigations=off nosmt` in your grub config and update grub. + +# 4. Run OAI CN5G and OAI gNB with USRP N300 + +## 4.1 Run OAI CN5G + +```bash +cd ~/oai-cn5g-fed/docker-compose +python3 core-network.py --type start-basic --scenario 1 +``` + +## 4.2 Run OAI gNB + +```bash +cd ~/openairinterface5g +source oaienv +cd cmake_targets/ran_build/build +sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf --sa --usrp-tx-thread-config 1 +``` + + +# 5. Testing with Quectel RM500Q + +## 5.1 Setup Quectel +With [PuTTY](https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe), send the following AT commands to the module using a serial interface (ex: COM2) at 115200 bps: +```bash +# MUST be sent at least once everytime there is a firmware upgrade! +AT+QMBNCFG="Select","ROW_Commercial" +AT+QMBNCFG="AutoSel",0 +AT+CFUN=1,1 +AT+CGDCONT=1 +AT+CGDCONT=2 +AT+CGDCONT=3 +AT+CGDCONT=1,"IP","oai" + +# (Optional, debug only, AT commands) Activate PDP context, retrieve IP address and test with ping +AT+CGACT=1,1 +AT+CGPADDR=1 +AT+QPING=1,"openairinterface.org" +``` + +## 5.2 Ping test +- UE host +```bash +ping 192.168.70.135 -n 1000 -S 12.1.1.2 +``` +- CN5G host +```bash +docker exec -it oai-ext-dn ping 12.1.1.2 +``` + +## 5.3 Downlink iPerf test +- UE host + - Download iPerf for Microsoft Windows from [here](https://iperf.fr/download/windows/iperf-2.0.9-win64.zip). + - Extract to Desktop and run with Command Prompt: +```bash +cd C:\Users\User\Desktop\iPerf\iperf-2.0.9-win64\iperf-2.0.9-win64 +iperf -s -u -i 1 -B 12.1.1.2 +``` + +- CN5G host +```bash +docker exec -it oai-ext-dn iperf -u -t 86400 -i 1 -fk -B 192.168.70.135 -b 200M -c 12.1.1.2 +``` diff --git a/doc/RUNMODEM.md b/doc/RUNMODEM.md index 119027f1695..2dc4fd2ff5f 100644 --- a/doc/RUNMODEM.md +++ b/doc/RUNMODEM.md @@ -207,7 +207,24 @@ UE on machine 2: `sudo ./nr-uesoftmodem --if_freq 2169080000 --if_freq_off -400000000` +# MIMO configuration +<table style="border-collapse: collapse; border: none;"> + <tr style="border-collapse: collapse; border: none;"> + <td style="border-collapse: collapse; border: none;"> + <img src="./images/mimo_antenna_ports.png" alt="" border=3 height=100 width=300> + </img> + </td> + </tr> +</table> + +This image shows an example of gNB 5G MIMO logical antenna port configuration. It has to be noted that logical antenna ports might not directly correspond to physical antenna ports and each logical antenna port might consist of a sub-array of antennas. + +The basic element is a dual-polarized antenna, therefore the minimal DL MIMO setup with two logical antenna ports would consist of two cross-polarized antenna elements. In a single panel configuration, as the one in the picture, this element can be repeated vertiacally and/or horizontally to form an equi-spaced 1D or 2D array. The values N1 and N2 represent the number of antenna ports in the two dimensions and the supported configurations are specified in Section 5.2.2.2.1 of TS 38.214. + +The DL logical antenna port configuration can be selected through configuration file. `pdsch_AntennaPorts_N1` can be used to set N1 parameter, `pdsch_AntennaPorts_N2` to set N2 and `pdsch_AntennaPorts_XP` to set the cross-polarization configuration (1 for single pol, 2 for cross-pol). To be noted that if XP is 1 but N1 and/or N2 are larger than 1, this would result in a non-standard configuration and the PMI selected would be the identity matrix regardless of CSI report. The default value for each of these parameters is 1. + +# Additional links [Selecting an alternative ldpc implementation at run time](../openair1/PHY/CODING/DOC/LDPCImplementation.md) diff --git a/doc/RUN_NR_multiple_BWPs.md b/doc/RUN_NR_multiple_BWPs.md new file mode 100644 index 00000000000..2c2c2fcf25b --- /dev/null +++ b/doc/RUN_NR_multiple_BWPs.md @@ -0,0 +1,51 @@ +# Procedure to add dedicated Bandwidth part (BWP) + +## Contributed by 5G Testbed IISc + +### Developers: Abhijith A, Shruthi S + +# Terminology # + +## Bandwidth part (BWP) ## +Bandwidth Part (BWP) is a set of contiguous Resource Blocks in the resource grid. + +Parameters of a BWP are communicated to UE using RRC parameters: BWP-Downlink and BWP-Uplink. + +A UE can be configured with a set of 4 BWPs in uplink (UL) and downlink (DL) direction (3GPP TS 38.331 Annex B.2 Description of BWP configuration options). But only 1 BWP can be active in UL and DL direction at a given time. + +# Procedure to run multiple dedicated BWPs # + +A maximum of 4 dedicated BWPs can be configured for a UE. + +To configure multiple BWPs, add the following parameters to the gNB configuration file under "servingCellConfigDedicated": + +## Setup of the Configuration files ## +``` + firstActiveDownlinkBWP-Id = 1; #BWP-Id + defaultDownlinkBWP-Id = 1; #BWP-Id + firstActiveUplinkBWP-Id = 1; #BWP-Id +``` + +Each dedicated BWP must have: +``` + # BWP 1 Configuration + dl_bwp-Id_1 = 1; + dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp1_subcarrierSpacing = 1; +``` + + Find these parameters in this configuration file: "targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf" + +# Testing gNB and UE in RF simulator + +## gNB command: +``` + sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --gNBs.[0].min_rxtxtime 6 --rfsim --sa +``` + +## UE command: +``` + sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --nokrnmod --rfsim --sa --uicc0.imsi 208990000000001 +``` \ No newline at end of file diff --git a/doc/TESTBenches.md b/doc/TESTBenches.md index 7365bc0f4c7..c6a01f278d4 100644 --- a/doc/TESTBenches.md +++ b/doc/TESTBenches.md @@ -1,45 +1,167 @@ ## Table of Contents ## -1. [Legacy 1 Bench](#legacy-1-bench) -2. [Legacy 2 Bench](#legacy-2-bench) -3. [Next Bench for DEV](#next-bench-for-dev) -4. [Next Bench for CI](#next-bench-for-ci) -5. [Indoor Live Network Bench](#indoor-live-network-bench) -6. [Outdoor Live Network Bench](#outdoor-live-network-bench) +1. [Machines](#machines) +2. [Networked devices](#networked-devices) +3. [Testbenches](#testbenches) +4. [Pipelines](#pipelines) + +## Machines - -## Legacy 1 Bench - -**Purpose** : FDD Band 7 and Band 13, LTE-M -**Note** : Legacy1 and Legacy2 are duplicated so that they can run in parallel, thus avoiding a CI bottleneck -**Note** : Faraday Cages 1 and 2 are physically the same cage - - - -## Legacy 2 Bench - -**Purpose** : TDD Band 40, TM2 2xTX 2xRX -**Note** : CN can run in a container, could also run on Massive - - - -## Next Bench for DEV - -**Note** : Benetel CI can also run on this bench at night - - - - -## Next Bench for CI - -**Note** : The current test running on Caracal could run on this bench with a N300/N300 setup - - - -## Indoor Live Network Bench - - - -## Outdoor Live Network Bench - - +| Machine | IP address | Lockable Resource | Function | Connected devices | +| ------------- | --------------- | --------------------- | ------------------ | ----------------------------------------------------- | +| asterix | 172.21.16.127 | CI-Asterix-Usage | gNB (n78) | 173.21.19.14 | +| obelix | 172.21.16.128 | CI-Obelix-Usage | eNB (n40, n78), nrUE | 172.21.19.13, X300 (192.168.60.2), B200mini (30C51EB) | +| porcepix | 172.21.16.136 | CI-NSA-MiniBench | Executor, EPC, 5GC | -- | +| nrmodule2 | 172.21.16.139 | CI-NSA-MiniBench | Quectel | Quectel module | +| nepes | 172.21.16.137 | CI-NSA-MiniBench | gNB (n78) | B200mini (30C51D4) | +| caracal | 172.21.16.132 | CI-Caracal | gNB/phytest | N300 (192.168.10.2) | +| idefix | 172.21.16.135 | CI-NSA-MiniBench | Quectel | Quectel module | +| amariue | 172.21.16.144 | CI-Amarisoft-UE-Usage | nrUE | Amarisoft UE simulator | +| bellatrix | 192.168.117.115 | CI-RAN-VM-Deployment | Executor | -- | +| nano | 192.168.12.62 | CI-Bench-1-Phones | EPC, adb | 2x COTS (adb) | +| hutch | 192.168.12.19 | CI-Bench-1-Phones | eNB (B7) | B200mini (30C5239) | +| starsky | 192.168.12.18 | CI-Bench-1-Phones | eNB (B40) | b200mini (30A3E3C) | +| carabe | 192.168.12.211 | CI-Bench-2-OAI-Phone | UE (B7UE) | B200mini (30AE8C9) | + +Note: The available resources, and their current usage, is indicated here: +- [Lockable resources of jenkins-oai](https://jenkins-oai.eurecom.fr/lockable-resources/): + "New" Jenkins, i.e., with RAN-Container-Parent +- [Lockable resources of open5glab jenkins](https://open5glab.eurecom.fr:8083/jenkins/lockable-resources/): + "Old" Jenkins, i.e., with RAN-CI-Develop + +## Networked devices + +| Type | IP address (mgmt) | +| ------------- | ----------------- | +| USRP N310 | 172.21.19.14 | +| USRP N310 | 172.21.19.13 | + +## Testbenches + +### OTA Testbench + +**Purpose**: Over-the-air 4G/5G (NSA/SA) tests + +Note: obelix and porcepix are both used in the OTA testbench and the 5G +NSA/Faraday Cage testbench! + + + +[PDF version](testbenches_doc_resources/5g-ota-bench.pdf) | [LaTeX/TikZ version](testbenches_doc_resources/5g-ota-bench.tex) if you want to modify to reflect your setup + +### 5G NSA/Faraday Cage Testbench + +**Purpose**: Faraday cage 5G tests + +Note: obelix and porcepix are both used in the OTA testbench and the 5G +NSA/Faraday Cage testbench! + + + +[PDF version](testbenches_doc_resources/5g-nsa-faraday-bench.pdf) | [LaTeX/TikZ version](testbenches_doc_resources/5g-nsa-faraday-bench.tex) if you want to modify to reflect your setup + +### 4G Testbench(es) + +**Purpose**: 4G/LTE testbenches + + + + +[PDF version](testbenches_doc_resources/4g-faraday-bench.pdf) | [LaTeX/TikZ version](testbenches_doc_resources/4g-faraday-bench.tex) if you want to modify to reflect your setup + +## Pipelines + +### [RAN-Container-Parent](https://jenkins-oai.eurecom.fr/job/RAN-Container-Parent/) + +**Purpose**: automatically triggered tests on MR creation or push, from Gitlab +Webhook + +- [RAN-cppcheck](https://jenkins-oai.eurecom.fr/job/RAN-cppcheck/1664/) + - obelix + - performs static code analysis, currently not actively enforced +- [RAN-gNB-nrUE-MONO-TDD-Band78-N300](https://jenkins-oai.eurecom.fr/job/RAN-gNB-nrUE-MONO-TDD-Band78-N300/) + - caracal + N310 + - pure performance test through phy-test scheduler, see command line for more + details +- [RAN-L2-Sim-Test-5G](https://jenkins-oai.eurecom.fr/job/RAN-L2-Sim-Test-5G/) + - obelix (gNB, 1x UE, OAI 5GC) + - L2simulator: skips physical layer and uses proxy between gNB and UE, + currently only ping +- [RAN-NSA-B200-Module-LTEBOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-NSA-B200-Module-LTEBOX-Container/) + - obelix + B200, nepes + B200, idefix + Quectel, porcepix w/ ltebox + - basic NSA test +- [RAN-SA-B200-Module-SABOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-SA-B200-Module-SABOX-Container/) + - obelix + B200, nepes + B200, idefix + Quectel, porcepix w/ sabox + - basic SA test (40 MHz TDD) +- [RAN-PhySim-Cluster](https://jenkins-oai.eurecom.fr/job/RAN-PhySim-Cluster/) + - asterix (`Asterix-OC-oaicicd-session` resource), tests in OpenShift Cluster + - unitary simulators (`nr_dlsim`, etc.) +- [RAN-RF-Sim-Test-4G](https://jenkins-oai.eurecom.fr/job/RAN-RF-Sim-Test-4G/) + - obelix (eNB, 1x UE, OAI EPC) + - uses RFsimulator, for FDD 5, 10, 20MHz with core, 5MHz noS1 +- [RAN-RF-Sim-Test-5G](https://jenkins-oai.eurecom.fr/job/RAN-RF-Sim-Test-5G/) + - obelix (gNB, 2x UE, OAI 5GC) + - uses RFsimulator, TDD 40MHz, FDD 40MHz, F1 split +- [RAN-RHEL8-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-RHEL8-Image-Builder/) + - asterix: RHEL 8 image build using podman +- [RAN-Ubuntu18-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-Ubuntu18-Image-Builder/) + - obelix: Ubuntu 18 image build using docker + +### [RAN-CI-NSA-Trigger](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-CI-NSA-Trigger/) + +**Purpose**: longer-running over-the-air LTE, NSA, and SA tests, triggered +through cron job at midnight + +- [RAN-LTE-2x2-Module-OAIEPC](https://jenkins-oai.eurecom.fr/job/RAN-LTE-2x2-Module-OAIEPC/) + - obelix + N310, nrmodule2 + Quectel, porcepix w/ Magma EPC + - LTE 2x2 test with TM1 and TM2 +- [RAN-NSA-B200-Module-LTEBOX](https://jenkins-oai.eurecom.fr/job/RAN-NSA-B200-Module-LTEBOX/) + - obelix + B200 (eNB), nepes + B200 (gNB), idefix + Quectel, porcepix w/ ltebox + - Note: like [RAN-NSA-B200-Module-LTEBOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-NSA-B200-Module-LTEBOX-Container/) above, but compiled/run from source +- [RAN-NSA-2x2-Module-OAIEPC](https://jenkins-oai.eurecom.fr/job/RAN-NSA-2x2-Module-OAIEPC/) + - obelix + N310 (eNB), asterix + N310 (gNB), nrmodule2 + Quectel, porcepix w/ Magma EPC + - LTE 2x2 and NR 2x2 (non-standalone) +- [RAN-SA-Module-CN5G](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-Module-CN5G/) + - asterix + N310 (gNB), nrmodule2 + Quectel, porcepix w/ OAI 5GC + - NR 2x2 (standalone) +- [RAN-SA-OAIUE-N310-X300-CN5G](https://jenkins-oai.eurecom.fr/job/RAN-SA-OAIUE-N310-X300-CN5G/) + - asterix + N310 (gNB), obelix + N310 or X300 (5G UE), porcepix w/ OAI 5GC + - OTA test with OAIUE using both N310 and X300 +- [RAN-SA-AmariS-CN5G](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-AmariS-CN5G/) + - asterix + N310, amariue (1x UE), porcepix w/ OAI 5GC + - Amarisoft UE simulator: expected to be increased to more UEs + +### [RAN-CI-develop](https://open5glab.eurecom.fr:8083/jenkins/job/RAN-CI-develop/) + +**Purpose**: automatically triggered tests, mostly 4G, to be phased out and +integrated into RAN-Container-Parent + +runs tests: +- bellatrix: runs 4G/5G simulators directly (eNB + 1x UE + (opt.) OAI EPC, gNB + 1x UE in "noS1") + +triggers pipelines: +- [eNB-CI-F1-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-F1-FDD-Band7-B210/) + - hutch + B210, nano w/ ltebox + 2x UE + - tests 4G FDD with F1 split, 5MHz, 10MHz, 20MHz. 5MHz stable, rest known to + be unstable +- [eNB-CI-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-FDD-Band7-B210/) + - hutch + B210, nano w/ ltebox + 2x UE + - tests T tracer, information through FlexRAN, RRC inactivity timers, + inactivity timers + FlexRAN, different bandwidths +- [eNB-CI-IF4p5-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-IF4p5-FDD-Band7-B210/) + - hutch + B210, nano w/ ltebox + 2x UE + - tests IF4.5 split over bandwidths 5, 10, 20 MHz in Band 7 +- [eNB-CI-IF4p5-TDD-Band40-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-IF4p5-TDD-Band40-B210/) + - starsky + B210, nano w/ ltebox + 2x UE + - tests IF4.5 split over bandwidths 5, 10, 20 MHz in Band 40 +- [eNB-CI-TDD-Band40-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-TDD-Band40-B210/) + - starsky + B210, nano w/ ltebox + 2x UE + - T tracer, TM1 over bandwidths 5, 10, 20 MHz in Band 40, default scheduler + for 20 MHz +- [eNB-UE-CI-MONO-FDD-Band7-B200](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-UE-CI-MONO-FDD-Band7-B200/) + - hutch + B210 (eNB), carabe + B210 (4G UE), nano w/ ltebox + - tests OAI 4G for 5 MHz/TM1 with both CN and in noS1 model, MBMS; known to + be unstable +- [UE-CI-FDD-Band20-B200](https://open5glab.eurecom.fr:8083/jenkins/job/UE-CI-FDD-Band20-B200/) + - starsky + B210 (sniffer) + - Sniff MIB + SIB1 of Orange, SFR diff --git a/doc/TESTING_5GSA_setup.md b/doc/TESTING_5GSA_setup.md index 9b27549df43..357c62c8139 100644 --- a/doc/TESTING_5GSA_setup.md +++ b/doc/TESTING_5GSA_setup.md @@ -50,7 +50,7 @@ At the moment of writing this document interoperability with the following COTS ## 1.1 gNB build and configuration To get the code and build the gNB executable: -### Ubuntu 18.04 +### Build gNB ```bash git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git git checkout develop @@ -61,42 +61,6 @@ To get the code and build the gNB executable: ./build_oai --gNB -w USRP ``` -### Ubuntu 20.04 -```bash - # Build UHD from source - # https://files.ettus.com/manual/page_build_guide.html - sudo apt-get install libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-ruamel.yaml python3-setuptools cmake build-essential - - git clone https://github.com/EttusResearch/uhd.git - cd uhd/host - mkdir build - cd build - cmake ../ - make -j 4 - make test # This step is optional - sudo make install - sudo ldconfig - sudo uhd_images_downloader - - - git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git - git checkout develop - - # Install dependencies in Ubuntu 20.04 - cd - cd openairinterface5g/ - source oaienv - cd cmake_targets/ - ./install_external_packages.ubuntu20 - - # Build OAI gNB - cd - cd openairinterface5g/ - source oaienv - cd cmake_targets/ - ./build_oai --gNB -w USRP -``` - A reference configuration file for the **monolithic** gNB is provided [here](https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/develop/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf). diff --git a/doc/UL_MIMO.txt b/doc/UL_MIMO.txt new file mode 100644 index 00000000000..c06bc78c4cb --- /dev/null +++ b/doc/UL_MIMO.txt @@ -0,0 +1,31 @@ +# how to build phy sim +cd cmake_targets/ +sudo ./build_oai --phy_simulators -c + +cd phy_simulators/build/ +# ULSCH sim +# bit level validation +# PUSCH encoding and decoding for 4 layers 2 CMD without data +sudo ./nr_ulschsim -R 106 -m9 -s13 -n100 -y4 -z4 -W4 + +# UL sim +# Uplink chain validation +# PUSCH on UE side and gNB side,whole chain for PUSCH +# No channel model on data domain signal +# No cross-path connection +# PMI = 0 is only unitary prcoding matrix +sudo ./nr_ulsim -n100 -m9 -r106 -s13 -W4 -y4 -z4 + +# How to build rfsim +sudo ./build_oai -c --gNB --nrUE -w SIMU + +# How to run with rfsim +# 4x4 RANK 4 +sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf --rfsim --phy-test --l 2 --L 4 +sudo ./nr-uesoftmodem --rfsim --phy-test --ue-nb-ant-rx 4 --ue-nb-ant-tx 4 +# 4x4 RANK 2 +sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf --rfsim --phy-test --l 2 --L 2 +sudo ./nr-uesoftmodem --rfsim --phy-test --ue-nb-ant-rx 4 --ue-nb-ant-tx 4 + + + diff --git a/doc/images/mimo_antenna_ports.png b/doc/images/mimo_antenna_ports.png new file mode 100644 index 0000000000000000000000000000000000000000..ef91f4becc80fe6c09b55f202f9d8054368bd88c GIT binary patch literal 18753 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 O(x@tFD54bZ`2An65hR5G literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/4g-faraday-bench.pdf b/doc/testbenches_doc_resources/4g-faraday-bench.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f6f7b078e67c61044004c70a92c729b14079cafc GIT binary patch literal 53079 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 W2Nydq%B(;(4pt;GG7(u(r2hq`*f?DP literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/4g-faraday-bench.png b/doc/testbenches_doc_resources/4g-faraday-bench.png new file mode 100644 index 0000000000000000000000000000000000000000..598715a19347b8f8e277d38a7132331555978c55 GIT binary patch literal 92377 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 literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/4g-faraday-bench.tex b/doc/testbenches_doc_resources/4g-faraday-bench.tex new file mode 100644 index 00000000000..6071c89947d --- /dev/null +++ b/doc/testbenches_doc_resources/4g-faraday-bench.tex @@ -0,0 +1,59 @@ +\documentclass{standalone} + +\usepackage{tikz} +\usetikzlibrary{backgrounds, positioning, shapes.symbols} +\usepackage{helvet} +\renewcommand*{\rmdefault}{\sfdefault} + +\begin{document} +\begin{tikzpicture} + [ + font=\footnotesize, + faraday/.style={minimum size=3cm, draw, dashed}, + duplexer/.style={draw,fill=white}, + ] + + \node[faraday, label={[anchor=south west]above left:Faraday cage}] (faraday) {}; + + \node[above left=0cm and 2.8cm of faraday, label=above:hutch] (hutch) + {\includegraphics[width=1.2cm]{server}}; + \node[right=0.3cm of hutch, label=above:B210] (b210h) + {\includegraphics[width=1.2cm]{b210}} edge (hutch); + \node[below left=0.35cm of faraday.north east] (anto) + {\includegraphics[width=0.3cm]{antenna}}; + \draw (b210h) -| node [pos=0.25, duplexer] {B7} (anto); + + \node[below left=0cm and 2.8cm of faraday, label=above:starsky] (starsky) + {\includegraphics[width=1.2cm]{server}}; + \node[right=0.3cm of starsky, label=above:B210] (b210s) + {\includegraphics[width=1.2cm]{b210}} edge (starsky); + \draw (hutch) -- (b210h); + \node[above left=0.35cm of faraday.south east] (antn) + {\includegraphics[width=0.3cm]{antenna}}; + \draw (b210s) -| node [pos=0.35, duplexer] {B40} (antn); + \node[below right=-0.2cm and 0.8cm of b210s] (antn2) + {\includegraphics[width=0.3cm]{antenna}}; + \draw (b210s) -| (antn2); + + \node[left=5cm of faraday, label=above:nano] (nano) + {\includegraphics[width=1.2cm]{server}}; + \draw (hutch) -- (nano); + \draw (starsky) -- (nano); + \node[above right=0.0cm and 0.35cm of faraday.west] (phone1) + {\includegraphics[height=0.5cm]{phone}}; + \node[below right=0.0cm and 0.35cm of faraday.west] (phone2) + {\includegraphics[height=0.5cm]{phone}}; + \draw (nano) -- node[above] {USB/adb} +(5cm,0) |- (phone1); + \draw (nano) -- +(5cm,0) |- (phone2); + + \node[right=1.5cm of faraday, label=above:B210] (b210c) + {\includegraphics[width=1.2cm]{b210}}; + \node[left=.5cm of faraday.east] (antc) + {\includegraphics[width=0.3cm]{antenna}}; + \draw (b210c) -- node [pos=0.35, duplexer] {B7UE} (antc); + \node[right=0.7cm of b210c, label=above:carabe] (carabe) + {\includegraphics[width=1.2cm]{server}} + edge (b210c); + +\end{tikzpicture} +\end{document} diff --git a/doc/testbenches_doc_resources/5g-nsa-faraday-bench.pdf b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1b921e64370954673e45ed70ff1643462f4774ed GIT binary patch literal 337509 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%0DckUjGN>T(9h>r%%6**0t;NvZ~stayfbT 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 XyEDAqf#pRaRpAIYmz0zqUZ3kfh}5rV literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/5g-nsa-faraday-bench.png b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.png new file mode 100644 index 0000000000000000000000000000000000000000..006e6ab347d2dcd3283f5cdb59c65d1d1ba1ea8e GIT binary patch literal 89413 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%0DS|Mt-y_KMh{fxyblGTwTY0_n7N^Q@dBTUbr zU;^wL=NAp>xWvR<u9e@R4z)CN#1j(-`=eCigkoF2-ilPa6QFIZtjyUWQv9csRVX78 z5+WkrAi|jIohO%u?=Oq0DnlSV5%>-KmNtL?f#AvXH=C>=!$6seUe8lJPDTzm2qGX` zi)Nt6XZ3eb9BdF|bH&~?bCcANl0gW-vw=fDw)cE}Ae8p;L>pzjSCvb7h2&JxdYdf_ zr+0Z-`PBgD6#R#>i4hi}_T;jWWctC@U}3%eFey2c*y9<Lw$=80(6t;`C$Z)oGVDO< z><Ht>@n=uT{CA|iYyADo-U`_KO!Hg^6`YPPk_1vPB5-}<FhxbJ+Rm2vpFatZK-TBg z-#XmJ)o#CH-2Zk3=h`>yx1U=Gl7DWmLg&sMA0IIMqptT<mel*_qNVioP$=E=WApQK zbCX096RfNYqf`fze1Ovid~v&E{q{)pG9o%!TKe5PDU(!e_SzONA0IcN-;U{g?-N3k zl`%lnZ|S9GfBW&{0i0ch{1h0w#~V0QYL-ODLir?)4<c1DZy7eX$0okNefyTdWVRD9 zpub7Rx>WlLfF|Ry@iYD=vnQd)Y(}iH-z3f0$~fa~w`C+JmwwsWI>DVgDk&1~l)vgF zZ`|M}KSg;ol{o58+%h#Y!&LzD@$KqTO+mUXFO7)bI`?sJ4jPdHKo|evcLP;`N|M+1 z(g>s4{bS6*K}bla2Ch+-$gQx3nr{0OF>Gvcagqpj?|mrQ=?h*5J0rDHR<q*`!Bj%S z^9G3hlk9yF5cV7|_l|o4jTIm*^Cgt%qB&+4u0Qzl{LB>$=nt60Jk)YoL{Ah7FgXFR zrk=3ageUYPTvb)IU9x<xGdB+c;a@pfN?s4%?8bVE>l%cd>b`kAv0hLs;RKOt(`{Dy zWFHuQd@%4Hy4829?@LI)BZrl-GgqEb5rfSmBqS6rBm|MAESIE-v^qoVJ5nLKn;@?j z%b7^wD7@g7NFgu(s}6_+0Y`^mPZXo)kJn;*GhDz_n5UJ}B<>CMG6YwzUE^*6W3y~@ zR5q5WnsKK|67c><`zYVY(9ndS@0NsLU+(XZGJBIdy2t+d@xaMlyJ^x9mf~A()m7yR zO01rq^9_?*39amBfsip+u5Fa_n^s5&Z2Cgm8&<d`xw7B6d8Pf}-7=@VVg#+L#KFq@ z@ZJKVg98NO&K<4jsPBXmlji1=6R^rktbl2vV4t!7Vwse*w2_he8Ni$Idw3y6eYN$h z%McC0iLJ@WpdU2!-E{4P7uFxO-7c)B<Tk1?`III*N5ddV$sig9!i=2!;#SK|uwhS3 z#3`GbOI6sLnl26!G`*ssNxBU-jGbLiPx$NCVA_9#XnGYLn{u0&5Sf{7_6Q*>3z3op z1qIkiV?RG#U8`&SCO8Z{={A9cgsEwgDCows($g~`mS?45d$jOXg9(h2i;C%BQ3%(_ zCU(#sAfxju?mBMlQ$uijVxNx$)lWPQs{i_!x*6z!8kSvtc(lJ<e|%I;%d!bH6uEFF zDM$p`Udl(QY(kyU@e%e+Tt7Kpt7C<I|870@F*Chq6yn$!Z)XzS(TJyEU|`5YMi>H= zDMp4G&P~6u?!jv@rGLIzC3XpB@u+##Y<SE%;U-IeSjBb?bUL?zMTw)@flID<Srw!g z&w`mX@bjH~fuXh}NF?Q4rRsPuH(IA{00(p!8jZ@SeAVrvFel0&s7x_qVV0hmnPHXB z78;_c7!pz{GQPIn{`PxY@08h_uU@>ooQ^jxpvc67q!)E1VyD|CCuwM{=SN*s4Tk89 zVW4FsO3lp;56|K_ecluF_eLZebFPbJfU3eIL^hig4Kjk(^=_*yTaWRhk{;^{aL27B zk$0g6R?R3m#n^!S9PJ|uzzKVLa;Rc4bH6^cD5vJx4wlz?2i&x{aYH2u5fY+x+Tupe zm6jGUH*Rq#mVw|aei00%fP{{>fC+fV3{-@YIWD~o4gGm4Di*XA4)t&nlKI}lgPTQ= z8A<Z!6obgx4?YqS>sR?e-1+hxNMxIcmZ`2RO$`j3V4$3WjNnaVZLOgJ%-wxcl#&^! zZV%<gTH-r3g5dHh5^mgVL`8Z%o*sL%eMX_71d2+kDQ(~3Bfi^%4i)x2oa1IzB{?Bn zm5X_kSN@KB>JJ+Moie9<4+3)KujHebTYc&7GxGB{2xtB>D<__`^D|x0l<SL0gK*ho z9xb5e|Bh!rJ$eiuN8(u2V+A#~PjAR^KQMJA8F?H5u`K~?1YbEMMRvb`SH*m;KX;U| z!Z+X~tReyy{MjF9`Rgq4FYqsnZAv#kKcj8z+bV$V(Y5DIeZaZ6XER)NKe61d$3V^P zHfTO)yDZu)qt&QwU1vHzJe+RB$Vh>FaaJhk0)u2%WF$N>KP|23bWy)nWB71E3^FK0 zQi~oTcCezUTDyV((+%i{kc7nhyJfZ{T3R2gyu5RJT`byQa^XO^eRmh=78)98S~Y{b zKxW){QGd7Fq8m*|ww-=HI@jx|wGq2(jbI|_SRR^2_&hnMT5*5(1?tlNMb3|_8vrXX zz0!`UOa$gEhoa)aVZiyDOg<~`f?@Hum1JE269G6jyNhFgG*RXi1j)%vOh!hSloX(o z^L0S9m9+Gn%kpmo3=RjalBy&awE>H9!K())Gz8dcY@bsjP17rL3xap=h$+FSdqpl; z!q9+RUMg$qhlWz{T^<S~uHii@SI`c#znmg4-)~V?uZhkbD3B=nKOf?K3jKpK>Pe9S z+BuFVx+LPnY{dZ@XXzj$1p==@b%G)<pymTP7QpT1K};T<Fl+Y{=dq&2k~yhwVgjje zDX_4+=#cc+Rp24$=<|E?Y+;HAW42=sSn!r%Xu$}`cN)5-_&08Vg|MYeY}g78m^@Co zYsoZa%2XIWwUl20^vKEB03dD7X3!aT7f_L8>y?v}uC2lgYMj4C*c1{W2!a9w17V5x zi6o<=p~;L>?fQi>mZm=KRx98JiMZ5f;4<ur^W7eH?b}(El9vY)BpjOEFS>#4Tt+6A z*LNSWw1hQ(Br9uf?j;(LVyvd7MR<-zgaL)ZZ7m)h85v1cyK!~`X=X4Vjk85d#}^iY zUpj44ks_X$L=mU_sDv~P7yxyxN_6uvjcG<H!v*Dkey0VplRRMUc!LfCRL#O1X*Tw9 zYE4aXaoQc<v{F^tmCe43LIwK7TBw};_i3Of=pnnxgR(hXxqIi1HRsq;!4Z?Zqj?!N zwXLV;!RiJf;8*JXmyN))c>WypttO5x>uVY`w(MskVlp{XOShHmM*I4H{206#C+7M4 zOZL^VAS!g>(Vh+Nf%<&*o<K(09hA|4?Z9R#)wicLg?syd$F%1cAgij@a&xnm?AHJS zVoC;K7$F|8lWhPS_|Da445)5R;mm!U$(>yg0#0lVe*cJve1sC>ss-!SA9!}Pmov?* zjZ0V2hUffg3GcauoRTceLG&)yx;BFT)i^z6oLeGT+Q(iz(lIPbr^j@l1^boR57w$E zi!9<iiReVRK_M7A04tWaPI{qo30O`f{f~S=@77y*Jaw_BQ<aly(JfUr6j)b*aGAHW z^XKKofC58cTKIKFUU6-MoSe|dmx@VQ1zA%gCN?yL2?^=wXiEy9Wb7_Z1!`I&k!8<Z zOMHn1N-Yf=Xe)@Cy+WgE(Vi?y^vjl0{(8I?#=IhT5Nl1wpNLY6PWIcdy!Xudb(S6- zcJX6nWwp0Qw#WqN9!hjkEa%CwY0W157kUizIafaDp+a$4$q7Qs-#N^ucvDNY^vJP` zXfy&Fn46kf!@y6k1w$Jc=;@)6=V&vtVq*}WK1oaa`ANBLMO^X)M_a1VsLGG9U`iUA z$teVn9)pPUZ^Djx|8OQiuzGJ}MKU|PRNsDUA^h9`hUY%Ync?cY!A1Ng$46J>G&Eqr zcWneLKLD9;5;QM*8JXy7nF!HCyOW6!bc%tXQ#5qj#RCU!7f`o}POO`jJg{|$7GHxg zGo$*?T!4TjGN?ZQWvBiit<|*$Z!H<rt{*+IJ*nirwFbU2;H@nsecJsZ=d30NB9lv5 zJFWoMBJqg1q+PZK$G1XM2jf3Ya6MvK=rEp8l{&0hV|4C*eI215^^U|w$6YG%jfnEc z<;=Q3OssHN9>HWyJJf?-2ZSJzr$;tzU`B?XtX3}i(j`E7F#B%o{HYir4P!cN_XiTE zN!i|h^+y=HCPep1slUcvebdZgb>6ZJyQss>`RxXHB3hKeqDO0MSWbc1=<gF#NcxwY z&e&`<7lZg#_Q=LGBDcv&XxqRY9S)W+4icBz^yO$;UR~*{AMshozyae}pufG@hx_OR zH8^D4IxFCA)Mb~^ySi_$IJy%fDH(308%qL#Lc+JoUE2xeDPmF)8v`D<f`Yw0pnevU zA{-a!BT@<j3vg0BfgO#FCj9XjzPfL%;-1ti>+5UIPVg#MGIHA<Ql088ymiU4>uY=a zD6?h11`pIuhlXg8b=QaqWF__I)h_S#rtR(LlKuWKeaQr0TuMW7+=QS>mS>h~gt(d$ z_ogxrY$?Ea<B(4?22unV*V2fL1tw2gc}_u~tF02*eSKt$>|h-JnY7GzjaqCrC<njq zE24BYjS2#zi*NLh7NpA%VP$1GO?a-tNFk7w?c+UWp=B9jd=Mm==|!A3X66ftGgS;f zI*y2qO~x`qjuS{`+nay*5Ki+H1`3vKe*vT8uq)sq=80juyMSn+p#ih2IGKls%ssbR zL|kh|1{<4{T0}(!5QIu9L5|r-$MxrxTa@Hr*>iiw)o7IGHi3pf7aN1!a>o)STN_@b zQA<t+rB<i=ts3Z20VB$M`m9R>#m}GEVp13|_Vt%&^PzUnog?(wn}s|~m7<bFM7TfU zqb}_fLa=x50RLo9k)9FXDtIv>UKf;iq|fTp*w|07^sE$#q-dhYO9on6>hSaoPmefd zz)^H%jk>2`an8b+-@iWvd2b^Zw%is2g8&f&SOVwGBa{{_AmC9+76)LlAhwj1BP%mA z69HT*37b2AaET6eYt8HJHt@=W;nz6z5&zx&CXwu;3cPWip66q}{WY4>ljK_39aO?o z0^Q}_?|z)jZDGq~CwubG<IkkP5LRSnB6tPD-NZ;N-oE%4R)x2#XxrIiQ&|M~eIf2L zm=c~S<S<g>S<)+7bfPK~pRfXRM>`ae(1JHnyt>FB1lu7`8NZ1u8UZUA#KaycCrJTd zuCaM&p6m$H%f9B(CA0y@l70RD9^SbkJ%V;%o7<ZY=*bOd68AX0^E)&wED*tRX?*7A z7nxL9GUHL8w$gB|t^4}IL)os);^1So+kQKjt`MwjZmz6s5Mr_2L-v>iB1OitCj5X2 zjloKhsww57^56Gr@+>v~uoDFPnW_7dfv&F82kXV@DPSGQ>2+sgL)!oc$?|C0(|SqA zIju)i$>O*?T{2p3U4$@$hH0iANlbK(RGXQ`{^s`f=H@CqFc46Vqef*rLpA45QMo&T zf(lGx{Wot=e``DX9m-b+TW~{ta9x||2azYG69>3QSYch2Es(ge=qG@cF0&u4b6_5u z>MhT&ueTPk<c9?zT^9#RI3glUZUG$?y!CC@_GGTYg`x9+8bRfb_+6wIxxvjXW<d13 zu~E-FsxfUVtMF~)y3Dcu$@v1}zsB5YNnS|<of7;}2Mlzy!KjA*6y9zGQVQ>I4jnx{ zF@Y1Fobp&dJQ@5i?-}D={U_cj_+R6j9zPq;u~`A6zXawS;t6eL9mr|wI*<9gh39_3 za=nsc3>Rf0vMu_w)kJJChM<EHJDn!ptrOJV3!x-oVa;|1LfZ!&GsFBzeOKvd?g~5a z#WH;dq8cz``1rt7RZA-K$cy?#-NM2Mdkd+^wP>UUE0%}Je%Tfj+<TAR0Rq6+aN<`? zsQhKUGK5~~3NW?oIYf(bA~oN|d5ObJZee@<I-A?gG<c4b+28-{p@|c#)Gj<a48UN3 zuW|L>Sfr|!Qq9CfL_{jf*iyBUV)KuH&H47^)*l3EX;rSFVT2MpW5&mOYf3cAIU(FM zVT=+r4x=CvQl-J50GxsA?e!a->+J-<S8z!>X}AD&i%}R5Z*R$cR%KOG^e&k21BLPe z>62$*#5T`S<O?SF_FWwgG*MtBB{nJZ^7!}>Sd6OO*f<Cl2LKf?P4MZHpC9NRy_Y8^ z7;Yn5QY5`Letp0-N89xJtda0Pw!C-GP0-{+c4f)sEAP{g<Z99Ova$pFywPtvJ5>wF zJnLuu*YU`eU`Y^m`u*j_*|K95c@s8xG@;>%C%<P|JCK(I$15=Nw`5yW;vX>^LAA#9 zp1*{-DIR)c9P#=myloO<3)<|Ljq-0OAur=?#jf*u!bSDJ3wO9M()3THk0+ffB`@}W zL#n+{)LJ{VEnrQ3BlWovC=9KO>479A{kG+LC@E9HTw3Qx>$^N-tRLSj4!IlK<^fed z@Dk3NhldE51gn?b7GN40fk6Za%)$cL`T{Y2hp(91TL{UKLPFZwsi4bT19}FnUqOMO zzSXskf}|AVP+DBXrSb8A0I4jMxm|JZXU~9h3LNLC0_G~IA2CNq*7cknHxf}}XjBF^ zSBtCu_*jR0ZuFSX9}c4#`^Jr~7@7N>R?g8Lo6+Dj8IAk=luGhoqYLb&etUQ$S*71$ zvbc4khQgy;2sSp0_D2>3oV|#&v~C7>A|fD64iF7_fbtDY7m~*dj%Ma?ynD-rIIguR z+yeZr9s!WUeX0#XZ`TJNO8m_%6*v&T&Y#ECA7yY>s3f<vNw|{6iS14$awx;VzA;j( zFEj=$P>>G_Mny&AGaICsliq2}p;evkJog|Y6WjZ;lT!`BL(=?LWcmh~A-m1wVZhS_ zOjGTk>4Pu;Gn0Y<>p018*loO!M;wt1fl>xPdK>LI>164Fg}5qvP4T!XMDse0CcH}n zT6O-dFC`*6h*5i_T$RV+Jn&<BlY`^U?G&8#@lkJn(@O%kC1Bf{Q3om<uyg&P7^@fs zBURh&fJhE9QU*$3;Q0JGh9`jW_QF=u?EshQH<8=R#Lmt>K6<5qK<esjOC|~l`P`si zPDshz*3!~W+}TA&%E<`}H6N{8uuV-*ukmT3G+FosCn%`90Ne?<0I-+Z*Li+<K4Xc} z)lh@clVhU|r2|OgYHNEKG%G6s|1wR$p*l5TW<db;s3?@4Y&sa4>RVoCv@w|Q6B4=3 zBR^K>j>%6Ib*5bnZ8U+=as!WexFj;{o`Zv=B+K>Hu}=iV7(qK=q7|cm9zI&-y6;94 z3Zy-V;00vc$Epi2*&{=;fKldA<n~>=;YTHUc7myCX{Dv5=T<hzDeSrcxqrObXIS0s zbden7FR<|#lGUu-+28u}6<&W_XZ}M~5)MdIX1~QUy->-V=PquHYKswQpW-mQK2p81 zsC;6%)@wYczyFso>0y9u+Ro{y7(z4=9zX`k*DJHmC?h=a&Jo*ua7D{KmXX7W4TDuX zrCQ=|cRX+;fFWLGVVc<2PI`7jjgQ6)bUy%e^^7EMH{ekcah=4p)VALZP@Ra9Vh9@g zAofO&fcIVM_y}TS5ZwA`BPIrN;I@)u&ews*wF2WO@GtJ|?Cc>JMS;9i!f~30hPv|| zf#Y6jWAQ`cBBzIUJ_BzD@OH__pK_cEBMp2;$taj7M>Q70b#Sn^NdV0HJ=%0Uh&OMv zly18NsHy^gTUwgSboY>^+iiZUPM!+o1VUDh=}FMW4MF2|#W0dVEG{M{fizFQ!n6U< zYkq!^xCd-Mrlvsj#G)LFfCitVDI)_65dpw3;xJ6Ag{Gyu_!77J$9tQd9nohjY2Lh8 zK>!HN%uGnNj|B!)EQcmMLiD)l)#6AkU_R)x5j-WjQ(joChIA_S3+VH~W8`#vvp$j) zo<LS;u7tY2J{b$P!4Yx~k8IMb0_`zg$K9^;i;Ls%#|yvm^$U##_SyY|H~NBV+MV|w zG@cxN3{ci&D=f_P=QtrZ-jX?d=iq^##RK#>&|#^n*`rz;ZdR5&E1P>K8+26-v_D63 z<agY__uz2+(KzP(3}gHzJ)W`Lv}C?r><xd`04=%|G5_lNVP>3}@>jDu<DS=*M!Z5f zU#hkC;FgCBs%@NBN54qh9%(9B9a;ziXBnr|%|t^31H%B{ed@FBi-_hQk~=tiVs6@= z=5~AS0Q*>8yTNDA5Ryl6QKc4C{MK3~so=oqAX-C19ZpCX#w_V0e41u*ZU9RI++^UW z${<pQTSSEY>`IUJV0peSL8&$PV0{HrRykQ&xm^5@vq@`u^9M_&`;6i4?mcPC>+OAc zyE_kYW@}KtHq|x^tje@fobT`40Tq247(Tk+f+H4&o|7H#=5~2`G4=HcK?M(+F5SKN ziclqmmz$dtA!sk=D=I_>^y#c*y^p8q1?FP(zrG|G8iEFMFt8HIqI30-M8Gi|OCXro zpEm{5l#c$Cs<)?*Y7Q($Znsws)?KD0c3Hs*(a%rYCCGrA5Xj>J0s7@Y6e_iR*XABf z369|`oJvn;knmZE^Rk%qE!PVG4SChjFc;VGP$@={S-E+iJD-`a7eBD-rMJHBR$IW! z(1v<yk8{!=pr_)T@3jRTEx&l1H7BnmNm4$C&0r3SNqC)FltWx}V%5A)fj@|GB9aE+ zAV}pG&!yEq>sz^CQq$v+yNbsB90aR+N>vC4BY^EApat{oAoksn5V;8*Ybdb*XDY4) zJgIZOr&l}M*QMP(<M6}FeaLBl(S4LcM&`*gw}q>Nu$r2-q})8hw&d1!K2Aik=TzHm z?``y_R}F9jS5%5b5E6cTwEgaGP7WX@WuKC&2s%i(k?(ADwI#W@!1?$D<f2+cCZ~XF zDI;TX(0$@mMEv;+bHM(mSLQnZ^(8Q_SGY^TifsCxQAi$>8@ROYtO7ET+hAub2nZAl z1JO~BXHKuoW{vt**fTnA*;-iv+2i+v8@k+5J_kVK-Q#lH>^a=0VmRfq@e_nhIsDx_ zw`wr?s5?Q1H(-!zPZsxr+|yQP&k;VJr)2;fnC)nCqP{K(A>qf5pphrNNkz4}*W3(x z$@f3IG|QGWrBg|Zv~-B*$vMAyAMFC=ZI;cXC2qW-u<pXnR3aGQR^@Pm0DW{jTZ52? zfJoGxk}5^y?DLn5Hy>?Srb3pO_i3fuU5_*aqO^RP_Y0}gPiCD`S`3}i)PT(#Ybw^N zgZ0xJLKL;INMfQQXO`Jg4q1Lpm748&4^xoLcnI*`OGaEyQ+l}HycNC3g*!8M%JqrS zL8oKIxP8O0SW0VjiAWZ<`ZzpVi<ZnpFtPQ~&9U+E+1W{=xYirNZyF!mfLB%$5lv1? z$v?05Rv;<zbh-De6&c2m6ZkePEQok}iHMX8RjcCZsiI<fNe!K;_p>$LWwS?UDD{!s zjd%=?z7`wG+S+Sx^^djxy(?qO4maXkfxjs@xI(DNa~%w`+l;4aTpMWsWmHhWdEmJ- z-WWRFPAsu!`R8k4Ju(lS*gCEjt%9-sKnw#GHZE|8=gE^VGGkTq0~N~ysC<VK=nTu! zaP4haoHCN&G<DikYW4OAP=B_KfZk!(*VObtJ)m?TIWe)iIyl%(0(jM{8MCo(#=hBC z^lK?e1;M|y3(?yOj_ogNY5+f(Z8;beIcatPYXwgAjQRq16(Mnj<r(@@d3u}B;S>Tu zwcl(%Sagt5Y3nbUodt6WE5;crEbe_V&c_+$JMWKGm|+Sl6Jdl}Yho7Cw14X=Djb}t z0<Lrt1$jiC9JF9IsRA7rJV*vFhJK(Yi#t&EW0!>G7Ln$9BqZMUC6mg@0~K=*hs~C6 ztwm-lvZ$(RYYPdbrhT>qI_K8H_ZDtGVo*FZZ{EOwi8T<*nVOmkS?}pZwepu|&(rke zUtC$N2&Q5dCFIsAa+#iLwQkGAa+=I^*bjScgGMB`#{@RwH#l6Ih7f-It+CM-Y2-g_ z29)6&H{2FQedvYVxNolSIN_`*POYrKl-YZV+pWv`wK8I?Q8V-Nf8Ohz+uPsYfuT^c zvVioM@5OG80$F^EQ5f_~yu9pZi!4+XL##76rj^QO2ox39)=`cYA7B=3=YTyk$MYQn zCChF7vLhgXeEe8rK$ezHllu0d!0|Z~;Pj4(K|oI7VM;=xG6!aAM0!S&7&x1<u{;Wy z1#tQfhkNtkl8D8D9A8f`;dppqMXF-B;bP*xzWNnNF+56p-;az~xABl<vpP-~$hh9s zYap@6-%DppCDang@Ax~KT%Lxq#gMhZ30k-t17KBcmCrwaEF*duPR!uAatr9zSqc9S zTkio*W&g*IbF8E&g-9qQWTX^j^)#%?I`*unC_8%{JkmsVvXVW^UOB2qLS{x8QN}T{ zSB`Oh@B6;>{r&#e^?!e^>-${Sx8j_8d_M2-8WkDw^7$<3BfdUqUCn1S;!b%;g(c*P z_&7PY!nVx}(0=bfbJvF&MXOxy_ObujT=iL(ItkPI`q0_$`{ovP-UBcv<C>Kfb(QPr z$jB&lP*C=QO@BEx4dkf4o4UFxhh&|QBfB<JE06&+5VW)a<nAigR*+N%Q?)(3=4QT2 z$MzaNHry1I~jj#5L5k-qdEWA$?PR}DpqoI{gX(JlEoDho+qy5!aNR{*JObwJ6$ z;NnGh8Oa;}1+x5b;c%ES(b9sgEhQ*h@$n-@rp0;cnRgt}1+=T0{`OWU13zaaMNN45 zvRE@R`qAarof_2V&j$rrS&0yE_*^T=Og_y7d*Ex}*-V&&yPXP(@p<M3u@TOb`!%&$ zSy{PvK~XdD^~DRN^%cFG@4Mn<Bch{UFy<P}&s0%1gyx{35A|*!z~ub>*`KgqStDo5 zmOvH9?w1>1Dak6J+cSBU#~fv-HWfcUb~|s6U@U7_v*TZ#i7tfdbl-nh8K>RJetLXv zfr0tk8fJ=;akE|#TkUK2{h<rhXV#`B72k*BRVHXeZb#wC7HT4y*OH?B$<QdXXZRG7 zAZ7J|7AQ_jOCN*%KYz~22Wq8^cX{DLpS{0f(T9)Fkxxy%z`)Bp^qxU+Lz187&cIoj za+kY&r=hNanM5!z>ps8r-C?~c!}V}H_!!Zdo^!*&Y>B78fOl@HKvi{pHK!t;n>o2! zPNE>0>cBbI@wS`-`kF2B>fjlm!e4nIzy33LR648Y`Y9YIXNCsUZw(F5N0ei{61!*L zNt^v`rFj{*q2zq98&0n4G;bV-UtP%1pkZSFH`r}v7x&pE(qiR}x`ojsKW2kGy}Lkn zlFAxVuG5(Of+J*WYp>>5sFfxMh()L#iW%4<4M*~c@+md@>uQEYMZJWoHM23J)RzCq zKmQPjo3`%*f|vk6>ATbpOo)!Jeq`%aI}C%lV{R3R9-O3)sB$)E)<cZy?^u(FS5s}n zn_h~%r=M8g?YqqYi3x$We0z}RPK}?!wS~Q~DrekC?hW(d!-7<2hUoiizYcb)O1>({ zbSh0OTA!`)`ta{dJ6u3uU_fs%wYGK$uZB8Jq94pDKYm1E9i4a>5jzf7y3&P*cXWjC z&_Sy6H5~>yMXfx(e;P$~FKH-ICC4>WvnckL&CdNKJhs5owSO;yftS!Vfcyu;p&Ajl zGZG*OF%dNTIrMd3Tmh)Qjn(RaTa~NrcN|n`>;bM-Hq*BO_AFwd6Qu#9%myJ|Zz{M( z(SDOr)FMkAIDrV&fop1K9gm1z9k?w?1%tA%nTp$uk?pUkyYL$Fc4aio%GY0Y?feY` z&DoiO+F7EIU|I$ZC#Rty3|@g(24_z%v8u{O5E^dz`2fk=b=*MGZ6?7D2Q<CkMetq# zFXf(V)mc%S7KxGqkHuSG%BRGKfB^O9=SzEnPKNK6$GU4W!qd2Lp{vm4ZeF;W5&5mt z<cI(2k?0v%8UBStvEcS$V|o@U^^4NWj0*3CsCYhobU)zmuj~iz>n=p&VcSoAPs`?) z&YaPf<v$-)6J_qw3S3?{0Et0O9mKIU&%!4pBr1AxU#!$9oX~4@+sr;l$0Q^)H29AH zZe5R<hRmn-qDaxw`$wUnM$DYr$SCOF2Z?eoqUegPi|hw~ysNG8AyT#$TOqTvn|ZVk zwv@PoHf_m}2UV(xDTlyd%NQvAILQN#pDZp?SG`O5_1mzvuI`qoD0DKOTzY4xp>gJn z(%lZg9Q0j&U6&H=x2w2Q6i0Zxvul4FfX8pw)Bu@p_6Oi{c$tAEGTmEo5?T(Ck@34= z+LLd}z)V#i3bXtfZmMt7W@fca5_0Rm16gqVmv?d9-&_X#mHl@hlS0e2Rj%m1@SeTx zl`bz&15wBzw(6XwW>~^IC`CM%{(E%h#}2vq|MqEAlSN>pV&<ZIzgX`%|NF@J+uKJ- zN;>l7Ywgzc)|@|I#}IS9{_Y$4yHsCQkX6Id{H!J@DY2*`r+)wmB;!`{^GnXng@<g1 zgNtsII>7HCddaL|GIzzsbL*0S4+2xJxr+@UOt3J0jfTWyvH52GS;d(}(YpSA9E~oW zHUJ&_HCkGp6h%KItDQ0|NJ+`fO~D-#IqOrIxdRYmt%`2UpW%P<3t45nPAd+6q<Pb~ zn_f||7Q_iQ;8I(Ph@5rV2`T96pm_zWLB+zeGh<)0&c|g4y>XxC5AF9;v?zk95($W9 z|J|a7N`<m^P@9^Tjt-#}{`&w496N$<m5lv+9max@>ma?0hn^*n!D8Y%EXTEw*OOV< z8QF=rH_TISLS~sZN#y&i$5iL$yNwIpm0B`NI{r#kg__&M`Re^8=^m<=r+p|s-g1zL z{`@(UZ?xs%dA1<3qsl~VJo~Osrnv^MrRp9MG8!DEqh&y%$6JxSuB*!q2<-Aqy@xe5 zfTpub%e`Hay;^tc<N-o3ukZM)7bg=K0{${uo9U1WND@Q_APE2dEAPd+&p$c2)HX2C zp9cgFDqVD<c=Pj@{Y=<ii(b}$O8<ss{mraYVzQ{CU_R}YDOkHQGb<^z6d@``1faN^ z4rXYl?#x+OG)0^Hey`>%-y$QVecWkVZRb^$A%XKzckVbJ?mE@hUZ6k7rq*I~QY!3k z0-}x7-htOkjPmqEHMM?D8tKw;E5s-H!Ne`$ovpF!X*jxT{Xagij$(0X-g>^tzphMZ z3KVCll>6q;65;a(mgLa4VOSrh9&DXs{71k6K%zlR9LK5POm8_iTXPVwGv0sN4)dM$ z9Qho3fKOoya4-}zCj5xUE<N$-jm7HiePi#Y8_K1A+t+-n>d?2huboL3f&puM@+5%E zFg(SiM6wjm8CVS5uR=7H?|hV13^{=;suc^Cl{wE>l&d1aI2s5Xp}ZU(+)Wn{U<&5( zT+-s>=a-k4<%Ch&?{5d~s7~8${CeUtRUGZkidVhFPEt#${7-3Hfgy9v0uK7!4^Y(f z!J!#5?O(rA=yYP#gGxRaU8j>|9+u3fPB<o-`vw<nh%74RAu8rMGW_;{v^I#aJ<u#n zQ#bcJ<UZuD%$p$1B;$EXcJ1?CD8(FyKZVfMPymty({?1^&taQefmpzqpiw-1LNi%? z?;#{i7c1(v+n<>e*k`Ij;+&*AaP|TjXny>dn1HS3(j`N~pdczuqGQyPGFWaO7409i z?n>fRpn<BnEx2c|Y{j*$eF6y6qYeiX+I-W#(pq&1pvnZ$fp!3bS6hekeyYcBakr$? z$g?vcJiFu10);b*4teJo7?3{GV2yJ|=^@5!7>v;C{e7D8`_Oy#JQ;RZ9(j6Z+Q&~W zTzK-NMDM1{Ril?t38LrpUGw+Gzgde7T_fzhe86K(Q(8bJoREb~gZYoZ`;iFbxm`mb z3sGtFP10gv1oRj-U15WI^CnZp%h%Epj|Zv`9&c$`U<P9YpwmBQGoni^#zp>51!nK& z8T3Oeq62^|BDH-Mm7~w+<-<L}T&*63GjCy0bGx0JaqTyCTX*!H_|q{js3}+IZaJ@# zeE<5yhmIgZ{cE03Pr1galDA<n0RPSb5IpYvw15$Zz`<Z(y7x5$%*n1@(_^=I8+!#R zR!M_AdYUjGa=}@nMD*1+lfAPiEFvNy;RWN!h~=%Zk@&%#e;JVv$3v0#EI|~dm$Zqz z#)<^4Eyr{J9C{Vf_Q^SMdf+##$?M7*zf|QI@mo0y=1~+};cH}3Ey^LQ_S}E4Xy;yz zooTk`Dxf^L7GR!5*vZJqXg$ay<05kMB&3U9(=P<iISlnzR9E+#)B<n@P}yI;jEpSZ zPd2T3^X83YZEI_*#IYUYU3Y5<Fe>`*KXbo<(yQy$>Q;YwGJE$@xdt9dsniF;wt>Np z-zaEt6WWUaU{OSJzMQV!xe$F|4!z4Y(<}H?bn3wF%Yl0xs%P8><~=u)&P=`Q_R3qu zt(`!YQunlB+3f*<`WE@!ri3H~(yw0{QiOSpN{5;=292bH$(`)tdj|iO1Q@}zUy%Q3 ziR&$6VPxD**Vxq5*w{oJ_#TMd2)nz{hK{^)=+vDyKFE`i`04xO?<9YGVaWc)qs*2P zq=&J-qJ)wq_JpDLkp4Fc!W@7j7NUH`{lfJF_OJ&3w3Kb`UO%{UMw}9lA8n0RG~PNM zwv6xAG1Q>8ZKJoPI-tx2Yr(m_P35jSV|FzfguVQipB_-)cAtG0sz4s+Pqys?{g4tG zsgoLsUp`Zrm^R-!a|Uig(e1?rfO{z_`uWvbyfL5xYLeNzBmDmS$^a9(KfY0sZAtw5 zDs@&P+GJ-j-erij*cPU%!(p3$&|?FWSNn@6tL;IeY%5e>BvZ`?SzJFEc^~>8*ioKd z3CnEjW0r|#MY0oh*yfd$liypZY%iB`et$r%8z{)83ycIrbD`|a9*$M=lzKE3bk2|$ ziwQ*XN^Mnkghjb5Sl&7c)8TAg%{|b$y4I4Vqcm9a{5hayPe2UU(;(e-4-Y7%#Ekxs zZTwgSGCNvN)DJ!WyIonMvJm1Z%Jm{sGAr5wE@{lh08*Mcxmf40ih$@e3|S;&Gkbay z1oUb;wdGFnyO#KJz|OU*g0Y%9@Wg>Y37?Y-Tc{3>rOBVgw3O^*zw?xUEyC=z!GxM~ zYioBhN1XZ2Ydb(_?wM;>#`ZLjaPgXzU!_7|3Io8GNeK!KeR)vw{&=KtSw9Yr?AE(h zR+lb$$iA`ZQs#XJqA1Wp{2_buLHB}2sf2%QgQe69IBvJU)x$U>wZ)Sxnd4Bkn6LCZ zb|FD~4Y(Z(BdTKMli1e+j1<CpqE<n*KB%#hl3lEA63EUlN1mL4@5h{-l&fgyXR|>X z)EYl_e?Kl{23Z8#LReCS`>Ff`Yl|Xi5RgWlX%+joayUKU*Z^Eef#2qoxj&|K#H5(` zORp~Pu`zYcT#$q!&+bIpOCTr)flW{DG3J^9Ggz6I8W7lDubvs8g(E()*iB;YGe1C1 zU(y3y{C4ZgG}Vy9fn7>>?x?639B6y>aqcHvB5qk$UP`+%0izO03cio^W?qi^pPEYN zDfF4uM~Fve`MN_YR*|$<k!Pc#qV_qkKtQm--3y7kQ97(w4sGkoXee$jLDPU5pe%^& z+(5IbmBDpb?SEQ{@9#)*JtYj=)OUsCP}jSK%yJLPno|Jx0kcDU0yab7Iv{P+nW^=< zcu{<|wXRU8FJii3!{n5ncEdR6zs-^u?)|8?*724@6ekSuw7~3|v(RRh1gh1K&2^eH z{XnmspI7QDote3GskXO7J^IVb40&^rOi)7<6#c(9`!ss9m*A7*VQPZlK8&C-_W3!x z6E+{t(bMWeDTM2QTt)&;0))lM0IC-dHlgM=gd^P7LnM_AhR+R#s3@oMv%X2|)wazd zyv~6oN_gq8&kko1e8|;y6C)h#d5BKOzWxYBww2eR3LRs+_;JNls^)6~Vq{<^pUU*} z8$u+LS`+C&p{Ps$!atpZ{-w4hvU!$1^xA*-lIDGoWM(@fkaE}Gv8R*8{FSYd$XfY> zpibjuY5ql7FxF8z4QSK?LJfhb-N~a0-hJ@&y>F6vY{~dPm@3rWDeRVZZMa+6#fN`J z)@AQsANPhhP(@{4OmlTRj|BA`<a;2Van6WO1`$*Gnof-g&D|I{6m3m_MWx8`EP+-H zl(w`L>}!zt{S&5VSX@INB_TFV5Q2eFx`9MW_oO|d2*beK$%CCk>m~JYNWlGYONJ46 zdAY$|x?}Iv06qg_<yX_nIEfc0RRcr}3(jh{|LpF`D=;2>;OA>=|Lw<{choY8ZgR8k zJW6uE_7=#Ci?R2hYJQ%;SwWvj|8GbbV8TD07ep@v65kIFvHVe9gEjAb{_iL4j6VT8 zwfa#uSyXR{t(RMxLJ9r^MDAuIs|Z>R<ec=~ka>e~dhed^2txtiDe^EDMWAGN*mN<l z(J==E!60;PTW&>Yo6lzh>WhMH;Z#?~@Y&sNf0zfQYxiwY@zl}~mf5Gox{ayo1&~F> zFNx!)k{Ke<{J}T}UH}e4)P`0G7+{?1FK7kZb}F}+`|g(aI28OO^qG~tv-4W3IQ+K` zuxWWJM|bi5TXNmflL?O3bmukDvQv&4p~b>u)RMGa_AH^(_r%_KWmW-II$Z?*SaLU` z`KsXg*y4qVXn*8<IB}vk{xm8Aq_~wiRx9hn^;h|13q#Y8d#nI2ar&U<Z*y3KR53Y- z)&s6lC{p8CQZij2^o^lrc+(A}wJN`@#U#oGNzorwO;aRp1qf%wE*Op$HQr`xbFy!G zC&qaNDhTO2*b$Q7-MIWu%)-Xl4NUy8!;ILE()m&*5zSHYI1qsQb(<RcVW1_p^;ZFp zkaaSnCI0NbZ9$|G*=HDXJ7cko-(M9?B*MBYHAHd*GAA+Gus@my$nl{ZA5~+ZF+phO zboOG(O#UDh3(_ZW-XpLf8nh;%IY?QHsRgYm&?rEj>DowP9q7m5VDM||2H<L|KP*jN zW2;|gtx4Z+Cf3V^dTdmK(xLR_1^Mjs5w8PiouuW0WRiK0K-%rB=P3Z=K<t!51eX-I zWac_`G~|~%b&Q@=V0;pGOn2(fN8VIQF>d=_mNe!ffcmBTLogp&8;vn9X7@z|<UmC( zN0-?afjM>O_11nyG3#8Zbh1t+&}BxbOT*`gAV^Ac32;piMs=M5bO0GMpu+a}o<YYK zXX9YuW?Cy1r?!r_O;+f&mUxCFfn;vV(fLhr(8xR+x2*$f!;7NjJ&+IJyJp2FC<IHH z>6(D%8X}If{`(}U6&-E3F`#N>$}D*SY9i^W|Kx0Qut54m)@eiqq)#ANx6j6s$D%L# zvfn<Begu6s7@-U>SXv=r?ca|*xTb#ZBWbmHT0P~a=8w1e-duk+eFm48XtRvZ$#5S4 z9gOFfjkZ*qZdnHjm5q8`_eEp5&v3gfoJK@~vX-}O<3+>@*WN7~@`k#6;x_Q?;WH%i z)_g6!IMiDTw%pT7RuBo^Ttl7J*{Y)Hi9rSr%IKf?_JRz>{ITwoa7Zr3oiG(GBkCI1 zK4A}K-jl=)3%ac+c^VNl0Nt}yD(rQOS)5j>>q3EvhX8zqgpIS9syb2J6v-Jc<s>(v zn>zLOd;h?%24fx+H=dNW1G&D2a6$Fx<5|Rt)Ob4W_q?=zdp4*oxUFF|Od-O^r=;2> zsGs0(sM3}9M<>6owBSSEYAvQ~mYW!1Qa2~LAa7G`4x~AwyD*Kd5cXU=2d(Mk{O76g z`cXL$!2G;c@lEdunV{}hja^40i?QPea`RRPzOP_<!bhfE&Yj~qydGhpW){3vZmAf< zHHTbPt!6}hxU0%{Yjb0LjYg5OvDgYj*4!6Ww`SrhYU9t0Ri7a37IP2xJMaKK$P$Q$ z3^m3w)vh5y55g(XWZ2ZZODBUWE-}zxk_)?My;Yb#py%70^En%pm=d1dkUs+tRO$?q zv+e?6g;z>p(FdHNx8L>SGaqEMnX=jWM@A{c!R0A9FcigP!jdoI4pj_t-hTfivH0FK zG|6iZpm)q#?_#*V;Qc+ZXmR-Xfr`%I=N4DYGHAt|YJ&PD{GZ7cq>p&8w#l3`W28;{ zrDB#uD_62y)3koPe)zXf*l^Yi%(&xNuS_&}bQcsT4kD)w{v5pR?N(<T+yA??kHcD> z(Q*c<)n|#kv8Sv%QdJ`e#>(Z+VvSY1*~GDd3rloDK|`BNTjo9T_eioMbY_Z&dN zea)-@7|B>FWwbs@+D^y1ZZ_4lUQK$bz|e1Zzp8!ua`Nb>=!3>suc*`8!p!_FzgTp_ zbE=f|_nj0!`%b#ko-vi?K2v8IkHtT)PoU#3ap4(pX_}u1<o!;hy~JU3KFx2S1t)uW z(0o~pY%{ey*?QY$Hn7@mb8)2fcUk4oHM269Q+gxq;)@quP%%XrR5lWXO^%xsIy8I` zto^vE;63|s6^9m|zH-}wk$3&0Kz9T}$N|*$5Xrq-EU$UJ`EeWnn@{O+!Gs=ch~IWW zk<7^0ZuF;1zeypcK|I3rD9sN&`<yZWbxc%!btCcWjX%yGZ=6CZ_Ur<J<7IPd02nC5 zhViAP`#&zS$j)Ce9@v_ka$f@FQg0ZL-i|si?L)L7SH>T@ZTs#AlYC+vy^3_+j{VXJ z{7>MAJQQapL6ShPK9*0O`v`cuxeFG{ja{Pp1+<v5<oZ>nOhod-eo%qb$B071aR@8S z@^cvZ+}3X-?g0`U-JwgUX*kCXF+t8r@z`)ZAG_9a`QepaZMRHcy4ZG8Py60oHLe=m zQkO)ARreoRDw!MAs!AS?5=Or`BLNY%=H~eEIRDjjSxtztx$My>c~*mop1b0+Rlbz2 z=iOmW++AW4r;`OCBS?wE1Q;>7#}an;j>%zO3XtxgKR@(bna5+~xiSIRm=I(|1?zz_ zjGjmhusk5um7eB^-X-u^vH$MNQMM-0Xnm?AU4<NPJ?d90nqHZQ?kvuprr0go*G^wA z3m)JZb3t#uasVUaE=z(r?op*pl%DZ=R{<&4#oQ&dr^}<Qj2w~XEs>w!@p)qPHwAyE zYssa_<Skh#yA&Se%}FENSuYdwSGohPsZQ!5dE&)%=p@4Q06bS9m~Q{)KmJF`tfAXl zcfE@LrrpRwGsp6okm0|D1-28+e4UBmyBd()dqj*Zm$>ZSJ#3iV{Lz-jZc(yrD{sZV z#E)r5Jco>g15W`9T&HY5G9k6HA~6*=u5Fyv)$Kd#l}dYX!AED%sl|{^$25sSR>5aV z&ZqYNt0iashN*7e(BB#%#)<lU1^N^P6~1(H^B)Y>!kGZf9FCkG57j6Yb^g$}-dvG^ zJV2ANfe$kusjf+n_C%T=3fcaot}>m9v4=up%shcuZRR9{X87Mu1Yaom;~<0W^4uXP z3&kmzUlxh)AVzZ`f#^N_47mHlyMte2xu=8712oHW2)>DkX`a5<R_c}2v@h`5uCpgT z|NMNd5tfsT2v3%K>aV>uNSDHIKZ?wnb;zW?lNhR=W>hH49YZd-q}%@5R(bc*Ic^cj zHoK{wh(6DSt;YGTWnW$Ov(sLwxf$l!ycey@Mm=+L7Wqcj3UkF4Dy^zo%*v{HvAW4+ z)icM7cf?os?dV2j)Ntgm>q@1iSD`tQoMs!-ulXJ5+N-5gV*L@38KuI+FomEe1iE>} ziGNVhUkk!%4*V@7j)nmYJ~EQ_|4)MV)h2H7hSzu#x7HZC2z_VET<oT(i0;U$mFa*L zJ`3`R?Uaq#>imFz=xF66b_dlgzjWx<z9!-*UgDHix+2=zqu;M$6;cyq;*)@hU+<Xq zx?|cLm1@7N|8+H^)V!c*^?Y~C<KtNy*>;hy)9aPdhx`dlD5TE;!?+QY4RLbVna&Lz zc3_-erjn?h`@keoO@)5^$UBraQ>;ENiRL|d>kDX%(F3;~32((QYGe`KM!?!<F>?<V z0GH+`hQBh*xpxk0g(|Q4Lgr|?lOEq0uku80%`98QC(catto2)=^YO(q(G{gjmMzB^ zD@WGPA;+!sy<33Qv9ZI<0*((Q2G4kmCk7MNib$=AiU-Tl54@me`)*qd_|I6g{f~{Y ztI3-iD~o-t40HQ@KWHEY9+Y?%pz#858{f~HVe5x$onuLot=9=_xv-A6o<V+@DHo%~ zlJhm`F4^!@sjE2Q&3-M`i>gXu{_He1$ma7Y2mz~5p2xj_#W=z-3X6KPa(Sw|;9x88 zH?%H%+9_hgoa&N5dy=*P^K|+(k@_XEt&wH*oR4v(CWvBx$^(D6)JRAh{q5dx3Gr)C zYb^>Al_Je8|F16p-Yy2%Cz``(bvl|9Q1$dAQV{a`VKK=-Ba(9KV!*K%mIj_B^#J#- ztDFCSY#FpRp)cRLOGQ$UO-IT@GEf+KX0fQ`hO=AxIzRyaH>83;NNH;LqNCJ#UsY6b zFZw#M{6VQ?=ns_^!ipHX=AO_HB)X%!wlhycCmNGIF^^}k6s&~2Y*kgr`y4|$3kV^R zL^*4<UPydEKAZg&Z&r^%^*SB$`!L}HRpSMhQ>{dPm*usH<-24u(m9Pg2-@({=UJ~b zDApc8Dk+GrP|VAMiDeh|R|1C>-9;X9DKe&`y7tXne20;EHAY-QlrL@WSyG|O_uwkw z8++m6{fcqXX7OU}XYlhgD=g^PwDyr1;1Wwoezf@8B7{HUIs%veS?tp3m^4})#4w_# zfVY(e?y$2!UfKeR^Y>7|?nCDF8*rU>sPYMlZK9v@d03+jV>b4O@Pkgmy&ZnVl8%m| zfBpR)();g~fQa8k{7HBUxTx3YiWOqxu*%NE7yGwdJGaiEAM@6?U!j@Q5f&mxk$CVP zb5B4ohxBgbpY!=h3i|K=fA6r(PUH^rWuajtDUI?Ggm9Qw#$M!`{0-^d@qv#s0q=zb z!;PCrlvuzZ9r+7gksEIW(TPAjDRBE!9fd0s^PE;k`-C8k>MlgUef$QReiD7<Sb%f; z<o>5U8}AW@X}e!NyWhnae}!09^zXr6<toEUq$|eAa}Ixj@OWG*7He4+_hB>%AV))> zmmB#ENJ!hl*PMi3+Ogn|e*N~e=g|+OR<}`P(#*Ru<Al*&7X<nc-S!yL>wHzo5^UF? zLgBrh(&z<BQ5PJ{klFs1TEia**)JZW5A>L2p37C75@UMmjmM+}_^gxUb!D{EbEK7F z`(s?Wl^8Il8o-);kgV!B>J8d-$Sv#<hz;iz!2Zf!>5DFA=h@JvGR?NRi&0JydhK@D z3KN&UpcmS$MxJvnW?C)hY=v0pIsWx_h8<gI^g5pHvqxn?JJ;5uc5>dftRfFbPwV#B z6qL5U-twLZZT&7`XH|vyMRX<2j$LjEu2$@54BdV#v=${%8;uMbb$I+M9ZIAxJ$vfa zv=aY}VlKj|5fgu&NF<*P`IO#5BO=?*dI#hc5E|RI??P#$zmK7YhWJI!KQZjqSTWse z>(T!`NR;F8ZxH>L2qAahC2uxLXju_E7R^G8{jRGz2)+-^m1vEb7BfR#CVG7*C*>x~ zg!+KX*8Sb_vty%2<mPEN*ls9W*!HHi$Tz(6-ZY|OInUL%Us_7x_%H?SR|xk`g{?1_ zy_8oz6!9)|Co5?xi`vK5r;D}uCk*c)oMk!>jya$V^?2EqGXBse*O9e<OsRTTmO_~- z%u96!d`FkFYA;ur`w+O9*$A?JTidYUX$fp+SZR4(w0enB*~viKSQP8ava4!-R;}S= zHnM?eO`3`?_{0qMpf@bDBB#L7cFisJc-F0_%WVIGRt`Vgm2hsgpiumz%H4`MJ7pQs zsEBD9b&+MUb-d=VH?gDfYWG+DW4dnr<Y|4kehyC_i6uye<j9TU6~qdC`UV%_C`auR zb?ku60Nf)9Ri{s+#RPq(>=e<8O;v92V#)cfcWbD8{CftMGTw=M+C6?Cz6SmZ<!!<~ zmOHuOz#RVGbv5WU#mxDY&eG>iDYIPOGx;-HV+zaH-qGQu69SdHBP^78-{8v*`7|UI zohhzlJ^S77YER7O*>eh;LDToLh(k70a%RUEQ<nO)qRg6CSzd3kJfeMozO9+B!e;HC z<yrlQl=o2MQ-k^;L<xt$MA;%*^lmJ2j~~t6jZOeu#U$<eks*L}k_2PCME7=1h}$N; zpo%6m^bYy-aL$ZfG^a`tqK@2e@L4AB>D{J3l|@<i{!6>o&R;>0(}*Vf#Xx~R72enE zGnwGYlxY)(Z}cReS@@@npQ};vOByLv#3aXe;`olrZ;S4)MgoO7s_&7sh0^Zkj(AT7 z3a?#23XM+9&#Rx~w%$xQMfd}m2^oG|t1>r#uJyH6&HPbXQltTWhiu!``xD-1w6LUB zzeA$6z&pHF^)pFRVUYF80H)cV!A^LFv`zoa0}BOd0Df77C$}@c!My~(r-A5aDNG%8 zUoK~6@X~_MrJZ|5Je-V)KHm$tgL5;I0=2sfCb*5HT8{h2bH{j_hZEGg?}|7ZbQvq@ z4k%KM{?~MH>YjG{Wa(@BX1BL_<4dhMcEs>|Y7ORBMJtvHh?UwkPvk?T(=?(-Y4YsX z^arM_MX)oZON{edG_@^fSoG|$lQDhiXsNeEG^we!bl1NUXtO1a#ByJKk82hi&&7>? zP!~f8W_j$A4J18<B<(c;n&aAs*HA-+`TAaxQE3KC%5qf5v$O>*`usSxsY6Jva#3;1 z-1N5SZ76p3%X8#ZTzjWuPaWlb;w#aS{NqvhMne!kV@ACD+Kn8E>4?6CPYsLWD>1JN z6)PkyiR7I}8Er-aU->2WM>DDN{vJ0cRx{tO_jyZtn?545tXi-|qiJewc{770eJL#g zc^mNOFq(z`_9*UPZS-t{6hZzDs!?HGmKOf2j>Fu0zK)|rjhS<(o5fOHQjlg0_K+p& z0);!#ty$jrql;yhXb*`B9kb06SuixrT}n+Cg9+Acc)3y$-Rf~ch>}nI7QKG4^ZtZr zmBcDb?ZMvpJ*H15MIPB0S>ug$mQ1q8PNT09YorR{h<)Z2qjbe~GLy0&@rviszUO^T z*E{vX_ym0lO=ZnC1+1Okk4NBrgkR;({$6e(ySVTqJRedIIDMPcYM6Ch2Qq-ASyX<d zOMFwQj8^ZTfOHVI2nfL0)*1z5q2+ds>A?d%`mQQrX@hpQ2)dJtF?RWUxWdEeRuKI} z26R5YIZ8fF8f$V*r1(tP=Z-Ox^jDVEIfZiU`Y$W;dA%K$BRh)R?rU$IHvO7*k~}YL zIQX5VZp!mq%MV4)vadvOPNB&9DbM)4{E&?FSq`lWdVjxXNJWinYEtSIih9cAQRnFT zeE?f!WsQ$%)7AgQj;4d=i^I{Ijda<A1w|EwOQB7^qaQkia;3$Zt2!5tjRdCZo7P3) z^#FhbAw3}BOP)&0T3SMqUYk1t4q)PAp+=u?MKBVP;PF{%SLXHE{|zh4i>d9`%*4bf zpqheicpJ0x<V{wsX5io=<3%H-TuT3>@%=_y#^j?{VkNJCptZnmBn{?mP{FY62vXdd z=lx@uE&O7$q06w5)DHog_zr88PtMr~SD%x*?hok_iIbmYqHCPM;m=h-^SR?e&NC6i z&(q@1Z2mE|wN=(A%}9EExiqKXKo`-xWRu35v3G=FGG^WVp?J{NqW-|(zT2_^MZ%u( zS6}e^NsKJw`<y9fUwSI@YBrEc-+qxb5kpTc#UbWj9{0jJ{bCO>FTZz{!Bf>Q{sYhV zvrzJR{oyr**YxFwLXe6V%3cSVPD1g@JN@W|@_ygtE+Drq>jvLMtw#X6>`_>gUF`&Q z^<2v!?_SetPPE(_-e`Rh)|&Q%KU5BMzeDeo=>|outjVMO*kJAu5IaMz%U2%z<4MM{ zEab)W_l0}D28H};Sf!GFGvScw-?!KkvED`a9TcjVRr_mWQ>JQb)c5;fUAQARxOjPm z_D9zzyxZ#S4JlexZ_&7#MLqk(ucl~Kxm2i+_-(57yUSrxTIJ$}`-ev=omW;bD#S=7 z=Ip#uTtDg=Mbv1?zgb~tCBL>Bxiw4pUH^TsU{Zmh(EN7&s{kQe#g@|9-}9duKYxje zJE@wwoVVNX1hQQ}i`pp6fBWSyUzC=%;R);{Nig?tL_IS|3BA+My#ad7KFnd|D^H9X zb5^avw!IGq|1is`g>=3>Eke(mTroVdcs!{oZVT8g-fLcbVz@_{o?R{*?GcZu4T<S& zTG}u8h~otz_#HAinwi3~3f~KSxs?^qRB>n2?9+lLK_w`BL%yo5;^(q+s|wxMx^Pm{ z{CLLEtciJ(@x_Oefma%iBq?u3Ds?y&Rz7a)O-v#EBfXmCHd$Slv_W0fNtrw4CKu{* z(!u$aU@yA0RasgX8M!wotzy0w8F?8=U(+k68DSeM+u@BGx~$tK`lYBJ_AjJW<LJv) z*B~BR+h9I`o}9ZW)pLW>oqNWOC%R5qgehJ6bTxi=<fQR>10io$v7VdBf^0kG&E>%x z8ob^U87-MJvmr&%z6%@b10mJSvaN;h;^<vlJ}-`LjITl$z&x6RE0WPeandILPzq%< z)CEtOau(KE9QR8WN{X2@itp~;FW*&S5k)%ZW!mgAnQ)dR^AE#Q(%Zw&CDaNn(MDdU z<QK%z@5_tc={S1ru672!4YR9wugM%%EfKzhPo5mwaWwnUr0<CWmXIaq7y8QGJ#O*s z4B}2i1<h>n<ZyrU&G-{i;{2=isGp!sy%=S)o8^GMvf>ZtSFOZv(<U~Wrlx#)hi*G} z>zDbu%$i>%N%3cEEVyNs`X2k}_={{cCY(H`v_&Io{sub_rH_}esYs*PtFE9)qd$|P zfdZPD6L@-ZZG#~bk;!&i$ddbVBI)>e*!)3jEw?N-CGw)%E1K^urOsJV+8k;>^l$gP zue)Y=m|E9Gj83A|<?!C;P@QF}er3?njx#fUbQVkTH{GO$*3e<*4=+&Fg%AfC38IvR z`#afLLOtuuw#R56Wc?p)!F5$(WaLWyrN+BUSNYS`rM#{9l9in4;h09~GaTn2U%2TL z=KOZ}JV#~1le|u+Qbk6tQQsHF_21Xi?VAluCG}0GPH^fwpN7(<y-sRjzow1=<!6`Q z^IsBjNV3Ys!8!B-@!y&F>c2f<bDzx0Nc5Z(wm=1(?HTMUC(>WqRWgE#5aNndQjz{J zb4$#m+~Mbkpjw#dBV&Egu15lN=@E~k*Cq6k{$p5efGbBGSjM;j=?@6(U|x5gN8&*> zY343b`kt(o6EwoN^EPc>)<h+62N!j_b@_z0f!Ws%M)#3wl_0~bMACSfL~Bp$tJf^y zOX`eN%dI&R^D@q_dRV}>>O^wN(MuF{)(NdIXcZpEw6^v2n=xmTQZoiDVK70wYs@?Z z=MYOM;Kue6Vs}-4!KPOr);frEu4%v%2Tp>Z(_xn{F0anMMYV5eZ3!myc+}%^llnEH z^IOuGwVj=I<MPlc;Tr-eV%*88dvf*$yi$IlyHV3Vg*_b%M;6{)4pBGP8hOfH;2RPL zTVmo<Mb%M#m-k^CZ_c6+7_};~)~e3=<D2VluLhq0)B$if`Uf<%BFMqeSLj-nLT0=+ z*-JDs&$_Uep8-9@{$(_(3&KE?LuhXR2O{(l4XFbXG((6Bm!hA-+_qO$wfMuyk7yIZ zyr5)q5!4pu=4AY2p&t*^`*=Shtsbj|w4T&li=IK}ew9713z93_^gPHG$4(=$ve9^W ztzSi5_I4iQXesS^GSww;=WM~1z_$srfD+Cuqu8XAXy%jlGFRyRi>-O4G|JC#?oit6 zWTK9fw-Yyc_0?IJEF@3dYZ!X+a7zcL)+vJ>^B~vC6!P&EPB@VRzGTWLJ9uW`h;on# zK|v2%!8a-BT)kjT3N-|4{t2S4=Vr=>nG-cq$PQTF_Zf3N3gkXBD8rrYlJwDW<TC=$ z!4u`s$u5aI1Yok`uY!4;WH8B$tWRz{orJ<tf$V2f6E~FS@o$o!y~HqgcS3<&Zampg z{^YlL>G0Eg_1~8ZM2?qCe|B9~m$fq-<m6=NP}Hz%g8CwJYI?l&rEgW2m@ZZNKz<&P zpTkp5gwI(9-=q|L;cCLqjkC|!?~=hCGzxU212+_(PG+8XZf>bk7r7CBL6H$H_@%Ew z8^rm_BXrU$RcnKwm22(F`lelL5zNIcpd^e{SNwV`nqU5FCpM9PM2gB32Q^9Lte1Y{ zjk*TWAWZVE?5GuwVnlTRYL0hgUkds&S^qSdZ!N?SH!i)@xn|^cnjKEA)Byj7Eu>sJ z@bJ5%Dj4#VLp7~Cs8lXLZ+g68B_8x*MTbVKRYtq9O~}-XG+>wplOQvgo=7e3*Swj+ zl1_{DLekT)jf)<08!4u?vqz&ARRYs7Hphu_&TX5>5)k}wn<n2mBo6LiMq+GDFq;YO zJl6G2W69jgMyoYiDAH+S&?~xDCn9YVOqq~TQ`;XLpnocucBjN=<te4*2fUaZ%Xe}$ zvzgi$S7kbH$O`p0^rN`wZoiKdksez^P#`uo_`8a>;#?E!$wmZfLo^6By0n?>*HQQl zI5Tan{CW30b4HbL53zHju>f&t_9uEjkFDyXOptnIrf8&Fn29LuJ`1S16tGM3)Jg*p z`Tr&-y>xCS+{YA^X1hf)EtQPv%hRL{u1<)afNC3LZy-8Fj{WZk?2cRd5Jk;S4@7rp z2EX*3`S;TpVp|3pro}sVX2pkh`$&=SSKqP*W^O5zX`dHN>O*vPvPJSr27_7%dG@1* zecQgDeCQ6cbK9J=H7Nq^?@rRwh}g8Ha@e8v2)ONAWrw{=4BOgIVqw{+v}-4Q<y|g3 z^2=thblDU*W=J(r;B#%%S+t31cdR<9+&?)}&Vl+J9kIZKMd<!EOyL?IIr7il6GX%T zu_?Ms?oZ5gBQpGdxOEP8GbB1Kwhi1A@!>mnLH&Zqci~O-Z|sr2jn<X62lt@$LW+-F zf*5?Bu4R&*FBR0q8<N^%rBASqF-`<?df-F1B|WBM<X4RUl1$F#-yZbli6K|{VWuaD zlLBfglU;KnP}tCHTxk`Xp?+Lc$H!pFF)wI7Kzvv$OiwaLI5-j#AoPp)fzY8ZP9exR zAyMgdXkitzAO6xFAZpk+EJaG9)$foBdk=kht*_hGc7KnOxQe@D`7fFlow5#Sc7<O( zc-r<`@%i<XO4N<)3=L}P<s`U07`ZcrW(4hPK-PjtV9;p^$etW4oxlJPU~>R*3h@1i zj?=-p=xED}_kV7W#l$qTCrD+LYM-$^O?ACG8WE|Fp+S{4$)_AJ<HGL2soxkDthn1p z+gi|BkclxH1YG#k$96zzmGbGrPEE4QL{FMI$25`Ttk-HNf4k)LOj4zoi}B>?!~&)| z!sL+#Iw6js&KEkjuO%@4wR+t4LZh*-p8s^vzWSBV^JicLCFr_S5={<-7C)f#)?UHE za|fsT6TYJ%%{$cHdQ~?8@JR?rsk=Ld+8$cn;~$XS3oQA%%2smnN0SupAiRN<6?zP8 z`f71il+Cb%YsrZ+@C-!}(x79&h2lObx2P}hrA$;EqENh0;}mlH5377phxPT-W*XHf zQYk{Y*vh*)yA5H@JfU?n<r5XANm{Arc!_e5CYvjqNljd`VrT>ha+1glQV<c*g$bMt zWeusSV7uLY9Pue!813b--3(Gk9_#zUBQcv&7QF^4lDejMiE;G0Wd9jtuZ9h~O+;b| zOtkOMV|!z^{WR&GaFV%C6Y)KYh%6^>qKJl$xt1mrDi@zgr>pHKm`5WR8(xdP*dl-5 zY)-@>x{HBxH6|cDHsr*in`dn(iQ#-|XQjrUVKp71ABNyaZ4~1l?RX5U!wA;_?eT0b z%nwcOwW+3)zbeabxL3#xqs5r-RA|#XUcyS=Bk>+-4sB0$Z=FYFuRyX(j)K0taw<=b zGe)N__XLRx-sxbu-?aJ%L%UHnHsO#e`u=6rfBeR0q8pG2kcwNKCARK%lF!Qb+ey?4 zXpm-m&~5(Gx|=IV$7>bt*Z#hZL&IU+^%6Zt!PO>iJysLd(Js{U&NyAy625kOT|~fM z&Q%U<hpb@&IRa_W?Yz1?yjge;(-<Ud8}h}13?x{PmP8YzW?F>__Xqh8g-lkKoRM(y zm;3AK3hLkpj?irSpKMV?(Gu)x=2|f%o)ESN;i?N)qDl&K>BwuVi?gKGRdi2@OUEEc zbVvi?U&ehlX6Jui*#?KAQiW|7Y5~D~#;$({E#|F3N#2EG)EpG{T)WufgPD)M)#DV1 zibnyWH5@hajOpPKNcbZ#3OL|8d190*u!)wnJ9UvlZ1|$%tJDBB9Be#FG59+ZG00O_ zBkkM+exLd;SHn8i|}3on_<^0#4dy{mDbkx;Qf{Ay#q(0yPCW?|;--}n)83wjOQ zn*U#yS>1Jp-xwn9{#wW^qUZ>C*%EU-Fh@ne$hC+&DsjoD7SM(BMRP2>kWEW^H~Lob z`lN3Dn%njo-S$zsx*nW*l2zppCTmj*WJmA^O`<_DYan9rA6l{DE+e_L&G{&F)8c4V zY)=d08w15I#6wd8H7NQ>vjfA9U=NB=-srn8n@7*%(H8fkQiN=UfT2Lb3$X0gQQD}I zVPV>etlb?O(PSx2!2?uO1S-{w=kZRLaUwnrf>FAx_)E%2oGeG$$f}<<XV=!{{fMMl zFbhM3jKLQVNkFME2hZD^ydXo2)z;HxMxsN2`-OY6+x=%V#}DtH&0{BL27lv3CWO~k zgSWQY26;O~qEb^q^bXzL4w^los&E*6LP8-3-;#A*8@Pco4sq50i>e^aJ166@%Dw1_ zGqJa}v_INhN$oE4#BPbfMZs8`Oq%|SS0CXo{!epTrJ=SB&1<={ny2}k)fz~K(a$cK zGT>WO90c>ItTvR4m?lN@xcW?j;8#$d`1Vu&Vt+BiT6;P>bcd*^pypZi^R+m_HbKV4 z`E6kMm$;er?t8fG?YEW=VUq);TuJoROVrs{r&!|Nv!IQRE50v|GR_sIHARaX@7%WG z^@~N$+_-~2p^KkZ<X8V8vVhz;#2uOeR+$R4Lb*#baPi{us1qH0TFnydGRm^#TQcWX zCiW7>{hrGTEIX_2T$`;vo?}d`nFtMiIQe5A2Gpg3w-tG18J?mwL3=I0{O<$SU%JMR zrGdp`ghA+68p+IaCXE#LqueiIcc!IyR*;0ax8u(zMg)G2++y}SBEI0?113JYOhc*5 z4Ub9sa>QS2V|^cy93`^?vqx_q3wX{B=A3v%E+eHhA!4U1yNRk*6!;*$XX_GVj0Iv_ z-DBeB?gKJ&k43>)>zx-1&v9Yud#9`3RdcIM=|+$G@j7VKcFJn3f*R(^jOiPyZ-~yx zhIg_bMZsrd0};PIlEa2*hF2W|jl+3IN9vVX4K+|H8UJ2nTn2K8wtcQMAfpAwNxfZ7 zOdxhJP*qgq-v-!e5J^-dvWp#O9~yekuMF%;YMRa!Kk`J`U|}KQpk4V&Z<{6v@qYP| zas&uwssGh8jJMxh8dv7|*<<@~2j1Ox0mdBv97L?kV4vYdiFqXl=V`#07}gNl@` zPl_{xmWAFE!XDcXywdN;Z^CbN&@&LMr`@sMgsE+Z)usd&*ZKl@z#>Mlgzegkwi1J` z^VwYKjLkezix~ZaTi4yR5cHXc!EOq0wBEegBZK7!FsqWva=&?4ao3$p#XVu>;p%mf zUpx}f?I2@7!XG1I{Che$X(PorKs=>)#NiuQk6M&OM}e3%kn?q|g*Cwk!Vpg@L*MJw z+f=-4d%DET%F4sT@vUp$t(;65FZMS^K-i6MpDD;ZCZXsy6FQ}<3qnG=x}&2&`$xdD z;A;ddnIIz#`9Yh!Y!OkNzKCVeF`YKZV`HnRSm64jz}j_`bCnkxLzP%eqNd9ERRmy> zBj(L^<l!xl+9871i{IV%ZaSQ+_Dj@J)zk|QK3nGeP4-Ym$7O1yDIj@jGwsShqC^KH zG?QrRl0a_e!(>=|7VlBa@er>Jnou99l<9bX0hf)wO9Eo$l?LSLTvU{|q<3?-=>?Wd zXo%@!AUGpY-K<=2$Q(q%oGD+R?Fjkx6YF;*hfKo6e~fGf@U5AHyNvMnw<=E?d#nL( ze88?KOHI@Txlo{NsLpn=!Ba11XY@#EZ%r=zv*~Zsy1F9C+I`Q5-+XUu(n##={<@-X z=rQ*6?9srVAIynG%Uo(x|D=!w&Odp&uDt8f0oD_=cd%UEA9dBM#538&t(Q|U^K{y! zsg44G@jkQfC$^XTF$S~heraca#H>28$Vl|(b^)XSR6b<dHq7w-1xm7UqIJi5xQC{< z(tEexSkyg8LdszY#lo)i_1aon3q@&kZ5|3IsGC0*^zXzpsSD_IQC$och0lwA6%Fyh z00q$&$+4um`opi{YI7j1D7hjwyGl{!Psq9SD~>e-zAOxG);_#%w(KQZysX`qr_9A0 z8sL~|^-CQ5)%tyk*tw_-9g;T-K<Y#czm2F|wmZzIRG$)6Ys5*Z8HvG<0%ts|rbX|X z8!|0H3NhG9{CUVNkfIYE8v~2s=>gP>!$@-ZZ{~m*r?YH32R93yc=yc;Ax61QXD{c* zV;M(r^h0eC;k1bD_la^9)9rNi-6KdH@x>Noi;7b@Snn`;n3VEE;dG<&EnZWaLt9Ib z=DM~u8#;n1$UB44SFH1JRw3ey<(bwIN|($TQ;8Il!C%dFN&3Wh|Me7w#vA=`2oy%R z(>BbxaqqU`^7RKcFFt$pMG#bl^uex^tri=knNy*fr0yrcNHW*3=oawVk>Ktrm?)<J zm={6x-qoS1yZ?0Jz*nu8Tv@M5aHq}`GwEDwLkz0HrJ4$p!DDj(pKipgyY>T6ti??} zvpCp3AKE6!(AHo=)7qj5k$#ff_*nu<clhan`P16uFFF5Xi?So9dx@e}1XYm)fiN&w z0q<<GO)_TLg;>cVZ4+IlHv)5zJ`WxaI;6wJz?hGfdc|pY162oMHe!d7rbupTodwFM zlxe+vlg(#lUgP!)|1*U%(=LP5pr=q*cSDON>+<W<$u?41YJ4B{A4q<rvdH+kM&e+> zfn;R)*oHBEpbf*g!^T>vr-?D8wRK~5YN}x|Z7Py`mbYwyMA}-LM=H$)Cy;)xHYwS$ zvA7~=U{q*{_*>%amS@*)4cQGnmTk{++gRU_y>sBAmJT1?-qz~HFXvjTX>!d`rP$uV zO|;W`@&PHU^a>c019Tb`sSz?AgE!J;_5JheG+o$;*f#puWi6!WJwTI#bUir-F`x9n z(}o#XA5kK=@`(KL(GQ@RgY?i!!qq0OuYH{74WT%2k6TQ^8b&X-&7F~$-`wB$Q^-f1 z|549TsF25Mr91CYTlEqfI<N>rva^Gri~^BXvJgRaB~ijZsz3dcD(;wJqhG<&`zXAT zYFnBg4`sbu=9`f2v!ZC++Tu=Ewi!57UpCt@Bzilw#0w=-u}i>UtH<nX0LKf$#T&ek zH*Vats^uN#W0TBEZUXf0Z&$YaAVI>eY^}wXEN@q2eLnOfHP#Friw!@fwpq|yz+J{2 zT2qp^Qr;l&s)skU2iT7zGL%2$Vp%H_(}8|M$6;Bfj<dM!W(3eEkrF&{up?A#EAvEF z{+^)Wt>p`Fj3PD`<ogzgiM(=X_t=|oO1@ohwe@0pvyyw&oa@i!KY__jD;ZbR{*2Im zmdMAjte&bl{ixH!k{l(5#-w|?5dASr?P`l@K{pz|3TtG@HM4-XDj)y_X*?I6+&_}i zo6hpsG9(IZQlu;zQ&em3V_X{3UZu#5b2=gg@g+MWryHh$E6r}$;U`2%2sdwOQnEt3 zW{IvuS_4*-I&3<k=nySikV!rH>e)$EpLRfEZY+ovP+<(OTExn!(&HrJ;jvZelEZ!g z9F`$oMc0SkZPmC6p-PRmpG3O`gT7qh<G+w6w0_R<$VnY}3R1U1mttwD6F)Sf>f(1R zy^`_=zG?9(TQ9$AMS0T!1z(eM%!cMGH&5pb>)y06QWErMPaZhURZ^>F7Fr{vZZ2HM z_n7PT_B69?Cl6NgAI=K^DHw!A^t0U0M*>t1Aqdw|IPb2%oUpuq<d@%du4)hFP^Qv; zZ2hOom=w9Bks#|b*7>4#yObyZff5vbN`)~r8N4ocuNET0^x(PS=}Sff40RAT;Wyr` z!0)`9?MZ%j(30<AoG9Z{fw1tM!fQXXXs_^M<K^TMvMA~=+8scjRUE!NTKYv+u<YPL zdVI`fUK2r-7ktOrq=DsxK=K0U{D9I=fGA^e=JgX?X&+Qo!QRMcO7AZ#xUo@99gHO7 z<8?AX*6Pcbr%xmICnLUHV3Z6Q=kO<&sZKIj_nmXw+FFkmgMKBDHGk{|O&t3{(8O^Y zwEYHZjX+?}%2Eym=W!$^85Rzm!%g=E|NCzc^~41HNeC4H8ef6kB_aZ{`CvC#AUQc{ zvjSCXYtw6m3aMh>zXw|_wZ`ZClOFXUn{QLp1CFw(e4n1&>+z0M#?>j3(>Xl()@R+x zSzRqYNwMYprQL=%%wQ#+o*`}nCNvb*Mj|v6vYxFwi)S?zMK1opDtl`5i8QN4CR{W9 zjIqowVErt7w%%i?Bq->Ok~W=>?vXwUnd1R5f)PdrD3(aMA~oeEOf-mS=tvEp-lmCf z6ON~u_>d|Tx&ypcC^q_Rfdd&!!zjjH8{2Hnl6t}Na3wXP8r3&~!*r}mpItLO!X2NW zbH|g)O!=0=p-uZ)SxvSJ?p^uf8H%R|B8JlK2Yol`nepe_YJ7UBvcLcS^=mR)-VK@2 zmDw}k&>-X)`>l=E^On@Zo-wEZW?mENFgFYB`Ba5S@a)({>pJ_RMD+0alDVQj|K^vF ztXItvzy^Hiv~4j}1JWS>NaFw=iq3BOY;=bY+j#Nt^lo|kY=XxWVW4W?KDQY;ziWAl zdU9FE)b38Kl8WYUGqL~vHeXLnYB3_q8nbo@ajp`#$02;_H?P#khV+(Ggp#~LekW<0 z6Tlr@Fq?+2Y%2FtLE>Sy($%Y7pEg062ttCgjGuDWR6QaB@@<y)MjN9bW2H4hFR{9B z*wp4TWCU??526^so%@aj>w-RA3Cc$slaVBp4FX->GuF*z7)Hv5`fFMTgCVQT1|-Ck z^+8I@;x)gcY`TS!Q<50bDyKL+SuI~^vtMt)JKL1?%ee6-nB97Kc+vEj9o**(3PP|U z{n+@(g8cV8G$P<M+jsQ8PtY*v-lfqzD!_JuT#?=>|1lVva-W|YU5fa!DL~yZ_p`_3 zq*E$;WW#We$-aFjJ&Sk#Yw6?CZ$s2KKZLNelR`<M1v-hV_3XZW{lt69(zwoUit{s& zC@E5W>FY`J$MvG8ZyZy$m>7^^&HL@Ea2Qr#c=@u6`c5qcjE8uj9PM__U$zZVeKGZL zGUn+zoPSvtqa7*DsE~dIH7_O2PH8MWZgb?f&~3%60m|Q8QClr0cmsDyT+{kFpP=_{ zL1CmpinL%a@d|WB_3o_6^mtw?jBYL0jMW6A@MGKBvoxNp2C7faXMIUg&oCOwBB&~^ zb^we0!6oIp)S<<V>o@u3*|@QzaI5-|b+S<NYVpuc8AYXV66HjgHro!rABjkp?jE82 zSZf4Dr*-}2=m$ThR7;;}mz?Ed+3ez5{#0{|??=jS+SRt^g*)D}UM3ayu*S6K-`sAk zJ?c5oB@XS!EYE)~AW<?z#JCni9+f7kIMbb4me(#brgEttZlq(tudR4{)f_7K+87v~ z<tcbKgs564${#GBK^sM9&G=%TM9wwPiF6cwh2@_*pjs8-x+sUd&(gYN^9PF@KOxEG z@)?b!O(qYijj2UYLMD^yhq7-KS7>(Hvi-Po{@MHFU!1l)f+aN|3VWvzB+3<A-!73J z0~WDZNyS#HFJp!1x9hWjfz*pHV~Q<@1lM~+GCLjb_;(~V6kR!L-LOisXtoSj%TqkF zu0tByNEVm*^BGhi{5v}roH#fvI#OS5g}z&74$Z#ON9C(=b(T?3z+Y*6$19Obbg2)I z<d+X+TW~0({T2~<_$xb;DZgA~a_2WTriYmibLlVcdCuy|DE2R_N?_Q(OIOym+*iN5 zIsLOskdd*UIQ3z;*coW*CsluVC6W%Y^RoO`M@RSKiV~^i85dZ7yA7tLeZL1YtZaC; z2G0(4Q<pJQZ6Av8sgO=5ZrfRzC*#Q_XmMMaqXc;2ZC~0+cHiY@SqA*ebo;m(>$47j z(5@~G1`PEq)OjHgWfMGr%ovqW(TP+AEtJ&#$8jim0v4mgZWmZ|b2t$9lCwjqjTjMY zYXRr7J$t*P7j~PcR4R#Nq~1`Ac1l!p5M-nIBoXkr)wtsL6#q{{8r>5H;SQH@e2l60 zgTnLOwGV5o5!3?2O(z7-hvSW+>=_LVrxb@*1RWM~%NMGN`H|Y8&K3Ae(X>`h-$$LQ zo;mAek@D<TcNJ0b$-i@%ni-(Bj#z0v6U@>yJ?U|8(99%PoP&c#-s`fmGqXsx_)9Tl zDcQyJi&vNuu<TQf;V}1VfvMCCFQPPbXtz5?#d*5kDl0=8;;t?J0&CZ@Yd@vmc*8~6 z?LI?*9(~>}BSvr@g_xibOuLC*QEM`7`sDSunf7*|%7QdVJ;PP3yUGNe)JLLKl9ScX z#{`H|fg9D>d^z&yLiRQt=D&$RCIB~q!z>e*Ywb|tCi8YmIVn-yI9ktxn4s|F5L=VP z7$tT`(djSjcDd;Qa|}+=JWG#?@E0*A;u&AR6>5lekpl2I)w<`jGS@ObI;OLGk%_GP zv*x7?3z|lqWD`F5%=hQhYFDN-p3DrNR++QPy&vwv8F;d*rQil#%-5{MP|sVVt38%D z9F326^*idK@30SaF1pGrt;qGvdc4RyTM<(U3r8)%P|ZD8nAoSXlYfNdhVhN+H*<`2 zhqu<*XN{}vPlQoCwn%G9G!K>KeoavpYldVqL3#uz)q3)by;xPKkI0cAFww-P>d_1D zuaS<PLIS@Uxna&|-v6Wgon!4p$JewBb$==67Zpzj<F{QZpQQSs<H?@$5nmo1A4B(2 zIS`6ObFSrORC{5znr0g_R14@6Fo60ptm^WlcqL*{CtCacaipH$3>3Xt*Ok^dz%xB? zh$^CCDJ|}G!;R;B44P4wsStbi@c3QOBe(4vYlb%B=7a{2lNcE(Ypvmel{Y}CX?>Mf z&VXeIC-P0!W8uF?xyM0>Au}_XN(SL+gREso2mA<DF#Lqx1P|Rz&H4{7Uiai*CitTf zHjJ4EHyTbJqxgNQ$odz5WpmcUi&oihqkMr)H%EWaIkZ4xXw<4mHo;SoIwmKT)}bn) z<<||}y?RF3(RFpTkJ&gm@69VqUsC9KI=qFA^VzlycvDe6=%Raq1m|pw6^a<j=UG*Z zx-T+;XSFc83Cnpxo?`PvD%Hsbsr=5^(Spv!o9iFxO&@oooOk1?5sjE%P9EuL#gh>Y zV<WW9YOSys!WFKPPfh6X%`R5AE-H`?zCc>J!0^mRSk#7vw11B~d4eE~abYC&t>NWu z`Hr0kjuybQbfH3B5>on6_%=b5r$d8vq{zOk1`XW$td<Q*b7_}FQUpG~HOSQ~;xs56 z>9YsnctmFA)M@sI&uo8G>x!B>GDh0_lzD;wt8v+6llBB2oR#qgJMIlsS~ZO|gB&3M zlcpFzsy<D9bp`}`5OL|uGJ81Fx+%V<<|65httZk*wS`8@CI&|%b`}d5gr_y6Mq_V2 zxIgtKr5s_49UV(lNO;M#pPd~jbnbfBq6$8DyoIgD&xBX7j4Mz)CC-9-HKtV*?UnG# z&+wv|&;Q}+%)_B<-#0$?P%4E~s2DPqDb;IVS{bq%WUojeyX<CYm(Va|m#kw=WFMo2 zP?R+x$`-P(W1HXo%roELeH};r@xDiCmgm0j>pIWR`Nd=Vt<YK&Jb2uqD}h44aGVkO z60}dtCc5^Rf5X_BS=*Z;*9qxG@TI(()dCed$`&o~ah(ZQC3E*b?E8NDlRMGGC84s{ zt$4^r{n*H-2!S&;qa2J##cml!Ck2FALc?p5-RbsJfJcO26@10<p@py)C88-tb`P)B zS9qQsP<u5@`p#2DI&^`<ba&CzbmrQHin^FxSGFrIK9(x_+l66M;pYaKhu}`3%mSJ; z7Uee{1{5@BTH>#0$~*VeRvjK*Nj}hW>uo=XLBQq%T6Y-}2!|VsA8QQ-TRaq!#v?pX zuP)hq20`#?y=p!-5lLu4<rtUm>XKp25=slOzjf=%l>jBXiu{GzFJMLN9v(i=cQu5z z4MskjGVXsKI6Zs^VO7<)#VotpKUAux>h7Zbtqgc4XV1ph{U7zHC2aopVZ*|H&0KET z(TUA5wb?nkD{v2N+4}2&yOZEI+{02KT*>!Yf#`u6kxPEvX<>N;Vg!THB{py7`|E19 z^w^D7F=q+AWRRlrAhmzWNJ14kCg7pS!%?i{*WHkh|0DWIGdybkJ{^kJ7Fo8Nzz;UL z^2<A^@o1ZtiRiLiG=2OE=3b#k?)*lwC@ijv;OO%^R(2>ncYb(k$QC$Uvi_mf)${(t z*|ZulOWoOD35#*2DPY4J8JTLOlB8lyDmyYRTUkx_1jwGOuq-dD8HqG}JzLlNmYBwh z378dsd#!@<EW)KjOq~68hZqV4e(No|_&8F?r^G&aM0@6$#cPYSjiViFzBO5;q#y@^ zMU)Eoxxq~7T*pW}kaRnBXFvZnw7w1iW8UAR;t*fo$`%CK-zs>yF=F{V?e!&rP6oOM z8g+vEBM4f7a)UBaVoCpXj||HBc4w)vMF)joBos%ij3hr8Kg!w75#GaBC}r_j=ay{V zl0%*OkzX*E#>WmYwg@HK#g{SmXyO4gRAZ(?+SW1UH#;9U4ors*NO-1w4rV^N`R-qT zsT-5`6-V!J4k2h`Oc6@>m;w@HXJF9H#@sL1^lpVa-np*pL=7}&mQFxvpv38s7~P~q z?p!fMv|@1t5!FaR(XZ5*e;hb@9(*}{$y;_bh>$i?8p|ccS;WZ1w!V(-8!#;;Khtfe zik%PVa)-9hv5wGafQ9H$nl$wryD#0oA)0VeyHHbDV!G2yuXz9)Fj(!`G80#oyPVp3 z&pyS7Dcb@;YC-!)xLC^S3?pTDRHd4&WGOdJC$v;-oH4yh9CD)Sj76cPa&wFNV2R{% zd+;5qRA^1aTI-_G@%lL!Dm2}8J8#6ODJznNYl5#$Dw#te%}Z?}h=-z7@IfgR-OX=s z4I<5Pi6NmiY5OBnz`=o$8vrHsfCw2Hf|#yNFjc&ctR$f`ebQnTS{$giuKmt=n8qK% zRXH-?F{_Xo4V}%PiB&Tqb~kIQLTHee1+%0eM|9SkQWTxq!poq(IJ@GWpU0mvHN|My zC5vh?%Z_w>K4dP)B2(qEn_}L4S!1k$n4H!Kj@p%SrWVbm@1P&>Q%1dC(NCMnVNDC# zHEE+)nQH1{!!M5MpmJ1_em5iYq6za?3N>e6v4~gcvSCos1d5i~iRODg(&K$U+Yf08 zVy4vwFBouG;&}>CQOTFEd?r(eO$`in33yE7SSQ`k?VVo@9<4*L=gvps+)d3lkXkBY zx6t3NiV;!c!_AdAo2Xi0e^vaydV3mj6ODhH0!pYoM;oVS(i>g`3rU0(=nYHF<);!2 z5y|*_HQ;<}Mi%Bwe@6%A-Lw8V1fW`1o*$lcyMe)2!Drz?#q`Dd=R-o_DRW1=l+;;J z2i;wKL2*EA(!Cl-|4{G@Tj!MIodr>`Ttevh+q+|Mqq)B~NCTVD!kqC|XgIzl4!#lX zf_NJMy1^vmju}QW-M4bv-H7TJG4*^g;eVPj`^rkz=e264-rijl!Dn_(6NNXi7d_t% zHKAMvxx8lwvUDn3Q+<p{C%`L8-0SCEg5=ZNSjrAEFb=8Vy)+q)tg=?sYd@F8EPiKf z!ZWWbS7m~1#HR!PO!b=&;|FYaCQTob08=I(mE^45{vr!KnXWC|#DyYZcqwJ{Gg}V@ zPUyAp7@)aKM8>u_CA`&EYqD2e47>ocZowK%V%B0lNv)cOz+-d8xT4m|`c2oh!P%Nu zP21=t{t#^5DnAYwfh6L}=3_*nJ!^tQNhrb>Z33zg0s1Z-IL-pu9*(zSWY4gckd#B- zH@-bRuhIOS@EWPf<Yf#MWiet*u=Nc73`KBw_wZ8&FKZ=c_gM@ZF*@|N;JT{i;^lVO zHog&PWlzxy!+Y(C0H4^2i#D3qS_Vu#e;tx4i~!S&J1XjJ@g`cFc@L(#B-O||@!?*V zv0ILBV)tfxk42X?#@Kyc3J}_rhr9Kb^#ZR+9{OdzlSF&Emgf0J#e!r#A!)3QA=1a3 zPb#NtyL)Lr--x8pdH-KF9tAOcCMJPmPfkZ}wzl6HsjN5A!d@nSK3=b><zVU!t+Uba z&=R*}UEqOBxQIFhErU6;D<2{r3GQLi%oXk0&-GF~0Tk283;V+n$&GiC$En6dC-9il zVo;Y><a08+^ld6fp=Ce#M=wCX1)c7=$(?vL6(v#N(NUf_dtI_!CqP>}BZ;mV8TlUW z4#IF#Ly|w;@vulnxHipH3SBjTTbH>uI`oduw|L}BIUcbTX9FaQb$mW|;V5q-C7fs# zFX3+uN7)>$i`AA=)CZ(put8{S2gsV2K$FM`Ve=~G+$`3UMvBWo#}l&g`>|8<DUjoJ z8_1#`J$lUY;W0QjgY$E7t(@1m4w@-SUCn>dSf9zQ9;hb@u4#-kPI1pca2gP14$%15 z&oj9X1>bB`*(z~umSBo`pb7XN;13RBhH(bD=(sesLM63N9}z%}^Z7-^(5#@sB!YWB z`59>|=cUK2WIKO|YsH3&^w0%^c7>HDFa7O>qb7^e*Un!)hiR;E7=ZVvwVsC9h^SVD zS}SyDjEN1LW{M>XB|I|<nbq3Y1<yvzl9{y{Y0lyQipyqWCeUnWJF52`DPcOYJR)rj z72@pq1809zz21>z(h0WqV#n{o%q?%cH_UANE3gXV!&n%1pp;s;H5ms`=wO+3OB5xq zm)c;?I@B0lbNF{BxQ%0~zV7W9N7=u$T0?FNfil_KdtSPp9=uV_R-$f)qwL_D_TH-L zpMA%&&b<>>k0{bGOP7k4p!YekXzH!9-Mbc(<}R6Z_R!~o7U}Q|f$1pE;}5@cw{{$l zm~^jkk*ePx+V_U=Ohr&C2Y3a-z&oBvpnRS&B^twRUZvZMD_E8W2M4EQAgmZ~3!V@H zZ3Pf6x`?s+RjcR)WfQ80{P~E9F*!Ek4g&6{p3TeQQ{wJz`B@}xs93yZzdb~@t^rZG z2TxeOLtK0e!cb)@5Dg7Z!<M%SP|_w$@!yDs)gTSRW$g8d6&(LFR`;o$>Ki(RO#pwA z<5@ScWj=Mlkk-58iA^IEq-P{bG<<>YC^=2r%Jjhthbl7aVCLubASY;{qF+KQSNT=5 zfIjK)T6~**sZH~q(TOlt^TnmV7n-&mv`<{CFI$ufsQbH;(Hm+^Q&@>IrXjv?j<b3( z+o8+jf9k0IdQKBs^DT4-g>V;`eQ<YcnmcSdVErNoB)oFTtX{$_r@<gi9@)sQSN* z5mu7g^{n?Klu?x!(PHt@3yOBg`MAt-lI_be78^ako18-nSDKCpxv?tHb<HgN=5|bW z?~-P2DdP)&gck~{5BIzTg>bF>J?>9uWt_Xj9;=Y93C^4B0Er5*#~imGcC=_|V6g_s z5oS37Y&>0Q_I|{=-@Mt!|HX(rosrRKwZ0KS)RdbrHZn5mD6*yi5t@YB>dT^n@Tj?t zEN3(Dtwobxs*5~{Fd2CSsDC3-I`PaBdbw41{)~Xmdk33&xzkt+pH$a?4;Tf2pbR;b zl9IT%l0}O8<{H3AIq_`rNyVY{wGfYXS1mLqxe|g^j31g%wZ*Ar9if&~TtHjh;yKgm zu!60XR6dgp+RAE6Z)ghjGc$M>e<DYA7(%|HXhIrI&NtTNis^r|Xqix?d~SGw8JD5h zA-G@sjZc@bH+iPA{%W7-rc}d^g$E;?O$QLur=g;-9=M7asIS5K(s*7<i$81rvk>^a zbH-cQKO`CLtm~!`Vn{rI2{_e?=IS_XpvS8CeQgdpREAh9N$_2B?EhfYBZ|cFnly7t zOC%4-iu~;`Hn!kt;S5=~eN6LNx7FzDD$R2M5qa_1XkA<8@jj@8kEA|Lc*$v}Hhxph zuI=>1OE1KPdNR#@hlS!($<w>=5uPz;=-l73hVO>9J{m~UVRK@AdpuosCb#|7g?j6) zRUH3CAGZ6^Z<S>WMypk{E)&YCmG52siWLFK(qAR7syWhg7C|#%{x{%%L(Yc!StXE> z1K#jbRuI;#pXOX-Sooo%!-P$<DRSf4=uE$@$K@P74X7Ps8b|szzse3|Hs4=6>aY0k z=Vu3U0qA0<as3sk@*AJAUJl9Kh$-<)io=`SaES`buPjK97e&bgoMR+mz_oj-eGD}O zej)g0wH0NQ{Rsx@RDraJArW}mTYcsy*38<c8*4T>v^Ue>GIJ*5ELy?r0*^&kChlTk zhpms}TX1fRXO6`~3xPd<&3sqprEE~lZFiu;BY*PVeX90hqVH5ED2jL8WI*Q%{!SUF zv%}=h;G9i8%67!2;My4#bQ`h!-G5@pP@_aga7+w&LF~cFRm51uxm~?{g~V&8_<QUD z$*IQkk9P4j&h*TK<{{CaIg@-Y_UySPkGN**7@V?l&aSG%Giywn!hXcXaf!vR<W9+* zQ~0%c;a?+9ufV6|cyU2Ll%yda*956F)LIbz118Td4^5W}37S2jGwVAVx<57INw-P} z`5_(^zP|1i@xGObN*``8?JVc~{y^Ju#9rGkv?nvi(H=wz4&3V(@{JHKWD&?Qt{a-G znFH;r0Igfz%s<~@3pW>+^wZjamTQf?G38v0l_7I+hl1}lINe+04Ao9*VYQMW8`aYT zB<2<ucHnpM9G$;@?3BUtz2g)4q5tT&{a;oy9O+U?()=;aPTjp)-7!J37`C__Gjd1E z4a0WZcg0equI)b~Kz#Jig<@~Cwj{<B%ep`&Z@e?Jt=kDOHTeEXd}I#J6^r7@9$hMd zp^cqYcrdr1lmk>dAa6`pWsgqau!RVzBWv;Kl0y?@LJR3;UDS$N&ymj}aq7~zL-^u_ zb7XdDOQ=X8<ngai;RCBdDcRDvp(|qCuV`2#^;pdVmQyT0MP=OsiW@X5Eb$=9Qseo< z9BZtp4^2^}_K|sm@-yT+Yr6OqzG<l*vo;zv;a(yr=1N|(Kia9c;rGq^4#DlDS+`M+ z9I<>WX7~=noUrAw=o@0qnVai+6KOUhm(XIiE+z&-a&SAZ8%GZR$68tnKB;o}$HIrz zcZzXrHvSIdUj%GT_^!$d?AtdyC$cX+>aB?e^jDm{osN>{5i(-wQ&S@$?d&scXu$sf zx|rEvg{w1IDYduPo~x4(K~0f&`|;q2?h_tmwwb?bX)!mcm^U!HSV%>*_k?)XaFM(n zjH&C^9HvlsxFz+RYXR!BG=I(Dtxhjb3^Jbe`l6(ymkmI5PA$%{0hQ3moE$MKqE&~j zY?KL(UPedLSNeU_WPvFkHCTg8IpH7Xt)=6Utzevthr08V$Lt=iY`uT+$vooIa3${C zn;xRj3tsiSSc2`PF;=3;rAFa6_<BS6A6|5Wqr&70_Oiv^<T-Q)abv&wA5BEm@P3u| z2Ov5O)a}zX%5x{<%mR6819--?Ct_MYQwqwM#YlS!MwR3jQ}5MuZ*Bp1O5Iv0hxfeb z98S<&Sl;!|M@<o#dY-%+a&0_W%&!*D6N+?<&VMJG0iSJ7lxuU2x^LHn?uSQCTLxzT zVeDo-iMI6?X>V?5tLt;-cC9{7b8ZA}q|TXpN-Hz1af48U)D8?K^l~ijb2VBObr^Mr zl~n#%Ds9DD?Jh8X@uC4-U#9I*!grb_M|NPldmVXDVHRD8V9YP9(>>pf>@2Fq#^L5e z_mW;C=bZ`~oe(jnIAhi~Y)(2`51v+B7-c1Xd<);yzQtr<#)t#9A?~d!9ZCk|>xPys z!sx)-e;&bo9ZjG(+ykrX25eLo;MeJI2S}%c+9ynKAT$3di0LrWlt$aI*L%v)Idh29 z8&4m@*JA9#`B+Uvy5qHrV2RH7mejk5--N9+6JBhA0ZK%n%1Y@ZbJwQzEP8rvOJdK0 zHwB2e0v_}g^o&*sw{z)TYq2s>nm3}^>q+*p#9(G~Zk(t~SqzOO*LU5X6#aAUMOKvA zr<VLh1rEM$^~KBl;0i|`zHxM|9TI<kMjWO$fiDhnxijqU8Ly$WQd$4ydd`rLqkKib zqH>t10&}dMY>JiAHQT#tH$c7bT?@K4-TE|%?x-M16^dbqyz0~|Pp&?KuhXkc^yaWV z=QsLE^yg$|x8EPrB<mj!t?_L9vCe`=@Ca4}6iDm;hdvhh8Xb2CG}y)%g0N87X3F8W z1Vz6s>81nI4IoZ1!OZO977=u4>~57{_`mL9a6y=$C{sE6C&EvNRk;pE-Wjcicd?$< zx24W=+Ak;TIr3yaFp-;VZCwAP@b4e>wzcG#H|euh*vakN){~iGsKGA%yZY~uefpf4 zU2%n`&ptVI%j{BJd%HDYG`41DA$0h@VwI*tsL9xee`9I#hQVTmJ3J7ncm8+y$d24E z^h1e`6W_pxP3T7iF{AtI*&a~*CAH4}y^BRndv2cQzex>9MLP%g|9%gx3#xgE$+<>9 zC5XnrqLQ2r`2s3EL`wj}6o@04VSI8id5A3#v3Hn>GS~%b`Kl<JmIm{%%`7OMVV~N_ zUVmnock?~#`d7MFl?hJ$HW_@6gRKu8g@N`Rp44$~`qT2k&Zc!(9*nA<>x#*2wd(e% zyFpPHwzVwmdeYYP(9{!qnfXM#PI<vnK{P=-L)|qiXJ-<jWp)9}zm9M!@_%-@aL5Zc zx?^-a>wfMc(c;3Yv6=nn0b?f~$(sgZ4Q8LFvzT>OE4EgyDAnHBcR7A<LX9@mB|rm6 z*eu%C1Qt^>y}N7d^_7A1p$yXvFILZ$#Yc8<UbL^<6=w!^hCFb!P%@@@x@Tm;$~Na` z`NC1wI4+c;2l6`c7&v9C!5S>@#ei2wZ$gDQn6d96&b`Uz??W3r)n{q?7Q<WysF41! zXD6%0Ene~D1NyLA=?Q60CLds|?(qK8npS>xnd6+%@6o<RJ&w!OS*Zh4g8Q0X^gFcm zck<_Qrjk(HCHBhTA6;P<k}XwNz8Dpc(A6rrmCW7xHiHyoBHj@1^7#D07l!ws^-dUU zlx3g&$OnrUlfi0U%UN6NwtxZL?nb-acK)4<*<-ro5XaVlJk?iFQ~b+SAuCMBPe>#A zHF2`JJM+POm@b9&Dx!eqxUD`-OZo6L1-MM@msla-1yBXF>fCMLuY0Myeef43;gX}L zldvbT<npvP%+2PC*weXjEs}To%*cz)hiHeSGQD-wgj7<hI`V=jCU1=Lx2(*nnXhtK zrFvQWo9g9h=1oA;LehnQUlxeJ(pp>#Qw8tAH-1XXg!t=?JFr`f9lmKqY|w&|^>R8V z3&1D7A@(4Nk%rp6uDD9rM6T)JeO`k4(Wl<Fk}|E_>$`62s)73wkf-*B?wylU&9k6e zV?td8?Y0_wsGem$pxBPODgN@T^_h*5uXhRQ+mh42ME|#fU#iRgng;WpBo;sDc)ldI z`kkodiEh_M1?y0?B{&J*l+2xJ&nhdu9LHgYWS0D(OIa00<P+Kz>q`aC7YEY7=Tu3p zLuPl@&(^mNuR^@3j@Z7dmfZ(*?j+a5PKgSx>FYp?g)zKgG?}+HSHj+TmHoTjXNYk7 zEtA|@Ni#h9$&j-9%$FdLUQuV2n)}7t0rKM3=$W_ot5$NXA$sHs+{}j*Xx)`jHK16a zYaR7}eXC1%%S)4B>qsc)0e~8zxScrAE!D^+esfqf9&m9V5uaB~AHy)q<Yl5nOq$PC zFJiFn&8w;xPqZH^*gD*@*FCW9A#(bS`Es&3-q9hp2w}WtHVrx;I)g>1T9vfoUxE6L zq`mn&>EXF*F<=}b81$+zOn2!jD8%&Lp8kT06k0%XehMh2kD|g0K`E#Y`{q=tEGj`E zX0xFZD5?D!T)ycftPj2TBw?5C3*auQ=Ey)%3yIOCaBpr-)c<0P`j{ER#B|tZ^*_RR zVpB@4IFvvDzTX?cs<7GGhQg&>*<YiKpl4Vi{!8k1DxYcvA->w*ZWfrATFCI{V>uL4 z`7~4cwD_Nu?du|9_;si)(wvlte#46V6+ctgysTf~y_e`qwR$a*6UYDTr)`yW>f-`U z*WUg-g<j&s;+N;U6dm~tbv;9-w|b~E52H4dX3q^eSI0NKMVShRd5xq(#d3`M+GpnE zBT&iOJ^b&79m_nIO@kET>Zwrm8}N>vn;PBx*+Fn0v=IMuHo{6Xl3P3lCW>L&F-WE^ zn7QrCg05Tc&_UN_iqL@Dj!YGo5Ry<59T6~&h)3cXjy604NodQ@&;;3NJ7ij^nYsE> zTO@DR5m+^=`O;HwlC~1PH8N*yuRSCVSelvVDHdnmzzmIiA(}Y;s_wTAp=CLwRqMJn zt*eYtr^96jGv=d6=@At@T}J^x@5JEL(oyx|U+(q4Ls(AnC57vL!XMC6K-+8XD9^fW zd|6JIJaf+=e>V%sYc!yL<=ymM3gLQliM`24fIt<06+hF<Cr@8~9=Qr1vVCGqv@qYw z825otmzxemRvo%t>oh$GrR+9SfmM|!P>5}WG`2`3C|fWWz|_WST#zggGnsc!%iW~U z=nxCC%EjKLybr!yP2n-JK!pgFNv+kkx2RhCEuZQYTdE?dMV%CsuNuSYt|Y~7GdA&# zP?he@DqgtU72M)BG}Ci;T}3JfoUJ#rDqg=UzMr$mXUO*&X)TG}xySi!c_;1Zo6uK| zlt$mZhUah=!LAzv%Zhf@-QM|=JyVu*w8rh?_t?ttroJak-F-iwru^WHt+QNp?W@rc zY%wrBfc~7+BVV|61*XpL?>1~ahLNp+g$opz6Z2Z?)#xJZ=F4Tthfi<WH`0;u4#ABp z2fC5xuvKC@oRMOFBxyTRzW0~`6{j@+-A9Yp&Y%6i(pW`OgxC41LGhSNdZ}yiD^-KC z@e?ztUUryIagGke{uyu5%GCC<Ra)7}*nVp;shaGX{tmnwV}$Ko7t=iT#sJBT#GBQF z-Zhi=(!K9Yc64MR;_Nu%OlbECo)?1hua!C~ARP8q#qg{6+veRr_@U~0zxwOHy1M~K zz!}WkZ;R0ec8%c=0X_P{oy^5%I#=Krodha!n+{uh4$?ZI6)uASrqh+rGncx5cNANZ zjzsWX;XQ;ckncDn?|(%%m8h565c&01`A?Ss<$yXliLL}v<iYmoENmK2X2kiIq|8z< z+~-VhF$*B>O}BTIzL~FKEsqT;lKNh?q&#Qu2t0b-PH&R^alyf@Xr|%vUf0Udxmy|B zXZLiTDjaXx9_$<dHD8~1U+cOCmaQ{C+f28Z`N<`*6HLBmK)p>ID)K4-C5`u8ko`3_ zO~1JTvi8L!I{Wdp<t7HiQy9w`fJ7I%F>&MGoo)%1w~T`-Y@iTFz=(nW<{7?`06o%1 z&z~qK4ypJlj&{XtldKn~_mK{rWSR;{zcDY$XPhdtrXrQ8lC<t`L$K3wT`0I^MAQRG zm5)X}c(3N+zk0QSIF7R2XA@NB%tFwa#59+|C2H*6+{0&gakCVdqR}-%CuL>9Fu8*% zp>y({a!NpbvR=7ZM!1UQ{he3nc{Va)-fW8xS6Jskquq^104w{?LlF&!D8z{tud(i5 zw`6+Fi{4nVD99^<VlofqGjE8egEV)3KxEyBLmoRZ2?zFrL)~lGCu9f9y?TKoq(Q7g z2Z3bjfl>KfDj+=pL@1bivI7%5SXRC~<Fep;$8M}+>@s_J7F+5Yg7#2xkd7*6NG7w+ z2@zFaV%cBgHF<Wc_iveXW^<S`7SAUXw7aYpjCDl4;J?qiyV*e~c`_W`J|VN#>4BwQ z!I$>V)vE_p_5;yXpUcCCQ|n-MW6LkVf^WrIkizo++yKE0rRI;%dlxCaKBL4kD?jK~ zJ;XZT{@S$Ww#|KK_dWQ9Ls1KryOa$oz-#eEew}>?@iI*EC3EG)f#b8!=AS)tCV@iP z*<81|ehXyTfrX7$w0`o$DUlU>VLTcP7sK*ez@=~tQ1xO>^qP;FHfl>(SDIIO`$zZA zT!^Z0eIel`Pu!a*R{i2wi(lZUIQ)huwJLM@D0sJ5z4JAM^f37vc^asp2z?Iojz9X$ z1&huy>M^ksA?DIbPvlHJ|5lM&ieCkNP;cKnGSRa*pmT!sFW76`H}=obDNtN5lM+GM z)NaRa=Yog&)H9_628A$T47h~s?d^_zs|!r}Z?Kvnj4rQNN6N<z7<jVaXMRM^2rN+6 z8}^3ah3@^JQX%XYSUwL}wHmca+}OT=2%?-%Hyp2#f!4X)_o=Z3x$%1G2GmHNXk+7- zg?Ky{f`jR<^TjGNFjC0R`jjzlBFC<y#7}a`KIvb}RU~$ju#N!{tj+eNecto-1Cbtq zr11Qp%R~$9hi25e?`O3Auh<3TNxhNgZ_f^^4%4>aI4t!sVpC%CxHENRWU=YP9KhOt z5lW!9=69WS`B8Rfq!ExKfUN#*;6meeiYio06Zb%UI=VLZH1#j1c^oK!MG(SZ92`Kn zpTB>;*~A!=b+whp<%u>}jcEVXZRi|SA|?7z<zD0%Z(l#N^JVXU@L7>`Br_u~TPi7n zXdW+RD*OFm^wLGhQR06>CJbo8Ku^s+n0kTbve2RCWF6jNt!=`W^T;<*k++uXS~=uW znPMEL>ldf<D<w+ByBmwQHb(E|#dh#nJK8*(IBI0XIaZZ3Hj&>EwN`Lcs(yAczU!(b z-~F>ax`x4j0A`+t!@%gz#DqH#()01V_OsjD7ucl4u>)MwYt3St^7T&-Z(kBUT(Y+u zRH1THb9XB!Zg)2yP<2~vF-igkGe5fv`d(esxR%g8<;^T(F*^RAn@u1S(LWWG@G!YA z`0eJn(t7yUk5|8Zqy;!Ic+Q4{pIVS4UC$jY1oC{gRov2f=3M&D`XEtRUF`D<E~NFf zOxO69lgAgHr}krP=dS(EEHZ9Y=fQ)Ibo<H?sSIyt%3@T^_9=Gl)XlMLoLMZ=`Q=+X zQ*ohAJW|0bRz+vnu2*NhT2SQemY0q1p7NaZz=@<0c-`ED?6C4Toxjp%9$(Em;2e3b zsV8M*M9(9q(pYwA=`|0ViD`Z_tM^oF@=*Z}g`@mBy2<I-aG()n60mabZV>pg{A6-} zrznEU@X3V`3e*n(LdiifmND2t8N%fP57YnW54Z~Hc0NAUfIS(zROTrxdsXH&1_OmB zEUL;FL|&K~LxC}_&ES<0Yzzk<0xHtWSUbPj>u$I2D=XPNcTc61w(!tcM{f0m4;VH@ z*NV=(ImhIS+GdiI$1tjGlgn07T_-RGneU9$atSSYi+l!3Ka8fOhL{c1>(6kQ%K`;u zkEL2P@8Uq4N<@+C?>^m?lnQ9c504ld*j2F1^ouBU6$sh^U0=sWscCmNc#hBZ(&8R_ z9D0mSTgq%>HR-kKuUP{DtbwaXmCD>iqF;EdyIUMau(EcIhg2q2gX;NhRv?*}A!(O* z8`NKqKlJzfeEad^EGgxx`z~Kvrbna<cu}B;C6_*CD1Zu_F@X*aY9w&OXcZ>9FVD>C zmDIy=i2k$_Gz<)?kV`dm8g{MbS8d0J22lqJidwShUffgZF!h`nj>rjoKEZ}<r#clp zAsjPCW!M+RS08Yh>Pr?|e-Rgy%4byFp^ZxL7K$ZRb~J#tnW~K@*b5VvNLyA$Ky~HF z7V}0<r>FQPs%r4Y3&paodtLX&b`m{s%jHhEHkFB3M;*#yZyc>Y+=GurnzRXnQ@bi@ z<-N?xzQRgnf%5K)_CR>hb9wzNX&N;0iqaes9TFe5-WsR}uOm>*IF&OCDZg{-e#K&7 z)KPY)H4eB~!Tqd!VZ>;A7pg@PR31n1z>=SEJIk$?*T*O5;-l^Og``fvf6jfUh5SzU zI9PG2(5)&|G3ekwOzk!nEMa&DR~BKDJySM3UQOJa>qPR*E5$$iYt<%l^KvX}F7G87 zctp;3zq9%ZDpSP~ZxkBEsyUVB`0&L<txn^#gRA(q0%vqYxz?Ces@M}bcJnKIM_5T< z7798OlZcix_oRmIl>}wQM))eFkV<vl{p;iX<`ukgE!NHMwu|FuzwoI8{vx1PM8XEu z9$rIB=GA%NII|UJZ8h7Ys;h4jN)GGTIVbjBDt>BnV7i_A?~f@^T<OOTXI%g4hDM8m zV)?x1D=4<G()*yO=jpr>fG^*K(Ys!D^wwn*2fa!7TX08j1|Ih?+0s{Vory(vj{<)8 zKeIIi&U)|eT-Rs~Gt@c=lA8t*Kw>XR=mDUy9hjjV$;?d23)31;>>wJFg40a2{M+_r zz5MEwekAwMs9zi3Sd~aBpH3>#G9X3iBw;nQaVGGJX=Cf6!n3R(1M%}j$7ky8T(UQj z#5YBx#U9+o{vZLvU~K2ej$;5W;p&RtfVv3vb8$oawA;W?Wj&LgzLM(Xve+?SliAz> z!*Y3`ykx?{npm~(Qyccli!7P*whw8jEwk;woBgyKv}fDs^7+PjuXV*Oe9Tjc1N!33 zisMJUA_eCU&z$?|eD>Sl*H=W&Z9EYvgE!mwBp637`~=F9jOrah$O*(mo8qp#qAzf0 zq@S6+2T{djJB`b!V(xOLmoQnetoo2BSp_gRt$Lfjx5a(RKxHTE#kWpM+j@w3X)}$n zhy%Szn3R9=Y4?u89s3ks8RFjP<?R+tOQX8cD*aS13qebk!<MUeN^xTq&IOO<*so=j zYLH69B^!;sPdhk5iv`Af^VPc>^?u$2fhU{2e#q`lzr(=K9@8RD)MeJYr`$JVFMn(z zO_BD6Dlu#}1&Zr|I^T}Tx^Z_s^)PoXo#&*DhlQpGK^8Vx95A}wx%k1H%QhM__^14n zv(C1%p*5yR%#0V`bNhKud4=@^6IAK@9-d@%AI%fh7xL%2ZSo_x#PGNsEq>c}HDJ9_ zg1%2@EOkOapF#^J_=&$UcUSO7w-+V0SS7kD4~z)FQCt{C?K2&Mt$F@ddEmAZMEuH! zlo3VZ2}_$soEa!H@_S4LrBioVMe1e5`4^vVlv_w|>}+^tZjEGdU94#9oF;@LIZL}7 ze3Bg59=~~>>bOfR%{Z0M0BC&f#ui7A%nh@oDpb-Qzj<iu&~RWPJ)`;(*$<L}69^gg zTD)|RK=4A-_H!opV39Rnm07=m1qFQM-zSmKzqhc>GNppq|MNv*{2%3KbJFAkx4ZHU zi?7rnrWHU{au4Y}XEOomg}@;Y%9AaY`x6$Jgu=JSLvZS0%{qFSM(#7v7uU&mfB(;8 z)?+r0#qH&$(3<irM+bkFjJ74~S^xZIOWj{2@_{(GIWd(DLw0QUvSQe}XgfCE-~jS? z=R*E&cg!hduP;oi0?Kg+TiAdPpArX;Cl4O2o6pFtK6+X==ST0=Sfv&&+Uw<n6Ahdu zfle$bQ?BI@>tuhcrgEuTdyC{bj@W|wEzyX=^)B+%p_!{hbKbH*SN+e)#;KMI1LQaF zNmEZ+o}4rBUbsXDq)d6x=+>{Zs<Y@cUtQR4JV-rCDjwM>Qm@(>-8f*Ub{mx6!s=`9 zfXU^KNy?kcP5eUnjUF`c!4r!{!8yU_V_A(K(_Jn5N?<+OWIx(;a))NI#m3Lh&))Mv z{}J=SbVSLH%XZ(!8NBAgN#Q!b8d1*ag|*0f-!0W+?5Cgno}j00?Ej9`+4&V8YMXFy z8;6rnO3}-CJGBBsc$n#?EdMi6Qr1==+Y>VuV{!=zr67n;X-gW7dTE56{H-WJ?4A<T z%0uWBLEJaKU3t@4z)$gmu!4CQ$7-8;{-wvHpmg&}YG|y7aw_rKlz&PUHmwBwuOq8% zW$Jhf$DplxT1rY`<RgzdPjwNIy0Zyavxn{AYp$apP&i)*r?;d**fUtMMagmCab9FU zV9Q+ibG4oyx8gHE)3$ml#Z-LXhNF(hW^3?;2W|PzWM@YX$bQIZyxjc>uN`ul=ynzE zQruO-JHd1SIIHL=tVueGfNiX&)8Y9RVvD|<b|@`-+2_>#Y0aDZD{Cz86UM%H-og%T zWSRh-6`iuM)}(V8YnoG_cP$0~<nI3d6Ym!8LuqNb*;=i~fEW25%uF-eQm!dw8ff|K zM}g@cLraxLGtr8#BKQnDs`bNi88l3<=P7lIh3np@j6;gV?`%8%r&BUQy_Vr>7DY(c z>B*TDJs+3)R@*wRDnEixH?@$eGKcokYTm)_j_q1mRJb`7x3JW1p65_dMnI7y(*AWz zsT?h_sH-h71#FYb%5)9v6UC!Wfk3e`>CG$~|H06r<?S<Bo`m-~r9gkD1B@FGaTEaz zy+EbQb4(gqyKloYFvVG1(NVTYW=$r1=%FW}0%SG8HHMh8eS5*kkl3$U5$NiB?DoxX zjp@%P$f@8{o9PLEYPHhRc{Q3x^XL@347P6!dn-MVu9*VE4(g|W5ea3$&j=Qlwxdn3 zD9N=mY{&@M;(T*B|IOi&uVtWE2SlpXy>Yt~W<3YSD)XlvPmDv084fKB;e^Ko=O{47 zVy`z0@17uAehLoXJh=9oLxKKO{hl=rgj<j>-KSMV&^<0Lq?*`W#fFtDG8p;-2ODmb zmIb`7{tb^{x{7014L$4LoJ(Uh_6`v{)p4ER>R_h!gjD-pYY;X4?fi=ZP2s!AA6jA@ zvtk{esa5@2_q#q2b%t#&)$1SjN`=^2Q~SK~fqRxsk+K4in}v@r?^sd6)j=Dhj4;xl z8$OqGbeJkEt!=6nKXRrznDoP#Ht%6EFheUshvHxn9oO<K{j5QOY52QAhA%YwtLC%w ziP}6eRAJO$J=e5NYyIydC{_x3ovj`bDIkPavMJc`kegL^`vq}OC&Oal<87K6&4aeZ zPTjM31aW@Xg>U{UY0#VITUNFa!>h)bY#)ijOhwWG{2r<aPFJB7K@NuPu3ZuZ1I5)_ zXv}uw=8-wKDcaL1t4UCtmG^2uvCN7Ls#oJ!4Z@9LO@mTKlin@rro-PEBat<_`USr< zB(fGiiypLP_TvU~gpg<`1_A^@pfdT=w(7wAL>ev6>uoUTCj`DGa_*>xPT0OwfYzB- zBMB!Y2!a)0g+XP3Ii{0Jo0qGEhS^zQWjY>}f5@9y>`iDb4QVg`yux=;vQDipDqLox zYo_{Fi<g>Yop5{IVo-ADq<bup3DR1k+~uw~r|v;KkB@McAX&>j&Wz~S(ddReS$F%V z&@Z*5D0J$hbUK`)(goaIblPK@Y;?2-F7F#jc5$cPq;XrwS83LJfU{D~GkA1km%A@i z6ve1bSZ}?v0h;bLJe8o5X(P_k=>$ZJ!nL39^(4a*(MZQ;P9MN(w?rUui@MTOwu`)K z{y{!pt;bx)L7CF@t}5<N;ed*1%^j-tGXgw*Ti1bW2?Ayz7`H=``XR`OWZ%rYy<s9? z{8IAE!N$Gr@DW4jD-87Gwqnpw4d}w<RSp)xB9LlslKswtX0R<TvyMuV(jI?6Kxng1 z9lF#ljSl>lPRRpf$<9Fan!ShAYVY<(3WXNe>uD>cnHmwRCbLZomAnyg(tQ<f6K$ZQ zEK>n)TyI26{1#GGyQ}K?qV6ZYcHUZ-wLWn|g#|s*QJL+Pr->xl$myX+7L3wM>G%!# zDUWd&kyO+%LS1|q2Xnv-Dwc`-4INwto~)7vioG7R7Sy}xnM&H}HBc1)AD|AoNBM%{ zIK}n)6c?Ub)^E!O$tJ<T4<O(mz2oQPXK}Bbz$<^inAaGiF@^w}w%pUq0at0NB}`NF zmeQbpx}euZ59Y4M(rz4Am2E#q-L&Nna}yd;A{S~(+zzdwSR*RmL4^RbXI@n5OQRc- zg_~l-F@%*RncvEmal%k-A>d<OwTTbhXsSLj>_X!yj-ZEzs?XDBA>&CKN9yVPmry)> zOODzcYc$`F)Vagw;PPFf*LX&5?rlL?5qsnF=~dmKdc^6|&^JZn-fAdILIQ<^HFb6^ zBI6vqda(Dlm)iFpI^}(G-~LzG{EER!$gz){$7E#08{7B(sL=Ou`dKjtppMHMt<^uv z{8zf~bAVf}@yJu2rZ}0$ds!|%UY#Ax+3P-C2xJ3?StEqE+mzk5&ugZWR%waOEiKF} zp;E;W&+iT%{`;#=H)(YyG|!l}lm-SmBUJ?|YrU1UO9J;zt~65z;YTqz#ZCpM!h(pV zxqkWu{D`$6k}jl5_W=>NP|j_@QA;jqxV7s2u%`+r#szLp4OY@-X8Q*#Sc-bBimPlc zKJ>s*YhR2wxSakUrr@0VtlM3OyAE}DJ>PTu2ADhb$<d9?9q@-+S;&rYGYg1B0XXad zZ+PeLP(@{lmB4<pPPYgcsU7l7qQGUs1?O=t*kPk(86<?9Pq_#c(;EL8e}&_z6<Z@G zDkB7AqjCTuA^r+P&%+_ho9F7&vJH%LB@gbJ;r}U9c0`>5PZ4C#Ev{9vYC9e=z+T>& zjYpf0Pe5xr>kIZf>}#9%sq8W_-H)_2hzmbS{qr{HRl-yp`<|_B7G}IHPFKsk2D17M zR9**Bky9}eON-0fnU_;}0(RCnt~?LBfAIny;9|CxvUEc4%_PdZ{XF=&^{s_|8vDJu zkiW;>+=e5S$G>2%vWn~d`*B)=WBuP-pXmZqz-u+m0q<m8U|LYAp{U)@vb+6T+u)5o zsxbf4IrP&r5Y!Bk)g_H>f;>7h!~5kMG1wW<ZUDEB!Xzc0`fc`sfazRA`5`M0S=3Df z03w+>!I{`WXBYcSn{X2BRdyI>3C4wmLVvDln&}BzZZlfC)i-~_n`;5CJvxoU=<|s+ zWlNus0d*daCoIXEP$AZ2p)xtN7T@xlLCN?o!wY9=`whc!3xQ4{z77NGe>R>>ix#QV zR+4=+koCt}M!_I`>InB0&kS(pXX;`=yd`v|;gD1BKN9tJpGV*z0|8aeq&K7b%rc7S z$L>j5*FZc_fc$H@kHQ#n^FlS<AkpyFkH0;@O7=Xb_VN-jm0<MV%-Rc+B1LoFE?%kU zpZ_&p_cf65&O802(4$mxC%WJq0Tw^2C%NNV55vFsxRWD@9E)rDSJ~{u`eS-D%D2~K zv3mu7oHf1Fj7VlRlxu59b6#onYQOuVBuH`oS0FI1C+`~Y9s1YjR%_^?hio^`4q_va z+m<%o+!T=67(Fojwmmgy@l6w6dG_VGX`<QkjGiL~V<QY~1BDhTYI{C5Rk#WrWR<ok z^Kr&-+Lg0&aB#5HZxND%rVh@p^w!hJ_hi8DQwtCp!lylza;{fp^IxaFnef4snH_an z(2YOge3UIJxTPnuMjT$5%71$cE9{4Tcm^^hErd`NrEGWYH_dm_y#rjJk+&DCWJh-3 ztLbC1HJ8EY8UV1W!ww#wSI^2ei2V)&wmojZY#z}$>8+HqVmCnJ4hlshTpDk=6s>Qz zF{s2$aEdU`DfmR%vr}1Ll?3X@zOa1{5GA)P-xl^w)RVn<a;tg%DV0oX*wNkQdzcw% zCDu;p=4`Qy3t`8p?6F@A0qrqL#4M|VPy%%7oOwrYE4~>M;FaWzrRWeWB&}mG*MMSS z&{ciS_Q|wTo^;FsW3@w!j-b#$H$O&?MV~cwmkQH^yWIW!jf~W~zXYW1*+Qq;Jkk!2 ze48%P*1k|WePc+Y87HA$EcL@^_KQ6a@165v=VPthT)s*)9PHL_Rig$Dyv+{<T0Gj_ z&3oHBHr3uh6eygxvCwNvTdUVkVh>vB{`=j-12OEG*K)PoyJ~bXPKLJ5aS9hQM9#{Z zTKf1K@y<=%Jw5Xhn{h(}!cI={D84m|os?yor=RxjZs0P4y#D@%Vvu?82_linwW78B zI?Mco`rbq7?@#9#_Y|v5EbruQ)(lSF^P#Tx3&<|7vR@S!5pi>~`=0UrwPiW;061w* zd}Sf8-<Y>^a|^}+-50U_bj|_ynym7n1jm0d{ZC0T5t|iBL#`n;R0_nr1mMf5NUM&p zb}hhGc%8s%C0CS22Loh*9RtX@X3<gg0R0B|Zx*VvG$_0obksH`^0z{cjqF@8N-*!6 zJF@byOaX{dq4(d|+FzW{xLh?p7TLz@_>|>>Csf|8W86M%OxPzfANg-|s_ss!oPJu9 zTFG7MHWh3<mqd!GWiacR8JdDK1rzniJ{a&*&Fi#AKSB5KUE?j$It4xuS((M9gn9;d zul+8vu4G!-|9(4s`>iJE@^(I3;ZD9A2a126hu9yjkNYWsPuF<okXv?)oxO{XA6m=_ z^hNYFS7cz1gRxY^lc4*S<m=XETHidY2$W{9rw{qXdvND16I<o<F2%D`GyEL9(zNUx zcE218c!mU?|AT)As;q0obxkx(j6gDht1sp$S7P`xEMBz1z~c?jc$Rc+54y(dVDBlV zpwdwy4*~=GXH4^d>e-7Sa?>%)r}~O)^r<uc>}I9grE-*8+?)#wOarb^a}wwUS7%;l zbOku5e)^Q!@1f8&qMF3QOzhS^otlvd-UXxelC8&M>e4hOzu#j5HX*+q>=yn&A?EDj z^qz&7^%JA(s<dsDdH}El6ibwK`UzWwJCI}k(H<a=yowbCMAh0FSf<wtV%06c+a4On zDxX1SGduygHj!-RWw#*--m*tD+O=!h%80m-IDD?bnR(wr@00o~TYM!PKUro%yDN6M zQ}2`fi^uB{*O=*<^dZ#CX_Yq{qXgA&)#_aWx^W2ou5YFwh-trl6O(>5P8=E3VQkJ^ z_`ieO1r$2g#Vq7BLHNhYU0$r@Z-%uCIb-z3)Y1!sRqzNf4>S)%kj>U@eh0GcBg+Lj ztZV=OMZ`6mE^RqD3^2S9i#OCU)qgy}F;$V4KE=2{0{0o%EFq@1`H(Br1>xQYE+u*F zv6DBV;g;NpJh=N-vfn?+j4BT5>WwePe~WL~t317#JN^7kB)Oux@k~15T3Xxkt~#5M zWP>quYly$8646a_y~&W^p&TGf0-J@xkG8(N-0?k?*C~5gT)(yc4>t=>b);2y)Zplz z$qNTXB~@NnX*6!bryYyBROg~9C_v<ULj(v-8v$6Z%^Z64V9(Hq)WegEd;o+rG$1K; zsJ=0i@qDx1F}Qt0c;9>)p2oVxv8(T3sieK}9@pY*JuA*fnS?1f+-CpK&Z_({L@)<n zpHL`T0_02NuIozBxz>1wRBRC-sQB#a>G~Kms{I|K2A_8_J5yYecem)A++h~*{a)^= zHAe>7yso<v_?-Rl7q?UO4M7x@AD~`}{9v?}r37CBsSA|qZKg62_M*OhY%Yj;WtriB zqNT#h-EUEJK1krd)2endBW#On?$*vTzIkWB)@nrVb9MRNWct|q_*HSfhGfM!(!c%0 zijN0)4Fo5i5@ure7UKzoQn?t;%8gKo-n)XFDxM#7i~d%Gz7Q?0p1L{`QSJIV=$rlS zww9)AjsaUDH&reR+-Ehx1y2?0Z?8z&O?}KekfYZH@|&R4h%q#di4prU`41SaxQ+k_ z(9nShp-$A1wPH6iJ+YlezHwapZaWhB<uOzU+R!#`jV81UcY5p7yZ}?}6M=;rGA{Mm z^7AkgYDYdg`9<=Je+$pXQ+$6x8F|d~R5sfnL+VIyaMnRn-ACd>loy%U0NIvgQ#pB} z$yH3cX#6xv@^=z_IC#KkvZl-^8P*XyqhAs<TGkYYCW6vfGU6|zpV_dV-N^l}`CRP= zJ!=TO_G1`iH)D7f1Yya8R|UVpVvs4OlfW^pm=E91PN~|776y)T7r}DdgxT8ncBEUF zc`=sASFcFjiM3>26-NJ1@pGnw$bHF0vC!x@<u=_Fw&twH*Y2zI={fl5ipK<uX6tUQ z0aQ)CSx)xqKh6T0--4>TH}h<b+t#|i8dG+Z-qC@T)9p>zf{%*>93!jt%EXzc3w>rm zD(y1WewlpfVAvj#wjTUvjRJekvzxZfis_w_mR`}39eOmpnN6NlrajlOymSJvT+ODX zK&w!yXj+N7tqHa-;;T`9n4+v=7}yZ&F`%9;4Qlr;9BM0XKF5i+ZtlGKaT~(6QAZEh z8Lwvl)9s^V{*HO1f0$<gzSIaX@<2`h2{9soy^FOasqoEXS}JY}lZCa;Pbct_VQ_do z>pl7vQO^#r!-40TnGv#<v$~pd;bB)Pd+TB8n_#F3jO#;MQb?YCyuhV`i*Gd=FG#OG zPd?-f#*aP0i%XZtzhzkNUz*4uX;hK=jg92ae7!{h$1H&G{cv5bIl{<^CwEaNzIDdb z%OFo%5&$U%j2lcsLOkA7=M<w6N0nj|@_MGdEu^PBZk;Jn@a-2RbK@sA^nZTG9o`4* zSi-_ZYtt(ZI4Qp}2!6OULF+55$ge0qA@=qf8&*=%Nm(!FCoWzmHR|V)c%3*NP3m^< zG;u<-H(#SzP1pWHJSu_tFM~n8a!^BGW&2~NzRI2;7&U!vo}O1S|A82_sWWXOIHXS> zx^%Fi7T0v)w~-BM=WmGRTEaJuP{wJoTZS9C_7?^vIJ@DdHY)3zXNrz=K7xR=;M8$= zp7FG*md}b^);We$uZ+-9Jf1bGZ?U_PJ{O<t&`7wiEi3?Y+eFYZ?4%?Q**pgJ4kwDS zINoDwgsKxm=JCK6Jr>40o56j2WdENVxa%6Lj_^Id8yxu1VBUu(*oFVS(LxWO?IrS- z>o)FjpwyNglYxRW(0f1Ao1l5y+hriYCZFiFXgIhEMSjn}=ceQX0xQ6<PE}<KGXna+ zlO&55GoDI7Q?!PWYw=a6BXrWdXfTemmXrj%N&6(cFn}MB7fmW}e@Khm+#H<tEgq`V zFt>tgP*r{Ess>Vzn1WKqvR@6f|0&uj{9T4A^Q?i5Ij1K|*@K(Dz|9akC<%b02$WOf zte#FV`uIOyH6sSZdc($2X0uk@Pj@~M!5Sny?@yV~u!Ghy^<&WWH`jF?<XVAnE75c~ zRpcAa-L!&{Qr|ITCzi1Ugl2MUv1P+~t{rl@**&&{nS80yiU~lHqz7aPz?(DNeCX0c zx?E#ENF2oIV68`X;2;_$KLUSf<7RVZpe~z<oMRVEJQ6{`ZU?QI@_%O@CSK5eh2PfO zOj%V9jb=K|a)BK|j#^jyv#GVMh@P_Qy>*A}WN74aNvv%Ubl(G)zH77$tRNhgk`7yo zitG4sa`9cTav(bp(_&?0Bx!2g5F7iCy45{VtcGK|5%)>@*){gF*M8dHiOGT!mvdbS zaf7^9G2GGINMOovZxsnYx3Wh&qxC6k>tYCDEn#arglw;R1HK;@`E8GBTg+oF$L{{y zoVg%pa{@@P(zO5}?<M_7T%HFt=r_iJmk2uZ<fmF{qre!X{@rI_NkJlQ5eaaBL+B(u zo1<<#OtSR^RFvW_PzRr+im0jwkcGj{(-52M#b<&&y;^dxqtybHh0-y9-pXB=PN>SH zhl_=*pO2p(Wb`)}7LslXx1*L;@M9{^k`ViYh&_Tw<l;p9pq<%7U8{+SGdJ_X1(aN7 zh7&zg3EhjUJS>G8E%lIdxF!oH6IXj`ypz8U#XpG8`y5je;T5At5Y%tKBTMsLTqGBe zPIQ<*Mb7zF+5D>T47SD%nfkI3-<;5n1O6griMI1VD!!5su?e01wq7o1z&;}O0f>|i zaOqW1o3^*vh=5cEAKU|E^BA%8m5flvDRmw&Nz<tlO{^l%%;S%+51bliw_BnEv)Em0 zX5RI?*67m0Ht15nF5>{X(kXFOBpt(CPqT3|BN$4~<j>k^>uF)Ml2m#}tHj$UAH>4Z z&)tr4co~+Ta>ryE08SAKsx9IOfx*eH+nW_8=ATD0OFt-_`UQs%&HEj|PHdWnU5DmM zKg_Qq;~$zRWJ68pEG9G=gomKXx%Y4TCxdL=;-J`J%s7c>545_|0{^#%GQ*>j04^pd z49O&|xw5{jU<U4NEU#}ek|?GXr%09#Ko7D8?6*eN;52SXOG?bSsnLXw)L35rJNdm6 zofdg}d}D`oRN&2M1gPD|pb?)q`(HTvW?8;!G|7BINBnvqoWkK@2Y7_Q7x`Ugi<Dn6 zN+W!?WOn7Oyj=13*@o)WTJBKjqq~RS-TA>@LTlYYZ`Q9j(3OT`m{tkuhoYhwV2S>q z!=9eCh#@bWWck%`bBCTUu+kd}bD4}e%;gl{nAkLL*sC_q?E797qtUXi7D+dmlFS!Q zGL;4$*nqP1K%gF;-hUqwUWe5>65D?M^{o!qYprZCI>$IuGofM41&c+@J|xi`hNDZh zUxXYJb>QI&p0HuUYXbM#p$T*}_+k_dIWwNJ`xIbzT0YQC9J<7Ij@ya9YxnJH^5jPL zw9h`i7b2kcnmb+tWvy2HmTKgGqT_?nj)Cru47Fl($a`|Iu;N$1bYTTE@Mu9sE#sAq zOlHuRp`TvyjNOEGfkETloKTC8Eq@G(V|d$lu09YP05MQ~8}cR`L*20a`0mMFyiYQy zqw3Mng!}Km&+_xrIvNgJSL_^y_Qk62${I6sftEBqfQ#FJzS2d|wgxe+jVm@NkRsvp z^vzgy?cC`0Dtx`})bN1T8*&<JV`E(EB3YjO#>!<naxapn1NmeMR=<M#nOxg3uglHr z_f0aP;Y^$T01XNh1G{wS0~SsWULFL*)FlVk@DzkVc_p|V!BYt!P%m$BrP;~|9$Y2z zWYCYRzx+A;X3BdZ)fBhL8eKjC^b_}Qf&#DXEuJ%v6PT9lpdyodbXK08o9nJMTe8_W z5)0g!u-Q#=9^O=5Yrtc0L=gO!R;B7_iyt9skWlZALxs<J42r|f(goCRR@FnxcHi#f zw;zCF)mNd<K{P6630x9_!*NW`c`pf}E}W@<Mxez|@~9@1mTkp_@41#1z0%V)`sq?U z%gCl?SZ>SsqnNddpaTJLj2AN;_99B5Z}IvZhDQEK8K&nASZh(+UD4=WpZ)G%-H`RV zh~YR?b(Egf^?nI#kAJPa_sksrdCr8xNKP}hj3;g(IIpCIzB*FG;XnE?Lu*uA?T}`o z0R+=Fcj}CyHv9X3fI@^yFoS;7a3zgeY9p)P_2a`L{e0f%7z!b_g;gzv+~_%lyP0~{ z3l^@8u&@^FHWw`6Ejeh;CCvsnb1GDoiKXOrFFZ|*hS`Zh{QG3{Z|o`k3+w%#eR}_o z_xb^~ts;?fr&Qr&`>EEB)4%`6hYn{MSbSLCf>M6+cK}l&J!kAcq@AyRr%Dn;tQ_T8 zBonny_^ThDb8}gc%nVz+@giJ;Gh>wc+2Kx|L`+T;9KN(W1ALsF2xa3jV~k8)MuJQZ zIqhJ^mfHZW6^~{ivr0?G9n=XYr}Yli?aZ$DQl>47-Rj6=l{noqRkUeORYZ;zR2q>o zO>s9_Zlt_vGndfc4ZX>vwEyv0bhkG;PE66k?!O=V<Vy*z$E7!Gu|LW(I?s#}<;=B5 z0Q^7Ew2@2dgwontVbI0C^&JA@=b>G#loz#b&l_TZCVE6{Ukumh7BvA<(&;AzHyfR2 zA;4IF0$_Q8@$A{0-Bd%@{XBdgv?QChr%}^mA&3iKj*ss<v+vJtk4N*YbaHL=$;|Rc zW%Kz(Ot(3+AF$p7CkEMMR!yL}r34l6g*R@tZkqneX&lb4#)8QJQJ+`i|CJZezo;fr z^IVjZFdKzaLSfd{F~NUVu53(Pgi)BJ3?KdR@Wp<(j9eZ|P`u@&q#(y`ddYhSkg!;> z-Q7x^>x#!3%zSWa|MTp?ESCIYTROXj8xK=->Vn~rz3$eQiyA%&y9*B8C(%z~timGD zt12p}g*-u$IVU9D+m-Cmkr9=a1f2#1H~`{HF9xs8ESZ-s7xIB_la{>;TMc4d7gitx z5O4ue;DE$ETQhJYf&B~Y9#OHmWKy1(ct(4iL_k6Vt`tG=2ilxs$HK~ihvZ-YfCWwA z-yYCUQQZ{*+d~;)u-{-D77MKYQIDqMk60Pe5dV{aexy$#SYSWDRFtUUT>_e44X^^i zb&s_KhG|Y~=Q5&K4=K^jl%eU+I<~zN0^vtNk6~kTD~n|p^doMcW;Zb@2CokzJAJ4v z9pYa7?U-l887aLC_&>6~1Foh%{{N1Kwv|N7D71wZ8dghb+}mEHB1u}>-FQ49iY6*0 zMfbM%(6}L`q@k%vyR@ZU|IfMSKEMC^exH};MKAXr=X}ri`x)<n+6i3tTSc)=TcAu7 zT$P9yHIYT-Q5E}<;{whM2?3+TA2VPrjrdEe&>HUS&UB-UmA`Z&C`Qo8LWHs~hiPJa zIHlF!xeZFI7md{EE}f@dArB*3v|#Ctw}!~O$OH%QnFVi%t89#L*Alhv6U;$^0dbAk z+dqMf)M$OZK2!zBsC1p~eHw@=&Ba!Sr^x!E9ya`2Y0~$}Vo8suFR?@oxfmm3H=QIh zS}{#qe$AhOaNhn{H8ML<Q=|-8@g?Rp=Groaj|d6v?IW`wO^q03(Ve5v)-zKc>SO19 z<ZA!PQ^??RM({}CBaC`CjcEibu|QOh&xl#~0%|+kXF2QPwJD1lXwd)BilE&fta_J% z?l1V=sI-EK9<r-N$0NG<FJ#U$pIV5dK@_>3Mj?X<xnJkbVVY>eyAuue$LnaWWJO2& zX#jRqQ?!2mZi?(dnqcRILNW^d3j}>MNW;{PH0cgaD=w%&FlXD)98?C8^59$%f=#xd zfOJUoPMfL-2I5@MH`F4CI)HpRp<P3I2x&jaJ*Cx=$+x00n!_2WtaV!*4R*JkO7p1^ zT>7u>fVwFR&k9q%ET%JDoGa&`xq~v5mLVe$6&axp0RvRhf_ItDB3Gd?OtD$$9mmo< z^*o)|6*%V>5B;~I-85vFh%|(gOOg}gVQwSZB^IKBsuOK~h$yx!9#J{Z9mC#aNue~O z&T}|aLg7^Txf2?94|(;~%E%$Zh*|HmipgEOVhdabox;7bd0G?sQ2Woj0^BshmD#Tz zaV4}aM#&+67%jSdM$i2jb{^#czNn5)5dmd0uq%6U(Oc&T0%(5qvEAkktz}H2fwg=E zjA)CS8!uWSUeirLI6g<OFx(SG{<MUS`od+<GV1b@D{Ruh9&=M{@b^O%5l)AS>1oRt zDm`*d_uNS*@X-nntf5kHQ<{<=VYw{~>B3+9gfDzVR1R`yC>QeMssc1yoT!t@vM@yk zB^q?47-{2nLQIMXubAM_`jKfPFTuK47ke?ds{Q-#R!1XSg?<(3k)#$#@0b(x^{Qyw z$M{JyUuLGO(=g5M7fTOQGh$^V8{DZe5YC;jM;!wh(QG`v_TG@IU!NUf&15^fgs!#S zx=ps)OwQ;%piCcp&PtP*B?qiZxqho5d7#f~s4ka(Mv{gu{0|0)8fW6s{pFVz_|2o5 z%<ff*N1w|`CNEeK=_{XZ9k;<3iY_BvDJ1hB{fd6I(_@Jv7ee?zCP$riZY2H?Q8ggq zyGIoJdr-Ivj@ATH-b}-%qWDOmW5@`vjvw_^AF`oA-PbxRZlyZ3j?v`wxagQCDvBja zyl2NknRtnA{6_!t<=b9g(G}(<$f$wSDEL2e(x`hCu3Ra!U5P>m@1x}-F()G&9Qk)X z*H-6RXfj^4r8xo<#jI%>FPZI&(bk$cyX)&3$iiG;!;9|c+D@PY*{O8T9ojQXdFzK5 z2!M;geP%)=2SJU7{KV0LKc=%Dh~3_cCB?0Aq4Vj!X%0@56l5H>cx`(y(2W+2AGKme zmg~xAICcqoXm*+*M!D)FdKC2#n4#g<h|#F7xoSga7}{YQ0e$!8{lDpo`C`2^#^OmU z=EV7Z+z*KPzf&*TMurm0HieB*gV13b5s=WAb@$OISIxnJ?F5bU+&&KhfTd?~!j@(r z0#qHu^2lJla~d_E;4Pv%K(3#XY@s#CV{VP_3ZMfTGjA=@Kx@t15N}KkuAiVeN{&qI z^0j{-QL9Eys;x%`<13n}VSvDH8Jdf>sFRVX<V|EF8TdagNgU2o6y2)br-V}LY5(%3 zsza46=&q@|`Pb?$86}M~Kc`*l_dk;WfCByIeT`^C4})TARIVT+@s*9HsN&!Tz1Yfb z4E45F3Uk3nn(l;W?^cTks0=#mC~9y@qFYNctk9IQ0?^d>?f3%SOswQrHloh&^S1>H zb@nf-g&=ee*<}AL(ify;f`CFCo`sTB6@S}Fl!@lb)_Rty=sbv!>FaN&7dg48bdn)0 z?iw5obX@k+Hf7SZz0ZEFF6;rN4>elH(~ZkP<lYZCim@ocnv_W!oFT_(qNRTZhE`D1 zu$}+8efQiwMmtT-nd{xTHzg5?1jUm;>7e}N;$)#*RXG=htZKsPA2gtwS=qtFk{k4r z)Y@O9@n>1O`@dSi0_sRwvS8;Y?79cR>NN@4sGN7hK2~j|!yU}9GAZyCFhr-L%$$mc zqRc$`kf1>Fj-3E5k?oLbq_}Vj<yLrjJCBT96<S?n6GxbLAMSfQNsnnOqk5!<>xy*G z*cJEi>be!m%OnfXpMCbI1o5A_)^rApSJ4faP(K+ePovT^i%ng+hK$ipL0XhbyO6|j zJC{u!E=IkDXDTXpcf81pNf)35G01&Ru%{dSwrf4zLCec<^mBc+ZsLGyJxUXOeJC=T zWRLFqE!d>5s(&lEnm3u$bK+`EPirQKv}+|>xKD>ZRnh#b)n?!QDou_iXBRWVvrW(M zkn-lBYdkktIMVL&q2h-rpHncElZN=SPKB%(Pjkr#R>y89?j@qXInnt5*0-u_Xm(DK zXotGFH%{mUzA3lJh;A>I`Mj=&B`!>drWNK)Zt;rcyENd9+*fosu$rxHYZW3pKC30y ziUy3XsoOpyY~dvuW{XJtNph(%Ho1B*(&TgXUShrg*)wcCa)Ge8u{*wy;KXaT%qv#B z#NmV7D|kK?0kG;|e0z-L){~Gfu(r`9o)%?$`z`Wz#=F|6#GLj?N4!9BJcE8~neuks zFJ6Z#Bfeg?jlD<7p+dBuqVzQWUaY~h2ji^Erz>*$Xb!NzOg>LwJE(s2o5Dd?VpA1R z&Bz~`DbbWF%c_OgoBf9uQ^l=QGuEFyk}!$?dS8Uwc#b)j;fl;5#3tHrKYT$MEhmND z7mpWBG`-4BIVfbUOML%WVurHvIsa%4`S%8qxc`gy;B1Z{Tvv|Z=RiercNpX$Vx3AA zUOMRghhOvWW4W8o3#qo!3<Hf5#Ef<mS~*#+UgZ>1nEFh*AQ}e+Xoj<qV7nzS|2d(y zNWg17`2)FRQLRlG#iAH)JaHN5Hfn8^c?PRma(TJZ@B{ksgy^FQ`%4}ieE#&2C<~<{ z@vVot%3*Bi*QSH6r@okLZ||>J7dsFb&Y&Kdu4X#Ni+?@-L(r@AcPIl9bX0*heD^3h z4cYs({X?y7#gTIhPA*$Rcx{3&;TXYtTK*|U>n@Z2V^=TY1+er={ZiB6lAUuaw$7U( zbLA7VTnVuQUzQY&49SF^Rn#45cyzwHNTAcwmisd8D&3|YOO*b1L~m=|_c=jR^curG z$`6H&)&=IV`x}={Eml8bXv)1Qe`lr<?r37}$6W#E+@CVA>SGVMZvVnZQ)8sx(*?-T z9*j#5$W4R7FD5whsQbOVKQ>}qw0DoTsB%A&9;FCC4kx1)nTNZo>wdfbIZYVg6es;N z;D7eP5*rW3x3N%YQQN02`~=i)Py3V-{4}XTzEUb{EA5u(SwMP`=&e5dcKdb$niuD^ z^1)s-^cbqKO;zrQss=OHc-`9SV_3+eUm@Zqgla%IK#yk+I-@S^vrFg)wif(<(Srr< zU<w*5HE|Q!Dd<av{F)+pC0IF8tA@UOAcGU3X>5;Tf*(i<cv(rJKG(!PtKLEx=D4pC z2D~QIXpE3z_O-^Fi5-E1Vam#DYX$~mDrDN@@=~5v$KMpo9=EizxD3&)$PT&<xY7Db z%fe)1a^;f$NwYbnQ(cCH9Df_J)Y_VnQ1R6L@%BVNO93=HMK@o0=c(!&sP&h^>S}w- zytHEbqL+n_z~_d=74P0Tua@8QMTEY9IUi253?x8AGS_p_TX{)QDw<3mhPXrqx{2r9 zW@||2ZSg|-*dwanQI@F5GA6wHlBr+qdJ<y_`|&5J%!zmZr=?<{MHFD)0|qi_Y6S<h zmP^Twn71YEM(s5i6YT~GJ+rRYTK9bYYgX6H1@9CLuKN{qDYVZoI<})NSB^nifE%|u ztJpq3FlZP!)4DjKXVhS(6#CLnAbMprRJjmYt{cz4tXrMhc`jOD8LxL&ly}Bf7YxE{ zR`t|{3?k`A0+-uvL8I2mGj}CfGIr3$!pJ>PI@Pu*wzw<2Z2pW&rc4qSR~|fgJUD+| zsc&gnm9_v0%FdjkiCWLuG0+p_W|gtNcy2+>wvQTli>XduG+flcWGHerC#||;PfLf3 zF4MnaH;xi|CQ=_U+-eR}m((Kh>_LWUHg`j3Z-Y9ny4F;PcTp`Qh`|M@9in}rt4tom zu6^_uf^w_lSLmpWP~^7HAl4}TwfN$Lamj&hmd~u}Ha8k5rUSh91X;=t?tb>@EoIn4 z+DWa=%wXcAS&jvZ%hmTT-H#)8ZQso+cJaw#_<*>p3a?dsZOHrIp|_{lOhWktS#kz9 z(9VE;1wZ`@6IcF)J<m2NCt=+DkhTcy@qzaUjfC?!j)7Ie-Eayx&YVfQ+bplvTKuiv znqBj;t4{0$-%euswE35LGqfu7XTc@*aimRT&n3%uY(21RWmmo4CT5O27#O22z@ZwI zIf$>65xTKvr@XE8l#L33mqj)yOfB~2(3?}=j9Cs&Z`R%oqwE$ugf${IjF`6{Qq{A? zzC879w=<Eu<I8L&W&fCOXy~)wmux2n4vy0|2Df53I^1}}vEM07E)P>yG=y#!sD?A_ z-F{p{IPz%6Qz5nC<6$JNDXB<fo;{_z@o(7H`N)obE@cE?!@mk5k+0o}?u-`n4?7pl zdW;L;$a+2Y?4-xgB^6F$P|)W+=*p|H)zCy&zmrcll1v%0a8JMVil$xE!yWB@`uTqw zS>iE>b<Ppa{?|LDJ4PNuUE*ho8kdh6?&iHG^5VTZF3$Dl&qIshkJ2c^Nnt8!ISN@6 zAHV-D!|nRzVCDUZ4kCg7PtS5o7Meri>Dn7J4LqC6zm%;QkY3flSh<-Z3#X(jDHMhN z!N2q^i&;+pHHcN*59?M!gLXoh;Ag{lnV^X5$OOkrcSSnmDZ{apsRi2B3BNQY2V%Lm zH8GlQe4G=E+QdAj_tVf)(+r(1twL)iq?K=?*bdBNz7sAjHF_$Dh2x(we5veE{*g>= z?8`-m-c&Csfp#qmqN^AS`EXeOXL<X`Y#EKauUv((k!e;qx@LO%m4vIM0k;3wU63yB zkqO2_jql058(bNui*_w_J+7!<>SDJ>?BecBF`!kI!}R8HiuY+6d`#GzGmhRuDRfw^ z{vGgjquNmjz<_Movqj&l_F=;qE^dF$JMz55c;dkRFim}O%V0Mu@<xjv_9u$gnCoBC z@pSnRzC)Br15K^B_S5zu_l>SEXqtld;g-%YTcKpnyo?%TB|L$<hYY>-tHb+*_ABQ8 z2gEWx?%0%d{%k)=JYuHT<k)wk3Q(9^v_VDc7jNgS5CASfa5onN(Eq5kHu;-S9BM)5 zi~EBXB}$U%W_`#v`c)~Uz(%NbH@-UFdyQNj-`tKet;gs}LwY`|J9v=6T#DGcSFFos zU8zDyj-$n?Gzq|(t=20=V*_tPk&XVpK?r~x@PVY6OmxIoe&NanG`qrlMbBu(!zGQZ zWHyUhf4>=;sStMSZe(n6+xz3@wZhlbvs|bDfEVwqJFT*f+@i#iP`F7JvR5UKu(%xT zVA+BU48Q=8f24ZD5nCkLbL}ysJ4hn!QYByc8M^bJ3Ys1@B1EP77<^{wT&-AU>4)|> z+E#=7GA;nemfM$@6STS?DI@)T!PE~^W^_&1a{_aL)_o(<3VaP!nGuTZwzRb1@C?24 zMYnl<XNIrsCdTB*+1{!hUZxA<z-{3X97%vGX$Zqn1kIy#UEUe-bOkR+l%*`wh?cr6 zOByN=aKy<wOue+E%#UY@W|})LW^LU~EegC%eS*4k;%=30eqOy*%Jomj8OMFHuV^JM z+WjZ^Ky-3$;Z@$$UKB6wzV$mQ4T=5Fyq#VcUC2B$ekPh;)S98|6RZ^FU+YM`9Q-d8 zwY#}AgEqEkkKqTzT@S|75hGh@dbFtq1Na}x#J`XABfV~Dc#lt+>*tsKnMVfxznb!M zG@}kg6KP|Qmx36K{tu0Fssz;ri+mIu8VJeFf1{PJVCg`j_u0GQM+d4O3my}AKoc@- zQq@8w{zJcah7ByB)cJXO-QQw%seH3}RjO=rdn3}`tM~cO2Mj*7={~a0y0=y4Gq($v zvvqH_tY7Nc-1(my8(Np&--tpyXXS~}XjPb}h_+DXH2dk536j&<_Z*Y5JB!eF!K43v zyQSyk{dV~~=o^gu1LBmCi&s259JYrhGdbWUz28-%9wh*(pip7|<$7VFnHG)PZv}J; z8qo27N&|FuT#x?Is<0~>*)yg8`!#T_hWjsBf)=9BG7F*(xW{LJbciqysi?0;@`&!Q zSpEFmJVY&ze-x#z1k#+Gi?-6dbUFD+gTi05!lGx^{?8AGkeo1aRg!$@mH)4?L$BJ} zE6^M8DC2oz@BvyqKwm1CHUiN)_O`6w1u%zcy%S`K>`$CWuF)a(tMI~TU1<5*Xx)FE znNujHRo<CS&^e{UqlIF7w$gat>6s|bYBdmT7zrFobRBS`BoC$Sxm;o{$&(<u+v_*| zl^u0KtUxGnUxiOhKD!=z(TBm4-t9PD*g``WTc(XDCjOx9z(b7Z&Ld-tBzgiF+#Tpq z=M_6j4HVYGP_JZnVyJe<USNa}_!Q>MnGYYaR0ra-NA<\ijCWyR>&-_G_f4Gk@^ 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 WP>t*+X##&v*kZlis`wYi@&5uBoZ=Gz literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex new file mode 100644 index 00000000000..a9f12fe3df2 --- /dev/null +++ b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex @@ -0,0 +1,55 @@ +\documentclass{standalone} + +\usepackage{tikz} +\usetikzlibrary{backgrounds, positioning, shapes.symbols} +\usepackage{helvet} +\renewcommand*{\rmdefault}{\sfdefault} + +\begin{document} +\begin{tikzpicture} + [ + font=\footnotesize, + faraday/.style={minimum size=3cm, draw, dashed}, + duplexer/.style={draw,fill=white}, + ] + + \node[faraday, label={[anchor=south east]above right:Faraday cage}] (faraday) {}; + + \node[above left=0cm and 2.8cm of faraday, label=above:obelix] (obelix) + {\includegraphics[width=1.2cm]{server}}; + \node[right=0.3cm of obelix, label=above:B200-mini] (b210o) + {\includegraphics[width=1.2cm]{b200-mini}} edge (obelix); + \node[below right=0.35cm of faraday.north west] (anto) + {\includegraphics[width=0.3cm]{antenna}}; + \draw (b210o) -| node [pos=0.2, duplexer] {B7} (anto); + + \node[below left=0cm and 2.8cm of faraday, label=above:nepes] (nepes) + {\includegraphics[width=1.2cm]{server}}; + \node[right=0.3cm of nepes, label=above:B200-mini] (b210n) + {\includegraphics[width=1.2cm]{b200-mini}} edge (nepes); + \draw (obelix) -- (b210o); + \node[above right=0.35cm of faraday.south west] (antn) + {\includegraphics[width=0.3cm]{antenna}}; + \draw (b210n) -| node [pos=0.2, duplexer] {n78} (antn); + + \node[left=5cm of faraday, label=above:porcepix] (porcepix) + {\includegraphics[width=1.2cm]{server}}; + \draw (obelix) -- (porcepix); + \draw (nepes) -- (porcepix); + + \node[right=1.5cm of faraday, label=above:RM500Q-GL] (quectel) + {\includegraphics[height=1.2cm]{quectel}}; + \node[above left=-0.1cm and 0.2cm of faraday.east] (aq2) + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[above=-0.2cm of aq2] (aq1) + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[below=-0.2cm of aq2] (aq3) + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[below=-0.2cm of aq3] + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[right=1cm of quectel, label=above:idefix] (idefix) + {\includegraphics[width=1.2cm]{server}} + edge (quectel); + +\end{tikzpicture} +\end{document} diff --git a/doc/testbenches_doc_resources/5g-ota-bench.pdf b/doc/testbenches_doc_resources/5g-ota-bench.pdf new file mode 100644 index 0000000000000000000000000000000000000000..121969030e64e03ac0e4fedc9ba4fc1c692de71c GIT binary patch literal 232400 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�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 literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/5g-ota-bench.png b/doc/testbenches_doc_resources/5g-ota-bench.png new file mode 100644 index 0000000000000000000000000000000000000000..86ae6b2b6413025f922887d4e0a17c934acf0297 GIT binary patch literal 96734 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	Q>(ylMb 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⁣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 literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/5g-ota-bench.tex b/doc/testbenches_doc_resources/5g-ota-bench.tex new file mode 100644 index 00000000000..c3a524fb0ae --- /dev/null +++ b/doc/testbenches_doc_resources/5g-ota-bench.tex @@ -0,0 +1,68 @@ +\documentclass{standalone} + +\usepackage{tikz} +\usetikzlibrary{backgrounds, positioning, shapes.symbols} +\usepackage{helvet} +\renewcommand*{\rmdefault}{\sfdefault} + +\begin{document} +\begin{tikzpicture} + [ + font=\footnotesize, + faraday/.style={minimum size=3cm, draw, dashed}, + duplexer/.style={draw,fill=white}, + ] + + \node[label=above:porcepix] (porcepix) + {\includegraphics[width=1.2cm]{server}}; + + \node[above right=1cm and 2cm of porcepix, label=above:asterix] (asterix) + {\includegraphics[width=1.2cm]{server}} + edge (porcepix); + \node[right=0.3cm of asterix, label=above:N310] (n310a) + {\includegraphics[width=1.5cm]{n310}} edge (asterix); + \node[right=.2cm of n310a, duplexer] (b78o) {n78} edge (n310a); + \node[below right=-0.1cm and 0.35cm of b78o.east] (anto1) + {\includegraphics[width=0.3cm]{antenna}} edge (b78o); + \node[above right=-0.1cm and 0.35cm of b78o.east] (anto2) + {\includegraphics[width=0.3cm]{antenna}} edge (b78o); + + \node[right=2cm of porcepix, label=above:obelix] (obelix) + {\includegraphics[width=1.2cm]{server}} + edge (porcepix); + \node[above right=-0.5cm and 0.3cm of obelix, label=above:N310] (n310o) + {\includegraphics[width=1.5cm]{n310}} edge (obelix); + \node[right=.2cm of n310o, duplexer] (b78o) {n40} edge (n310o); + \node[below right=-0.1cm and 0.35cm of b78o.east] (anto1) + {\includegraphics[width=0.3cm]{antenna}} edge (b78o); + \node[above right=-0.1cm and 0.35cm of b78o.east] (anto2) + {\includegraphics[width=0.3cm]{antenna}} edge (b78o); + \node[below right=-0.5cm and 0.3cm of obelix, label=above:X310] (x310o) + {\includegraphics[width=1.5cm]{x310}} edge (obelix); + \node[right=.2cm of x310o, duplexer] (b78o) {n78} edge (x310o); + \node[below right=-0.1cm and 0.35cm of b78o.east] (anto1) + {\includegraphics[width=0.3cm]{antenna}} edge (b78o); + \node[above right=-0.1cm and 0.35cm of b78o.east] (anto2) + {\includegraphics[width=0.3cm]{antenna}} edge (b78o); + + \node[above right=-1.3cm and 5.0cm of n310a.east, label=above:RM500Q-GL] (quectel) + {\includegraphics[height=1.2cm]{quectel}}; + \node[above left=-0.1cm and 0.8cm of quectel.west] (aq2) + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[above=-0.2cm of aq2] (aq1) + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[below=-0.2cm of aq2] (aq3) + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[below=-0.2cm of aq3] + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[right=1cm of quectel, label=above:nrmodule2] (nrmodule2) + {\includegraphics[width=1.2cm]{server}} + edge (quectel); + + \node[above right=-0.3cm and 5.0cm of x310o.east, label=above:amariue] (amariue) + {\includegraphics[height=1.2cm]{server}}; + \node[left=0.8cm of amariue.west] (aa1) + {\includegraphics[width=0.3cm]{antenna}} edge (amariue); + +\end{tikzpicture} +\end{document} diff --git a/doc/testbenches_doc_resources/antenna.pdf b/doc/testbenches_doc_resources/antenna.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0d48aa8ab9e17defba56fb89e6c7f36c6f3ec548 GIT binary patch literal 4886 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 S(m*YAP~e%1va*GvCFDN?3v0Ll literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/b200-mini.png b/doc/testbenches_doc_resources/b200-mini.png new file mode 100644 index 0000000000000000000000000000000000000000..0355e45f1837b3ca5129566cb524af070ee06c5d GIT binary patch literal 238906 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	I7*TxYiu>Ovu{7nDFn^eYsIAR?lLgvc=Jp6l%D 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 literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/b210.jpg b/doc/testbenches_doc_resources/b210.jpg new file mode 100644 index 0000000000000000000000000000000000000000..23599b0b1f9cc6d25830ecb3bd12208351dac9da GIT binary patch literal 32877 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	Z%-{i-Sb~Jr#20egBZDtsgDIv~q0yjY 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 literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/indoor_live.jpg b/doc/testbenches_doc_resources/indoor_live.jpg deleted file mode 100755 index ce8b9cda4817796abf6fb87da43befe6090469be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254133 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%0A)%h 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"-0QgQ_f&;P+@ae|xCKI-OpCg4A{V9= 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�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 Xw=kVf=>HmO>>rBppYw?K*W&*G6`{5$ diff --git a/doc/testbenches_doc_resources/legacy1.jpg b/doc/testbenches_doc_resources/legacy1.jpg deleted file mode 100755 index c3579df3e4a56521eff8f23df1dbca9ba9fd3a59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107882 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 br=129W%;M6%0G78A1CR*{3Hecw*0>UmnX;J diff --git a/doc/testbenches_doc_resources/legacy2.jpg b/doc/testbenches_doc_resources/legacy2.jpg deleted file mode 100755 index f40d167a2db2626f4be2a47fb82528cc9df5abae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122055 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 Q=k@ozuRl0u|MlB{0A&rZtN;K2 diff --git a/doc/testbenches_doc_resources/n310.png b/doc/testbenches_doc_resources/n310.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6ead5718497c72f4fd972f3da5fd9fe95744d1 GIT binary patch literal 120716 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⪼hb6%4(Xkz=f<Scm#*)bCz^Awb8z_JMn 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 literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/next_ci.jpg b/doc/testbenches_doc_resources/next_ci.jpg deleted file mode 100755 index 2d4111510c061b5d18ed1ae3097e3c6cc0040437..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157592 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�A(SmYoqJhO6gzHn~W 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 CdZAGO diff --git a/doc/testbenches_doc_resources/next_dev.jpg b/doc/testbenches_doc_resources/next_dev.jpg deleted file mode 100755 index 72e9f63bf91cdb7fd47a44780126b7269bf0475f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185772 zcmeFa2UJwcwl3Vz1SN<PB-08gAV~?5X%NX0MRHJ4Ndf{ABsGEr$*6#$<eU{jGL2+V zBnQb+a!w62-G5=)y6?XCo%_ar_PcMqtz$8$wQ5ybRkP;&<~Iv$KXwdqTuDw*4uXS& z191WWA=p8P4CDv_0U-hY5kf-3qeqVrkx-J75EGNol2edTGSb1A80i=oPO<W^onq!< zVPIev;@~=eK|nwN#wH>m%qPynFTi(L2+q-?M@fiDXh=zE_)asN=KF8|!&XC193e0u zN`&GtLvT;vKu_Rc>mV=)1P33q_OQX<|KZ?5@$d-<j~pc;1{sQuLvV4RP+UAHK0Y2E z$n621L-0=Elb^mIO+cY>gOJ&dlJ8+e;t`fhZ{AaBcC51U-?aBWN_3K%hL-NkSvGc# za{_`Fg@i>!WiHFg$tx%-UDdj#t)r`_Z+h$Y9W!$aONaZ8PR=e5Tzww-`uPVu4t(<T zS!7i7^A|Bm$tkI6=^2?>1#b(B-W8XWmethO)i*RYHMewjb@%l4^?x21pO~DQ{xUN= zH@~*NvAMOqgWBCY>=zCM`mI|(d-kV(odEs9#lwT*5gzsn2iF-~&=Yw0r!NqYOKT9` zu%lq+dw7KMQbgjL_eWXyHCL%_+IJA0WEB`cvv%0EuRZ(MI_CYq)w7=+`=eh25E3X3 z_;}D05IAIKk3GqY=%4F<#u%JS%lH_hvXD%5`(e|mF`vRd+9VepxsrB)&tD47qLg)G z``gYco;wP6jnRQtC6$t)WD0qA*Wf!CHO#p%kbwP2#Ixr)ZtAdLAxE5iun<W$3>MOi zh16^OhZ`-_qVt?ju#iV$(pX451r~ys!a^o8{=<!F;#g~{W<(8r0v6Kt7z;tJBi6K# ztA4ZajS0jGIv#zEN4>OH!!RCwx{M5sir>dV*su^PWl*8b!(UqfDlFrC2FmA``cs8p zZ$N*v;Pt1xz-h!dNjrR|8VecSg`=|IzoobcugThj7MQ~}#=f<H7kxU05RHO;uUpn@ z-aO9$bG#LbaVI;#LY`tFfyqCTn8Q?3wWELzFKD8fKNj*!HN?ME%0;Ll>i}EzMIjDL z`T80t1W5*l!5<^{t(5zlIu}4GCWoceVj(Pw--r6=jjv;WUDTEH1?V_0$g(kxg+%-q z>7O@J4u}3Vqaf8sETo1SWZ7NCLYg|ij<l}}XaIa&0F3lWXlhbvKI&2h918)1hz>g( zX?gT%V;B~afcV*{LLDK{C>_wKS@7UzZJf2Eo1pbyi`6~$Bye(RGl-kIQQy$jT?JR| zhSO~g&ht0(ZHrGm?Xp8JyiUQ9rBwgt`ezLOopS(R!T=-HH@daLhViz7)gsrq=HOd1 zWEd|_Q*A6HTyW>W4J@IAn8wu=bdadp!2_^_5{NP$$7mI5_CTH$YPREQb|_07RW>v( zUNfkXg!S?W<jSi@@+>uxpBpTPC=h1Q%*v|6=qm^m2(_NOy;OvwfCz1$vl6<zMi4Qf z40~t3vpOPOeU`uF3BTXfmiU`ExuOsyef9+0Kz(*dQdA&>Jt-<2pHh=Q$<*Q8Oqwb? zj)nPxEQGR9Lkgd&-d$rYchn2bc{2UB6@F`7pYq)#d#5~&K|3hk!KW9DmT+HVp{lh} zKOR9wxq%Vl0G=3J?j5}ARJsfoSUnaUCD@^5NrC#HLJkYi9StcOq4;&UdHgn6B^J`Y zl%164x`B~jqQJc0LGCdY-52nq)Btt=bNw?0|He6RwFfyx>VbtAuOnv97Kn>sA<PY6 z!!y1Ib`;#AE!$nF38Jqee(z{b{4ubhyaC%+-z)eYBrD)Wsw_8^6y>*dDSJv%74;a; z*@T{V>5EZ^vKy}OCqAMC!6mRgLES0rOa-)i`Sn#>oK&OvF39wcKgRQ<nt)T>jw1_p zO?lT`H6d0K!%Ae}fOm<2(AX-qPuy+Ia!0Y`T}k`O-O~|7%>tr^Z(bW?A^c_x&J5kb z?@=6?!~N(hT}w;D6)$_9&~}OQJ-P#nP)CUFRfH!zk%B%^v)oM|vw1Ua#9zlOaY<yN zci92Is4j;D%Icmae6F>NP2&8KPh<)1Zfjh7LXWHq%k{3<&lm71NQs=!pl@)yRX~;~ z&|4$mm>)7i+_6lDS60$}OM77SMzCn8=<>}h`SzIp)%-dnF{<W<b=pXQG1c(4!K3vl zwAcm4Rh0+MH6HZiL&lUUGIh>n3}vw&s%9ODpT8v{I7iSRZbsWoJEg<8#?y6abtZ&c z5QcB5eTPt5_@ofC3G?+v;rFMY>*10WH-m!r{0(~-#YK`0EeBE>=*2v$OdoN{eIXKN z*kXReg<(Z$?$k!pty=~$#oBWCPDNdmK|+>@<aEbEz4|29cs1$Ts>O2EIW!(vnMrmH z-had3Su|-v<c?P*(UTUqw=~&VxTq|^-stdl6?fZkacZj?Iz)Y9aT~!{LE)T1uN}8O zEQD|HIHAru4oxn#b4n*wZjQ@})g~_#%E{4mYV%ZIYdozdo%sk^SB{|3ab-Nd)@_UH z4~Rnsl?m|HCFk%wM4dOWkcY)99;-F2tS?)w^iqAIn$_v=U7ho)g?3Tm^q`*B?@>R> z)t=PvW_d@3$&=Jqyb!#k(cB=XcDL_@_1gaXt0MyBq)H>_Re8?5!>5mXuUjnfK!2^& zQJFUYLH)$TO+A#9*~(9YtKf(Rcb5b6@?GmDn!PtG#@Q3CgyX7-<H{dAF7DS}EbfqM zv*MzD!@2uVwY~15F2#F7cpQfznNC6Xq9db-ATeh~`di15w{o8~Ij6&d<9NEnZ%ky1 zRWi*hE{+%IhHl=%RasVrx>3yx4wSWh9yE+BVl=3IS}u|E4hyjiAsg1D;WV9RK#U4D zp-orQBF3-~>H&*A0W#9UsH0+>3ZIl;uxi??B?S_=k=3pQGErEQ)y6Sm+8w*ATJh5w zd~0?SFD(rRJC5n3TI$D!hTS-`o$O4Sn`7ds_v&2ms>s&aioWrkn$e>n#I<qE`_NeB z#df3J5V6P&C%@rh;f2-*qf5{Ui<Jrkn1AxKgQsdCObV-VckIg9`i^`E%S@0@Hbf&< zwWx#eOf^e_BVGpNddbd|+#zi=#&?#aU$gO_7(83nVcR)PIo^kFM7FQ=fU4TUm<c6q zIzC%C_!0{tHBz`aDEP6sgVrcuH^AewvFr6<oo6mW>S6DZbQ49LD^F&w#9$$d(qrKY zPi0uFFDZ;oo>OFepFno?APEbZiq}Q-Yr_wyxaIdn5KSSOh<-)nrj{ey5;YdWx>t*- zc>^R)rbYbQXmmhX^uZ%grL4RZQ>`pFB}7B{a3fTfqM=6qx??8hx$gY4WB#Kd{JmPz z?>lCN$nQI*<1agA{xQV24fENz4Kp3g<!biSLo6mWf$W+411#jszyhY`Bo@*ly7%UV zhB80CI-jC2ZUuj1JifT}ge~nn-KTg&8h2$ECtk?|s%~E*`6KeS`qe($j%zYkk|wWp zOa`H1M9w(Dq}0teGHL5k0|pZE6E-Ory3-ReYn~r_XK+%4@e+63!{x_~)A!~2RR^5? z9icu9Y69f2?dP0i2RPXot8DK**lMWP=A)xkGA%D`PzboO1ngx^Z7i!eGo4wT_7B`7 zj)iGzU)*@Oak`cT8s6d|4Yu`qTyc|e=UO!aRPFnVJ3E=;G2V)-&dg%o<qD?7p`#r7 zi}7P74_Pj);16WX>o0n7K6*N48zR7cNl{#Ig67HDF{Nm70|oi(@1<e6YGm)#=ogAl zqz8&$t!g!}BX#8dFw=h#BHSi|W~UuS>%A`S#2mHM_egr+)cZ!imi*SMbFIgrY)`B6 zVB1z$NLUy-qTCuim9Mup<CiCXZOlmi(%Tqzvl3l&@k=pjd7T+ZoYSQ6ieYgLuRmR} zS7^>&ZtJUDSLP${KD8F#K~EKgmS>!Z-IoPAPDmOS(yxfv)Oxn^d0Yl9-mSH1tqD3D zo|G3hQS9wV#^`cqP_4`Cou3O&6k^lwdJb;E<S8akTcxMtI^HW4#N&#Et#T71R*&;W zre4}BWt<BnP{2F*xVa()6F{lSbfuuetP)V+i$&CY`a{-F?=TQt+bwq=x0>ZesgDo< z#KfQtO=Ow4Mn9G!$<_U(x6rNbZFd@^m9qMI>h<&VERhoYUecSN9GdG_^Cv#q1>IWH z2*s(^$W}d0mH_K~7?(c|_ruVvdS**3hmmAEweRxWdR5iU$`o6m<*;NdxGy)T5O=YQ zM^(I3V4QB_leRp-7G$XAk;E8=Arv{I+@yMU{T3$4)FKdCq_hloS+9!{50`xAeidcu zjz}M<Ozn0Wh<stok&2fRSQ{xk*F-2RJQHeuqI7lp^3(A)e_95<5K;Uli5iIfmm~SF zB!&Bx&DO4JL`hvVswY{)LdvHf!BOjiP8bpt|0F3(UCixI$=UBuzBILuCZKnVww^W+ zCN3ml!qoMpxL-zDr=z9bJW>`Lusm5_)n=bv0&&gewX5D?EceD~o5MozC1IAXj+F-~ zI+}w+as_e=PIbrStdvzz7sg^)wBJ^F4@@py+~8_|%=6rP-ual=Snx!}z~I<Q-7t;d zyQdQhV@1sa+(opBS62#ge2h%IFeeuF)Pk1WRVF+<Y<ZSs0+JP(ZdPZSycos9DJ_8< znB$rZ@M9F0{11Fhv5*eUZp3d}mXTV$ExrkArRLsTjAMO;(DC8aCLw(9*F^JjQmn9e z39+l56et$;RW?7K`v<CS7I|#t7ND5Vff?-C!Qmpi9_-Na)Ffbv9?A(0^Mqrb`@imS zf^DOSrh_CzzvK@1Xz%j8!)pQ$4cLFKf5zb7HwTDZi_s7BkqaYg2Y9_E{_rW?PQ*eB z>;R&jmWzd)vRc{O0Y;;=;EVCL-ID_Gd+Pv@l%i~>yRRXu?)?*7NliKgSK0x{RQMGD z!KW+)sN<o2C(C_`JnAbpa@dDoz?izjr7*LCobqf3x+M%4s)>U-(uM~+=&%9UfzJwZ zQ_OM}U^jvPT>p&0zjY4a#{K6rohm&W(L}e8sRU?$yUHDu14cH44O5W_QuqP{v6PxU zN4_JAhZyD$K(QKaR$1PKp|zwwsl#t@h4s<V)AqqQ5e`jXD&X%u8P|3~7xQci^U2#7 zoH~yT8O~F1um-PrS>SAWP_0LmU?Jof>Ur%h;{_q#JI$eLMFOh|a(pR5v~%5NomJi_ z$4Q(?#1Vt}yvK~4Z~W#3_OqEMg||<6OBUkvboR9%$+vPns<`K4tfPt$xRoE(>*<U{ znU^m^y<BJ|Ba0pY&7v~)Z5u4Wcsg0LhFwsx_??6hgdf#T*hyKm;a?LUB)VwKR=Bzn zkT+FcREBulc&7Sedy9*@?z*%%!_-vZ=1PdO&PfFE*3n$EsH2x(d##CRLz-}=)Cm(h zjD_~aO-4*m&bn3~N|$MQx;bJl?aO`ooPQgv{$1XEH(fYAI)2Gug%d;0%V{<MvuP_d zwc+n#Fzu`=O2A7^it+;Df`f$pt1kV`w<)r}vI{GO?-Pz9W}SN4b>Ki&uxtZ4bbWv2 z;MhPJ5de1&0p5SEf5zb7HwS(b1ZFNk5P19$1m^Rj>jYI;Nd5!(CWYPz18~=wD1szA zViQLNCtX>VvW`--L+ab6_<e_Da#(A_C~7BTAx77Mk{D!2SRH>7g{Un%nSJa{)}Wpu zcS{*pu6L~szY!MF2;V)UA9mpAgN4X(KVYk|_1zN+yYC^lpjnReHn6DEIC#;{f$z|C z8~#y~)_Kyo&WNI3yH`~5F{hEd^@SLNgw(4}M81Z>aVbx`()i;f;A8QA`Qjq02l!}B z83zwBBLO}VJ`SR+BTL~4V;ik5+POCntIiWzp8A6$0a7tgajC~QZpz<tD#p8Ie__r< zd$z3TU3rq8<vZ)Lk!7k#2|0P0Wl>lv#Qn`0x$Y81WK@OoQK%S-v40bCj@)Wg5FX4# z*u{0Llx|4pO2VRdk8=5|`wZ7T6rm#((1~kV#^}4<xo5ao;<jn}^VMn98QeCE;=`(- z{pOO?<vpA9`=4*Ul@VwkF1R>b{o(jE9lT=*A}PCgGJ&8`dUqXv4ZqKwBLLoBqK`J# zKF(00>Cr?a7N=%vJhRq?QB?h7h@-2?7>F}&twwgM%d?(%k$Wrjyq_%L7wzh4KZm#! zGYQT-)GQhLT!?b$llSras6w2Nm{#OE_kzh5Dt-^&&Duq0vCo;_LjNFq_)DX>=Bv$f zE!C!&UHJ2S$26A7{M|g{4j*Vnt4D|l<E6C8$$|iBj}g|U!B6r74)HBj^(p7Sd7^%w zr2ptZ|L8aWR{iE*(V_pO1H}VvpK9~FwojG#s}7{TI*Jb5lRtPMbLhl1ClzH+O*?h? z1rPQ4Z`*ci3gIhv2SN;$YHFk6^|k}F{ukt(F~m4sZ>aG8O#lW{Ej`00IuC(3QQ}O& z3aR}Jv{pl^it*giJEso5@W-E7B~z0l^6;~aUYwiY;MwGsuiZFl`?`tEYtk$1RsL9Y zJc`QAnmI$m7eaPJ3U(HShM`QNWeC|c-c_Sn@^j(@pIi*-<~x7-;W8-?fpm4#tc5vr zGDL|O>5GM&q^Zdvh;=#RkBN~QdiZqS-(sgN)x#*?eB1N<YGm(A5#|BR=(K%BqVVmz zOk-mhs)B2ZcwP##3UkT|W{u6T5KmH<7kQqaZrl`4W;yL<6)8R`ZkFbDB5-!gWPrF{ zv?#j&{*vUU7K>*Mopp4IN5x6KUP1fbESablaAxYLx43%qk;*fs7V=hcx<pi7g9zY^ z!SN+eS~`_=8?*Q2GIfeM!cB{xQAG>|+p@fdyn;5fNtEu9|FszejR)IK#6I{GuRV4! z{?<nL4m+a&NJngwfd|0#oB-6Wf1mOAPuc(fj4cWGC965Xw-&ap+Z|^Lnw;c<b)#;e z0XgXYRre4zjL%g-p$b5vV(w!h>jEEu4;L`OW^J_>tUfby+eb%af=_LO*k1$w77FEU zk6&IWmt`333D-^ideh;1DUxl!zMzwl+IpaeA82CM4GI;q!$Lfn0g=gk|6)3@`^&?= z6|0kJ{soicf7AbS5qyty2=TQ!CI$0|O?qIjAWtCH1YM&-ZReY~)c1LQeNq0i;~y^| zmF4*{Plzccn==vZHj@}M0A=eswpEldKF+Y630}<E{LT)*o=Wj<KztVb<GtVV_xf@( zwCyQynH_{_0ueOacz_DRLLMhCx<(%mEW=moOwcOknw?(|ozkZ8UvI)pyODo%(CSiD zsM!JQN&c$(UmDY`>PXBvNV@l`_(ZGSw5Yho!;oNCU&0KkT)lyKv<Kj|?7=q;x`N8z zq965y#IPq7aQ#nHx_?ttf0x$CUj@0wp9MLG`Jo`!|4NlP3Y1pJSA+Je;`$BR@jJu) zUlXYa|AT4vACw!Q1p~^>KiAhWAazzqwqU(|StII>FvK+`^`I1xFxoZ23df~DTk?`4 znu-9IvyT9y)%La)3lTTPLaJmfXtIr-3|2;%?mGY@BOx^!gU5#I`2AJnXW*rdy8sqE zbMzu$A-2(AAuADTQKy~Me#>Z%8R|sLa@+>4{G%8_vOnGmdkfqm-|FMMEO_?UYyt=y z3-~5w0TxpI2n(SLT3khZD_;I{!jDRWF7q@aiUC|mq=y*0gb0BR#;6_Ob0Jqx!yA(K z1z;Nu@ck)`ZFBfcFk+`Ese@Dz{-5N2@gq~}&)3ZTl9B&O?w3DuC;x1fY!Y4Qf6;uk zKROD#<AZTsKyxsP|7EVTkQTa*dvc>JXN_Q)Xys?3W%qPCX2*#1}j6(n1#{OcF~ zX!!TWRi~Q!B_XWmei=mgJD_ZRA1krHr~o(UvLLrCmqT4aJ##ZXNp@lrTt+P?{}@C- z3v&G^@M?AB>lg89Ta$`q`%-Es-1r+vp9H|nT^DHmxf#u;jQ*0;;nZn=28>>X8_KfW zkTcxZD!X$Er?e}|0wKfV4N$mJGId}ft&aVC)R-Ae%o?7n`Dmc*a;dD?#k<#tV;z*< z#wL_>b0<Z5t_ygb*vh=SrA&Ic<ZZd1{c|psdv-DFwp3C(k{8R1gYPKbxvcJ?pw4+$ z0$<aHue0e>uCYQoqngRPQtx&AxPe<SXJ=<W69m1?;L07Cn7<WBx&LVfqVv*SthY5U zVZg9$|7BPV7ZySsIvRkH=`Cwx1b)K!2U}sl2cysCKb4bN`CKkvQ1ZUDp5;l`XJ-vK z17>8!6lGq~g|6s!-93B4XjB^Skqt46m)(M4aV_sI?g*l<5!1pMivmTkh=S!?hPasR zN5_{pXL6ZC+cM_GZ2am|bHpZ9A=o&R3c2%gS5A`;s!?{th0*)Lp68u|`3>CK)@b78 z>6H%_I-`IWb_Jn7Ex?(bPll?rP7V*}scPl(sSO!)^-PMXy_ymKHY!6kXQEHEBd%3h zma67H{-KoC8%RfcSbW>AdL!@5$FFT261--?RI$BATDN@>Y+D}_{)bs!f3iZ9YZ2?5 z7O<^pKqWo5{2NI7>m!Z?fjRS}hhMw>-RA&i+&7#BEQPOLh(k}re|h12^}YdIw_kGq zoBOTwci8bC7WFSeg}~%7e9E93zTks6=O|Pczs@}m+j@_Tlq@nK+nQ2S2RMfekv@kx z4u^Sa3a)04it^RMPOgFZZ4Cy~hx3i?$G((sjy{e))Aaha?{OxQsW&XMM;gCax$3$` zdQzH+zV=((jNxn(7=3&@^>X)Ohx#kp>ul3lh}SDDM05_VHUS-9IAWtYq<Z`5b^Psz z??vX8F2C+EJws4*JzKi*g+xe;{zM^fz|kzrh|fm)+^?gj74crsmqQy}m$J@j#tK;^ zB?`A1Gi&xS-k#LUtI)pha4QJ*YV9bVKb+^m+>%k`xo6WVsXU3anRmfNDtdA08$DT; z5=S1en+Z(zmV_`Nu01(OGDH(2Vxe$!PjEr=G5QKi0f@y(`CFtfEAm%qd+yb5Nvm(d zSMxmZ%Z1~xB`ioWsiY6WPNI5mAh_a;jauT4)r+6nTtM&lw9%tXR6BBVmlv;1j<Q8H z>An`Hi1Uoky`wMVnCtRxd9rrOpebjgL2s==iY;Q)S<PL$*2SRS_*5M4Qnqg>`zJ{= zO{wKe>9l)&Z#nF>g6s>FP1}@Xxb>H|E>_^A>JQElXV!E*C{`}&X{sKmW4P{|r=x>~ zJc)rXY{L$sDpea=7)2ZC6$qGpaq|%Iy%leNd0M)<F_SIwfM5U3^dp_;aRQyJ9pX~F z)&=21@K_46v3vINGi{SgMi)!7(u!7l4SK4b)_Y}PHRF9O=)GQG6BOR=-4x07VsZ^x zefqf(wTZTBvfdK076_47iZHnSUZ!yEP0vG&R9Ln4Gn3*+CIdkxc7kxnvt|596i|sy z8MN)8u#nHP4#*RL=4NKHx1;u@r^6knRpHz-2kwZ)q|(vHuyq061Gn@IOAbVp0vj4n zA4a~M{8slySE9~kqP$LWVVY0pIpH;gs^x3U!}EQ<Hdm@{SvIdXpB8Dh8QQL%Vc5>s zEl?kDe0}}MdbGEM?*mxq(%mI-wR3t|r_6g&F3;vU#EIGYpgL<m#mb+%7skD}Ol8WR zDk2v5K~|&VR*W@Kjk5QZHd}g;8{VoNuX^^@2j0HvkL>~e)u`~goTaN6$-?-(1K1w- zg3?<@6Vx8??`|Syi?jSD+~_tnWbdf|FC^ptN^<^7&vlr~iUU@*7!|o#I}_g(mR+1> zD~=c%*P03+Lr|wW_B7AJ*LL%P^wm^5z~M-NqDO%-+cpB6JYM!#$l8F3P(28{*#+`> zi~)&uD$2CXd35VR950~Mw31;V5Fi{T3;&cZ%2$>RH*DGvH^D;SF)$1c(5oBGM<+mF z4jTBJSC5%s#0)4kZV^ZVMklE4%g@?`T#y)q02~dC#zI1STe(k4-CSNnpfTnM6d|aR zF?IO&LIetPyz1M46*{v4pqOeA1Zs))F#qiL{JB}|1yE|q!`2S}Y;EbEa=fNNu7SDV zw*0dh@QM6i-zX{u{h>kpDU%5*8`Qh=qh9L{S+AP6-9>{4a=p2M<hd>xN4!o>{hGCc z=PiyyOX1F#$Sxfrz)xfO<O_7S==e``bLVtheqjOhz)67$l$(O+J0!Pd$Na$$=u!Li zNy6{YABXu@_8Y*s{~D_LD-`k{`0Bp}&ygU3MOd7H=p)EH2mkr2l`Jsuj4y8yaafqs zfMA+Vu<0gwiAOi?r9{V_c2j9=D#W33cz+XzZO@Zx7-d%L6m#+AQF9inMybvgIaRgm zZa4>=ABu+90*j#cg0+lAZi|zbhi&HDF$8bt%by(LxOAd_Dxox;gP&Jxb^Aq*Y{Bwp zWv2*&K3IrDJOzP(@_8{s#9~@`;DqE^FmX<{VXENUR}E2mLfRZ}^_$r*-V@Syk18{M znJHg#ruv>CMP1;OCxa<W#<+4k_O@dyIen7+D<o@+nDD~x7TPMlebZ$N>DT`GHPej^ zy0h?_@j=2p4^oFJ!X6X3HDX=EX_gY(Gd)N@DVGC#INf6IK1$Ieqj-nr>cP;{*}6{n zR61<$0C0@&<QwF({+cw*b9b(X$rxU2>jpS=iK^FEZwzoWv%9!qq!xfD?wcVM89lzT z3(Y@piU;ntN=ps+<3~=?vXolEe+SZ2{}dzl0=duvKOmi7(nRdi-8pn5Vj-JC**!UB z<lccCmU3tK9+-NMDBijLhB?Yf0s@VBl2BD>up~Lr(Vx{uFQ@BBOVcW7HBV;RxY>Gk zQm@ZOr*?6>Jx$M8kLa1nC3(U8j9Fvuj-0sNE$1h~Qg==mDJZ}$5mH9QPzR#9GZfFp z+px*eoH_sD)KWzEwV==9Ruf|I0>yNXxRFajA#vLG+?GY^-N;|st0;+AnZ+eNb5#AZ z^3Yw@F?V1{##N@xMu!|Hq{X3cG_bi_oHu*OW!3V;fRDxY^XZK%K_S`2;${++oGGjE ze*XS<8E-j0nZHS=ZS2EH=|&R&sf=zc(or=hmOIX0DQy}ry(Dr*l6zHR>r>9oz!lDO zs?LhX9W`@@g2%3J?L9RPQ`YUsJ*WBQajKG~<;Q6>Y0}7S+2szChBqI$>T3u{q^cPr z8ZGPAkiJ_U28PPn#2Ny|N{Ny;Gw~=6CM2xd=PV~5zp^Z=)Z=+(C_=^_CcQS(;%(Kf zN{B`Tv!h|D7Uo#UF*70W1^p6v`r<-``k*)@Ki#IjeyORY;O*P9O11AL9O*#J{CPqt zj&2RZJL8A2nYIm($S@G+<{5Tyaw}aANKp6hz+sP!okWNwds4#RVtM6V1rTyrD*{vV z1TlNm$jBbV*LqrEA={Jy&X7{F8=@@&*12u~4==a%#e=jjG|u-o7<dq(Q9_Ex#qZ_? z^U<nG=i?kCBd1P}V<CIf@C~Ic6F-x66>&I_I6(&%ChDREmoo31g77IWsSl0}7`^4L z?55ybuMvTs*wy9@Lrle?!Z7cPVS8MCKAvreb@gTBB0U=>I5g<t=I||JRCaBdb>rui zttGx*+ua$#A@kZ*Ho-42CU*-&(xC3F{_QS<4^AP19~w{y-eun{NbJzs4zRQHeX8)` z0cb(%9ODJKt|hw%;kAra2MO_!&!cE3UpE>T<`H&;8%jGKj~X%m61?fse;yu?t|+eV zbvu%!O=Xe5szs6>EzswVKPl$_<bY@M!Qzl@NFbSztMxFggk3qF8InbO16Jsdek3jq zpL>Rdw6d2lZEY{WclUiT7@`-9tm;iIEv{4|R2#N_7-;JRFNv-d#{|vTz9F*)vHr=y zxWQs9L}~g<bUo~d`>kHPkpl561(YGpeqZ?K)4NITH#IWy%U17gC+s^W2n(s>!simQ zoCcn`B7Kv3xYt?A3n<cDy_!o9qPt|(p2uzJQIYp=SDw6`_`to3`o)f21D}M4c?s-x zqXS;!2{rn7*?X4yyS5E*LO~?d0x{UDpEV+Lx4LOHS(Z!h6aj>yQT)}KanP#R1U^uT zt!)Y=ZXybebsGv~#NOSC;u>4tI_HEQ-XYm&<{^B27?E+q7zpx>L_}Ze%!Xf?(hM(R z>Onhlp>t!m)`(G=R_(W_&dhP-E>&UJH)bG}?QhSre|<)Yb4Zi_Mujj%y{vQcr0QVp zUNMc+($?){r*LapyqA^S9mjdoJF9;vVQlIa2$Xyv@8!w1P{oPzM<mSaU#7DzJeezc zscB;T$SsHn8zaq>HP!qs<YC0qcGo_C7ha62X+2_Vi5KHbYKgXMXAM#-SgU%;H#i@| z^*FkTev;>6m_5y^nBNU4rV<4_TsbxA1!d#YV`8O}=g^8T>v!Jlx_SnY*y-u>o8A4$ zXF$8?%rF@ry<fESu_fSB9lpjBwHs0lCUs#9Dr3Vuy%HCDcpbBM-Lu8C@q9w{0`SNQ z8O0*5VJJ|O8i1^BQ^cq`(tC8Q+#K>wn@H-~-SNjFyOnM_C&pJ!%u2Gafsic~TZ1lc z?GX;H`&MEvOFDYR89o#RoO-7!j5*6NcFoqCF2`w<#9i6S!VWq=ze9aoZ?~nO>eQ9v z{I6^#os}T7Tk%134e1k{NHTYLyIk%A^Ln$gR})mH#wH^tMQFMB<Y}pRA|_S>PwMBs zl4M`KMbPkNLioz|G1|nTLFe;2o&?fMqcJT9u^pzX1aIxE$tBjR?%@az;VGz7%sm;+ z)qOdU9(+HHd^Sccz@5eVx}fqiUm7ESG3Bf$7oT?B17>Bt)|RyrDNLcFd-?In?eL1u z6MdH6YU|mN({Lui$BC=4>Hawn-Ii?Tt}FDs{+Qs6xX2EtgP1(*nAi97&2ovqRvM*O zWYqu+ojY2xY+}-I_90ylN*%WepuVDXE<e3m8Tvp&&r~5nWrgKUO;(tuOJ;>caxD-? z$L97f6JGc{m~#5fP5?u3_pA7ZLZxg|dmo>Oi1v2EXDGr6zw!xWfb-t5)D-EoL21jb z6s}O7<9;B5(5@p?uERJ-fu<SC1{EA1AqK|_JYO?8a8m{>R2d`N29u-m6L5TG4~hUs z(o=#%6gI@`52KBSA3|VRfsoBhQVj~U!nCRRapL?rM(8_heh;lPNy|Ka&3SB@*@9lY zhdS{$vDw;4-aud5lz_N=NnazJ;O+}?9Hy=*BZx%UrnY3XvY)QL(V!S9{fSI^pgbOG zDaqS?e<6L%@2OR~5m$*X_si2=(5D+nkv2q4$%ptO?w32z78BeKwbXQ{e6B?@q;_4f zKh8j6T`eBB#p@$^#)^r(U0mZvhDAs11UK`@)dFY{>vbBOW-(p9v5im%Dbij~E-SkD zfIPGWP#2}?il&pP;^rL!w0wL*b%LjEy>4c>rBx;$RK*TxJ@-(_@5AZoUj~fx_Y2?g zcd#CMZ-k;HEcUeG+;)}?tEOwMFI3oR*saE!ym#WXlv<jyXVFdDz_<&Y;>t-DlBZWg zioAMwG%0U5F)Z<9DGaEo)aF9msD65Vw4L7M%?(hMeL&nhURtNY&dr+Mp=FOqcPD}* z{+Zl2E-sigihA2{bw2-2RE$lu?U@uMgZp7zX+qX@?#OcuFQCG_-5a6HemQ`B{0~U? zeGL8p=(KvseqeQ4TS+LLt^T+~Acp;ZFwzL0p)Ykz74{+uwJ2;IgX5P=Xjs;u@K_s^ zTjKy?`~E%40&)JjME6$TC@C>?LO6nG$%Z?jyx4_@S@EWwpFAx=saU+<fOu!LpFsvC z@LZK#ho4tlFzU!xN);p;7Jc>U)ua%+Bee$Vaq^&)N`zZ;nCuY^`R>=4OWEivVuhS6 z3wH77`@Nwr#~7*AUfj7KH7_e-BJmKq3W1`&6mBiy_SIdC7#vpQ<Fc*1avA#S#1KqB zpgU1D#gO-QIY&cELU$k&E?_~3epq0``1LfQFL$U!r7~qhI2oJk9wA74kQ0QnRvm@8 zJftv{z=r<PK(4XUW)Tq)v<h6kYpF<?mTP%(lq6Q}o_r!<ZyHUg(sI&gWVL;2tBUOM z1HwnQAE2#n3*_i4o^iS((X7qdSJ=m&f}&RH*rHiUd@`?S`sqDqCL|(w761O`&4o)j zU4Fep$DgrS02eB^{ma9j-x%<pR(H@3`!MBdSV*#Q5hri$=sF=l65#+z>`wn%ZH$KB z%?eonZdts<R3ro6<4At*lUb!h#=gwq4=DhD{+ZFQEPLuOdIdL-!yJ;+YJicv{~cb^ zEZ9PzcK?8vq8f53HPrtec!?A22&nx&5J|wnhVhE*(c%7igA?3%);rdkrO#pc$o*hn z9_ThQwOGhj3*t-UJdy-46$1`usifZPi^Oyi$?o{SgmDDkBWq7b^`)RsBg52DCdqsd zI!bd!88du_P|svSrp>a4xsxlqY;i1rcw^m&2@)I|eLISNCYHZX&<s8=Oa6USkR54p zZT#_ybuP<Z@&;mt+b@(d_MS+gt?J-rK@UtCb^3_>TY^*_?<^84JcosnP0I`&`!HGj zaAj*yS;9^Eoe+f{i>w``#S1#|sS}|JSIfh;-!2$CkMRb_<ohf!cP=mWsdt8>0}SrI z!F@n9d}RKfyk}BXW*%Duj0i0_F*_Y)Ap5pk_qHv!U+-`umndAi@6~<gAe_{37^Atd zV4+3f%O|&kp@N0Uci+r(J2OqPj8yn<M*wUy%pbXMsPl4qtxD9d_(^ikz1v>@a=AOI z!6;=Zf=-RwA88nNkIZtDY(O4!Ns<W*$pZuxfm9CyD;J?jwnr84F>7AciYIG%OWfY# zb_O$C{MD=v_xfI1?dT&LcmudEhNYHe<9VOAzpN2FK7FGG3psH>pk|`F8eaoDf(jdN zc=13mIDB5m>1E8a*keA1nJ)tdw&Q^t@pvxrS5Y_CaE+Mv%#6g1URuq@pS}>Aq)v9_ zp2IML2(o86s1hW<n&Ntk^?5GWqa$jXR2L37zwmmyM*2mr9TSU{+aCBdq~B6yU6)OF zYZA&O)#`E0!zXPh+@6Hn2StaPtd<1$+@s0556K?oiv~d7USa#VUouJWpPx%2U*WEc z@*jUc#x0}TwdKZmX?+*(LZg-FheC28ekxWHlC60=L;uCeq>lqt`FRDey@l~(gzntA z?F3V&LabyBbt26enMba9Ts17OxaPj-N9A>XQ-lk_%-L5M0#j?hUm`Hf)5D#6$|#c# z!RPwK?P+rYabclm7nA_RiNz9QDtY0r1Uvdf4tL0(;N9%}@8F%uuMl0f{x9I2Eh*wB zs+T~jba-gk;Q=YHD~uc`#3XPPD>!dhdt?!+hYy`Uq65D$9bH^$(;)>Dor@u>Ut((% z^$)tfnie<UyDnhgc;=(rsiT@s56{D^MW2q8=LbkKtjULL!N_L)J~XvM&opG)zfHhz z)FLjogTA^ar_0ncPpM8A@fk&LuxeJ{(^GLFohyzG&~V-GG?R$kw@&N%-IKcE<-$dX z%oXK|C=hOWeJV^t6~I`_2ybJ^zIdFP{~Ay2+k=aqC6gF^ZTNeHUl&ThWf|~?=oH@d z#^?kJ3E^HDj8r`ztg`~`He1a%1TV{0;7^A68=pdUi{or7AMmXCT#U7^rW6sTIU@}f zKVCgH7RqO(JRbizPIxWqVHPS(zUzLIKv2dsfr!*lV$Vy6*b`4<QKB7Jc1S+8kEGB+ zQtET^JzKw1{V5lx`0YiV#6BZe+VjnG;AAc`va1!v>vP&^9JbRNHn$$oeja?<^LX-$ zxLXWlD2JEY$R)H*>WM8;zk!M6!){g~5?rdbj}LAytr!%l6MibY<Fn?bxb`V=qF<aN z{avDa2*aCZhZ6y~TCoXN$X1V~?BvU$V$)p8>*8o%w-;KSLfYP^i>-b^bzM3*j~KUB z{FRw+qwA(VJG4R2)~_u8k-HfXfX7`Z)F^6g$p=RVa++x)Ahj2UT4)Mp#1F<u-Of*$ z(QE_oOS}x&@~C1{XAdjuaS2h(Y0iTuYc^EUmpqMH3~z;EA<lc<z&$R>G%rbo0bfqq zfwAFDw&Yx=IF<C1Mm8GODAvh`1C{3jA!{dBsY4|hUA(an^;N>pyqo0>Bm<5gAnH?N z*CX*rR%M_*-onkfyndc%T_zj!39=_7U@BdwI(d?x(M&__{k88xmKAqhW;usvzrms} zxH=4KHdL79$vMoNuTx3QD@x!y?5zaf6?kCWi7zw|z%Y2J_QW17EQu_i?X}>{URv^l zoR%}aJST5oEfZ5{=x31#9i6;!@TKjwab&KjW?Ws1C7W8d%er!SyNd_)hgrv?eITyq zokb58G9qmJ$Y##a=;Pai1dr#H%WvH$j-<vGi-)@2+LoOT0EZr)(sHIAevlVE9vA9J z{JBEKzSK{mcff@uU-*f}7Rz<XhvkBfO0Uc>9bD0RHEmkiE?_PWPcpCwzhFm%UN0Vr zZ2nNXbB7fpm?}$Eeg7W@)E_J`T2EG>zS*jSeS}o|95Mi?BVS$1*J3){IrkRTG!C7} z7r>80o#XI;rJv_TeWjLAYJR02fAv2Ay@X`+n^U#|AXdODTY#1To;*iT_6DFg_T?%$ zpq|U$0w*gd)cg&^SQ3EVMx@#9t%m_lfoppf5Y8-Dfa);~!}x7^7DiuE2XG5$$&a|m zuTf8_hljQm9)?c-pfPB6(nP)hpkm`E0Nj}XJx#XKQrj3fhrXkX)MpHZ&Kl4?(~y-0 zK=r@h2r?}8M^3H)x7zER_&r>mtA<FBUigu|DrMc-p{&Ich6))AKs$~nUq7SEdpca% znxDki<`L{BADm^Nf=s0d6}#GrG3OFEkY<S}7Hzb#ITcL{nZo7YeBZ!tqOIBa8pdU5 zyLNR#Jo|=o`aHqlJzLg+gE)Ma;HXp3g=Wc~rBM<|Si09HElbShmsiVAFQ-bc2Om43 zrb(bC(JVOB*-jYjezo1*(R!jEeRZ6z)V#OjMkKch4^gyugC}aYWNc%gWFaiTgxZ$N zvs&Q8W~5(33?s**+y%5S;Vhy4-pwd4ao9MlhFeXkcYF;NkZ9n5`_#(ZfVX0;@=bO1 ztmxEsBOj(+^w^v1ky%ZPm}^_}@(eXH);8;pSkw3m8O%m1KShNzAZyE&U&8!j7;}fn z2Z!V>vspD0wPj|dr|8z<p;gfCyb5LOyxD=<Jrl$A)5F|3q^I>LyjqLdB2V4Nz+3_I z8!{=5W0!5>&i_`$xMhA&BXBtP1&>CQ`~Xq*@uBq#eN|SCRYy>!CY=~&?oY{y^V;{g zbFyxi6uER$1e3gm3U20prE;DJT6+osn1SdpQR)L%V}!6(Ql1kQ0(1+)@4AKNpP;?` z@%&$)z26UW`}*wuci4{-C-Z+}-r+Oq=yh!>s};@*agf|vlCsyA!^~$)hrPz@i??Fp z>E80{FnA$Q4sD=9cHU-M6b^Rd;KsDi>4`21(b)#tKGlp^=IMWNs`S}ZA&F{_aSQcw z_<25@##Y_FLqR=HbNkH4t@D}J(r=EwB+W6_I`Sq#q$c#Bc}sFD*3P3ZCh_pcr>OCl ztgmpoV>WN7Hgcs|e%2p$3DPg>xEuS#Ag#6~S@McZ^wU*F3Ehkp6Pf<c26OLDZeNTz zlAAlJn-qNinuZtr+?XV}i+TU-$^>!AnsX-my38@tVut+o;t|O~56+H-rn;W(r(L(4 zH2t|8hky%dM)02lTfYT%9*zSa8rWmZBZ*juAzkh@6F{{1=HbkCO#f`schmJTu%8v` zau8G|Ll&NN6%~c|o;FZeQ4!KQGLkWp-t7~cMD9`ulI@!Tv+HDG($h@J{iJhZ(uI1f zsRy4j$Fs#g6qAWR+<C3e?|-A+u3cLwfG}urWN)ue^Id4osap!$9M==v(oGr)-H(EH z+yO2>Yxt(=wKfXSkbJ<C?|X}doEw;@8c@{VMk^Ex3aqqGZ_>J(We*O_6K4&2M2vos z50RlF_34lZb5$|XUn9W?Kb7gsPbxNqJe<^o_pGo!N!i0h7LW1nQrxX7K+IYj#-)=^ zH`ZI+d|i67PbK6@BnkBnRNR9PPB-h%m8~LBsFwIFFOk|gH?;QB+cnwB4auU6fuTW~ zCauR(rwh(|jxEJ)<z@{jnkAbU$%gUKKVZEQ9PG=AIG35EXLZsKv1Fve>ukMVQ%7ND zxXFk@XW1SHMB*&amsiL=oIDXp%OKmRh6M!%;}FM5YXcR!$f`{94&2(7C_(%;n*h4u zeIzc;8&H@Y<I=+xs1o*eIgUTVFxqz$d3*$AC2I4Av8bFs!#A1H4c*_=YL4R9Qf7o* z>%!Erly&(upAO>w5)rN@fiZOT;LNLF?tZ3O<{?m=86qOkvy$0wv_N<JQ4(kQzBwz4 z80#}=n4#9fgS*@DmdXJ!Lp+o0cCT?pB`z59KHN0mwo)nU-cm@eEQ@o}>}0H$g072W zbW>ODNyX|1M*L}c??6Sf86NsUY4$E2-OgdVMErs+$64SS>*7F1Y-`bU?l5wIJMU)9 ziC4|^ej1?_fd&R2tY+O8lmpVkghwg-Xg8bknY;5+SErZXj4yEXEk^TXm%KS>7j8m_ zb{XfVShQQ{s}x1PBe6@M_g`aLLd98HscTK7dTehpiiX+@2LVl_??MLHr%%7|1XghP zA=wi!D>kiqQ*VO<XQctGY&7$gn;Ur*^*s6SBZq;Liz3nxKeY}*;8MmyzWS6GE`3!x z4%gK8SnFRgo<rj3p$8KvC8q(8SPK94JRsj}{2-3nYp4F{#x)r`WmC;S_Dq_;g+#<V zK8o5q1bGfIoycyT3%{nHwbMV-?9e)uniMGY1Kj*}2F2kSV}OeM?f3~0;82YO<1-@- z9P7$$Go<$g+bm)0;<NCrxd-U+JiqYY$S??CHD~|e!qEL<PXGGgyE%PmQvWwD5fdgC z>#YN_*0)#Yo%EsxffZ5->+nL?#Py6Vx!h6z@Cv5kW1^wshgMx}+&)_-XmG3EFJ-EP zk)>o_zN5ilp1xbhiJ+LPl<DJ4-KB*W4AQJ|R%SKE43eB{f>kl|D#500RW>8);%7Y! z(MXlXq8lHWYbg|Fh?37%Zj3kjzN|H-*Dep{Nq4`z<C$T%-iU?ZFnB04ZG8^OZ9aCb z{Cwgu3!_cZRoo2V;jV@jaZ~C9I)9xOKY{!|l=%Nw4H{ZcfC2t6Ugp#PFkV`a1<1TQ zz{)XCIiG_(F=xLZir@2yk6Dr3C}+1phF}J!)RXk;*5sKp?J8$;J`pt5dJ1&ioh&Tu zS-j~jzNA{x%(@jOp_qr%E_kWlzMK;gt|D;ud~3~AC~8S(&PuWO*;Gm=GVwxMQqC<G zQ>A#>cJ4(UW1%R%`ruoU(~p-4a~%d6A8nOZ=$$Q285yWqB&g-FPrp;!&`AdSR350$ zVr=&^X4og4nu@7WEKv`YMEu3WO0%f6=t6iVxtGkX>j&=#B^FFIi-ZP@hGSmK#Zd=b zU=-q@J+SQIzMLhZ{PIS|XWfkhp;}44&L!>6E}b`i{TEpAhvZ!2OxqTW2>r!*nI2Ph zwTYCKm5an_)8IK&!ye~(M-|2~JE&NDHa+hQR;BB!WnykWTM{H)Re160#ntFj%U4m* zK?Y1@W&+A`Ql_Y?WdE|WXwisXs(Y5rR9Gz=Ti~39c@(p~wukcuz7of*os%a4d^OZ$ zz~lo%Ovsd<c8Os)4MRRFbRj-7ca&6jp6<?L(x_xsK1IT&FbZ-aC&E+r=TJm_NokHV z0^ODJbap{y00zrZ!3EYJ$>F)+O{WnHKW#@iupI$S?uYG|iN2!o8O(Ie{|?FRuZVB| z$~`Cx=FU&CE%z4r#UlPYMqg;9c>fGOH>DQI52N?DlXZSGY=6PzOF4f<=u6KfmZZJ` zYWv^AYvO#dI)nDG0^}1aV8cp<mRWvr2ip`(9}79~y#+iEENNcDfRJ_br*GkxP_#b` z;jbq}E11DE5KS8(+UOfWfoNt6w##%MwzpY<xz{HxMJ1@N8s-jZzPNs!Y)8dG61G<S zXnb`fnzD+m!!&|xLPs7MKy{ixn!ZG^ze5Vdv7p&J!Iw|Wm%&2b2gA|VV5_kxIL5CM z+$1;;cED@x8vk!+JH0mJQ{B8~?BB;=c>;D2Q%2XacGlN+!sOVf`HrEy;|cZ2ETL;R zmT90Ub$m6HDjEjx4r6~T#D@lPc=Es4D&m0D6^0?X0YXc&$Z!^-Mf?0OyM}$pp6e`% zN{HY5EX=)m!>_IK{w7WvI6dEa44^l3n{YHu?YG1DkB<5P_{ORo&~{D1SD`Y(r~IFl zQQN6<0tR*Qzg*V2jJ}q1B>f7Z(ItlDW7qs!yN@5)(=nBWxKP(3NJ9|yxdLtYpW>61 z%M=sttr@D4E!UhEK6l}ZClT3I<9%7GRHY}GJQfr*8QG_j0y+7-{|1=qQ270yyUr1h zaPb@gp@S;ukRwND^ORNF?>`XuAn$Ru{zc*?-N8iGC8i!T%!vbP%)^r~6iNKJeu*qV z^~g}HX`h}1&cMf+IuNsD>3|!~hwz21hM6Nb3A?~dp@r8(v$|nmtCtpMXY-sfCzhx& zUV8`(lntc;{<gw)5D-KjK*ZxbMYB(bA!;#4jAE&%0O3L+2?!*Z8lZ9m$wYKmKKy6- z3~yFYi1);A6O&4T%Tc~iZ4WvJegUnLN3)c%9pG#Nc|xGJnjH1DiKm_JQ)(0b@dO_{ z!JHVT_}UQMbd<&iU^)1skCzM0=D<+$_d#(Mpg5wR#TA0$4qy6FoUMi~*zjiKHwg~A zNCmq1t+)XM=C|U^b9g~<@SnvggC2i*40>#R*yF2c4*NzVa1r3~w6<`Pfg(VR)wd!* zP<4$6u*ci!RlxvgfdLRP9R-{bZ|Xb4RG@$(hdg;HYjEJoVJRbwew=Pr{nta7AM>&v z2}n2>Dh#=wSg$|lJG^yf4TcVK^*^|0S*}$f|I^IR*VqOu1kppw{`BFGKOGPU^!LMa zBz`;n@ZY>MXZ7{1TC^WcA1!*t{OHn0#aRf|odR)bOj;ubX^JUQS8VyH@|h6LdJ(y? zkbxLuIQ%%jBs4p8%(qXbn5>2m0RDa+7&|X}gfH*!S!9#@1(|_w(Qgpr;Yfytf;snF z>YOEep&LO8d^LO!@v{urYPi84DK%xKjzzjiEM)xDI}jLP1hy;4)Yl36d-{#Ce0jeh zC!$8$8vN~+GJgzCGlueeDkkhOMRg}C%=xwDHP8ZY&>lh9VS6|b#Y-TRpbG%;)gthk zoX(ErZBixV;5LZ7n9Defya4^)K0u=PEa50ZHq^B&eTk9xnOFBcM}HK-ju{2S$9NU+ zvA?#g_-jizun^lpFfwV$-$n-ZTah{(<~wc#sf25!Ip&|X%e=FKpWK}q^SqWx`B*@a z%Zz=VRxLwN9xT{!qtOF9!~tISo-Nut2N<;8h*{=mPm0<(N9r&93alsV)&64fDm}&p zI>n)d`dy7UG}yts`;Xy(zeDPOLfEy0DBlSJ_%7mKv4CjxkpWzVdbx?E%9&?NkKGI% z82)mTnm&}00jI>%Q657f2HPXFLZCPSPyKP46=Ge~9KN*x%+Fk<lswKCqpL6a!2%RB z0Q!jGC|U)!`a%!!N7B5rqlKCuInD=SuoIlXfP0sM!y(|`(l$TR9jVFBc!2+*=Jsu{ zUWaYLd8!VGH37u$X~A?^hC~N`3<W3e9>K!*7A60l%vI7Cx%5Q`efFZsCTTB_Iyyjv zP{@Nc;(J;Mr1c96bxGn;SMGw1nm!jympog{*|0yQi!zc9WonJ7*{^Lvu0H<^`YZIc zzd+upSZT=m{V5wz!$8|_9KP53wJ+d?V7{_awJ9j>+ii!#E*{=yzzB6&Uw`8ElKUnN zi)N?t*%#-vG`gP_dvV&ob_XvrGgShoCk0}bAPA?cLzdF(ubBOuF+gK=U-&~~)&Eif z`UwLl&mS5q08ySl`U@oG@chePkrW0DnENcBd_c8_Avd#}@!f}<TEsU_E&jjshcNE- z`D0GR2Wl6`JFBg+GWVK(wwb_dXdHgZ2}Ci~P#^aih2l%?)oUyLjp!>}??&}r(=wZf zZZ(#^hlSjobuAQK_PLP-)?rq~!?PN3Fa7Mc7~w>a_N0G3UguviTmG-glfjFeteL@- z3atxDNPA!*Ow{nLW@JQKF-3oKC-6g3fTd$d0r-+s_E{E)^&?=x<sAi!F0fQz+3C#d z!)TkskehaZGs!wQ;K!B^8MeH+?8CL_LTQ_XtIruwiHbHQj(l4XH3kj&G;!Xe5f9^? z*5%1OS8Si66RvpYqg~0nP1x1<2b|8nIgz_pDvQJhW^T*gwi?(%0xC&KNuVCyle^b~ zNoMeNBzxkMT}D-V9q|hk()@Jr5}(rC6ualzYZ;;_AInYT$Q;k<8Y@VtBWN|Ltek&> zk<r?W{HQVS`H0{=htYJZ3+Wug^>>BNFn)>&)IUdbcvAUS4p){aY#2oHZmZ4dWQF?g zIFjuhJl(r$LQJj2`v;n_mpB36r4}UH8|(251Hi`n!w?z}>3SGk{S96N2U>u^_zM^i zCmN_3yLh|@&hcO4X|xajuGZ9X<kkq{fNm@E8vJpf7|?Xj$pNSAzqAg1%|{h6LAG@f zzO@hA%5`n(!$Nv=fmOJO=*^3-^W}b=0hZ_YvuM8we=jBd8FACRVRO;D6a!pxif8-X z>sfKUJv_4G+Qkvhj@h-=nOwL>L#t;WQJHp$Z{`Ku$Wmok>u<T1Ol$wPgFQ8mOl{36 z-C^=-YV(xG%O!GIuUF#^p$>h4pJF+*RPub4EH5IjR;1?GQd&Np9U$p@_nsu9g<vhB z8Mh<|@c7f#^m6Z-#%hf{&yDqhKg>?`i&fa*ejIE5{&QTSvauOq9q{pOwDbs|w!<nO z(g`u4<L6L)NuP~sGxTJfZ3Yt~WjIo`AI({D`xCv1tJ^Hp(4{-<Aij}2M%o#%RS)22 zimP+Tb)vUFrmFw1Tj#(pTjxuZY<C8T8*T$aNdqx!tA8!#kCeT3EIA%v{}r)Z5NxBe zaK$<5%qg%~9z_%Fa02Z=VfoH~(umEd{ABop_MwYPtStnKB(IJu%%QVmS3SxsG5ozn zV%2A&2<vWmowipXTqS;J?7jV3QQV>8LSYBFseQ8j)b+80qj_1cQ`LqnimgB1;Ak5$ zpe(Ai>5}SdUHY>AvIajG_oG^x!VcV*j;YjQf|%@`-tI%_v)kd27WurRTX|M>{`*!9 z19E|-=Lh2phj4;jy%0EIC@Sf3hXbF<SREPLD0-hS)uP8FuS38|O7Z(&;$MTQJ5Yp? zUV_1+M)}=L)<R#750)(1OqM>;W7&ZC;#4<7MOfOqMNPsAB{ZkGdlhr1Bi<!_^0I-e zE1+8)m_$oM+a?IY94|1loBGM0x;3U$2i!v{uFJfPmU|v~k13XYxVgJ{hP@(I25B)y z3%WNlOJobT^sDNWa-PMgO}TnFxSEA*#v15iT8k+jD_#$sPlPc&B7eXTdag0Z5xy8t zVyv2TIVVo*mgCTn+3FOAs>V`ZJdUB=T`Z^Wk)hOhI@H^lag1E-n9f>`xkm8hip{2p zo#Q#-N>LlvH>agpy$D(3dYVSi3hlW(BpL@v3wYkE34<tdIRsI3!@y&vBQX=bYEPy$ zWRA`Dw|x;tTef*`4!V&Me-=;>{}Aw~Q&QyS(8lH*N~`902;4%@!}?|_hlqV$SEr+! zgiW1M|NqC{d&fnQZd;(OfPjP+$r%O7L6Rt`Q6vipN=_;wNkBn@q!y4U83`geXC!Bk z92ChxqBI~mrv|#)_o3q%XYQGE=iGPi3-`T0{B;#AUDZX^xA$Iq?X@}#d0JIu&%Rrg zLvXQaZq-MmS~ROvk(Q=f9|YaaF&$xHh}+%J^W@UQGmT^pCS&=)p#dQcRycT%=K7ew z8@)y8>ndF!|FTECP06)D{_dOylD@%PgXY-+8;2|GD`$9|x{}?{b?k?9UfN^0{(0hZ z`-w%|ANFmNYlpC|eZp&$^hw?{%tYtTxF}GUaC6OdMs;>=MXbw0XY~u4;D?~38)rl( zgeSe`yk<k|et(VjwN;4(YXEz}oqKt8MnB1_yo!T=*vqo!cx<62L(cqn@cV1=mKZr@ z&@;CIe7sy8-4Rr9EEMfL1sdwQ1!DLhwKPUn+^OtyWzMy5cq`dwX|dg2YvOn+EbJCh zfbO;tNCM97P17vv#@81Ne~j8pZF}(Qe&^MN*u82gGA&Qn8^}5YoXBZMtzYOHq=-OC zGmt5qsI`QqsIw<qg5PlIsS8fj+e>>Bxn$>BOd`i$<eX7R`J$a(7*_@ls^{4v&e(T{ z4ou;7e6*ym7~`cPP74$W$sm?6Cq?+SYyf8@f1yrm9<QLb^`0(lh7T7Z4Ix5cUTRQN zBtY1F*9O-jwk{_*VXW_K&_im2Mq9z)p)b|&wnD$yl4|p6jj~x;ffXxb7H_%iv34?j zXgYggoZf6maH-|!h+glS8f^sOaIw^?gg>lzq}++CO&1<4L_Wl=fw&N8cl`oR%G1%= ztaWH+rXnw{oQzXNt5HBb)27WU<NngD)mvwVSXrIk#1wIhU7q#OpKG9$WFOaaD}Y1O z92y<pJRD%XJ3eyl6aNMnow^dR1?uJox(i#Z*~B3QW75XYCC}p{jOP^>kn-Z$;>HmX z?R2K2fT9eggLn8Af~fFv8gxHB--$mxNdOyuO8{SpTKtt{gZ{J+m?~c|`ayHSw(r*x znJGjbf*^C!fAXLgI<rSsdgmO7f8Pnw&_u+RX-gqF>ed$2*HxnMvv&J^;l?0dp4n06 zU^Oc0?MeSR1~*LPv{|)k%ds0&FGOpL_>FzG(s?2Q?bO@v8oDbh)}xtFb<)pJsOV;0 zM?Ya$5azOPv-3x1WkiqjhFB8|5#yK?mnYOVQ*vlyie$i5I>X$y8KG=0Y*`*td@B^s zGXp~K;>>gGg{c?fS}o2CARG{^I7>#jAzUachtf&(VyqCH_$Ed%F|ud0pPi|;Qa?bz zy=uX9im}m1>G2yx@TrHrH(s`M3*?>`FT<U;J_K!Js)o4?S8>oS0}ZOaJ}sTC5{v?I z%{PcO!004JrG@ILEMtBBCF#vY%d^>I_n)#yNqIP0MfTDW<DM1O65Bj(qxssf#nz^) zlI&2dy)*))&%4NC#Lb=O6)NC_l`Y(k64`7B*<*w(MLV+vF%Oh3iBGc*j^pwpw1_^5 zy<^+TWyHQ$U5<>LHRCIg>7G-sR=ukKycj=5(70ShbykXD=NIk?E(}zv{{kESTYajh zjKna60ddVt#v#0DkK;VqZbkG#5hhq}#-Q#gY?~0-B{%s>r(Xa*9*Yk{`ok0<Ygzvv zmY?P%*g$RqG^_vsc&fLJ;O*W$Xj_{(^Zb^5f!&5fY#sOrHYo38^mAghP@dck-wXEw z&G1S8@A4{O(FLh!Z3%*+=+bZ@I`*X>&l7pfPFNfUGP_fFrw}@#t%S&z?s53M->!Lo zko^HH(s6!EB{gEv?m^n1)x<6%A(BhAY#=4^cDd54s=I>tvKoS)CZ6@w=?#fPQ<wQ4 zu;auvr@p@oBVV*k#|q}Ke1qVuveO?@_vPaWW<+R@r|5(z1;S@DYLAr6cacJCvaBXM z9^oRGmDI5IfwOR$T|WPYZ5)tM6^5W+57Jos3HSIoY_flY$Om?^u%VOI+GqP~Hup3{ zNo*di+G+So$VMCI_m*kz<ugp}UFEH`$E*;i)Q-yo-IF-@%DxRcHWTTRM@wX|+u5mI zph70H*#T?MoWE_(xP2!C?cV(jQljq7XTtd^y%b+H{`z48P=4TfE@yV)EeZNQw@=*_ zg4F;WfYrqQQZAVE(vQtpq;_?(D}Y`uegzPeJ`H%Q1-{K|0hD=iWq(WBQ=-xyoQT=r zkbj+G-EyePKo&2Lbq<c{atg}KpFSI@u5h(SvmLj;x?4_nN1Rr&D5DFD7A_$2UQ9Iu zN{!3BnLqCncUSLN)*?^OvZzK$KWMlrOM3IO{j(Ui%4X`Fv&8955rM|ZyIHWA3xf?a z+VIDRANEnkA4g#e<sWCMmevℜxTWeR;pg$o|uC03vnkWw|?~e8`4H#~!~qP1+i( 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 diff --git a/doc/testbenches_doc_resources/outdoor_live.jpg b/doc/testbenches_doc_resources/outdoor_live.jpg deleted file mode 100755 index eba44a3c00e7456c7d2d0cc12ea1e77db31ae10a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167702 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 Z?<8&57vZk*DB1NW&uB?}^sQfC{~y*`r6m9W diff --git a/doc/testbenches_doc_resources/phone.pdf b/doc/testbenches_doc_resources/phone.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4451c7af1ac6af3251edb72fada64e08384d23a6 GIT binary patch literal 4358 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 Jq^YeL{NJR<KC%D+ literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/quectel.png b/doc/testbenches_doc_resources/quectel.png new file mode 100644 index 0000000000000000000000000000000000000000..443e62dcb569996103380797afafbe382835298e GIT binary patch literal 88455 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 O0000<MNUMnLSTYkrBwa^ literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/server.pdf b/doc/testbenches_doc_resources/server.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6034fcf667018a2709804dc9bfa136a56aec281f GIT binary patch literal 4366 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 JF(H{k{sW0*OH%*< literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/x310.jpg b/doc/testbenches_doc_resources/x310.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e14d30a15849d57cc30fb384024e825217fb50e GIT binary patch literal 11188 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 literal 0 HcmV?d00001 diff --git a/doc/testing_gnb_w_cots_ue_resources/gnb.conf b/doc/testing_gnb_w_cots_ue_resources/gnb.conf index c96d2074456..206e1b4f02b 100755 --- a/doc/testing_gnb_w_cots_ue_resources/gnb.conf +++ b/doc/testing_gnb_w_cots_ue_resources/gnb.conf @@ -21,8 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; - pdsch_AntennaPorts = 1; servingCellConfigCommon = ( { diff --git a/doc/tutorial_resources/docker-compose-basic-nrf.yaml b/doc/tutorial_resources/docker-compose-basic-nrf.yaml new file mode 100644 index 00000000000..cd1e957ad8b --- /dev/null +++ b/doc/tutorial_resources/docker-compose-basic-nrf.yaml @@ -0,0 +1,360 @@ +version: '3.8' +services: + mysql: + container_name: "mysql" + image: mysql:5.7 + volumes: + - ./database/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql + - ./healthscripts/mysql-healthcheck2.sh:/tmp/mysql-healthcheck.sh + environment: + - TZ=Europe/Paris + - MYSQL_DATABASE=oai_db + - MYSQL_USER=test + - MYSQL_PASSWORD=test + - MYSQL_ROOT_PASSWORD=linux + healthcheck: + test: /bin/bash -c "/tmp/mysql-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + networks: + public_net: + ipv4_address: 192.168.70.131 + oai-udr: + container_name: "oai-udr" + image: oai-udr:develop + environment: + - TZ=Europe/Paris + - INSTANCE=0 + - PID_DIRECTORY=/var/run + - UDR_NAME=OAI_UDR + - UDR_INTERFACE_NAME_FOR_NUDR=eth0 + - UDR_INTERFACE_PORT_FOR_NUDR=80 + - UDR_INTERFACE_HTTP2_PORT_FOR_NUDR=8080 + - USE_HTTP2=no + - UDR_API_VERSION=v1 + - MYSQL_IPV4_ADDRESS=192.168.70.131 + - MYSQL_USER=test + - MYSQL_PASS=test + - DB_CONNECTION_TIMEOUT=300 # Reset the connection to the DB after expiring the timeout (in second) currently can't be changed + - MYSQL_DB=oai_db + - WAIT_MYSQL=120 + - USE_FQDN_DNS=yes + - REGISTER_NRF=yes + - NRF_IPV4_ADDRESS=192.168.70.130 + - NRF_PORT=80 + - NRF_API_VERSION=v1 + - NRF_FQDN=oai-nrf + depends_on: + - mysql + - oai-nrf + networks: + public_net: + ipv4_address: 192.168.70.136 + volumes: + - ./healthscripts/udr-healthcheck.sh:/openair-udr/bin/udr-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-udr/bin/udr-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + oai-udm: + container_name: "oai-udm" + image: oai-udm:develop + environment: + - TZ=Europe/Paris + - INSTANCE=0 + - PID_DIRECTORY=/var/run + - UDM_NAME=OAI_UDM + - SBI_IF_NAME=eth0 + - SBI_PORT=80 + - SBI_HTTP2_PORT=8080 + - USE_HTTP2=no + - UDM_VERSION_NB=v1 + - USE_FQDN_DNS=yes + - UDR_IP_ADDRESS=192.168.70.136 + - UDR_PORT=80 + - UDR_VERSION_NB=v1 + - UDR_FQDN=oai-udr + - REGISTER_NRF=yes + - NRF_IPV4_ADDRESS=192.168.70.130 + - NRF_PORT=80 + - NRF_API_VERSION=v1 + - NRF_FQDN=oai-nrf + depends_on: + - oai-udr + networks: + public_net: + ipv4_address: 192.168.70.137 + volumes: + - ./healthscripts/udm-healthcheck.sh:/openair-udm/bin/udm-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-udm/bin/udm-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + oai-ausf: + container_name: "oai-ausf" + image: oai-ausf:develop + environment: + - TZ=Europe/Paris + - INSTANCE_ID=0 + - PID_DIR=/var/run + - AUSF_NAME=OAI_AUSF + - SBI_IF_NAME=eth0 + - SBI_PORT=80 + - USE_HTTP2 + - SBI_HTTP2_PORT + - USE_FQDN_DNS=yes + - UDM_IP_ADDRESS=192.168.70.137 + - UDM_PORT=80 + - UDM_VERSION_NB=v1 + - UDM_FQDN=oai-udm + - REGISTER_NRF=yes + - NRF_IPV4_ADDRESS=192.168.70.130 + - NRF_PORT=80 + - NRF_API_VERSION=v1 + - NRF_FQDN=oai-nrf + depends_on: + - oai-udm + networks: + public_net: + ipv4_address: 192.168.70.138 + volumes: + - ./healthscripts/ausf-healthcheck.sh:/openair-ausf/bin/ausf-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-ausf/bin/ausf-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + oai-nrf: + container_name: "oai-nrf" + image: oai-nrf:develop + environment: + - TZ=Europe/Paris + - NRF_INTERFACE_NAME_FOR_SBI=eth0 + - NRF_INTERFACE_PORT_FOR_SBI=80 + - NRF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 + - NRF_API_VERSION=v1 + - INSTANCE=0 + - PID_DIRECTORY=/var/run + networks: + public_net: + ipv4_address: 192.168.70.130 + volumes: + - ./healthscripts/nrf-healthcheck.sh:/openair-nrf/bin/nrf-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-nrf/bin/nrf-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + oai-amf: + container_name: "oai-amf" + image: oai-amf:develop + environment: + - TZ=Europe/paris + - INSTANCE=0 + - PID_DIRECTORY=/var/run + - MCC=208 + - MNC=99 + - REGION_ID=128 + - AMF_SET_ID=1 + - SERVED_GUAMI_MCC_0=208 + - SERVED_GUAMI_MNC_0=99 + - SERVED_GUAMI_REGION_ID_0=128 + - SERVED_GUAMI_AMF_SET_ID_0=1 + - SERVED_GUAMI_MCC_1=460 + - SERVED_GUAMI_MNC_1=11 + - SERVED_GUAMI_REGION_ID_1=10 + - SERVED_GUAMI_AMF_SET_ID_1=1 + - PLMN_SUPPORT_MCC=208 + - PLMN_SUPPORT_MNC=99 + - PLMN_SUPPORT_TAC=0x0001 + - SST_0=1 + - SD_0=0x1 + - AMF_INTERFACE_NAME_FOR_NGAP=eth0 + - AMF_INTERFACE_NAME_FOR_N11=eth0 + - SMF_INSTANCE_ID_0=1 + - SMF_FQDN_0=oai-smf + - SMF_IPV4_ADDR_0=192.168.70.133 + - SMF_HTTP_VERSION_0=v1 + - SELECTED_0=true + - SMF_INSTANCE_ID_1=2 + - SMF_FQDN_1=oai-smf + - SMF_IPV4_ADDR_1=0.0.0.0 + - SMF_HTTP_VERSION_1=v1 + - SELECTED_1=false + - MYSQL_SERVER=192.168.70.131 + - MYSQL_USER=root + - MYSQL_PASS=linux + - MYSQL_DB=oai_db + - OPERATOR_KEY=1006020f0a478bf6b699f15c062e42b3 + - NRF_IPV4_ADDRESS=192.168.70.130 + - NRF_PORT=80 + - EXTERNAL_NRF=no + - NF_REGISTRATION=yes + - SMF_SELECTION=yes + - USE_FQDN_DNS=yes + - EXTERNAL_AUSF=yes + - EXTERNAL_UDM=no + - EXTERNAL_NSSF=no + - USE_HTTP2=no + - NRF_API_VERSION=v1 + - NRF_FQDN=oai-nrf + - AUSF_IPV4_ADDRESS=192.168.70.138 + - AUSF_PORT=80 + - AUSF_API_VERSION=v1 + - AUSF_FQDN=oai-ausf + - UDM_IPV4_ADDRESS=192.168.70.137 + - UDM_PORT=80 + - UDM_API_VERSION=v2 + - UDM_FQDN=oai-udm + depends_on: + - mysql + - oai-nrf + - oai-ausf + volumes: + - ./healthscripts/amf-healthcheck.sh:/openair-amf/bin/amf-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-amf/bin/amf-healthcheck.sh" + interval: 10s + timeout: 15s + retries: 5 + networks: + public_net: + ipv4_address: 192.168.70.132 + oai-smf: + container_name: "oai-smf" + image: oai-smf:develop + environment: + - TZ=Europe/Paris + - INSTANCE=0 + - PID_DIRECTORY=/var/run + - SMF_INTERFACE_NAME_FOR_N4=eth0 + - SMF_INTERFACE_NAME_FOR_SBI=eth0 + - SMF_INTERFACE_PORT_FOR_SBI=80 + - SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090 + - SMF_API_VERSION=v1 + - DEFAULT_DNS_IPV4_ADDRESS=8.8.8.8 + - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4 + - AMF_IPV4_ADDRESS=192.168.70.132 + - AMF_PORT=80 + - AMF_API_VERSION=v1 + - AMF_FQDN=oai-amf + - UDM_IPV4_ADDRESS=192.168.70.137 + - UDM_PORT=80 + - UDM_API_VERSION=v2 + - UDM_FQDN=oai-udm + - UPF_IPV4_ADDRESS=192.168.70.134 + - UPF_FQDN_0=oai-spgwu + - NRF_IPV4_ADDRESS=192.168.70.130 + - NRF_PORT=80 + - NRF_API_VERSION=v1 + - USE_LOCAL_SUBSCRIPTION_INFO=yes #Set to yes if SMF uses local subscription information instead of from an UDM + - USE_NETWORK_INSTANCE=no #Set yes if network instance is to be used for given UPF + - NRF_FQDN=oai-nrf + - REGISTER_NRF=yes + - DISCOVER_UPF=yes + - USE_FQDN_DNS=yes + - HTTP_VERSION=1 # Default: 1 + - UE_MTU=1500 + - DNN_NI0=oai + - TYPE0=IPv4 + - DNN_RANGE0=12.1.1.2 - 12.1.1.253 + - NSSAI_SST0=1 + - NSSAI_SD0=0x1 + - SESSION_AMBR_UL0=1000Mbps + - SESSION_AMBR_DL0=1000Mbps + - DEFAULT_CSCF_IPV4_ADDRESS=127.0.0.1 # only needed when ims is being used + - ENABLE_USAGE_REPORTING=no # Set yes if UE USAGE REPORTING is to be done at UPF + depends_on: + - oai-nrf + - oai-amf + volumes: + - ./healthscripts/smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-smf/bin/smf-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + networks: + public_net: + ipv4_address: 192.168.70.133 + oai-spgwu: + container_name: "oai-spgwu" + image: oai-spgwu-tiny:develop + environment: + - TZ=Europe/Paris + - PID_DIRECTORY=/var/run + - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0 + - SGW_INTERFACE_NAME_FOR_SX=eth0 + - PGW_INTERFACE_NAME_FOR_SGI=eth0 + - NETWORK_UE_NAT_OPTION=yes + - NETWORK_UE_IP=12.1.1.0/24 + - SPGWC0_IP_ADDRESS=192.168.70.133 + - BYPASS_UL_PFCP_RULES=no + - MCC=208 + - MNC=99 + - MNC03=099 + - TAC=1 + - GW_ID=1 + - THREAD_S1U_PRIO=80 + - S1U_THREADS=8 + - THREAD_SX_PRIO=81 + - SX_THREADS=1 + - THREAD_SGI_PRIO=80 + - SGI_THREADS=8 + - REALM=openairinterface.org + - ENABLE_5G_FEATURES=yes + - REGISTER_NRF=yes + - USE_FQDN_NRF=yes + - UPF_FQDN_5G=oai-spgwu + - NRF_IPV4_ADDRESS=192.168.70.130 + - NRF_PORT=80 + - NRF_API_VERSION=v1 + - NRF_FQDN=oai-nrf + - NSSAI_SST_0=1 + - NSSAI_SD_0=0x1 + - DNN_0=oai + depends_on: + - oai-nrf + - oai-smf + cap_add: + - NET_ADMIN + - SYS_ADMIN + cap_drop: + - ALL + privileged: true + volumes: + - ./healthscripts/spgwu-healthcheck.sh:/openair-spgwu-tiny/bin/spgwu-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-spgwu-tiny/bin/spgwu-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + networks: + public_net: + ipv4_address: 192.168.70.134 + oai-ext-dn: + image: trf-gen-cn5g:latest + privileged: true + container_name: oai-ext-dn + entrypoint: /bin/bash -c \ + "ip route add 12.1.1.0/24 via 192.168.70.134 dev eth0; sleep infinity" + depends_on: + - oai-spgwu + networks: + public_net: + ipv4_address: 192.168.70.135 +networks: + # public_net: + # external: + # name: demo-oai-public-net + public_net: + driver: bridge + name: demo-oai-public-net + ipam: + config: + - subnet: 192.168.70.128/26 + driver_opts: + com.docker.network.bridge.name: "demo-oai" diff --git a/doc/tutorial_resources/oai_db.sql b/doc/tutorial_resources/oai_db.sql new file mode 100644 index 00000000000..fb8f4b20edc --- /dev/null +++ b/doc/tutorial_resources/oai_db.sql @@ -0,0 +1,328 @@ +-- phpMyAdmin SQL Dump +-- version 5.1.0 +-- https://www.phpmyadmin.net/ +-- +-- Host: 172.16.200.10:3306 +-- Generation Time: Mar 22, 2021 at 10:31 AM +-- Server version: 5.7.33 +-- PHP Version: 7.4.15 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- Database: `oai_db` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `AccessAndMobilitySubscriptionData` +-- + +CREATE TABLE `AccessAndMobilitySubscriptionData` ( + `ueid` varchar(15) NOT NULL, + `servingPlmnid` varchar(15) NOT NULL, + `supportedFeatures` varchar(50) DEFAULT NULL, + `gpsis` json DEFAULT NULL, + `internalGroupIds` json DEFAULT NULL, + `sharedVnGroupDataIds` json DEFAULT NULL, + `subscribedUeAmbr` json DEFAULT NULL, + `nssai` json DEFAULT NULL, + `ratRestrictions` json DEFAULT NULL, + `forbiddenAreas` json DEFAULT NULL, + `serviceAreaRestriction` json DEFAULT NULL, + `coreNetworkTypeRestrictions` json DEFAULT NULL, + `rfspIndex` int(10) DEFAULT NULL, + `subsRegTimer` int(10) DEFAULT NULL, + `ueUsageType` int(10) DEFAULT NULL, + `mpsPriority` tinyint(1) DEFAULT NULL, + `mcsPriority` tinyint(1) DEFAULT NULL, + `activeTime` int(10) DEFAULT NULL, + `sorInfo` json DEFAULT NULL, + `sorInfoExpectInd` tinyint(1) DEFAULT NULL, + `sorafRetrieval` tinyint(1) DEFAULT NULL, + `sorUpdateIndicatorList` json DEFAULT NULL, + `upuInfo` json DEFAULT NULL, + `micoAllowed` tinyint(1) DEFAULT NULL, + `sharedAmDataIds` json DEFAULT NULL, + `odbPacketServices` json DEFAULT NULL, + `serviceGapTime` int(10) DEFAULT NULL, + `mdtUserConsent` json DEFAULT NULL, + `mdtConfiguration` json DEFAULT NULL, + `traceData` json DEFAULT NULL, + `cagData` json DEFAULT NULL, + `stnSr` varchar(50) DEFAULT NULL, + `cMsisdn` varchar(50) DEFAULT NULL, + `nbIoTUePriority` int(10) DEFAULT NULL, + `nssaiInclusionAllowed` tinyint(1) DEFAULT NULL, + `rgWirelineCharacteristics` varchar(50) DEFAULT NULL, + `ecRestrictionDataWb` json DEFAULT NULL, + `ecRestrictionDataNb` tinyint(1) DEFAULT NULL, + `expectedUeBehaviourList` json DEFAULT NULL, + `primaryRatRestrictions` json DEFAULT NULL, + `secondaryRatRestrictions` json DEFAULT NULL, + `edrxParametersList` json DEFAULT NULL, + `ptwParametersList` json DEFAULT NULL, + `iabOperationAllowed` tinyint(1) DEFAULT NULL, + `wirelineForbiddenAreas` json DEFAULT NULL, + `wirelineServiceAreaRestriction` json DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `Amf3GppAccessRegistration` +-- + +CREATE TABLE `Amf3GppAccessRegistration` ( + `ueid` varchar(15) NOT NULL, + `amfInstanceId` varchar(50) NOT NULL, + `supportedFeatures` varchar(50) DEFAULT NULL, + `purgeFlag` tinyint(1) DEFAULT NULL, + `pei` varchar(50) DEFAULT NULL, + `imsVoPs` json DEFAULT NULL, + `deregCallbackUri` varchar(50) NOT NULL, + `amfServiceNameDereg` json DEFAULT NULL, + `pcscfRestorationCallbackUri` varchar(50) DEFAULT NULL, + `amfServiceNamePcscfRest` json DEFAULT NULL, + `initialRegistrationInd` tinyint(1) DEFAULT NULL, + `guami` json NOT NULL, + `backupAmfInfo` json DEFAULT NULL, + `drFlag` tinyint(1) DEFAULT NULL, + `ratType` json NOT NULL, + `urrpIndicator` tinyint(1) DEFAULT NULL, + `amfEeSubscriptionId` varchar(50) DEFAULT NULL, + `epsInterworkingInfo` json DEFAULT NULL, + `ueSrvccCapability` tinyint(1) DEFAULT NULL, + `registrationTime` varchar(50) DEFAULT NULL, + `vgmlcAddress` json DEFAULT NULL, + `contextInfo` json DEFAULT NULL, + `noEeSubscriptionInd` tinyint(1) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `AuthenticationStatus` +-- + +CREATE TABLE `AuthenticationStatus` ( + `ueid` varchar(20) NOT NULL, + `nfInstanceId` varchar(50) NOT NULL, + `success` tinyint(1) NOT NULL, + `timeStamp` varchar(50) NOT NULL, + `authType` varchar(25) NOT NULL, + `servingNetworkName` varchar(50) NOT NULL, + `authRemovalInd` tinyint(1) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `AuthenticationSubscription` +-- + +CREATE TABLE `AuthenticationSubscription` ( + `ueid` varchar(20) NOT NULL, + `authenticationMethod` varchar(25) NOT NULL, + `encPermanentKey` varchar(50) DEFAULT NULL, + `protectionParameterId` varchar(50) DEFAULT NULL, + `sequenceNumber` json DEFAULT NULL, + `authenticationManagementField` varchar(50) DEFAULT NULL, + `algorithmId` varchar(50) DEFAULT NULL, + `encOpcKey` varchar(50) DEFAULT NULL, + `encTopcKey` varchar(50) DEFAULT NULL, + `vectorGenerationInHss` tinyint(1) DEFAULT NULL, + `n5gcAuthMethod` varchar(15) DEFAULT NULL, + `rgAuthenticationInd` tinyint(1) DEFAULT NULL, + `supi` varchar(20) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `AuthenticationSubscription` +-- + +INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES + ('2089900007487', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '2089900007487'); +INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES + ('208990000000001', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '208990000000001'); +INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES + ('208990000000002', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '208990000000002'); +INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES + ('208990000000003', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '208990000000003'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `SdmSubscriptions` +-- + +CREATE TABLE `SdmSubscriptions` ( + `ueid` varchar(15) NOT NULL, + `subsId` int(10) UNSIGNED NOT NULL, + `nfInstanceId` varchar(50) NOT NULL, + `implicitUnsubscribe` tinyint(1) DEFAULT NULL, + `expires` varchar(50) DEFAULT NULL, + `callbackReference` varchar(50) NOT NULL, + `amfServiceName` json DEFAULT NULL, + `monitoredResourceUris` json NOT NULL, + `singleNssai` json DEFAULT NULL, + `dnn` varchar(50) DEFAULT NULL, + `subscriptionId` varchar(50) DEFAULT NULL, + `plmnId` json DEFAULT NULL, + `immediateReport` tinyint(1) DEFAULT NULL, + `report` json DEFAULT NULL, + `supportedFeatures` varchar(50) DEFAULT NULL, + `contextInfo` json DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `SessionManagementSubscriptionData` +-- + +CREATE TABLE `SessionManagementSubscriptionData` ( + `ueid` varchar(15) NOT NULL, + `servingPlmnid` varchar(15) NOT NULL, + `singleNssai` json NOT NULL, + `dnnConfigurations` json DEFAULT NULL, + `internalGroupIds` json DEFAULT NULL, + `sharedVnGroupDataIds` json DEFAULT NULL, + `sharedDnnConfigurationsId` varchar(50) DEFAULT NULL, + `odbPacketServices` json DEFAULT NULL, + `traceData` json DEFAULT NULL, + `sharedTraceDataId` varchar(50) DEFAULT NULL, + `expectedUeBehavioursList` json DEFAULT NULL, + `suggestedPacketNumDlList` json DEFAULT NULL, + `3gppChargingCharacteristics` varchar(50) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `SessionManagementSubscriptionData` +-- + +INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES + ('2089900007487', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.2\"}]}}'); +INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES + ('208990000000001', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.2\"}]}}'); +INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES + ('208990000000002', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.3\"}]}}'); +INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES + ('208990000000003', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.4\"}]}}'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `SmfRegistrations` +-- + +CREATE TABLE `SmfRegistrations` ( + `ueid` varchar(15) NOT NULL, + `subpduSessionId` int(10) NOT NULL, + `smfInstanceId` varchar(50) NOT NULL, + `smfSetId` varchar(50) DEFAULT NULL, + `supportedFeatures` varchar(50) DEFAULT NULL, + `pduSessionId` int(10) NOT NULL, + `singleNssai` json NOT NULL, + `dnn` varchar(50) DEFAULT NULL, + `emergencyServices` tinyint(1) DEFAULT NULL, + `pcscfRestorationCallbackUri` varchar(50) DEFAULT NULL, + `plmnId` json NOT NULL, + `pgwFqdn` varchar(50) DEFAULT NULL, + `epdgInd` tinyint(1) DEFAULT NULL, + `deregCallbackUri` varchar(50) DEFAULT NULL, + `registrationReason` json DEFAULT NULL, + `registrationTime` varchar(50) DEFAULT NULL, + `contextInfo` json DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `SmfSelectionSubscriptionData` +-- + +CREATE TABLE `SmfSelectionSubscriptionData` ( + `ueid` varchar(15) NOT NULL, + `servingPlmnid` varchar(15) NOT NULL, + `supportedFeatures` varchar(50) DEFAULT NULL, + `subscribedSnssaiInfos` json DEFAULT NULL, + `sharedSnssaiInfosId` varchar(50) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Indexes for dumped tables +-- + +-- +-- Indexes for table `AccessAndMobilitySubscriptionData` +-- +ALTER TABLE `AccessAndMobilitySubscriptionData` + ADD PRIMARY KEY (`ueid`,`servingPlmnid`) USING BTREE; + +-- +-- Indexes for table `Amf3GppAccessRegistration` +-- +ALTER TABLE `Amf3GppAccessRegistration` + ADD PRIMARY KEY (`ueid`); + +-- +-- Indexes for table `AuthenticationStatus` +-- +ALTER TABLE `AuthenticationStatus` + ADD PRIMARY KEY (`ueid`); + +-- +-- Indexes for table `AuthenticationSubscription` +-- +ALTER TABLE `AuthenticationSubscription` + ADD PRIMARY KEY (`ueid`); + +-- +-- Indexes for table `SdmSubscriptions` +-- +ALTER TABLE `SdmSubscriptions` + ADD PRIMARY KEY (`subsId`,`ueid`) USING BTREE; + +-- +-- Indexes for table `SessionManagementSubscriptionData` +-- +ALTER TABLE `SessionManagementSubscriptionData` + ADD PRIMARY KEY (`ueid`,`servingPlmnid`) USING BTREE; + +-- +-- Indexes for table `SmfRegistrations` +-- +ALTER TABLE `SmfRegistrations` + ADD PRIMARY KEY (`ueid`,`subpduSessionId`) USING BTREE; + +-- +-- Indexes for table `SmfSelectionSubscriptionData` +-- +ALTER TABLE `SmfSelectionSubscriptionData` + ADD PRIMARY KEY (`ueid`,`servingPlmnid`) USING BTREE; + +-- +-- AUTO_INCREMENT for dumped tables +-- + +-- +-- AUTO_INCREMENT for table `SdmSubscriptions` +-- +ALTER TABLE `SdmSubscriptions` + MODIFY `subsId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; + diff --git a/docker/Dockerfile.build.rhel8.2 b/docker/Dockerfile.build.rhel8.2 index 22486c5e680..2664096a9bf 100644 --- a/docker/Dockerfile.build.rhel8.2 +++ b/docker/Dockerfile.build.rhel8.2 @@ -35,4 +35,4 @@ COPY . . RUN /bin/sh oaienv && \ cd cmake_targets && \ mkdir -p log && \ - ./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci + ./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci --noavx512 diff --git a/docker/Dockerfile.build.ubuntu18 b/docker/Dockerfile.build.ubuntu18 index 3ba1e41442f..7809d56216b 100644 --- a/docker/Dockerfile.build.ubuntu18 +++ b/docker/Dockerfile.build.ubuntu18 @@ -35,4 +35,4 @@ COPY . . RUN /bin/sh oaienv && \ cd cmake_targets && \ mkdir -p log && \ - ./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci + ./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci --noavx512 diff --git a/docker/Dockerfile.phySim.rhel8.2 b/docker/Dockerfile.phySim.rhel8.2 index 2627a9eafdf..b4eb9a1eebb 100644 --- a/docker/Dockerfile.phySim.rhel8.2 +++ b/docker/Dockerfile.phySim.rhel8.2 @@ -38,7 +38,7 @@ RUN yum install -y libasan RUN /bin/sh oaienv && \ cd cmake_targets && \ mkdir -p log && \ - ./build_oai --phy_simulators --ninja --verbose-ci --sanitize-address + ./build_oai --phy_simulators --ninja --verbose-ci --sanitize-address --noavx512 #start from scratch for target executable FROM registry.access.redhat.com/ubi8/ubi:latest as oai-physim diff --git a/docker/scripts/generateTemplate.py b/docker/scripts/generateTemplate.py index 850bb535a52..ec8f32ec6e8 100644 --- a/docker/scripts/generateTemplate.py +++ b/docker/scripts/generateTemplate.py @@ -60,6 +60,7 @@ def main(): "rcc.band40.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gnb.band78.tm1.fr1.106PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gnb.band78.sa.fr1.106PRB.usrpn310.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', + "gnb.sa.band78.fr1.106PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gnb.sa.band66.fr1.106PRB.usrpn300.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gNB_SA_CU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gNB_SA_DU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', diff --git a/docker/scripts/gnb_entrypoint.sh b/docker/scripts/gnb_entrypoint.sh index dd6256609c8..ac0e0d4c889 100755 --- a/docker/scripts/gnb_entrypoint.sh +++ b/docker/scripts/gnb_entrypoint.sh @@ -10,6 +10,7 @@ THREAD_PARALLEL_CONFIG=${THREAD_PARALLEL_CONFIG:-PARALLEL_SINGLE_THREAD} if [[ -v USE_NSA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.nsa.tdd.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.tdd.conf $PREFIX/etc/gnb.conf; fi +if [[ -v USE_SA_TDD_MONO_B2XX ]]; then cp $PREFIX/etc/gnb.sa.tdd.b2xx.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_FDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.fdd.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_CU ]]; then cp $PREFIX/etc/gnb.sa.cu.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_TDD_CU ]]; then cp $PREFIX/etc/gnb.sa.du.tdd.conf $PREFIX/etc/gnb.conf; fi diff --git a/docker/scripts/gnb_parameters.yaml b/docker/scripts/gnb_parameters.yaml index d5942f2c9b4..420559ff3f7 100644 --- a/docker/scripts/gnb_parameters.yaml +++ b/docker/scripts/gnb_parameters.yaml @@ -94,6 +94,36 @@ - key: parallel_config env: "@THREAD_PARALLEL_CONFIG@" + - filePrefix: gnb.sa.band78.fr1.106PRB.usrpb210.conf + outputfilename: "gnb.sa.tdd.b2xx.conf" + config: + - key: Active_gNBs + env: "@GNB_NAME@" + - key: gNB_name + env: "@GNB_NAME@" + - key: mcc + env: "@MCC@" + - key: mnc + env: "@MNC@" + - key: mnc_length + env: "@MNC_LENGTH@" + - key: tracking_area_code + env: "@TAC@" + - key: sst + env: "@NSSAI_SST@" + - key: ipv4 + env: "@AMF_IP_ADDRESS@" + - key: GNB_INTERFACE_NAME_FOR_NG_AMF + env: "@GNB_NGA_IF_NAME@" + - key: GNB_IPV4_ADDRESS_FOR_NG_AMF + env: "@GNB_NGA_IP_ADDRESS@" + - key: GNB_INTERFACE_NAME_FOR_NGU + env: "@GNB_NGU_IF_NAME@" + - key: GNB_IPV4_ADDRESS_FOR_NGU + env: "@GNB_NGU_IP_ADDRESS@" + - key: parallel_config + env: "@THREAD_PARALLEL_CONFIG@" + - filePrefix: gnb.sa.band66.fr1.106PRB.usrpn300.conf outputfilename: "gnb.sa.fdd.conf" config: diff --git a/executables/main-ocp.c b/executables/main-ocp.c index c9388e179d1..5d949d5a287 100644 --- a/executables/main-ocp.c +++ b/executables/main-ocp.c @@ -173,7 +173,7 @@ void init_transport(PHY_VARS_eNB *eNB) { } for (int i=0; i<NUMBER_OF_ULSCH_MAX; i++) { - LOG_D(PHY,"Allocating Transport Channel Buffer for ULSCH, UE %d\n",i); + LOG_D(PHY,"Allocating Transport Channel Buffers for ULSCH, UE %d\n",i); AssertFatal((eNB->ulsch[1+i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,fp->N_RB_UL, 0)) != NULL, "Can't get eNB ulsch structures\n"); // this is the transmission mode for the signalling channels diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 8ea7f167121..bc3dccf4fa8 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -304,32 +304,36 @@ void rx_func(void *param) { ); #endif } -static void dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output) { - int stroff = 0; - stroff += print_meas_log(&gNB->phy_proc_tx, "L1 Tx processing", NULL, NULL, output); - stroff += print_meas_log(&gNB->dlsch_encoding_stats, "DLSCH encoding", NULL, NULL, output+stroff); - stroff += print_meas_log(&gNB->phy_proc_rx, "L1 Rx processing", NULL, NULL, output+stroff); - stroff += print_meas_log(&gNB->ul_indication_stats, "UL Indication", NULL, NULL, output+stroff); - stroff += print_meas_log(&gNB->rx_pusch_stats, "PUSCH inner-receiver", NULL, NULL, output+stroff); - stroff += print_meas_log(&gNB->ulsch_decoding_stats, "PUSCH decoding", NULL, NULL, output+stroff); - stroff += print_meas_log(&gNB->schedule_response_stats, "Schedule Response",NULL,NULL, output+stroff); - if (ru->feprx) stroff += print_meas_log(&ru->ofdm_demod_stats,"feprx",NULL,NULL, output+stroff); +static size_t dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output, size_t outputlen) { + const char *begin = output; + const char *end = output + outputlen; + output += print_meas_log(&gNB->phy_proc_tx, "L1 Tx processing", NULL, NULL, output, end - output); + output += print_meas_log(&gNB->dlsch_encoding_stats, "DLSCH encoding", NULL, NULL, output, end - output); + output += print_meas_log(&gNB->phy_proc_rx, "L1 Rx processing", NULL, NULL, output, end - output); + output += print_meas_log(&gNB->ul_indication_stats, "UL Indication", NULL, NULL, output, end - output); + output += print_meas_log(&gNB->rx_pusch_stats, "PUSCH inner-receiver", NULL, NULL, output, end - output); + output += print_meas_log(&gNB->ulsch_decoding_stats, "PUSCH decoding", NULL, NULL, output, end - output); + output += print_meas_log(&gNB->schedule_response_stats, "Schedule Response", NULL, NULL, output, end - output); + if (ru->feprx) + output += print_meas_log(&ru->ofdm_demod_stats, "feprx", NULL, NULL, output, end - output); if (ru->feptx_ofdm) { - stroff += print_meas_log(&ru->precoding_stats,"feptx_prec",NULL,NULL, output+stroff); - stroff += print_meas_log(&ru->txdataF_copy_stats,"txdataF_copy",NULL,NULL, output+stroff); - stroff += print_meas_log(&ru->ofdm_mod_stats,"feptx_ofdm",NULL,NULL, output+stroff); - stroff += print_meas_log(&ru->ofdm_total_stats,"feptx_total",NULL,NULL, output+stroff); + output += print_meas_log(&ru->precoding_stats,"feptx_prec",NULL,NULL, output, end - output); + output += print_meas_log(&ru->txdataF_copy_stats,"txdataF_copy",NULL,NULL, output, end - output); + output += print_meas_log(&ru->ofdm_mod_stats,"feptx_ofdm",NULL,NULL, output, end - output); + output += print_meas_log(&ru->ofdm_total_stats,"feptx_total",NULL,NULL, output, end - output); } - if (ru->fh_north_asynch_in) stroff += print_meas_log(&ru->rx_fhaul,"rx_fhaul",NULL,NULL, output+stroff); + if (ru->fh_north_asynch_in) + output += print_meas_log(&ru->rx_fhaul,"rx_fhaul",NULL,NULL, output, end - output); - stroff += print_meas_log(&ru->tx_fhaul,"tx_fhaul",NULL,NULL, output+stroff); + output += print_meas_log(&ru->tx_fhaul,"tx_fhaul",NULL,NULL, output, end - output); if (ru->fh_north_out) { - stroff += print_meas_log(&ru->compression,"compression",NULL,NULL, output+stroff); - stroff += print_meas_log(&ru->transport,"transport",NULL,NULL, output+stroff); + output += print_meas_log(&ru->compression,"compression",NULL,NULL, output, end - output); + output += print_meas_log(&ru->transport,"transport",NULL,NULL, output, end - output); } + return output - begin; } void *nrL1_stats_thread(void *param) { @@ -355,7 +359,7 @@ void *nrL1_stats_thread(void *param) { dump_nr_I0_stats(fd,gNB); dump_pdsch_stats(fd,gNB); dump_pusch_stats(fd,gNB); - dump_L1_meas_stats(gNB, ru, output); + dump_L1_meas_stats(gNB, ru, output, L1STATSSTRLEN); fprintf(fd,"%s\n",output); fflush(fd); fseek(fd,0,SEEK_SET); @@ -380,7 +384,7 @@ void *tx_reorder_thread(void* param) { if (resL1Reserve) { resL1=resL1Reserve; if (((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot != next_tx_slot) { - LOG_E(PHY,"order mistake"); + LOG_E(PHY,"order mistake\n"); resL1Reserve=NULL; resL1 = pullTpool(gNB->L1_tx_out, gNB->threadPool); } @@ -462,7 +466,7 @@ void init_gNB_Tpool(int inst) { pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx); // to unblock the process in the beginning } - if (!get_softmodem_params()->emulate_l1) + if ((!get_softmodem_params()->emulate_l1) && (!IS_SOFTMODEM_NOSTATS_BIT)) threadCreate(&proc->L1_stats_thread,nrL1_stats_thread,(void*)gNB,"L1_stats",-1,OAI_PRIORITY_RT_LOW); threadCreate(&proc->pthread_tx_reorder, tx_reorder_thread, (void *)gNB, "thread_tx_reorder", -1, OAI_PRIORITY_RT_MAX); @@ -600,7 +604,8 @@ void init_gNB(int single_thread_flag,int wait_for_sync) { gNB->UL_INFO.cqi_ind.cqi_raw_pdu_list = gNB->cqi_raw_pdu_list;*/ gNB->prach_energy_counter = 0; - gNB->prb_interpolation = get_softmodem_params()->prb_interpolation; + gNB->chest_time = get_softmodem_params()->chest_time; + gNB->chest_freq = get_softmodem_params()->chest_freq; } diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 78d02e8849c..b782209e4f8 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -729,10 +729,17 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) { AssertFatal(txsymb>0,"illegal txsymb %d\n",txsymb); - if(slot%(fp->slots_per_subframe/2)) - siglen = txsymb * (fp->ofdm_symbol_size + fp->nb_prefix_samples); - else - siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples); + if (fp->slots_per_subframe == 1) { + if (txsymb <= 7) + siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples); + else + siglen = 2 * (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 2) * (fp->ofdm_symbol_size + fp->nb_prefix_samples); + } else { + if(slot%(fp->slots_per_subframe/2)) + siglen = txsymb * (fp->ofdm_symbol_size + fp->nb_prefix_samples); + else + siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples); + } //+ ru->end_of_burst_delay; flags = 3; // end of burst @@ -1091,11 +1098,12 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) { cfg->tx_gain[i] = ru->att_tx; cfg->rx_gain[i] = ru->max_rxgain-ru->att_rx; cfg->configFilename = rf_config_file; - LOG_I(PHY, "Channel %d: setting tx_gain offset %f, rx_gain offset %f, tx_freq %lu Hz, rx_freq %lu Hz\n", + LOG_I(PHY, "Channel %d: setting tx_gain offset %.0f, rx_gain offset %.0f, tx_freq %.0f Hz, rx_freq %.0f Hz, tune_offset %.0f Hz\n", i, cfg->tx_gain[i], cfg->rx_gain[i], - (unsigned long)cfg->tx_freq[i], - (unsigned long)cfg->rx_freq[i]); + cfg->tx_freq[i], + cfg->rx_freq[i], + cfg->tune_offset); } } @@ -2103,6 +2111,8 @@ static void NRRCconfig_RU(void) { RC.ru[j]->openair0_cfg.time_source = internal; } + RC.ru[j]->openair0_cfg.tune_offset = get_softmodem_params()->tune_offset; + if (strcmp(*(RUParamList.paramarray[j][RU_LOCAL_RF_IDX].strptr), "yes") == 0) { if ( !(config_isparamset(RUParamList.paramarray[j],RU_LOCAL_IF_NAME_IDX)) ) { RC.ru[j]->if_south = LOCAL_RF; diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h index 6e36dcf6c7f..1e6c556acff 100644 --- a/executables/nr-softmodem-common.h +++ b/executables/nr-softmodem-common.h @@ -66,6 +66,7 @@ #define CONFIG_HLP_ITTIL "Generate ITTI analyzser logs (similar to wireshark logs but with more details)\n" #define CONFIG_HLP_DLMCS_PHYTEST "Set the downlink MCS for PHYTEST mode\n" #define CONFIG_HLP_DLNL_PHYTEST "Set the downlink nrOfLayers for PHYTEST mode\n" +#define CONFIG_HLP_ULNL_PHYTEST "Set the uplink nrOfLayers for PHYTEST mode\n" #define CONFIG_HLP_STMON "Enable processing timing measurement of lte softmodem on per subframe basis \n" #define CONFIG_HLP_MSLOTS "Skip the missed slots/subframes \n" #define CONFIG_HLP_ULMCS_PHYTEST "Set the uplink MCS for PHYTEST mode\n" diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c index 1c75d9a155e..54345dc6b02 100644 --- a/executables/nr-softmodem.c +++ b/executables/nr-softmodem.c @@ -839,10 +839,10 @@ int main( int argc, char **argv ) { } for (int inst = 0; inst < NB_RU; inst++) { + kill_NR_RU_proc(inst); nr_phy_free_RU(RC.ru[inst]); } - free_lte_top(); pthread_cond_destroy(&sync_cond); pthread_mutex_destroy(&sync_mutex); pthread_cond_destroy(&nfapi_sync_cond); diff --git a/executables/nr-softmodem.h b/executables/nr-softmodem.h index 834e89b4039..98087ea2bb2 100644 --- a/executables/nr-softmodem.h +++ b/executables/nr-softmodem.h @@ -22,6 +22,7 @@ {"E" , CONFIG_HLP_TQFS, PARAMFLAG_BOOL, i8ptr:&threequarter_fs, defintval:0, TYPE_INT8, 0}, \ {"m" , CONFIG_HLP_DLMCS_PHYTEST,0, uptr:&target_dl_mcs, defintval:0, TYPE_UINT, 0}, \ {"l" , CONFIG_HLP_DLNL_PHYTEST,0, uptr:&target_dl_Nl, defintval:0, TYPE_UINT, 0}, \ + {"L" , CONFIG_HLP_ULNL_PHYTEST,0, uptr:&target_ul_Nl, defintval:0, TYPE_UINT, 0}, \ {"t" , CONFIG_HLP_ULMCS_PHYTEST,0, uptr:&target_ul_mcs, defintval:0, TYPE_UINT, 0}, \ {"M" , CONFIG_HLP_DLBW_PHYTEST,0, uptr:&target_dl_bw, defintval:0, TYPE_UINT, 0}, \ {"T" , CONFIG_HLP_ULBW_PHYTEST,0, uptr:&target_ul_bw, defintval:0, TYPE_UINT, 0}, \ @@ -36,6 +37,7 @@ extern threads_t threads; extern uint32_t target_dl_mcs; extern uint32_t target_dl_Nl; +extern uint32_t target_ul_Nl; extern uint32_t target_ul_mcs; extern uint32_t target_dl_bw; extern uint32_t target_ul_bw; @@ -57,9 +59,6 @@ extern void set_function_spec_param(RU_t *ru); extern void reset_opp_meas(void); extern void print_opp_meas(void); - -extern void init_fep_thread(PHY_VARS_gNB *); - void init_gNB_afterRU(void); extern int stop_L1L2(module_id_t gnb_id); diff --git a/executables/nr-ue.c b/executables/nr-ue.c index 620e21ec142..85ec4e5e0c6 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -106,23 +106,24 @@ queue_t nr_rach_ind_queue; static void *NRUE_phy_stub_standalone_pnf_task(void *arg); -static int dump_L1_UE_meas_stats(PHY_VARS_NR_UE *ue, char *output, int max_len) +static size_t dump_L1_UE_meas_stats(PHY_VARS_NR_UE *ue, char *output, size_t max_len) { - int stroff = 0; - stroff += print_meas_log(&ue->phy_proc_tx, "L1 TX processing", NULL, NULL, output); - stroff += print_meas_log(&ue->ulsch_encoding_stats, "ULSCH encoding", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->phy_proc_rx[0], "L1 RX processing t0", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->phy_proc_rx[1], "L1 RX processing t1", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->ue_ul_indication_stats, "UL Indication", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->rx_pdsch_stats, "PDSCH receiver", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->dlsch_decoding_stats[0], "PDSCH decoding t0", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->dlsch_decoding_stats[1], "PDSCH decoding t1", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->dlsch_deinterleaving_stats, " -> Deinterleive", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->dlsch_rate_unmatching_stats, " -> Rate Unmatch", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->dlsch_ldpc_decoding_stats, " -> LDPC Decode", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->dlsch_unscrambling_stats, "PDSCH unscrambling", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->dlsch_rx_pdcch_stats, "PDCCH handling", NULL, NULL, output + stroff); - return stroff; + const char *begin = output; + const char *end = output + max_len; + output += print_meas_log(&ue->phy_proc_tx, "L1 TX processing", NULL, NULL, output, end - output); + output += print_meas_log(&ue->ulsch_encoding_stats, "ULSCH encoding", NULL, NULL, output, end - output); + output += print_meas_log(&ue->phy_proc_rx[0], "L1 RX processing t0", NULL, NULL, output, end - output); + output += print_meas_log(&ue->phy_proc_rx[1], "L1 RX processing t1", NULL, NULL, output, end - output); + output += print_meas_log(&ue->ue_ul_indication_stats, "UL Indication", NULL, NULL, output, end - output); + output += print_meas_log(&ue->rx_pdsch_stats, "PDSCH receiver", NULL, NULL, output, end - output); + output += print_meas_log(&ue->dlsch_decoding_stats[0], "PDSCH decoding t0", NULL, NULL, output, end - output); + output += print_meas_log(&ue->dlsch_decoding_stats[1], "PDSCH decoding t1", NULL, NULL, output, end - output); + output += print_meas_log(&ue->dlsch_deinterleaving_stats, " -> Deinterleive", NULL, NULL, output, end - output); + output += print_meas_log(&ue->dlsch_rate_unmatching_stats, " -> Rate Unmatch", NULL, NULL, output, end - output); + output += print_meas_log(&ue->dlsch_ldpc_decoding_stats, " -> LDPC Decode", NULL, NULL, output, end - output); + output += print_meas_log(&ue->dlsch_unscrambling_stats, "PDSCH unscrambling", NULL, NULL, output, end - output); + output += print_meas_log(&ue->dlsch_rx_pdcch_stats, "PDCCH handling", NULL, NULL, output, end - output); + return output - begin; } static void *nrL1_UE_stats_thread(void *param) @@ -613,7 +614,7 @@ void processSlotTX(void *arg) { int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_slot_tx); uint8_t gNB_id = 0; - LOG_D(PHY,"%d.%d => slot type %d\n",proc->frame_tx,proc->nr_slot_tx,tx_slot_type); + LOG_D(PHY,"processSlotTX %d.%d => slot type %d\n",proc->frame_tx,proc->nr_slot_tx,tx_slot_type); if (tx_slot_type == NR_UPLINK_SLOT || tx_slot_type == NR_MIXED_SLOT){ // trigger L2 to run ue_scheduler thru IF module @@ -713,7 +714,8 @@ void processSlotRX(void *arg) { LOG_D(PHY, "Sending Uplink data \n"); nr_ue_pusch_common_procedures(UE, proc->nr_slot_tx, - &UE->frame_parms,1); + &UE->frame_parms, + UE->frame_parms.nb_antennas_tx); } if (UE->UE_mode[gNB_id] > NOT_SYNCHED && UE->UE_mode[gNB_id] < PUSCH) { @@ -1107,8 +1109,10 @@ void init_NR_UE_threads(int nb_inst) { LOG_I(PHY,"Intializing UE Threads for instance %d (%p,%p)...\n",inst,PHY_vars_UE_g[inst],PHY_vars_UE_g[inst][0]); threadCreate(&threads[inst], UE_thread, (void *)UE, "UEthread", -1, OAI_PRIORITY_RT_MAX); - pthread_t stat_pthread; - threadCreate(&stat_pthread, nrL1_UE_stats_thread, UE, "L1_UE_stats", -1, OAI_PRIORITY_RT_LOW); + if (!IS_SOFTMODEM_NOSTATS_BIT) { + pthread_t stat_pthread; + threadCreate(&stat_pthread, nrL1_UE_stats_thread, UE, "L1_UE_stats", -1, OAI_PRIORITY_RT_LOW); + } } } diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index b418fc9e90d..cb848a76cdf 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -261,13 +261,11 @@ void init_tpools(uint8_t nun_dlsch_threads) { } static void get_options(void) { - nrUE_params.ofdm_offset_divisor = 8; paramdef_t cmdline_params[] =CMDLINE_NRUEPARAMS_DESC ; int numparams = sizeof(cmdline_params)/sizeof(paramdef_t); + config_get(cmdline_params,numparams,NULL); config_process_cmdline( cmdline_params,numparams,NULL); - - if (vcdflag > 0) ouput_vcd = 1; } @@ -319,8 +317,8 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){ UE->rf_map.card = card_offset; UE->rf_map.chain = CC_id + chain_offset; - LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan_carrier %d, UE_no_timing_correction %d \n, do_prb_interpolation %d\n", - UE->mode, UE->UE_fo_compensation, UE->UE_scan_carrier, UE->no_timing_correction, UE->prb_interpolation); + LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan_carrier %d, UE_no_timing_correction %d \n, chest-freq %d\n", + UE->mode, UE->UE_fo_compensation, UE->UE_scan_carrier, UE->no_timing_correction, UE->chest_freq); // Set FP variables @@ -332,6 +330,7 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){ LOG_I(PHY, "Set UE nb_rx_antenna %d, nb_tx_antenna %d, threequarter_fs %d, ssb_start_subcarrier %d\n", fp->nb_antennas_rx, fp->nb_antennas_tx, fp->threequarter_fs, fp->ssb_start_subcarrier); fp->ofdm_offset_divisor = nrUE_params.ofdm_offset_divisor; + UE->max_ldpc_iterations = nrUE_params.max_ldpc_iterations; } @@ -356,6 +355,7 @@ void init_openair0(void) { openair0_cfg[card].num_rb_dl = frame_parms->N_RB_DL; openair0_cfg[card].clock_source = get_softmodem_params()->clock_source; openair0_cfg[card].time_source = get_softmodem_params()->timing_source; + openair0_cfg[card].tune_offset = get_softmodem_params()->tune_offset; openair0_cfg[card].tx_num_channels = min(4, frame_parms->nb_antennas_tx); openair0_cfg[card].rx_num_channels = min(4, frame_parms->nb_antennas_rx); diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h index 927d619c42f..a25d9cf5cff 100644 --- a/executables/nr-uesoftmodem.h +++ b/executables/nr-uesoftmodem.h @@ -7,10 +7,11 @@ -#define CONFIG_HLP_IF_FREQ "IF frequency for RF, if needed" -#define CONFIG_HLP_IF_FREQ_OFF "UL IF frequency offset for RF, if needed" +#define CONFIG_HLP_IF_FREQ "IF frequency for RF, if needed\n" +#define CONFIG_HLP_IF_FREQ_OFF "UL IF frequency offset for RF, if needed\n" #define CONFIG_HLP_DLSCH_PARA "number of threads for dlsch processing 0 for no parallelization\n" #define CONFIG_HLP_OFFSET_DIV "Divisor for computing OFDM symbol offset in Rx chain (num samples in CP/<the value>). Default value is 8. To set the sample offset to 0, set this value ~ 10e6\n" +#define CONFIG_HLP_MAX_LDPC_ITERATIONS "Maximum LDPC decoder iterations\n" /***************************************************************************************************************************************/ /* command line options definitions, CMDLINE_XXXX_DESC macros are used to initialize paramdef_t arrays which are then used as argument when calling config_get or config_getlist functions */ @@ -32,8 +33,9 @@ {"tx_subdev", CONFIG_HLP_USRP_ARGS, 0, strptr:(char **)&tx_subdev, defstrval:"", TYPE_STRING, 0}, \ {"rx_subdev", CONFIG_HLP_USRP_ARGS, 0, strptr:(char **)&rx_subdev, defstrval:"", TYPE_STRING, 0}, \ {"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:1, TYPE_INT, 0}, \ - {"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, iptr:(int32_t *)&nrUE_params.nr_dlsch_parallel, defintval:0, TYPE_UINT8, 0}, \ - {"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, uptr:(uint32_t *)&nrUE_params.ofdm_offset_divisor, defuintval:UINT_MAX, TYPE_UINT32, 0}, \ + {"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, u8ptr:&nrUE_params.nr_dlsch_parallel, defintval:0, TYPE_UINT8, 0}, \ + {"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, uptr:&nrUE_params.ofdm_offset_divisor, defuintval:8, TYPE_UINT32, 0}, \ + {"max-ldpc-iterations", CONFIG_HLP_MAX_LDPC_ITERATIONS, 0, u8ptr:&nrUE_params.max_ldpc_iterations, defuintval:5, TYPE_UINT8, 0}, \ {"nr-dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&nr_dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \ {"V" , CONFIG_HLP_VCD, PARAMFLAG_BOOL, iptr:&vcdflag, defintval:0, TYPE_INT, 0}, \ {"uecap_file", CONFIG_HLP_UECAP_FILE, 0, strptr:(char **)&uecap_file, defstrval:"./uecap.xml", TYPE_STRING, 0}, \ @@ -69,7 +71,8 @@ {"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, iptr:&tddflag, defintval:0, TYPE_INT, 0}, \ {"if_freq" , CONFIG_HLP_IF_FREQ, 0, u64ptr:&(UE->if_freq), defuintval:0, TYPE_UINT64,0}, \ {"if_freq_off" , CONFIG_HLP_IF_FREQ_OFF, 0, iptr:&(UE->if_freq_off), defuintval:0, TYPE_INT, 0}, \ - {"do-prb-interpolation", CONFIG_HLP_PRBINTER, PARAMFLAG_BOOL, iptr:&(UE->prb_interpolation), defintval:0, TYPE_INT, 0}, \ + {"chest-freq", CONFIG_HLP_CHESTFREQ, 0, iptr:&(UE->chest_freq), defintval:0, TYPE_INT, 0}, \ + {"chest-time", CONFIG_HLP_CHESTTIME, 0, iptr:&(UE->chest_time), defintval:0, TYPE_INT, 0}, \ {"ue-timing-correction-disable", CONFIG_HLP_DISABLETIMECORR, PARAMFLAG_BOOL, iptr:&(UE->no_timing_correction), defintval:0, TYPE_INT, 0}, \ } @@ -78,6 +81,7 @@ typedef struct { uint64_t optmask; //mask to store boolean config options uint32_t ofdm_offset_divisor; // Divisor for sample offset computation for each OFDM symbol uint8_t nr_dlsch_parallel; // number of threads for dlsch decoding, 0 means no parallelization + uint8_t max_ldpc_iterations; // number of maximum LDPC iterations tpool_t Tpool; // thread pool } nrUE_params_t; extern uint64_t get_nrUE_optmask(void); diff --git a/executables/softmodem-common.c b/executables/softmodem-common.c index c78fc70243c..bf30cab847e 100644 --- a/executables/softmodem-common.c +++ b/executables/softmodem-common.c @@ -85,6 +85,7 @@ char *get_softmodem_function(uint64_t *sofmodemfunc_mask_ptr) { } void get_common_options(uint32_t execmask) { + int32_t stats_disabled = 0; uint32_t online_log_messages=0; uint32_t glog_level=0 ; uint32_t start_telnetsrv = 0, start_telnetclt = 0; @@ -149,6 +150,8 @@ void get_common_options(uint32_t execmask) { if(worker_config != NULL) set_worker_conf(worker_config); nfapi_setmode(nfapi_mode); + if (stats_disabled) + set_softmodem_optmask(SOFTMODEM_NOSTATS_BIT); } void softmodem_printresources(int sig, telnet_printfunc_t pf) { struct rusage usage; diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index eb0c1a54f74..a2ba6802346 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -60,6 +60,7 @@ extern "C" #define CONFIG_HLP_DMRSSYNC "tells RU to insert DMRS in subframe 1 slot 0" #define CONFIG_HLP_CLK "tells hardware to use a clock reference (0:internal, 1:external, 2:gpsdo)\n" #define CONFIG_HLP_TME "tells hardware to use a time reference (0:internal, 1:external, 2:gpsdo)\n" +#define CONFIG_HLP_TUNE_OFFSET "LO tuning offset to use in Hz\n" #define CONFIG_HLP_USIM "use XOR autentication algo in case of test usim mode\n" #define CONFIG_HLP_NOSNGLT "Disables single-thread mode in lte-softmodem\n" #define CONFIG_HLP_DLF "Set the downlink frequency for all component carriers\n" @@ -71,7 +72,8 @@ extern "C" #define CONFIG_HLP_DLMCS "Set the maximum downlink MCS\n" #define CONFIG_HLP_STMON "Enable processing timing measurement of lte softmodem on per subframe basis \n" #define CONFIG_HLP_256QAM "Use the 256 QAM mcs table for PDSCH\n" -#define CONFIG_HLP_PRBINTER "Do PRB based averaging of channel estimates. Frequency domain linear interpolation by default\n" +#define CONFIG_HLP_CHESTFREQ "Set channel estimation type in frequency domain. 0-Linear interpolation (default). 1-PRB based averaging of channel estimates in frequency. \n" +#define CONFIG_HLP_CHESTTIME "Set channel estimation type in time domain. 0-Symbols take estimates of the last preceding DMRS symbol (default). 1-Symbol based averaging of channel estimates in time. \n" #define CONFIG_HLP_NONSTOP "Go back to frame sync mode after 100 consecutive PBCH failures\n" //#define CONFIG_HLP_NUMUES "Set the number of UEs for the emulation" @@ -99,6 +101,7 @@ extern "C" #define CONFIG_HLP_NFAPI "Change the nFAPI mode for NR\n" #define CONFIG_L1_EMULATOR "Run in L1 emulated mode (disable PHY layer)\n" #define CONFIG_HLP_CONTINUOUS_TX "perform continuous transmission, even in TDD mode (to work around USRP issues)\n" +#define CONFIG_HLP_STATS_DISABLE "disable globally the stats generation and persistence" /*-----------------------------------------------------------------------------------------------------------------------------------------------------*/ /* command line parameters common to eNodeB and UE */ @@ -118,9 +121,11 @@ extern "C" #define EMULATE_RF softmodem_params.emulate_rf #define CLOCK_SOURCE softmodem_params.clock_source #define TIMING_SOURCE softmodem_params.timing_source +#define TUNE_OFFSET softmodem_params.tune_offset #define SEND_DMRSSYNC softmodem_params.send_dmrs_sync #define USIM_TEST softmodem_params.usim_test -#define PRB_INTERPOLATION softmodem_params.prb_interpolation +#define CHEST_FREQ softmodem_params.chest_freq +#define CHEST_TIME softmodem_params.chest_time #define NFAPI softmodem_params.nfapi #define NSA softmodem_params.nsa #define NODE_NUMBER softmodem_params.node_number @@ -141,6 +146,7 @@ extern int usrp_tx_thread; {"usim-test", CONFIG_HLP_USIM, PARAMFLAG_BOOL, u8ptr:&USIM_TEST, defintval:0, TYPE_UINT8, 0}, \ {"clock-source", CONFIG_HLP_CLK, 0, uptr:&CLOCK_SOURCE, defintval:0, TYPE_UINT, 0}, \ {"time-source", CONFIG_HLP_TME, 0, uptr:&TIMING_SOURCE, defintval:0, TYPE_UINT, 0}, \ + {"tune-offset", CONFIG_HLP_TUNE_OFFSET, 0, dblptr:&TUNE_OFFSET, defintval:0, TYPE_DOUBLE, 0}, \ {"wait-for-sync", NULL, PARAMFLAG_BOOL, iptr:&WAIT_FOR_SYNC, defintval:0, TYPE_INT, 0}, \ {"single-thread-enable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&SINGLE_THREAD_FLAG, defintval:0, TYPE_INT, 0}, \ {"C" , CONFIG_HLP_DLF, 0, u64ptr:&(downlink_frequency[0][0]), defuintval:0, TYPE_UINT64, 0}, \ @@ -157,14 +163,16 @@ extern int usrp_tx_thread; {"rfsim", CONFIG_HLP_RFSIM, PARAMFLAG_BOOL, uptr:&rfsim, defintval:0, TYPE_INT, 0}, \ {"nokrnmod", CONFIG_HLP_NOKRNMOD, PARAMFLAG_BOOL, uptr:&nokrnmod, defintval:0, TYPE_INT, 0}, \ {"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \ + {"chest-freq", CONFIG_HLP_CHESTFREQ, 0, iptr:&CHEST_FREQ, defintval:0, TYPE_INT, 0}, \ + {"chest-time", CONFIG_HLP_CHESTTIME, 0, iptr:&CHEST_TIME, defintval:0, TYPE_INT, 0}, \ {"nsa", CONFIG_HLP_NSA, PARAMFLAG_BOOL, iptr:&NSA, defintval:0, TYPE_INT, 0}, \ {"node-number", NULL, 0, u16ptr:&NODE_NUMBER, defuintval:0, TYPE_UINT16, 0}, \ {"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \ - {"do-prb-interpolation", CONFIG_HLP_PRBINTER, PARAMFLAG_BOOL, iptr:&PRB_INTERPOLATION, defintval:0, TYPE_INT, 0}, \ {"nfapi", CONFIG_HLP_NFAPI, 0, u8ptr:&nfapi_mode, defintval:0, TYPE_UINT8, 0}, \ {"non-stop", CONFIG_HLP_NONSTOP, PARAMFLAG_BOOL, iptr:&NON_STOP, defintval:0, TYPE_INT, 0}, \ {"emulate-l1", CONFIG_L1_EMULATOR, PARAMFLAG_BOOL, iptr:&EMULATE_L1, defintval:0, TYPE_INT, 0}, \ {"continuous-tx", CONFIG_HLP_CONTINUOUS_TX,PARAMFLAG_BOOL, iptr:&CONTINUOUS_TX, defintval:0, TYPE_INT, 0}, \ + {"disable-stats", CONFIG_HLP_STATS_DISABLE, PARAMFLAG_BOOL, iptr:&stats_disabled, defintval:0, TYPE_INT, 0}, \ } #define CONFIG_HLP_NSA "Enable NSA mode \n" @@ -203,6 +211,7 @@ extern int usrp_tx_thread; #define SOFTMODEM_NONBIOT_BIT (1<<2) #define SOFTMODEM_RFSIM_BIT (1<<10) #define SOFTMODEM_SIML1_BIT (1<<12) +#define SOFTMODEM_DLSIM_BIT (1<<13) #define SOFTMODEM_DOSCOPE_BIT (1<<15) #define SOFTMODEM_RECPLAY_BIT (1<<16) #define SOFTMODEM_TELNETCLT_BIT (1<<17) @@ -210,6 +219,7 @@ extern int usrp_tx_thread; #define SOFTMODEM_GNB_BIT (1<<21) #define SOFTMODEM_4GUE_BIT (1<<22) #define SOFTMODEM_5GUE_BIT (1<<23) +#define SOFTMODEM_NOSTATS_BIT (1<<24) #define SOFTMODEM_FUNC_BITS (SOFTMODEM_ENB_BIT | SOFTMODEM_GNB_BIT | SOFTMODEM_5GUE_BIT | SOFTMODEM_4GUE_BIT) #define MAPPING_SOFTMODEM_FUNCTIONS {{"enb",SOFTMODEM_ENB_BIT},{"gnb",SOFTMODEM_GNB_BIT},{"4Gue",SOFTMODEM_4GUE_BIT},{"5Gue",SOFTMODEM_5GUE_BIT}} @@ -219,6 +229,7 @@ extern int usrp_tx_thread; #define IS_SOFTMODEM_NONBIOT ( get_softmodem_optmask() & SOFTMODEM_NONBIOT_BIT) #define IS_SOFTMODEM_RFSIM ( get_softmodem_optmask() & SOFTMODEM_RFSIM_BIT) #define IS_SOFTMODEM_SIML1 ( get_softmodem_optmask() & SOFTMODEM_SIML1_BIT) +#define IS_SOFTMODEM_DLSIM ( get_softmodem_optmask() & SOFTMODEM_DLSIM_BIT) #define IS_SOFTMODEM_DOSCOPE ( get_softmodem_optmask() & SOFTMODEM_DOSCOPE_BIT) #define IS_SOFTMODEM_IQPLAYER ( get_softmodem_optmask() & SOFTMODEM_RECPLAY_BIT) #define IS_SOFTMODEM_TELNETCLT_BIT ( get_softmodem_optmask() & SOFTMODEM_TELNETCLT_BIT) @@ -226,6 +237,7 @@ extern int usrp_tx_thread; #define IS_SOFTMODEM_GNB_BIT ( get_softmodem_optmask() & SOFTMODEM_GNB_BIT) #define IS_SOFTMODEM_4GUE_BIT ( get_softmodem_optmask() & SOFTMODEM_4GUE_BIT) #define IS_SOFTMODEM_5GUE_BIT ( get_softmodem_optmask() & SOFTMODEM_5GUE_BIT) +#define IS_SOFTMODEM_NOSTATS_BIT ( get_softmodem_optmask() & SOFTMODEM_NOSTATS_BIT) typedef struct { uint64_t optmask; @@ -245,9 +257,12 @@ typedef struct { int band; uint32_t clock_source; uint32_t timing_source; + double tune_offset; int hw_timing_advance; uint32_t send_dmrs_sync; - int prb_interpolation; + int use_256qam_table; + int chest_time; + int chest_freq; uint8_t nfapi; int nsa; uint16_t node_number; diff --git a/ldpctest_BG_1_Zc_384_rate_1-3_block_length_8448_maxit_5.txt b/ldpctest_BG_1_Zc_384_rate_1-3_block_length_8448_maxit_5.txt new file mode 100644 index 00000000000..2983268dac4 --- /dev/null +++ b/ldpctest_BG_1_Zc_384_rate_1-3_block_length_8448_maxit_5.txt @@ -0,0 +1,64 @@ +SNR BLER BER UNCODED_BER ENCODER_MEAN ENCODER_STD ENCODER_MAX DECODER_TIME_MEAN DECODER_TIME_STD DECODER_TIME_MAX DECODER_ITER_MEAN DECODER_ITER_STD DECODER_ITER_MAX +-2.000000 1.000000 0.346185 0.258473 44.551218 31.688925 357.883903 217.655668 12.810778 326.852166 5.000000 0.000000 5 +-1.900000 1.000000 0.345395 0.256275 40.787109 4.190954 65.926488 215.687102 4.300128 230.585721 5.000000 0.000000 5 +-1.800000 1.000000 0.343100 0.253634 40.748628 3.912915 56.669470 215.314020 4.139156 227.806468 5.000000 0.000000 5 +-1.700000 1.000000 0.341806 0.250634 40.550845 3.347808 56.032851 216.839001 5.959734 244.483352 5.000000 0.000000 5 +-1.600000 1.000000 0.339245 0.248129 40.457158 3.735092 56.853508 215.747244 4.995522 242.867659 5.000000 0.000000 5 +-1.500000 1.000000 0.337230 0.245763 41.178595 4.297429 56.265874 215.785600 4.151781 227.795995 5.000000 0.000000 5 +-1.400000 1.000000 0.335131 0.243311 39.915221 2.739586 55.454917 216.866764 6.547848 251.528327 5.000000 0.000000 5 +-1.300000 1.000000 0.333085 0.240664 40.119215 3.044973 55.978253 216.208443 4.459816 228.810686 5.000000 0.000000 5 +-1.200000 1.000000 0.330664 0.238769 40.507713 2.998241 55.701876 215.868796 3.778455 226.049304 5.000000 0.000000 5 +-1.100000 1.000000 0.329130 0.235812 41.038895 4.522472 56.760814 215.654663 4.746822 236.021980 5.000000 0.000000 5 +-1.000000 1.000000 0.325980 0.233534 41.067622 4.626711 57.444142 215.260535 3.481966 225.512853 5.000000 0.000000 5 +-0.900000 1.000000 0.323823 0.230863 40.683316 3.689159 56.208182 215.560917 5.180017 243.603452 5.000000 0.000000 5 +-0.800000 1.000000 0.321004 0.228222 41.643513 4.717568 58.502452 215.630891 4.283475 238.574145 5.000000 0.000000 5 +-0.700000 1.000000 0.317983 0.225520 41.214547 3.941824 56.054211 215.910346 4.375081 227.444626 5.000000 0.000000 5 +-0.600000 1.000000 0.316243 0.222903 40.834442 4.370416 56.765508 215.153296 3.617927 226.280086 5.000000 0.000000 5 +-0.500000 1.000000 0.312886 0.220473 40.178174 4.185502 64.657291 219.647151 4.454154 236.473446 5.000000 0.000000 5 +-0.400000 1.000000 0.309757 0.217536 40.240385 3.172484 55.751563 217.761119 3.900779 228.757195 5.000000 0.000000 5 +-0.300000 1.000000 0.305464 0.215229 40.852271 3.761739 56.158869 217.830497 4.087453 230.237764 5.000000 0.000000 5 +-0.200000 1.000000 0.302919 0.212364 40.531166 3.688281 56.426841 217.657657 5.498697 253.516146 5.000000 0.000000 5 +-0.100000 1.000000 0.298246 0.209310 41.058364 4.140510 59.959571 217.519279 4.087389 228.768313 5.000000 0.000000 5 +0.000000 1.000000 0.294110 0.207107 40.436486 3.604369 55.788895 217.853044 4.012624 236.118036 5.000000 0.000000 5 +0.100000 1.000000 0.288139 0.204033 40.603738 4.045866 57.560760 217.046816 4.583841 244.429411 5.000000 0.000000 5 +0.200000 1.000000 0.285604 0.201954 40.494607 3.886199 59.431970 217.322824 4.080988 233.317513 5.000000 0.000000 5 +0.300000 1.000000 0.278478 0.198929 40.311327 3.452837 56.124657 217.319394 4.434358 232.534720 5.000000 0.000000 5 +0.400000 1.000000 0.270992 0.196299 40.649243 3.415612 56.204178 218.079445 4.990947 245.055337 5.000000 0.000000 5 +0.500000 1.000000 0.263944 0.193661 40.464299 3.622703 56.602842 218.555364 3.936432 229.481159 5.000000 0.000000 5 +0.600000 1.000000 0.256340 0.191194 40.200314 2.474984 53.432412 216.547260 3.695211 227.198078 5.000000 0.000000 5 +0.700000 1.000000 0.251578 0.188606 40.111945 3.029821 54.900896 216.581752 4.247622 237.358365 5.000000 0.000000 5 +0.800000 1.000000 0.234558 0.184742 39.533282 1.182169 42.753097 215.462335 2.960246 226.716604 5.000000 0.000000 5 +0.900000 1.000000 0.225915 0.182691 39.851294 1.108193 42.180342 216.404194 4.450720 228.482353 5.000000 0.000000 5 +1.000000 1.000000 0.216180 0.179994 40.721936 3.302539 56.032206 217.082196 4.599188 227.979232 5.000000 0.000000 5 +1.100000 1.000000 0.203481 0.177332 41.006217 3.798207 56.014901 216.204345 4.292145 227.297386 5.000000 0.000000 5 +1.200000 1.000000 0.188297 0.174121 40.739289 3.269948 56.653507 216.585873 6.250858 251.207034 5.000000 0.000000 5 +1.300000 1.000000 0.172624 0.171622 41.215540 4.783342 55.692883 215.885639 3.629370 226.473280 5.000000 0.000000 5 +1.400000 1.000000 0.156483 0.169110 40.289903 3.749338 56.290861 215.663761 4.176366 225.824735 5.000000 0.000000 5 +1.500000 1.000000 0.136293 0.165692 42.208932 6.070189 69.182665 216.390504 4.816283 235.417446 5.000000 0.000000 5 +1.600000 1.000000 0.125127 0.163325 40.890581 3.941185 56.491504 215.752348 4.426511 226.425984 5.000000 0.000000 5 +1.700000 1.000000 0.104593 0.159971 41.263557 4.128935 57.062514 217.284932 5.311288 249.647163 5.000000 0.000000 5 +1.800000 1.000000 0.091397 0.157460 40.273078 3.062810 55.546913 217.252505 6.331426 251.175692 5.000000 0.000000 5 +1.900000 1.000000 0.078256 0.154628 40.407489 3.419342 56.316166 216.967648 4.712664 245.093313 5.000000 0.000000 5 +2.000000 1.000000 0.065221 0.152571 40.660365 4.317854 57.537407 216.198346 4.991856 245.173269 5.000000 0.000000 5 +2.100000 1.000000 0.053694 0.148885 40.355654 4.062614 60.051963 215.797667 4.447252 236.221454 5.000000 0.000000 5 +2.200000 1.000000 0.042182 0.146229 40.613562 4.124655 56.201536 216.117304 4.060825 227.115987 5.000000 0.000000 5 +2.300000 1.000000 0.034334 0.143612 40.465884 3.541452 55.067611 215.575953 4.891719 244.546802 5.000000 0.000000 5 +2.400000 1.000000 0.026641 0.140869 41.074690 4.697458 61.619188 216.069185 4.700827 233.830937 5.000000 0.000000 5 +2.500000 1.000000 0.019976 0.138112 40.766971 4.274128 58.871741 215.761570 5.633731 249.753931 5.000000 0.000000 5 +2.600000 1.000000 0.012826 0.135122 40.559343 2.952804 54.017706 215.835161 4.039993 226.822103 5.000000 0.000000 5 +2.700000 1.000000 0.010550 0.132915 40.985193 3.330639 55.013950 215.975836 4.240744 227.040703 5.000000 0.000000 5 +2.800000 1.000000 0.007327 0.130133 39.778804 3.002485 56.610555 216.462786 7.082268 265.051418 5.000000 0.000000 5 +2.900000 1.000000 0.004038 0.126763 40.327795 3.934211 55.515352 215.982666 4.626198 230.696124 5.000000 0.000000 5 +3.000000 1.000000 0.003087 0.124336 40.337807 3.537021 55.101627 215.468662 4.177203 230.789145 5.000000 0.000000 5 +3.100000 1.000000 0.001576 0.121689 39.812195 3.116738 55.422687 215.797778 4.091192 225.897780 5.000000 0.000000 5 +3.200000 0.980000 0.001000 0.118928 39.853764 2.871322 56.405555 215.562722 4.187466 232.598421 5.000000 0.000000 5 +3.300000 0.960000 0.000623 0.116065 40.440328 3.580650 56.738889 216.165848 4.735158 240.329999 5.000000 0.000000 5 +3.400000 0.850000 0.000303 0.113505 40.974107 4.291544 56.280236 215.889562 4.448049 237.556780 5.000000 0.000000 5 +3.500000 0.690000 0.000152 0.111010 41.508631 4.251791 56.198873 216.740295 4.889693 242.922934 5.000000 0.000000 5 +3.600000 0.530000 0.000102 0.108493 40.065231 3.643794 57.120823 216.887338 5.242621 250.003843 5.000000 0.000000 5 +3.700000 0.320000 0.000043 0.105612 40.462159 4.162383 56.782173 216.465615 3.846314 227.022697 5.000000 0.000000 5 +3.800000 0.210000 0.000032 0.103084 42.192455 6.207380 64.648964 217.030913 4.482820 228.095918 5.000000 0.000000 5 +3.900000 0.110000 0.000013 0.100391 40.640286 3.715782 55.922914 217.726055 4.553212 236.362804 5.000000 0.000000 5 +4.000000 0.050000 0.000006 0.097518 40.437760 2.838308 54.764308 218.230040 4.309275 237.932625 5.000000 0.000000 5 +4.100000 0.020000 0.000002 0.095436 41.347934 4.608500 64.182062 217.408836 4.385757 228.219627 5.000000 0.000000 5 +4.200000 0.000000 0.000000 0.092396 40.782371 3.621708 55.984245 217.579878 4.102149 228.145363 5.000000 0.000000 5 diff --git a/nfapi/oai_integration/nfapi_vnf.c b/nfapi/oai_integration/nfapi_vnf.c index d13dc5d1c50..8cc1bda7828 100644 --- a/nfapi/oai_integration/nfapi_vnf.c +++ b/nfapi/oai_integration/nfapi_vnf.c @@ -217,7 +217,7 @@ void oai_create_enb(void) { } // This will cause phy_config_request to be installed. That will result in RRC configuring the PHY - // that will result in eNB->configured being set to TRUE. + // that will result in eNB->configured being set to true. // See we need to wait for that to happen otherwise the NFAPI message exchanges won't contain the right parameter values if (RC.eNB[0][0]->if_inst==0 || RC.eNB[0][0]->if_inst->PHY_config_req==0 || RC.eNB[0][0]->if_inst->schedule_response==0) { NFAPI_TRACE(NFAPI_TRACE_INFO, "RC.eNB[0][0]->if_inst->PHY_config_req is not installed - install it\n"); @@ -267,7 +267,7 @@ void oai_create_gnb(void) { // This will cause phy_config_request to be installed. That will result in RRC configuring the PHY - // that will result in gNB->configured being set to TRUE. + // that will result in gNB->configured being set to true. // See we need to wait for that to happen otherwise the NFAPI message exchanges won't contain the right parameter values if (RC.gNB[0]->if_inst==0 || RC.gNB[0]->if_inst->NR_PHY_config_req==0 || RC.gNB[0]->if_inst->NR_Schedule_response==0) { NFAPI_TRACE(NFAPI_TRACE_INFO, "RC.gNB[0][0]->if_inst->NR_PHY_config_req is not installed - install it\n"); diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h index 7fb42e566aa..6d40752a9aa 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h @@ -10,7 +10,8 @@ #define FAPI_NR_MAX_RA_OCCASION_PER_CSIRS 64 // Constants Defined in 38.213 #define FAPI_NR_MAX_CORESET_PER_BWP 3 -#define FAPI_NR_MAX_SS 10 +#define FAPI_NR_MAX_SS_PER_BWP 10 +#define FAPI_NR_MAX_SS FAPI_NR_MAX_SS_PER_BWP*NR_MAX_NUM_BWP /// RX_IND @@ -19,6 +20,7 @@ #define FAPI_NR_RX_PDU_TYPE_DLSCH 0x03 #define FAPI_NR_DCI_IND 0x04 #define FAPI_NR_RX_PDU_TYPE_RAR 0x05 +#define FAPI_NR_CSIRS_IND 0x06 #define FAPI_NR_SIBS_MASK_SIB1 0x1 diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h index 5f8a856028c..a28762d1ff0 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h @@ -36,9 +36,6 @@ */ - - - typedef struct { uint8_t uci_format; uint8_t uci_channel; @@ -50,7 +47,14 @@ typedef struct { uint32_t sr; } fapi_nr_uci_pdu_rel15_t; - +typedef struct { + uint32_t rsrp; + int rsrp_dBm; + uint8_t rank_indicator; + uint8_t i1; + uint8_t i2; + uint8_t cqi; +} fapi_nr_csirs_measurements_t; typedef struct { /// frequency_domain_resource; @@ -87,7 +91,7 @@ typedef struct { // N_CCE is L, or number of CCEs for DCI int N_CCE; uint8_t payloadSize; - uint8_t payloadBits[16]; + uint8_t payloadBits[16] __attribute__((aligned(16))); // will be cast as uint64 //fapi_nr_dci_pdu_rel15_t dci; } fapi_nr_dci_indication_pdu_t; @@ -130,6 +134,7 @@ typedef struct { fapi_nr_pdsch_pdu_t pdsch_pdu; fapi_nr_ssb_pdu_t ssb_pdu; fapi_nr_sib_pdu_t sib_pdu; + fapi_nr_csirs_measurements_t csirs_measurements; }; } fapi_nr_rx_indication_body_t; @@ -308,6 +313,7 @@ typedef struct uint8_t transform_precoding; uint16_t data_scrambling_id; uint8_t nrOfLayers; + uint8_t Tpmi; //DMRS uint16_t ul_dmrs_symb_pos; uint8_t dmrs_config_type; @@ -433,6 +439,9 @@ typedef struct { uint8_t mcs; uint8_t ndi; uint8_t rv; + uint16_t targetCodeRate; + uint8_t qamModOrder; + uint32_t TBS; uint8_t tb2_mcs; uint8_t tb2_ndi; uint8_t tb2_rv; @@ -464,6 +473,7 @@ typedef struct { uint8_t nEpreRatioOfPDSCHToPTRS; /// MCS table for this DLSCH uint8_t mcs_table; + uint32_t tbslbrm; uint8_t nscid; uint16_t dlDmrsScramblingId; uint16_t pduBitmap; @@ -476,20 +486,20 @@ typedef struct { typedef struct { - uint16_t bwp_size;// - uint16_t bwp_start;// - uint8_t subcarrier_spacing;// - uint8_t cyclic_prefix;// - uint16_t start_rb; - uint16_t nr_of_rbs; - uint8_t csi_type;//Value: 0:TRS 1:CSI-RS NZP 2:CSI-RS ZP - uint8_t row;//Row entry into the CSI Resource location table. [TS38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1] Value: 1-18 - uint16_t freq_domain;//Value: Up to the 12 LSBs, actual size is determined by the Row parameter - uint8_t symb_l0;//The time domain location l0 and firstOFDMSymbolInTimeDomain Value: 0->13 - uint8_t symb_l1;// - uint8_t cdm_type; - uint8_t freq_density;//The density field, p and comb offset (for dot5).0: dot5 (even RB), 1: dot5 (odd RB), 2: one, 3: three - uint16_t scramb_id;//ScramblingID of the CSI-RS [TS38.214, sec 5.2.2.3.1] Value: 0->1023 + uint8_t subcarrier_spacing; // subcarrierSpacing [3GPP TS 38.211, sec 4.2], Value:0->4 + uint8_t cyclic_prefix; // Cyclic prefix type [3GPP TS 38.211, sec 4.2], 0: Normal; 1: Extended + uint16_t start_rb; // PRB where this CSI resource starts related to common resource block #0 (CRB#0). Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSIFrequencyOccupation], Value: 0 ->274 + uint16_t nr_of_rbs; // Number of PRBs across which this CSI resource spans. Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSI-FrequencyOccupation], Value: 24 -> 276 + uint8_t csi_type; // CSI Type [3GPP TS 38.211, sec 7.4.1.5], Value: 0:TRS; 1:CSI-RS NZP; 2:CSI-RS ZP + uint8_t row; // Row entry into the CSI Resource location table. [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 1-18 + uint16_t freq_domain; // Bitmap defining the frequencyDomainAllocation [3GPP TS 38.211, sec 7.4.1.5.3] [3GPP TS 38.331 CSIResourceMapping], Value: Up to the 12 LSBs, actual size is determined by the Row parameter + uint8_t symb_l0; // The time domain location l0 and firstOFDMSymbolInTimeDomain [3GPP TS 38.211, sec 7.4.1.5.3], Value: 0->13 + uint8_t symb_l1; // The time domain location l1 and firstOFDMSymbolInTimeDomain2 [3GPP TS 38.211, sec 7.4.1.5.3], Value: 2->12 + uint8_t cdm_type; // The cdm-Type field [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: noCDM; 1: fd-CDM2; 2: cdm4-FD2-TD2; 3: cdm8-FD2-TD4 + uint8_t freq_density; // The density field, p and comb offset (for dot5). [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: dot5 (even RB); 1: dot5 (odd RB); 2: one; 3: three + uint16_t scramb_id; // ScramblingID of the CSI-RS [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->1023 + uint8_t power_control_offset; // Ratio of PDSCH EPRE to NZP CSI-RSEPRE [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->23 representing -8 to 15 dB in 1dB steps; 255: L1 is configured with ProfileSSS + uint8_t power_control_offset_ss; // Ratio of NZP CSI-RS EPRE to SSB/PBCH block EPRE [3GPP TS 38.214, sec 5.2.2.3.1], Values: 0: -3dB; 1: 0dB; 2: 3dB; 3: 6dB; 255: L1 is configured with ProfileSSS } fapi_nr_dl_config_csirs_pdu_rel15_t; diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h index c3a173758cc..3a7dd8d523d 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h @@ -738,7 +738,7 @@ typedef struct { // The total DCI length (in bits) including padding bits [TS38.212 sec 7.3.1] Range 0->DCI_PAYLOAD_BYTE_LEN*8 uint16_t PayloadSizeBits; // DCI payload, where the actual size is defined by PayloadSizeBits. The bit order is as following bit0-bit7 are mapped to first byte of MSB - LSB - uint8_t Payload[DCI_PAYLOAD_BYTE_LEN]; + uint8_t Payload[DCI_PAYLOAD_BYTE_LEN] __attribute__((aligned(32))); } nfapi_nr_dl_dci_pdu_t; @@ -776,6 +776,10 @@ typedef struct { nfapi_nr_dl_dci_pdu_t dci_pdu[MAX_DCI_CORESET]; } nfapi_nr_dl_tti_pdcch_pdu_rel15_t; +typedef struct { + uint32_t tbSizeLbrmBytes; +}nfapi_v3_pdsch_maintenance_parameters_t; + typedef struct { uint16_t pduBitmap; uint16_t rnti; @@ -854,6 +858,7 @@ typedef struct { uint8_t nEpreRatioOfPDSCHToPTRS; // Beamforming nfapi_nr_tx_precoding_and_beamforming_t precodingAndBeamforming; + nfapi_v3_pdsch_maintenance_parameters_t maintenance_parms_v3; }nfapi_nr_dl_tti_pdsch_pdu_rel15_t; @@ -920,32 +925,24 @@ typedef struct } nfapi_nr_dlsch_pdu_t; */ -//for csi-rs_pdu: - -//table 3-39 typedef struct { - uint16_t bwp_size;// - uint16_t bwp_start;// - uint8_t subcarrier_spacing;// - uint8_t cyclic_prefix;// - uint16_t start_rb; - uint16_t nr_of_rbs; - uint8_t csi_type;//Value: 0:TRS 1:CSI-RS NZP 2:CSI-RS ZP - uint8_t row;//Row entry into the CSI Resource location table. [TS38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1] Value: 1-18 - uint16_t freq_domain;//Value: Up to the 12 LSBs, actual size is determined by the Row parameter - uint8_t symb_l0;//The time domain location l0 and firstOFDMSymbolInTimeDomain Value: 0->13 - uint8_t symb_l1;// - uint8_t cdm_type; - uint8_t freq_density;//The density field, p and comb offset (for dot5).0: dot5 (even RB), 1: dot5 (odd RB), 2: one, 3: three - uint16_t scramb_id;//ScramblingID of the CSI-RS [TS38.214, sec 5.2.2.3.1] Value: 0->1023 - //tx power info - uint8_t power_control_offset;//Ratio of PDSCH EPRE to NZP CSI-RSEPRE Value :0->23 representing -8 to 15 dB in 1dB steps - uint8_t power_control_offset_ss;//Ratio of SSB/PBCH block EPRE to NZP CSI-RS EPRES 0: -3dB, 1: 0dB, 2: 3dB, 3: 6dB - + uint8_t subcarrier_spacing; // subcarrierSpacing [3GPP TS 38.211, sec 4.2], Value:0->4 + uint8_t cyclic_prefix; // Cyclic prefix type [3GPP TS 38.211, sec 4.2], 0: Normal; 1: Extended + uint16_t start_rb; // PRB where this CSI resource starts related to common resource block #0 (CRB#0). Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSIFrequencyOccupation], Value: 0 ->274 + uint16_t nr_of_rbs; // Number of PRBs across which this CSI resource spans. Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSI-FrequencyOccupation], Value: 24 -> 276 + uint8_t csi_type; // CSI Type [3GPP TS 38.211, sec 7.4.1.5], Value: 0:TRS; 1:CSI-RS NZP; 2:CSI-RS ZP + uint8_t row; // Row entry into the CSI Resource location table. [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 1-18 + uint16_t freq_domain; // Bitmap defining the frequencyDomainAllocation [3GPP TS 38.211, sec 7.4.1.5.3] [3GPP TS 38.331 CSIResourceMapping], Value: Up to the 12 LSBs, actual size is determined by the Row parameter + uint8_t symb_l0; // The time domain location l0 and firstOFDMSymbolInTimeDomain [3GPP TS 38.211, sec 7.4.1.5.3], Value: 0->13 + uint8_t symb_l1; // The time domain location l1 and firstOFDMSymbolInTimeDomain2 [3GPP TS 38.211, sec 7.4.1.5.3], Value: 2->12 + uint8_t cdm_type; // The cdm-Type field [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: noCDM; 1: fd-CDM2; 2: cdm4-FD2-TD2; 3: cdm8-FD2-TD4 + uint8_t freq_density; // The density field, p and comb offset (for dot5). [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: dot5 (even RB); 1: dot5 (odd RB); 2: one; 3: three + uint16_t scramb_id; // ScramblingID of the CSI-RS [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->1023 + uint8_t power_control_offset; // Ratio of PDSCH EPRE to NZP CSI-RSEPRE [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->23 representing -8 to 15 dB in 1dB steps; 255: L1 is configured with ProfileSSS + uint8_t power_control_offset_ss; // Ratio of NZP CSI-RS EPRE to SSB/PBCH block EPRE [3GPP TS 38.214, sec 5.2.2.3.1], Values: 0: -3dB; 1: 0dB; 2: 3dB; 3: 6dB; 255: L1 is configured with ProfileSSS } nfapi_nr_dl_tti_csi_rs_pdu_rel15_t; -//for ssb_pdu: typedef struct { @@ -1195,6 +1192,10 @@ typedef struct #define PUSCH_PDU_BITMAP_PUSCH_PTRS 0x4 #define PUSCH_PDU_BITMAP_DFTS_OFDM 0x8 +typedef struct { + uint32_t tbSizeLbrmBytes; +}nfapi_v3_pusch_maintenance_parameters_t; + typedef struct { uint16_t pdu_bit_map;//Bitmap indicating presence of optional PDUs (see above) @@ -1240,7 +1241,7 @@ typedef struct nfapi_nr_dfts_ofdm_t dfts_ofdm; //beamforming nfapi_nr_ul_beamforming_t beamforming; - + nfapi_v3_pdsch_maintenance_parameters_t maintenance_parms_v3; } nfapi_nr_pusch_pdu_t; //for pucch_pdu: @@ -1665,41 +1666,34 @@ typedef struct } nfapi_nr_uci_indication_t; -//3.4.10 srs_indication -//table 3-73 -typedef struct -{ - uint8_t rb_snr; -}nfapi_nr_srs_indication_reported_symbol_resource_block_t; +/// 5G PHY FAPI Specification: SRS indication - Section 3.4.10, Table 3-73 -typedef struct -{ - uint16_t num_rbs; +typedef struct { + uint8_t rb_snr; // SNR value in dB. Value: 0 -> 255 representing -64 dB to 63 dB with a step size 0.5 dB, 0xff will be set if this field is invalid. +} nfapi_nr_srs_indication_reported_symbol_resource_block_t; + +typedef struct { + uint16_t num_rbs; // Number of PRBs to be reported for this SRS PDU. Value: 0 -> 272. nfapi_nr_srs_indication_reported_symbol_resource_block_t* rb_list; -}nfapi_nr_srs_indication_reported_symbol_t; +} nfapi_nr_srs_indication_reported_symbol_t; -#define NFAPI_NR_SRS_IND_MAX_PDU 100 -typedef struct -{ - uint32_t handle; - uint16_t rnti; - uint16_t timing_advance; - uint8_t num_symbols; - uint8_t wide_band_snr; - uint8_t num_reported_symbols; +typedef struct { + uint32_t handle; // The handle passed to the PHY in the the UL_TTI.request SRS PDU. + uint16_t rnti; // The RNTI passed to the PHY in the UL_TTI.request SRS PDU. Value: 1 -> 65535. + uint16_t timing_advance; // Timing advance TA measured for the UE [TS 38.213, Section 4.2]. NTA_new = NTA_old + (TA − 31) * 16 * 64 / (2^u). Value: 0 -> 63. 0xffff should be set if this field is invalid. + uint8_t num_symbols; // Number of symbols for SRS. Value: 1 -> 4. If a PHY does not report for individual symbols then this parameter should be set to 1. + uint8_t wide_band_snr; // SNR value in dB measured within configured SRS bandwidth on each symbol. Value: 0 -> 255 representing -64 dB to 63 dB with a step size 0.5 dB. 0xff will be set if this field is invalid. + uint8_t num_reported_symbols; // Number of symbols reported in this message. This allows PHY to report individual symbols or aggregated symbols where this field will be set to 1. Value: 1 -> 4. nfapi_nr_srs_indication_reported_symbol_t* reported_symbol_list; +} nfapi_nr_srs_indication_pdu_t; -}nfapi_nr_srs_indication_pdu_t; - -typedef struct -{ +typedef struct { nfapi_p7_message_header_t header; - uint16_t sfn; - uint16_t slot; - uint8_t number_of_pdus; + uint16_t sfn; // SFN. Value: 0 -> 1023 + uint16_t slot; // Slot. Value: 0 -> 159 + uint8_t number_of_pdus; // Number of PDUs included in this message. Value: 0 -> 255 nfapi_nr_srs_indication_pdu_t* pdu_list; - } nfapi_nr_srs_indication_t; diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c index 3adde23e7da..98f89f599c8 100644 --- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c +++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c @@ -200,8 +200,6 @@ static uint8_t pack_tpm_value(nfapi_dl_config_dci_dl_tpm_t *value, uint8_t **ppW static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) { nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv; return( - push16(value->bwp_size, ppWritePackedMsg, end) && - push16(value->bwp_start, ppWritePackedMsg, end) && push8(value->subcarrier_spacing, ppWritePackedMsg, end) && push8(value->cyclic_prefix, ppWritePackedMsg, end) && push16(value->start_rb, ppWritePackedMsg, end) && @@ -3663,8 +3661,6 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) { nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv; return( - pull16(ppReadPackedMsg, &value->bwp_size, end) && - pull16(ppReadPackedMsg, &value->bwp_start, end) && pull8(ppReadPackedMsg, &value->subcarrier_spacing, end) && pull8(ppReadPackedMsg, &value->cyclic_prefix, end) && pull16(ppReadPackedMsg, &value->start_rb, end) && diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c index 264b25deca4..af02a160547 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c @@ -814,7 +814,7 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y, llr_t *s1,*s2,*yp1,*yp2,*yp; unsigned int i,j,iind;//,pi; unsigned char iteration_cnt=0; - unsigned int crc,oldcrc,crc_len; + unsigned int crc, crc_len; uint8_t temp; #if defined(__x86_64__) || defined(__i386__) __m128i *yp128; @@ -1233,8 +1233,8 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y, } // check the CRC - oldcrc= *((unsigned int *)(&decoded_bytes[(n>>3)-crc_len])); - + uint32_t oldcrc; + memcpy(&oldcrc, &decoded_bytes[(n >> 3) - crc_len], crc_len); switch (crc_type) { case CRC24_A: oldcrc&=0x00ffffff; diff --git a/openair1/PHY/CODING/coding_defs.h b/openair1/PHY/CODING/coding_defs.h index 8fe31f208ea..1854f28fa78 100644 --- a/openair1/PHY/CODING/coding_defs.h +++ b/openair1/PHY/CODING/coding_defs.h @@ -38,7 +38,6 @@ #define MAX_TURBO_ITERATIONS_MBSFN 8 #define MAX_TURBO_ITERATIONS max_turbo_iterations -#define MAX_LDPC_ITERATIONS 5 #define MAX_LDPC_ITERATIONS_MBSFN 4 #define LTE_NULL 2 @@ -469,28 +468,11 @@ int32_t nr_segmentation(unsigned char *input_buffer, unsigned int *F, uint8_t BG); -/*!\fn uint32_t nr_compute_tbs -\brief This function returns the TBS in bits as per 6.1.4.2 of TS 38.214 -*/ -uint32_t nr_compute_tbs(uint16_t Qm, - uint16_t R, - uint16_t nb_rb, - uint16_t nb_symb_sch, - uint16_t nb_dmrs_prb, - uint16_t nb_rb_oh, - uint8_t tb_scaling, - uint8_t Nl); - -uint32_t nr_compute_tbslbrm(uint16_t table, - uint16_t nb_rb, - uint8_t Nl); - void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f); void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f); -int nr_rate_matching_ldpc(uint8_t Ilbrm, - uint32_t Tbslbrm, +int nr_rate_matching_ldpc(uint32_t Tbslbrm, uint8_t BG, uint16_t Z, uint8_t *w, @@ -501,8 +483,7 @@ int nr_rate_matching_ldpc(uint8_t Ilbrm, uint8_t rvidx, uint32_t E); -int nr_rate_matching_ldpc_rx(uint8_t Ilbrm, - uint32_t Tbslbrm, +int nr_rate_matching_ldpc_rx(uint32_t Tbslbrm, uint8_t BG, uint16_t Z, int16_t *w, diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c index 9ad18cc1a63..471b26fe243 100644 --- a/openair1/PHY/CODING/crc_byte.c +++ b/openair1/PHY/CODING/crc_byte.c @@ -244,11 +244,11 @@ crc16 (unsigned char * inptr, int bitlen) while (octetlen-- > 0) { - crc = (crc << 8) ^ (crc16Table[(*inptr++) ^ (crc >> 24)] << 16); + crc = (crc << 8) ^ (((uint32_t)crc16Table[(*inptr++) ^ (crc >> 24)]) << 16); } if (resbit > 0) - crc = (crc << resbit) ^ (crc16Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))] << 16); + crc = (crc << resbit) ^ (((uint32_t)crc16Table[(*inptr) >> (8 - resbit) ^ (crc >> (32 - resbit))]) << 16); return crc; } diff --git a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/logo.png b/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/logo.png deleted file mode 100644 index 7b785ca0517c0aa7467aafebff9255b2bdf0b8ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3723 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 HwF&(n?xrWN diff --git a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.pdf b/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.pdf deleted file mode 100644 index 590dab5ce26bd9181db6f61c649842e44aefd922..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281923 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	GagC|@)ta)gIj7U%wF8#gy^XmDKS9qaY&Z<?g z=s~hcVfQ)D=&gY{l~TVaM61=b*YMcu^%-YqG<d?DK)Ib1d_R-6GQrq=o;8*hZm|`8 z!Gn0iZ(5x7XX&8k<k1f+_m0xY)v9fk_8AzD#23qCaqbh=DkSgP<Qvpj<cYOG&eSU! zWT0mbUD5P$-Pkpoz_s&bF*G%<R*+K%m!5^FZ#_9nP*QZl9phl{(K$6TVEKgWs&yxJ ztG}qkYIz!!#a?~EF3B%;5oQn6M--cuuHC0<X`FImr*WpS{%@fLWdtnJ(B+?%2}%NT zG)5{BC&xh6X1gg?{$^(tnZYsB**0|*9t-Xy?q0*+@XqB+eA@Di`U9opVW#()9ch%d zGxu|yQY>#)4nPESfu(Cx&M-MO>zkYJ=5o;6`{spZ4(+PaQO@vDljAdOiVRtPH9pIF zE+&L}BNdf}N@D^<Bn;T9@Z=bRmn5hDyUx-`06hbSek-cC!A2Qln|YYfZ4Vfxjf_01 zScYpr3~)jPZgj37qMtt)<dqWT%PB;j|E%!q<zy{BHcV7!{X@*w!dOttJdNf!TI0w> zYTq8lR}*Tnb=5hhO|TZ=v#+}K=E!qV$&9kwMN_KT(T?_F>TY=1uJ03n9Xp@1DyvX- zslgc1f6ArR)bK30iho0#2UDhGk~gfiak~%@gUh-!ZqWr|r)Vb4DL)j1MB9Oktnl|7 z3>GZOZpJER9Zir{0B;aV!@SVLEfka%GTvky?$Ag1A(yKLF-k-V>tam#uUH(0*k=h+ zZthVpln1(*eK+g9Pbp?;9_2i0d^7LXMk(s9j_+>A>5dk%@pC@qI8RnQM1@_QtFl5E zfiHn_@amPNU@dfGL<y86AeH-sjRu1k82bqK1HxVZ1x1qZM8(Qwk{518#(CBE=y#xl z=^FDK(eFJM@|+zw3YIJGU6>LZ20ERRPTOVEA$5jXuqZ0R8uA!-S}1&_bPO%gkO2QS zR<o;4594u5BCaAB4V0n4g0ICG<-pFOe;`@W?=QB&v6o7unAWO?*bwr0g6`m;VEfyv z`QSVxVF>$Mguo!D42zSx^{m{?D{jdwy;;tw)y)pRcybbH=#8OD_=&A3zZG*OaB7GY z1`@#jo=iqdoo%P#R5Fa(;ee2lEWP)8!ZH2@rfxm`1A50i@<G>%<wI}}5Hn%m;C@49 zV69SB6qg8#&uce=87sFZmYc{zT=b3~iCqT$xSARI0I*AXQo?bn;SEmW9^KkH@6yE+ z<5;~+ZIb1phMlRY0S0Z%7Aj1x$ZpMTx|Mjdhky`rO4sicgyU60XR<-4a0G-dWcFGX z!9HRBjM-?4DJk+JR?t+aiOnznsm$$a@AOkGV@mhlN}3OX1J_eUAJa~=Xg)T+`MJ;V ziA}hZLt6uEnkcq2NrDQbXXTV?@FRR&!mcrtim#3Vj5`hz+dg{7%Yj07b0F!Lu12&V z*$g;X2PLT?+aWN6iAPUo7}pjWSJ47~=(`k+8n3-88Q*h6ycM}J9Ca|W`}0+y>=&Kq zKEhgOneI;Jx78~%eM0sp_8N}L3HkKqpnBrFif-e%ngtR%-NkD(m6A!lo2W}vn6Bp= zo5;Zby>d;1<Daync4H4f@0s1Rb3XR+cu*MU=hFs?tD83>Jdb+?6%no*xkZ!5;Q~PD z93<#H=~|vA5|`%bt}^d7@Ga1_EnHHWIvU56Xj9~Z*G)>j>notDt_4%R^WEdB69&J2 z&nLw9!#3yaV^5>EWPu?R2lJ5E!ti?9*SlerISo9L=AkU8VU!JfGi~ugZbQoOt%p=Q zSB`=>kh@M|!YC7|ENvaKD3da?ofsgUdD#c*N#%mN2Z(KnU9CtD3JD%8Mib`X4R+!) z3_YC;zlCYUn6(V2eZ?nc6D)v59&ty?s9{yBR<{H^nFvP+T}@)sl)|;k1D1VstC)V7 zBu?q`Px-_xxjY~H@)j+yUY>7OTWZ-Bca`cbznV(QrZjt=SRkHr<Y9jSs|gXEfwR57 znFyBqqrsY??i==^OHL8jsSW6vx)VYD>9JVff}%r7BF*h#yT5f6kGT#d*6w2vir2M_ z#x5F_oKzlp<adMTkVtLGGdxk3xJz7hHT)kT;QH6BuM(OW(YktU2Cnk>Moa~3!lH+O zf-ih9HqobiUYL?;OOBq8k!e^F5!G@?{~W^CdQ!O&!GN9&<C-<zrJ>rseMVlg&2xGc zcYb~|ms-+PI9f^wHOI2~U#_%~P2BM~g>!?+PF4gkBMVBzs3w{^xO1^!_;(%&Fvp>| z2n>jmrDoooTh&@u9{l$zE#Oz8O=IdrX`|lKSK<o<OmDftVJ`{-htar+*1mRe#InmP z@IR()Qc9L&F}n%MP%ZmAJz`bOnFn_D%?{kJ$Wof}+67b{K_VeBHe}k|nF2XH1y>%@ zI<r9d37+XNzm<yE`V>%f9glpb#9S}5+^5%^w7iGMsFeC~i$x`~<=gu&{WQ`eQu_>6 zg{|h3cH5rKJ7`c#GO38qE<S+E6|QrOwOg`N(B?Ab6-L%#qO;&sYv(Sh&+^{S&@J5F za(mibit2jwtr;DCDOgQ=+CGoICzx-I6hiP+L$-M>sWxP*D@M=5tK+Hwt7!_$=-VZl zyVMzZz+)n4;D%Ru==&yyhwchyTO9jHLOtnzAiBa&sa6-(Qup@xvBA?T&UBH*3(Z+7 z*)ZW$nRMbXeie>I=1QO3QGo?8DK-b7l#vUQ?Um-X9wJ?Eh0!C38#a~m+%vuHR1I>X z3Q9WL1Ox2)TZZb8Ud>iKhVLtHH-_-G^Hd^!ad+F=&41&zV_<T1K<s|$Zh_cfErel$ z#6{5Yra(fthJx5u7Td6*pIjR=>ym(3lPLdkF=|m1$9TFBi5y_Pt+SeQHza+}c)p`C zAjO@jLF)}h8pkFe8j82E)U6e6#OLhBQzsgQrjw;@=nRRikP^uUB|H-j#{rhVnxTh_ zvgR87k<8s4yWF|x7BE|}B0L;{kjt(TXt3#~%)T{V+Z_F!qVH;^(FmW$<5iWaB7=gd zF-{?8HRW#SA|W1aMN-#l>UO={|2nccm??!%e5H+>tA&Mz4+^_@AMcSSjk+*-cuq+v z9M3H{Hz%?dGg*77aKb?xwdo;kO($#T$;0a5fQ+fs`|PQi8|Y}pGJ3IUuXYn?`M~i> z)B~!NFeKISiZa)qbW)p0j<^3_dg99hg6}sLcS_MihT-$A`&cRX%^f)_+sNh)1vav} zIUW^$OT2MtZsNvn9?!CZ@_vZoD6T4<t7-+94>7)K5=kzL>;B_oM}PNa0lDNCgL>}3 z=oo+_V#4^^I9>lC?4$t)S#?MI?$>pY@`I_Js<VJNAzDJf9iIEi#3dzGy|EY4vh%r> z$Yf`@b_p}>eas9DLT4UHLNcMkpJkOYyvean*TrG8#j`R!(xi7nG5J|HTpQDvmd3lZ zz+|W3d}pur`{fBXW7aRJJV9Az=|4vq;En$86^rek*S0jcbp*N5JWuyIu_;*4K~(n* z6zEzj5}i4GIYw{Hk>g}%aGle|wKb0R2q#Uih9RlPJ`_v-yQKOL=@uh~@&_s7qce)l z^q-RG@BSCW(`ME`4%!(4z%i|Qi~G3gM9A~jilr3XrfeIjA#Jp;*FP0ryxrF91^|8s zsMHIs7?JVJ4Ci7SBPKU36>VtD2v0W4ZKFMfp|U+rp$wpNj}yU)TNCBy#-%RDmWmp& z<`c}{A*+{<UZ;GOl}dzgbR?xQr+;2_p;?sDtc)-XRY`R7(+Z|1^=G2UOs=FSSks4< zrA&qzov@0G;=j&-HfH+Pau6!N$69)HdqDEl^6WH!8Ry0OeqWjwawBJ2>hC_212>I^ z8E2yn;Og-B79o6|kl~FLi`C6tQn4HYAW;&&%d3U1o?MS)nD*Hp&(aKRHgcR*Bi`lh z!7p1cyfP;u{K3)2Ro!$<5|TfBSuaBX24MCp&1VB2X(L?C)N(UeGORv~;e|a9yR%km z_B^^XujQ+ST*4q-<KA21ge&1>ck3Q9mSUV3<4C~+gXPkM#S7d76`4#nzJ|7j0~*HY z2;HjA?3pns!Sti<0vU)VD=f%BY+m_2i_mN}I?2R5*XrEP`0CQiMFxcnq%`_YKK04N z`nVxO+1gX=qR`FiU>|&ooHUgF?MsR8^!xG=0j$HH)SG_0#0|>ImT?}x+m1Q!(BI+j zO_Dnn^x_+D$EwO%FRi|uV9eGHM>be+4`su74l^o<l)j`F`D5mqa-Pp>OIcfPeT%zX z)&46c$oEm_!ICpQ>Oq&pV)*rql8zTErdye)KxVmM?*@JVDmNFIE0|d&gY^7_ptYyi z(~lVzblOB^PLieiYsQx}2yiLmiNq7qZb*SgUBr{`(a3QP7Vij~Oyb{ehPQ(fsVMUI z{U|V4@O^^i4e7a3n%G%yH$AaaL%fY<p5#RP!HG(2U(NE!3^s2u75d}9Y3^PoNv42_ zOYW7RzucMaR9;#bCZB=}8|T8-Tvqa4$EVuN=&oya?3;y`+gggBpfxs>o&>uFh_b3^ z;hRImn6wOVagi4B>ef6dmLxd#J)?Xw4#Uu!tA7scF9<nINK%VjNJ@yx)09bu*JV|9 z%y1@Vce?Py*+M>e3G8B0>_SVVfqRMK@M?f;vbwnzu8#P&Ja)lc2Z(YZVx{9i|19O% z3kpQ#<l=g41TBr10W`(V$l9Md+@sjJ9n#=@_K~Bu0Wp5}uW|BLU#P|VXLl*h3zRSJ z4L%tfqum3(Flt)(M*g&NJp`|Q?N==xx-6sPn#X=JZ!aO--n&>|W0K!%xZ~*!`gP!n zNnk1F+V3kn&I1&&S$>f8Dq?!f4#w=6>|2s%{DR$Xnh5-uX?5lq)hMG4jk3x#1ftp_ zu6pUF)xm%wHheDO64v4}VKA)&A~w9PkEZO-BJBD!C%L64-J(WRZqJ?#(M0LS%`bEA z0xL`ee31}d!gsMK6I4sa44+FpGx1_xWUwqcQ%J#O5B3PG;pW(w01pUXMm*I3G3oiJ zq`i>x0!S)e0ZIR58(~TNcs8+%!KVLg%3fMP-GI<Wfd~+qEH{h^CrtzcA0B0L`^o>7 zvI7G013W{t-%m&Zl8v7DK0D>u`s1keGkT*E+z`BgT=_YUGJ@%eFdb<QmpKcxKHWI( zbVBgxShK4dH?YN;ys4Y;lTWbmZY<Z#imH170D$g;d3!;{hR4L&e;tJUbWR*nV~kDa z`ZzV#ISs=?vxhBq6|7<?i#Qqv8>A%ww0`M7^%Bw|rUsHLE=HEO;*Y?Y2yJQs0fTBn z@FfMvmmp9x6SS@4M=0qbkS>Sbdds;8G>2X_X$nrFwQ*6}+`*_McV$lqQr(*0Mwb(% z7D4v;{0Ms;BnunVK;?Ut-Wu#zM1PXoSm9+hg8%#mi*yRL%!r~SQa0q#;Eet_(e(EN z@;NxcE9Go~SqoCnxdS=D^9s?^4Bw}oouU>~w-weJ;c)w18pE*ZU&J9?q<M<YZdMGs zQ>Mdg@^LjuKvatz3D|*kJ!=9`|1pYy*$vtF4u|0dWb3Z-;=pRsL*%G5enEtN2uJs< zD4ooz=u`~Xgr)5r=WoQzwm9W(78GYnW8a{Cc_u|dr4?bwOYRa*r3zNrn0I>fk_x{v za^OVCCE{CZpXUf8eQ|HDQ|+zGLa;JIX45Nr&%hGZi4?;{eNGwzg;o9wS-Z8=SNJ=4 zLFaX8#Fj`1F!TCDENolTvJ<#0V?gmq6mq6NBbj9rg?=TFXYH`R1d?Lq>WMf|wbbdb zO+ste0WBT2nf@N|GwN}2FEyer%vd)s5J;~1)V7WJIYDV3j^`$o?hKaPj(Mx>{k>q| z;fg(U@ad%IqonPSqB$j19eQG1#PZ9F7Q8kqn-0lm(j4_<Y9dId@A}pJy6;ZVvH3NC z2K%5y>V4dK{>5P}KEYQY{PlYcSXlo&Ahqm6x@(PRX)QcvLU{-(lw91g#!t2Q)&rxU zwHKT8zFtpn^(yN`hPj|^n2CCE0=DD9oWQ^Zh}0y)+!~&O?1gCtiBsLv{YoWYOFCnU z>XHfEW=J1gqli(mEtRH(ap;MVVkpDIT8JRttZtGv);P*VFMwXLdR#j}JUc2XSxL{Y zWmnb+fImicQDsO$15WQpALV8>kymq>aHYM4zT2RS;A%{-aF+K%xvzijrR-4vMvKz! zjDv10?7jlEE!47h#irtbD<ka=LN)N6foMJg;*t*JV8mA&WPCfK03#3jhVDt?xZuGE zWF%dgq-V+@F57jNbtNN0Y=`~ypgz6|zszrrMje_7>>+}fM+n>JafpxRt*6s4El>YY zANV%PI(H-S;!UjZsOJ92lhRCFe7tU{P6L@@?zL;@cQy6E>%`!yw&H>w(2ZV&4h>CF zX16Q@sL}BRv%J*E0?(f(3+)`u#mQo2YLz||z9-J7#$L^pOyZDt02(|CqxGZfuP>cR zb|Lo-3NONfTD+aVW^yaRdHiEEN={+z@Rvc<j?O9r0p(`rR;Cx_VQk659^(B0cqZ_B zPK~$HGdCFok5|vQ?7S-{tUWFq<BF>3g1Gy2>%FDfjQ%t`#CV7>=$MaYC>h)%p+ciq zsX7Qtkn=f?Si#2iAq@7qa(K9w!=4S9VL5*G*a=k{s#WH_hIdF$eakAfUEI>zVNxRk zI-ki?Q+TOHf!J2^lNLe#KBf47DBuzb+hT}+Ce*KYL)AxV&_+4%ak*C&4|8p7C~G~J zDxm@!F!0=79aA$@iX{hs5k@b!r160}Mo8fmsFYfL7_>1nm0a>sd#?-xR0VWRF%jCX zOOpmTR_NlV<!Rqa`?i|P!#A_o$I}{agrx76$L@7HCELc`$>+1$IA<b!B`RWN5cczG z=hMt*kUzCgzLVy-NS6gAZ`cp-3XE}II7^p<Qn0TEG-hPb8^c9a>*@~FC+VL4f?R1= zOvQ8?^Zm*B$G)6)Ke`r7DoK#I@1BZ;td9kqsFm>;5WO22{LMY=BWc8_DVb)ph}tg# zoe{e;%lqj}+pX+`Zd>GWM<aTGV6)}BPBDS7^7f}#d*rYG-n*}0!jZ|dm;z&SEF)vG z@AInp9j4rj@i`j4w{gv`v&5hgVxQ=2l`HP5tU-!)njwFvF5_^?e~E5Ge7Eg%CymjT zNqw<hQHERAEci)k{TtPErr{~b`Xes=An{`wan|mS=ak+Yl6{w*&W`X<fl<ZkY$rHX zt=ugpzMkFSQgH{0Qe=FWm=U!w1$QF{9?9h3RVu{q-1GAdncy;)8c!SDK49Y#joj6T zm~GUy=9PYt)LsvE9%Ao4S>1`HtN$_@sLUP0q}M~MFM3#V20My2s`^^s^B4c{&RW9R z*REiAc8b{8k<V6}oo#D@WvpEg>6Nv)T#=2-<zw7xfeQ;%NAr^>>=&+CL!bOVQPph! ziK=F1<oGXknh~Fso%z3K{}ZZaV`pUhf8JVrC^}IKYiAQjd^%BU17{Oq6C*og6DVF@ zC?{t}69XG4_l+25Q01lV7gh=#%KN}RfQ5hE&)eHLjC}w?Q+@Qz5DO#}1Q6m<;!;El z;*>CngxlmXcX-d;zh1kaK2|=vna#dVFFXIY2iht3l%DDA%xQ9?-v(dO9z8J&4FVB( z%*wJ73Wy)y7aw9MY<9{TK%|5J$Muj2O8_2Mo?ZHi58wd;0zKk^!v7!LM2Zb2|L6>O z_W<l3GUOgI%#RO%2SNNnhmTDFCJ*2xa1D^j?~jQMcHd`~8rJzvm=7B(zQp>g3AARt z4%k&#IH29T2-sK)5Ax3}3v3>k5DTxi6x*VY=Fhu@3MKIIQv{L~OoVt&Ix={8eGLQB z=?Sn80Z!pc>(7RK4lx(x&JV8(&(&8K0H~?2HkLQ;|272xELJ{>*UP(wdk!PY4?rFU zy@U$%$Zz64aD@*6VCm%FQwheu2?O*Ayz&OT2lVB`3ZRRB`<wd7^{GZce&xovwt{+d z0T%i$XaEb~RSpf3UsDVy{DI#Npr5`?hrc!q96JH-6;ME{kA=MFcB=26SWOEMjd^!_ z&uxt$&sGdR2Ym5hC7i2gB41Vw@i!@~vqMl{9PUf+n}Qz!UTdl0^Wm#q!wh{3>*Tl9 z04`*G{TFj!W-(?I9?a!6xSa9}Mxg!f_u9!HA21Lf!N3;*9^e4h|80%);fvC4?-J}C z=ji)bR0jU+7R(KJttiwVMDUuRoX^`2t{x4<U)Ws`==+!HP7XRR4NV`sSp>)$A66dy zr?;wT3;vUj_2L0R9?zcxVwgu4;B58QPc4<)bG_eyw&yqWw?_{b1&Ib!hG>Ql>DNwL z7WM}C?i3Bo{t+@z-WdfR6ru<<;J3OEIP_;5^lZ1HlHQBmAML43Yl-2z%BZdvvhSsp zeGTxJx)fBb0ToF9lWm-aKM-GQDeUz(>!Mfb$L`Os%JHwr!>_IQ_~P)fTl%%z*Dpkn zP62I?AFzD!vv46uKBU+<z{{?@(HP#mrQlV5ZtX9Qib$Y>V0;Ki{@Bzs6#xk2*S!!= zay~CS7Y_Nt$~~OP&l`-N#55>W&{-c(e(w&dGAhKA9z$}Eb&kSq7<gowpP)Wm@>+av z-F+I2!1#Hd5BY%gzH6`ZC>c2j01>>tp7+vn5w(CnADv{rD}3JW6xbbrfju!LsDCC0 zygr=R-fxGg0s=tXG~KFQ6dEzaUcgTn1<0Pm2b>am-{IHhml#}2E(A#B`0kPb%NyP2 zs}MlI8^87aY3Y8;!9NF+feqSnBlFJIWf9_97zP@t_f}DeYTKCZ@I6`8_{VzP$?|0K ziKlx?bv9?y(H5O!s%g)sUsX}vD+>EzsoI8Peyc=w50_A$^gW;75WCDmaH?50sTi4R z;F-u`K@7>aKbg(xT-B^JVxQ(FPu9Wo!(B{by{3EC$|u~iovwvEHzLc%XJwdm3kJP9 z+Lyp^=I1gCfiukvA*T*il7h~`H;Hef8_K!l?_M8}2AqxA6%$Kc{BzMLf;gkdeSjDg z5W9*f^!pH7JBe;*#_P9DGTzwL#&as&-!h#g%N%xJuJvZ)J^R~ni{gv^ZK?%%S>MbI zG`@6drbOj$o^ittLd2G*xiGgTAxzfj;X98nP5x|aA*92KS~`K#wEH%ffWgNZiP^5d z4;e|o4U9#@<0W461_t*r1RE2r*0n;$knD7qJ9lWRDA~LuQ4(%(eX$wg!B;kRJ;NeX zX>zsg*cei^7+lYiq-YS>0U9$mx7@9e2UH#kOK$fRrCpt$Io6bcq2Gs*ch4?;ZCN1= zZQlMb6I$`RZhe7nHMIW#<b$Ri=ob0IB0-Cukc;NEa&q$$)L#aR=*x5cDfao$8U2<D z>x}ZsVL(%P&4*dxO0u<dX|tkfxw?BO*<4@^h>6ZB0xxBZZo+N2-vNrZ`70F=)$a;C z9obuQ)U%+7`7Z52A(^d%CDxsLnr>tEmmzFFt>KcHBx-&Qoo=*N_IIH~ryJ5^l2i_8 zijn?uE@*SLlc00B;dx7w=p^4`_3QJ)VmF~?#;<)V+M>jF1Jh(lx(e6EJd?Ok?z%~D zPV#X?#)+XxPm1GZkFuw&KctaO1vO=ERKcc@9rCRctRFrVG&}dy=O|Ul2r?YzykB=m zG6Q27{p7qdS=y@JTi6lk48vr@K4=#W8I=JY!4fcl-riDTXhBT(Oj{&~e4lAIR%kuS zD61lhgu)?R#&uqYQ|nn9<drPw+V*Far+&sXi(`rCKgkuatLfRfpT;D-bH3BJQ6!xr zg4O5-IE7cko^(}~M?d8UcccH(cH#XdVT0WKH3Wd)PMe-~+AbeT@=rm$J^2w@*`1xf z2z=G-nKZ2f`*6`Qky*-mt+s1-e{52%k@XaHt83ygh7~R1n(yc3g%#LIvVtiX@V?qW zEkWcrZ9g&4w!`8Ze~m{TW4g^;cyj`nN#e1|SQB4}h!iEU&uy+f^YfkNaZ1%I2o%Lv zYaOKfOU>cjt-ia&*xv~__;*(plmQF8g-Qsh{zk-DU`_LUh)ZQd%pM`3%PDu3X-N$> zi^oSit~m$tNKI^(JZ+E|-ioO!43?FexQ4x%-QJBfl+bQKin8mDls7ZA<#~4!QO#9A z&HVLs>uJw1L=h#gi}aOwa_O-$rnXOlqE;7;8y@!AYFi@Oc}O~OP$>NJwtH1s75G<C z*igbHPlLW)kiI_VjS>?;0OgY(%8@nDx8Mr_6FsYoDA?hu#Vp$gJxF7brSJi(T3?%r z59jq35C#@xvsZ2?dmbpd4NaEv`<Gi_$oj0tM%tZ7L{|TJxd$Ds!)IEhy>B+2dL#_N zP8g!fl%Zzq`gM-e!L%1;3CpYagnLmIcYSgCoT7I39JC;ZHS?8WGAlw1?;078O~ey? z7y8tbW<N6LH+36nw4Y5_wl|O5g%xR<2S>^}&awBQ#C15%LPsIr#TN1LBA!`FntpOp zWw=64RhP0RePDytv~)&FIjGrND6yk-@P6v==!dPgCb392Rb7`)9FXL!h(w;f3705{ z>@h=53Ih!KEwo<tw(XJ!&Te#LZ4<Spbgz(eNK5L>mcuTto+eqdLKx^D##MRHx%l6! z8QSm@cvD~A6VeOp<7)vUS}T3W5)l>Ro-xKfZIBKmgEE~uU#8KzID{H`;_xy}-c6C# z#aC}DnuSV^yayFIbH825UU(SVtZ0AA3IawwM6RCLA#z0A>G|}2e54PC4Q&oWj8)`o zXPDx#@Yyev+EhQ(C5U~JvhMWcW(zW0O%63{PpU1X$Wu|bXa&o*JL<JJZRn`&xJ;*0 z>&WBdpeJ%9EW?`G)HB(tsD+k2wSLHPml_w8pherLKRT?^eXv29cL7R*Dby_#%<m10 z3A66p^xD}lm!W1YHY9{vPLMv}3pZV^L;x^>Y#VMHUwmJk6fPGk)g<3N#<q{iinlE{ z2r+AB@Io+Rml>}PV^es3MDumi6R?9Ro99xMd@>#NdZsK*LMvf>ftPfI%1p@;f5|`Y zg$Mr~G@xdYEmRjD6fs0LWlk+4?EXtewlt;_j0;Zp+t6-^-M^jVF5}c2V~HH_ZTDjR zY_{P=pBLbW&S|}55{Rz4RGlz?uBj`<!l4ZO%+DPD;4pjdSMaac56Zb+VAAu{dOyRY zgF#+PqWU-)5Zz^OcZ_feZF4+Vgc*Ogk##66Yze)uU_#y~UOs&}|0HbCw@0b%laM@o zIjkeq@PL1qRa_z~(qFueNF0xvvtUd&$D#M=-Y==y=(adUZMEWNjNy&k%%Mzf66VfK zzus=M8OhW05uSBO*D+-(aiOAKWR-(Sv3#LRP{H=v@UJbx0`;wZZU?bPymq;IOoaGx zgNN=l)lo)trKi#Rp{oeA@+9bhmdN)@);}RB#F=)dpKAX#4ai*t;~F>$6m|h+{YL#5 z(@fl{{4{`I5?7CNAi2o$9g;8^P;N_@8$ZofW~&}nlwBEL=D03g&FkFaZS?u{E&MuG zt7k{*eOYPL;z74>^h>RJ+)=YsX?VX$0XKOGoq`!X>*TeUSKJaPiW#BK>E@W@AHHG2 zE8iH}#)BuH=dwX7r~4H_T7*cW;7Gi=k;$ZaRwCrOMaymhFt*q);M*z2f(bE~YDYCC za7Y!9*bg}fzZOBhy-9IRa#ZJc3iRKPuecwdxKzR-7^b`RjA0Hm90xL}#zG}lv@2)( zTJBjcw0qG$4BObg$eT!wCJnZ<uXt?OUp_~(32%M#v(wIp-E|;BkGrx=!__~mvQ?4n zmVo5s>2hPjV!!CfSWt1|?<febSUsN>{0UANi}zn}UaoF&qNLHa14y&ycIVPEOlNPq zq;D~r!Q{z1cHIrSs_!8Xm))MDTNq@U^`7es3%2)uV?ot)(s3OjG82l;n|kG4g;LNl zv7O>gPJgE&r8X8{F<C0*(7+GplOL5H8P)0HvC!G|ru-3)uk`_Wuar`<A!M_)GxgjP z=tv;y0W(#g=5uVCH3r)5_{R+5laOYfY*)Ra*F-Wihcv@rF~Br+?x(3DMrbs==mAcT z67(a-sXIx`-V>vW-#?cf#cqY&Pt$^+npbcmQkQZ3;b|FAy&d5&lMpgIg9;KX=bZLG z7xHl*4*(s^?(Z8|W$GMZ1%#^}y3H`u^DLcJJbr~8d^a4K=3PWfn6t2hFoVZWSVS}R zR32XqkDhwiMuD|G*epL_>aEqDJe~YB;lt-C#6X-eAZ$M!et=@V#i|0{t!nkBB8`HC z+4UjUGSfjU=*9uzRHNZO9d6pJI<4e9rA}!(oejG8py$tL)E5{ZjZ2pxa;-|9hNEo{ zrf_5#R>K61LNm5)%ocB;8r@pN$85cN!ug@fJfYgvJW6%&Bj2s|7gD^Sgv{|XHp;XT zpiv6^IaN8YgADzY9Vg-Zo(k5G&|6%zKFciy3Vz3(nc}O8VV<-<hC|(NbJFS7=Tp>p zZOpo?SSwY6q9Qc$Bq+61vo+?Hp)~dPVdr@9Xl1`@K<3C5&J3#a>qavPYVHRVh5NRN z6ET}y(JHbe<UJ?QR1G1z`<LuvCsJ(LtHUIssYV6sV!qan21;#vu;a|Tma>*xSB8mR z!WCf_MD~=UN>wwJ?h#Js>1gkY$@)Kx-9wNjO4Oj?vTfT|m)T|8wr$(CtuEX6%C>FW z#@ty<#7xA$n0>A?cX>`cZ|7C5FSdC}3e&K!qrrB%5yiNK`uc4xIfB>T4&bd*>xvm% z8Km54QpAsOq?l@TQCy*E5*PsGihkdz4I)(K3mWXMIaO!=m=#75)7gA|vZJZ!f?6aH z;8QXP_kzZ__KSp!{l`@*q3Abq-rwc9XKqphV+1izb8%)D?Z`#ON&nh@W0rl=1C^bv z)X0u?RkHy8y1_Gs@n6Fsi|!}1GP?=HO`8hB?xU)#q3PxXHx^x~Zq)?0ll2b}cYD+z z2Od%+?O{KKeB;;}lvnOXRwBk*y;ou762w1nvYRvaoMD7I4YO?e3oFjObvmBI4msXX zy?^_Ly)JwgIe+gqU!i;lWfKl;Y7wR4M@}3Fn-pYYv<q^7rN6m9_NO+cj^H4<#-Fz7 zBxt;QmS%gP+bX_Gl%Que4bRKV92^OkK3aCD^7k*f#H-JTud|^)u-I51x$bqA8^Fi+ z73Cm#|0CA<SHy2du64yvbjP-+vvJwQ5$cn7P9YeBP4h>X8gdxQ`|7&Tpc5-KbR|#D zKQ6YiI>wZYneDX#b$)>dYaTJ#+05-zEyKX`obvO4<+|=xhS<2zb~3I-Xvoq%#^@gi zgYtdSk@H&ZeD07}NB<-uXH$s85BG(%1ROfIkc%`K8sq5zR6|F9)ACHJ2?fRR1xY_2 z);f6xq6>Nb?>(CP>+Ry>O-sX=@mn8R`sL+c#>{lDA0M9hqaQ|P-toR{L7lG1b|V5r zEt8zLZxIRizKO(WZ*E}@f8EM9*#GF$UE2PQ*-rM_6JYx)307&6im0Fb76Kc}Id=N% z%KlIgXFRSVzY<|WqZzBjOn4UZbBvz7++ehEgAaY;u5m3T=^paZl=ENKOBce;P8FSi zj&cw=<dgmcxt?lb-p<Y~zJW6inxp*TM#5>A!KPK4J?N%rzdYo<aXo;@eZLY5|7<bg zQ|jPF!<kEcxm+IwAqEq2Ws?V{8GuuGLjtc_!QJfk8d|lwgN`APTfF5$GCi%o2Q*F9 zJ+n2(sCfRBa~H?usz&?J{<x7DKFfbbO97kS6T7>AE#g!I<>8x7-RkF$X7ATB+g-_O zeB|6yx;0jcCTcx4l#JAgx9lyym{V&t`J9BBClA{TH&}T4Lc7w1pgO2+FOS@%1uj4) z_Hw>BE=AtFGv;c8zVT;ac?uyd>T$N&Rh{;ga7)H!H>Zyg-QskEBhMQkdgkX~H*L~4 zG!bcp&&%z|e<Z+4BWKdcduEKYGTjZMd7u%>ar%)kHPwiUj$)!&g%8tX{3}UL*~t|O z?-y%=8^7vn{?8;zzK3<)LrIyyJa25xGqi&umniv}GqSV781Ch8n!^bLI)CfTTj_={ zDWa1pHB~7H*Z$0nlv3Q>4=rHTxSz1Xegc+`iP1N!?m4E5ItEe2g$<0pRmqMV?mfY` zQQvE>nSPp7|M^BfXHFcfg8+NW-B}~5V1k@!+L|KMUYj3i5_*4H4FBsZk@9FJZ$xmT zoTvQ3;#WEcyh&a0q<8xzxjg@fhSoEWzlta&k|Xts0_O^2ZI|C5_t09dk3{P&hg;Sz zqzMX1lF|;&kZO6(dX=I!0B<*;b~ar~p|KB~x*+({p(Bh_{b?D0N=jIEQ?X97Ip5j1 zsiXhBkth80Q~f_c{T(Cw{F>WFDoZE%<fHJyD!f5_I@{M<8r@q_o)i`KTWJPQ`o22v zD3NRXl!RT}&(tN*;z8^sb{gVSDa?R*TH2K%)ewm=ryiN+=zJglPQu-b$1CW-jbdP% zgQv)8J&&eWq8y>6l_Vil?nK&_;^KmtUYvhqB`bfB|GBi2_-s*bQB_?)e~f1QKFQ$g z%okp*lGvzY+M3#u%hTcaiwoRY^2^w+B;XSh6(TcZB*LDYXFbSzX#WGnpzciCIN7=u zNU`9Q_T_5-&!>g>YHD8S9}HDh;@mXAl8uA6JI<EXR!PSecSQWk&Z9~?nLzI%4!&b8 zYNT@y=DxTM`8u7@U~x(RlWcOjy)z0Xg`L);rk1NZc0)5Bpul!oe4K3ityei{nt{J5 zLhU!Bmzti9qsNI^s-Q-q2q)Mp+s|zi#^e42Ja4T+vB|bpE(Wecr-gJ-_r)smz}D<` zFG7{K!f!#i1NTA5*H8W;uFf|F71|T_E2m9hX{8XhHD2iju1s@GI9gdAHi`5rM!qS* zh2s#mO}Hn`MU=8z?~E|L?N#8GYCT~m)d<kRlpi(iA=zZy_~mJ`O9H#9YUdGb@Ap$! zXOrY_l5_?m`g~xQp#<wS*B6*sK=Rux?0SYO9n)7^u_t%B*C~%d*ilauOuG}I<MXib zo_!Vyz1#__WfR3OoTdxAU~k5}&x!^aw3^v+CIDKrTMLk7FHQ-a0j=%dWFYW-n6$(J zO3p$3lhhCkc%qiCjlfbBn6mrlHrvzV-G?~!`{F2Kp(bRt7tyjmZ|J1&Ncw6bI>|K5 z@v;!Kn5>T0{ddR*Gna5U42w}BTW7tHoQ90XAsaSzE!Yp9;llXdY(_7?26^uDptU{h z4STL)gugTRIT@uqbEJk7AUo=@7*ay;>L!u6)mo)HJ>zKi&790@Cy)0E6hj<Z{S^(t z*?9}LO#wuc@-*_SJXZmJX1>j}*p#Zi(k}p-^tU^J`^=im>m7|Y)+K98i}xTvdh*uu zNxz+IIzMIob*)~e=BaBPwxsLa3fmJWNu{K_-3)*KKytM#KWdPsfCoLgq6*vro}Zhp z)lgftf3!c@UD4w7w<`ROq*94`z3~~J@;xKNE=V>3G}xfG%+&e%hIl2w^%x6Pw<`0k z;__~ZVzw<z^reQ4D%E&AiEi(@2gcZvbc-UCE^%7C&Yk|GRG$}N{r<V0(z&Yu-@~rn zB5#Va#-$&iV<hvzb{Zq>sc}kEN9-q6?`?`Mo^ac;9CFqN7w8eD>mV};rL1}JGW%CD zn4dD7vM!NURCXs2g>(PSqh09le$GedF1@ighCK|OoStkAec~|DIW603=s-|_4nte} z3-uY)4d#FYXm`Sr!O=-WM2Jk*&id$8(3UL-vKaR)duL(FLz5MXrq5r}ZN|p^m*XI^ z$CP>1CSqjO17WA>LgZ6h#AW8REIlOPsLPvsqzUS)=5w+~%ALis;k)RXGd(4;aO{en zy|PH&8)`?21s9RJr(+x);Ysd!_v&KDETyov=-tw60vgF&yOCsex3$7d=Wfb4uY{=h zY)m`?O`Q0VJIncGuPC4BKY=)-E|V+}>ckB#A0P&pY7}HB(jR?tNgTpRh?G(tJt*#| zdP~IQC-c*6QIuR?OnM;2){$|?#budOdQ>-he`eoFRtTuwelEd}j=YYTdzajo>06t& zA}w$U{vIv)Z1+x%N^@*QDISGKkW69DB34w%*crWUkx^7r0%42Fee3<XZifNt`5F*T zAB%ZRl#8LU0wMr2+#3!|cFLpfWcqF`wP36^+0CkSO?LHN;L&2aTEi0mb}V0VPBs6Y zWQIj_)1NJ)B`9MHGVBQwv#1ftX?;5eH@=cm6@cbM))J>Iq&BAzI(j7_P?ulO27NDB zGgyr82F@kjqQxzhALdcrvIErnMsY{n!_=155RvmgGY@gtU@0BC(!qG~jVsD<`N0em zH?M<gr2i<8d&-m+!sw^xvg5~8oy!%X(!jQ*?^qdVZQn!5;`I;|aPzx=MrC84p?uFf zGI-G?yBD7?T@<HBMCZ)wkK6m2(o!Qhu4Ingv_XZVI{J`$Br+dvnIS^sa=`kZ6Qnpx zUc0>N(ZBZyTa4FSuxoBbKTa{)3}I~F%ZYR7*|I$)2dL;@(J~!ubqfp-<;+>iIO!B- zlZr=P$dyqxtnhK_gY{=y*Y_CNc$CB>mU{?=92!i1GDSp=IPm%uCvly+o=%Lz-FJ{x zAxooNLoO1(goxoGeZS=poZ3O&7>r#o#pbDn~LoRYDdMF~Wr7zc4?4uO6X1*1xt zjne)+KTTZ=%?Q~`0oiRYZ#rrd02{OBb~q|<vwx`?PL5BfQ-ht8Ha-yE)umOO8sw%P z)6-t|XFc^WW1YDF6`8GnyPR>2+4o@dg*?PSe4-0G8k+o=SDysiaaIRga*&$9pj+nQ z1c_afWy&@A3U1|`{8zKudurZU5u;<0mbN%*=+juxt>qTOGvJ`2HBmvIYfPv-Ee{q8 z*+nIQK)^DccGL1xGHS=28EibaVrGpdHcRrVR_XTognp~KJL}ST{E2*bj37T~wtvEj z?Zi6hB2Etmna^iCU^y}OiV!eP9DL0;!LM-i9i7>pSJQ-zacCStxOVV088f*j;#u%k z-J+;xFh}wx=9kYpMss*IJSQdCC1{XPtc3dd2Od9ifOW<|^?a&N)gY<K{q<Wl{~;>^ zM5y$_x%<G{nTGUX6@)-QKTqBS8x*B^Zj7BZzlChHLF=tiT@#mColRT`pl-bT&`=w~ zk}S{4LDgc(FJ;h&irHuFPp&@hHxxyM&}}fVM8uxLPGeubgWs{P)Y0=Q=J%=4dzIn{ z5x*yX;MTeM_~nhU)mPb(9@eaVY6|j2A$k>S5u*wkddh9j3DwqdUUa%j(Dhl=7K?yQ z?r+SNHH^;=#qB_D>h~t&LjU2nj%oia+PvfFE-EkGXwu&DYOD#;{E%=>2eD^+X=?sw z`_<sEVh{#jJl&!6rfULkUBrNaG8<~$_$Ab!2gK9f88U{T$skSD1KCc2@C?jXo}gT{ ze>YT8e7)b*4YAOJS*9;MHt=$D`R5P%=ebuL+3Xw|sOlc32&c|Z&o@-zY*N-%(}o}a z4vMpjOI+g15Vnw0{jKS|4C*4qn^=5f@v`;%IwoqW<mMSA%YL0zz($Cpo_BKS!xN23 ztd_oN4Os<e9%Nar8s~=^OTMny`_kB*I4Kl!mhz$)mB2Qk`(QWmz|4(|4X!iv#KZJ; z6v4i&z+Z=nrgw>jsW?BTmrsL#YbPg`{+8usaPuh8T|bTMASQ^r&oaXo_Mq88yLRIm zm!nsvK1_u{An!fBC9LfAR}E0A(@MSCxHLkTQBapS-xtAgLK3bELup9hIHnLd!y?$& z2((>{Cd~lHf}uX|^x(84dIpqj_FfPdR>)cm7FITxHE!Fk|KjZS_Zh-xbaQSth1UcB zU_J@;<E79>KZFXN*ArH_%h^};e!tC4{j5tj?vD{4l5Z+3sByLHHKWR1EqFf9V>++> zd}3^c>gw#Fxng0to^K6eGz)l+O?~+}(H{j5{ehTx7=8YyQ8?HCGz$Oo|1?~gnE%I7 zI5QIy2lM}L!?hV)MduuaJ_aI)2Mjv4tBa>!H&_}pmTiR-%-x-`9YUI@y$do(*de{3 z|2Q$TgVp`!x9)l8qD3xWx23AL^1}_Eh6UY~g4x+yxuBU3YhY+(Y63AqK_%rFxW3Ve zsj0D%R8i3~fT*<(FeRa)B}i$Wz?bn0fI^WIL>-HkT>yI+P;Q0<J<_oOw!s5pxAS8s z@KaL*;-RJ8^^bUw`vQ_gRZrj&OvENKM}*)eRg_%g@!$-kt07_>{W?V#v=)OjI6OQw z{3698GJ|vh$;=D@j-o)KE!dunG^1z*a`k3KLOQswLu(FFLy7<ufQ`=1#%+qsWo_z7 zE@i?e?Sltv0Qm=;8z@&R=-hW31}sJ4)+fMYELH?!p%Iw#+g!D&Ex09<6A*wIOg{z( z<>nXZ0Gth)3&a=>x@3wDG=U&^mv0g(038zmFatF(Hv8n+)}IHU2KM=bWoKlrZ*pY> z@Ch172Y`=ZKq;iD8HBY9V*yhbJno91YMXzid!VYLCe%cp!|umV$O0`GRRSfaL;PCJ zu1`T90XdqvL9GASB_6wHrBh1>PLp3<Uj-OMurAzwkO|2NHl;Us*ME67u^V`E)UWFI zfq=2My={kdM1w|CU>%)-q@;dDKN$V}7&U_q0czLq^yKtd2No0un%ka=I(GMhM}*uX zlxy8RNk{PM#=F7?!eEpI@)gABOBWzxG)Gk@0y;PXdAk3w9|a(z;Nte-nLq$%fY1vW zl=wFSG6FID57H;yK{`O6H1wNCAq>91KR>7UMD<Qy47B6@&-}L-qjOqIV%l*A^YMSL zQ8C-xAw8HIfHT%QG=Obvcx{04(lPV>%@vt}zg5961qvGtV7-BGFY}jsW6lN8yMD-l zHUMeC2zR$8QZI~^;2;*i$Q}H&m{seO!Pmc<7ycn%ztmsuX}{THzimX8nA)2HTh0D& zzXEosJP9?U`XQL}oq~E8g7ZJ7@O{71%Md>u%~68R3DMiXUZ%tpjL}38tv<-CsJN7@ zw5R!Q2~BKc_!hMwK^dCg)R_X;SpfBE3^0hwHJ)HUe{H=Y4b9)t*G7FacE(-AQ%v2T za~4NGP4+Ru)i+#F{gv}wSBb#st7-pRd>%}WzM=8)A<*;V3w<QazUXUHq3OUIe=6L* z0l3!i?hqh7uNPpAH6G&cUNbv8py)UI#rz1!K9c_wv3-#GvEN`lpQv9VJ)r1?-H3Gb zzM=<?18>8uuVB55vR@*8py>78h}h?2s5$@sbgSxL*j}>6cU-3)GAED3#GZEnxYl%! z)88P*`vieKK$ywN!O;`Tut4)SOaJelK(C5m0nZ$qrQyns4AIz!v%;lpELI}!;!8Wx zm*hq)0?(pHAu&mbyw!vSpAa99wPLT1S7EyB#$2bc<kmffx#`V-^(CxjF61dXYQ<9? zd4=WH)g$_oOVR2d=65<TQk6Wns5k8&lyZJ5^dyOxnN^aLG~WxAvmLg4?-SJRe~wb6 zo<~92sT(}jQcY-g5%0}$>`O$lWx+U`I_Y3+gdA5!pd7_dgUYEaW5?i|_K7H4mCP#; zVUX#}-jbap-^V(jt@6~uL>WpT!9z(oP|I4A?-q!J(mIH&_1!YNhS8IA=d$zUX(P7g zFP4M@?_p|)o7W<@?PyRgpPGbe0w$5)Q2*ggV(w!sYWUZ?Kkub41OA#fNl%^`Kr6qh z);8#)6&5p_#RJZnYH9~on>#RU0Vfa*2_N_wvA-;b&v+H(6y9*_<sJK0CD-#5Nx)}C zq%t?hs29fgERSS84~U6;X^{d}Wp>ddO7w`k0+tzv(M#`hs3Fk;Yd(zlB`7c1DOk*~ z1g0>klj<rt_6$e9rf9K?Lj$AbAo(>bf>Ac!W{L`vE|zvk0WTkmhgPL2W`y&`b@OCD zkkN!C>)}uCE32HTZTJ5=_6cLMEo~2SMPDtDSr1%Hdv8*g!&|(s)1lqD<!93|{Ej{w zo%j+frIJOKbuF+$c@@<N<&+~^;4d?Z13$gA_R~FhRUP2}Vx7rsV!W2f1~dQ^gzD9Y zp#nJQLkR9$xlOLv!&4E_F1FQMS4#(lD~r^|<R5!5KcUneT6lPcs7gU)H=f{Zzfn)c zhh$2D8P~n3SOd}scJAc=_@c@AZ2zNKKb8p7!n0pe1)|UPD5=D0`7R$J(tngc{x}bO zuF^}2oyh|_3-Vb)Z~9uL0;JGwq&&=OTf&0Eh`k}X8xWq!wD67R67J~VsUkiMDe6~| z_zaVmgn4dcI*|8z8Zb+lgx_~ko@hML@({ewBM}6R%Pbn_7|h~whv9f^-B-&~dbGx& z@9WMuGC+^cb`-kmFCL0@9A(rz%&%7$dix9TG#`<ss#u1SH#EM=%e$2ml2tZo?+$xU z-Ow$Tg*c()?MB#L7!PaUfaHxvmU1!{?A#+?)tl4(txJmZ)$gtZohTE$xA@!TsEHiU zWPw9lgR+yJI}F|H`joYM0eI$NjJy{xlY}N683>Jr9gs`|`12lJKV$J{Q0iZ;PI-Gx zCvYWnkLj;t9A(#qlY%@4WFGUGP!hFQjx};xTcY^81X<aqhNjHaU2|)3G|T*aowIW1 zx@zsDSY7%(39mP6`-%}@*HiN<?ZFOoH^U&bO__^^SaiAHy5_yB=o(Jp=ev25Jxy>z zHaRuJk3Gtwu9GxQr4W#q5NiI*@H;`O`@0QW>}xquLeTNCv5`~Ck>-I|rQigrUCzV4 zB)Jk;+qV@*(SpD>kv@j)!qSyMu3xg}R1aS$V!i!eQDx5WtRI%or#t7eYGSo$lwyj- z#Ea3`6v_P)t8C4fUr6`R%#g5M_4g+_(fdRF`0L}A<MyfrWwk=kxjS!!i!%t6xQ2M` z!uk!gT(5Zrb?U*YQxU*T;6SbO*N=k3)t&;qJZO2u+$?#(3q3%88<EG%O@N;m;@Hq4 z8KtFx)|HfzV`HBWw3{8obv+kB48LTVr;1)m!JziB+;U#3Qo2Ki>puoG+m~uK;vTw_ zInjXJ0sr0s9)K%6-Dkbrfy+z}*;iA>efCO^!6!bt1@6z&vPY29U>PF(%b<!|)6?q# zrMxi3e&go?-3wlx-+uvzrV(x&wUiOb=&Lm=`?>4`BJD6yafBf}*Es{aZ{j4cl=f;y zag~-VS&AclYS!9|kOthJDv);qy{Yw6;-}?MMa>TloA-jSpEO5NG#M`iPxS!cLB!2I zlyiUX7@|Hg!9+wA3qGgK#p!YQ5^;SoRIYDa@QqpY(3t8q=bdfsB-OOlJ73me|H<z8 zAjlMl=w_fPI~Yn>N~5j0qNZ#fYvi@{a^`fvCbKSc@(oWAT;R^IjRj+Gx}H0aG^kL4 ziqX=}MEDtr(JWirf{D%0k;Nu0&(p&wH%SHjD8z2q_cA2_Cwu+*N7|1y^EVP-TFT2x zcrJ{kpK|)oj<hIQ>vji5J<7)Zr1Ao9GyAr}Wk4%^R+}C&jHj4cMjUk{bluyWV_>W0 zSmee)L_WJ5fk+|*MV0-hDqGP$)h2_Gr2b^|$m5xdF!zGUTEM6*Qnf18##!;3!6=P~ zgi`@r0;JtyN&t;7i9FP?1gA=ha*Fd1*Og<_Ct|ZKem-{l+?Iczhs6OsCv5b7H4W=v zhMz4QCMB!-(6wc9dVcUUX_azz&+_c3LFWO_&?FiWG(#|fg6Lm&YZxfyg2q}5owk77 z#$Y6tvT10f{3ytOQ1F-l+}sm1W8HqZ(*)oA+DLdFXHuspyLG%>bhpIT<TaNK>ZRL9 z-CRR9H?Un<QYOLs2!@ygOZrxnDsStLuYkgV8P9Nl4<%ICA7N!w!d6?NjEoLy;sI~T zse0@fOt@+A9~6OwOFS~;#>!2?@S~YdMko$qeNOZ(cM*C-@DT!LD=fciYVDYHt6@Z< zb2}vNn-)@4ErmLfJ^Q6F%&W|kc)`;)fV6@4FfMadMw&Nb5%TZw{0O||c=VTD_sX4t zFr(2wJDMe^<bZU5Vsp5p%F=_$pu}i)yy%Cofd`Cf+sw2?5%5o}65a1o+)cOxjWZBh z>>K(Ay4cu(8wUGky5LQ6bR}-DVoTO7iKaMfZ5+cG=Z+D)vuxfps1#4qA5NWikuc8E zS9Rk?SzxAHCssGiKw+>5K3D6&5$a`UOH{D+?}F0^pdXT?$yRcCyEUlVxRTs|EJF<s z_V7WNOzi&%PnYH(<=^AAQC?+^szY&tMw?E_nXV}!r&z^JRglU78=2r3*17_fc6s1X z0R@vnYB4=>SP9iDrK&>kdY#`5DKKXjwC4L;_d~T+3y5YziQ3`SxA7;`S~82Iw|G{$ zI~q=4ngCTPU+Kem(lz3QqQsu|`D_Waj6t>vWjN2L+*FEa7`t#S5fo3pq`FbLjoZP# zk{}tcU+Z59!$^6rQ(J+nu+WwGjLQMHnV&*uxqvu(aUJ;WbbE6+s5BV|Qdlrj*p{b# zw@dzJ=qwAzx(!Mf@54Xv<zXR-SlrP^J5t${C^8By{*nKPu(yvfakiRLlw!7mDqTI* zWF6)nMx6^z<`12922@(ozu(^!>QX^4tH$gM7I3{`&x%4xYJ4<ay`O4ZGz``g;#_F} zqB4Kg7oB_~IJ&z7cxt@heg9l+YmcNHG2Q;$yxoJfg79(U_N#|L7;-E$4muOezBpSN zolTzu8{e?czhOp=9K=vG)S)b-o>O<aarK9di5DqOtqniUG)+5F4v1iwKny)PJ7shz z?~*g^@U65XvE9!8I~bPnlo)DNv*cmivn_gAvQY^4e@R~^8b~2{Oy;qJjMFK&6;)>S zg;26OmRnQU_xIcGigC|5u#$EZ9rR6$#Cs2YrC>%;HEYqOGsvTC>MMX?!wee-UJ})D zA;jL^Krp`dFgA3Eav|~oy|!q#&2hN#f9=49aXtl|PPZY{IE0O(Y_I)(wA{$0Z;e_f zUqIac%v-ctF|y-eP^IWbLn__J8SO@WlWa~3_$vi>mU<+Z<KcQ-Z9mce4q0@cil6vQ zFQQG5L8fOjy5Ngm3`NZs=z<)!@bKfu?=;1+D<T=j#W$~xxxSIiPR>PTXtTrg(UgaA z=w`YynKkt=aID%L*<M3I5r^og@LqVK!Z;8Ak;2buZ@fqK6PVITg+y6>!AvO$5E2#E z-VHCygsu4n0%fYFx}Rs|!JzW^yZHp#hMKpwP62S3{edfti>Es?(*qmjvtV%*uH>&E zC|0Ti?KCGPKCM)g%kYZj)#2T{`V-ixIifRkoZU9a->Z}Kv+0(UMO~w|`1#Ol6XnAG zUH%y1LZcp`B16}jv6CSDHquPl)avcCJLC$FMp`waTBUW?WRd;2G#9sW?2%MgD2(#l z(i$-N2Nemg1s>jdQ&P+K0$J)xGPcStqX(Yw`HpvV88e55;l(o-Sg$;sdDj>8Mwi`- z+9v~TEl2@Bn<(Y26!=knL}q3q+x33r)8Ruok?mXllXTS91b4xeHTfK)rTZYZ2?Msj zXOg_xMM1xEaa^@{^`8u-DD(#&HVT|7PWy1LZAU`d>qm7zc*Px{I5fBoK_{g!{gIiN zLrpt}{X+v$2=~I;57JdKM>WRdth9YXnnv<hGxpvrI;!HJ0!G>Pzb9F>AkiOgl6PG) z^G2V!Uv4JJ#R$QivulrbcZmJa+*RX$F=mr71qultFt}s_;7#gMYsyF~4db9xYB8#z zMprcS@z^@yq%p@uXfenU{n<q8wlz@$ufqsV9KWdyS+=L`NvilSCfk0z-@{4=uIdol z(<k&Ks8mI3n{T~kySEpE7KoE4v+TvyeBD77xiJHeul4r5sIW1wwcwp0=UX>B9iAkE zFd-booIKs%FW|EP7)KRAtW>ftLbHQMIOs7Fvdluhqmp6pxXJ}X@sgq~@l+t!y%D3% z+0s&@rZ;Ot+use|hj!SH+B|};r9#-CwPQ4o<$h}zoZG=(S?IU_XKZwj(24*kr>a72 zDyrf`BCB4=ACC8FD%Kawt<NaB+3<N55hcs7^g?P70$roNs}c1eJ35Lkv&oJeNfk=L zGg^MGFDl00LFZgVm7tcjuFUkw7}<I@NYUcy(#@Xly!~XSI>n7+ciVOkbZ9G`YMufr zYV`&8gbf-}n(-&_hw+mYNeJhd#yV+oe$jNema{jCUI;eXJ2b);Cd0P{>Fy$}`l_S< z{oWZp9`9h6F!f*{V`Z*wPsIxcM;R(Q%h%wF{&TR>_;!f_%_%Z4Xn-JIE&D<In@&yt zIwY7e7L+;P?)rnD)UTAi5|fIg><4rmJRe}_iAD`*Sj~{QZ}JE~;TymMan)mes=7X& ztU51Wh4o?SiOae=ZIk&_u&FQ`_NzH5Pts3>-IcI$uiSR%n7EbL4s2E%yTNg{&%Uq% z$4j0^-6<ly5j-GBsqkp#LuFKouMt>s%eT<F;BJMmCA=LO`R9&YzEqQE6~7OqHFXt~ zqAeaD8trmqj3&1>{u%OKNj=yk`R1Ra24nNlD+P%)x=tkNSSYpXB7}+>p}lEl<R$$v zyA7SzwbU}nh?3jQMS|%SaB^&FaMI^*W67Q~YQlf?<rZt7^K3>bIl#I<X!15fI}mZ6 zEia9?U9XoSyp}ahcq6?iw8=V^gJw)j33{ks5ejvEpeJwP)2n9`vdb5ng@$v<P&3w- zG&aIIwOcRNv#XiBQ~%|&a#qUYW37#t<7(=t?Ro}#|KZB*XTdvvu$YuNGOj33v;Eu= z9_)q_H-ANvD3RvV{rAW?Fk!sn%t<2G^S2)DKLV*)s-30>hwpf+dA&Tmb{Je`%5Htm z6RoU$M+R^Rn>w!O<N@WGzPB}M(m@e_wC!gmJj_<2eOP)iX*s`!4v}EFkNI~rO#&7d zG2-uXVnvf2y%&LXy<#EU%{r0r)FvlL%F_bG6EKZV=otEKS6f`GohYGj9{AmiZU$Dx zNUv|mXcIY!dQ17Ed3DzX+2>QmnK`h^%7V2_ig;#BMq(MP>Q7K19tvIx-^zMEd=jk< zF7CsZFBIHg#OCxzLr5X+RjhyLt}S@kk1`)b3{IN|S$fGGMN~+!<wovhW6TFNvibZ~ zO(ba?&};Ngh9+84B1dI;tF-LNKjIGZAqW?zS4KHYCHQ|^fksq2ZXO$%j(J)-<uT{s zMQidkqL~5r`KZOnIgiCHrywz~ulkz8){ZtOzRN8<#SVoQQ3_0Yb_!t($h4TfU=O5; zF_G)MwD8Ucg#Pr(ID<Uo7Ol+6Zrzb2@lbo@G=*i!y1WudvTrH4sv#!gv?`UO<L7I8 zmv28clXvV@QOMF?f5!{QNIImA79H<aTmJ&j|Kk>Xew+H58I4GBa8kC@D$Ot_bf&kO zL!aj+M(0CU2bTjTeSE34H#v_`3+fqGt;cQ>G+b@Vk3}9EqG+Q_Tt-j{?&@tV?U<FW zJJ%h9MiZ~G>sZ8UBZ!I|aBTlni&6=#p=VfTlJ-Nka`{$S<GZ2N6sa1_d->}kMtU7g z-4GXAbiF}cB{B3nA=lzRuz}h4MX|H?6P>OEgtxtnyH^oS{<6x~y(Z$A1^>mP+(^XT zpHiT}GB4!C->16|VoZa=jk=mk^tVMlp<LPgp%z&PiT=3&y*Ymq3%7f(vvloYHgKYl zd<TP+K5t0gV^Ht|G-|TRI#oGbN|_>4q?pS8^)a#Yg%WQkpk7%lO6L2~UA6epMn|G> zbMh~mj766!FrUj6?5)@SE3V>mzfDpg_^NS`m~>u<p&9%PZbRWXw!F*Hdh&1!2uS;; z`dZ`;p8PS5(A0{bE6=Kpo&ceVGf;*)GXmOB<eAw3Q7XA9r*0^kjBxmDU*&*&o!jts z`Gp7{7T0JY)!DhWs>`~5y1hxcI{ZhhzNd}Gj5U<H&W^&)nQEEAIhmJa<F&AZyy#Jt z4k2(0sh<41^R)5`t>(G>XM5q1aE^)|O1K^qW}5FY4VY|!CNNzruc#BL5SAG>x$JrK z`_NodWc|)g{gJ6!sS7v+#wJCz>~dnU)TkSN4p+%6Wu{$vvT@i(xLpro`Eg|u1Xv~? zp@^rz97Uo)PrldE)X4G0L;_`a-obwoK&K!`X;}vncVg(86suM~jN0b~(m$<sX`5Dx z%R5qi6Gh*)XK4Z}M?6a%k1Sr0Q$sQmWc+3hw~QRvEcYiIIXo^Ul5Qb;yJoNARm|kH zk>smb56I9}EaB2@K-*rMp37OFQ{flWUU?`ys~>>@w`#vzH;{GTsj>qhjQ>eA-hf{y zhc0qCahR^A!V)*XPxQkJDc+j02r;;jDks>nuYpE+=fRIy`1owL_7496zf-o0G<4{> zM#=5t>rp9cWJiNNrHvz1Bf<mn+a1dAH(Jf6%NLLDe>xTorZq$zLcfxImT&AIgk0(8 z3xH8Pz2BEu%$sI~mn#LjMNdCn2S?DcQc%=XZ8Z*?-NVUYX-lS87MG~yc1=%SKeOlR zd7=E@9)EdW-e1Ez=x=5MxgJQ`3&Zf)+2+ARb$Qbyh#1Dinr!QeFr}~2C^zm4-XTy0 zg{&pjp|wpv^2~bit!FiDj%|!U$Ne_jkRmr<eVqWWKYSMZHoa5a%W0d2Mdck`-lgo7 zEXq=AS~cR8?)ZunID=)~bDL4IsZRU|WC*>WSoGm=a6_VR1-{QU2(FhrioNSD--KzL zn7q;zPKNH315Iz(10qbsw~DvoGGvDfawpc8<;Eg>r~54U<?Ddy-4(G?7n$-0PfOiR zmj+x`U3mXkvV*_#X+)onygY3aaTBU^1i_bOFADb|yQ04O(;BkFu7a*2y_7fwcgl9% z>@#+Rsyy4YnXj$U3{6=|%3zz1E;Ckg<><?opP2tVK+(&Lv&&9wkf(C0@t*TXe^3#Q z{Q9r)Sn7}xmQxk7RaABPS9rs+NUFI0a*6vJTNZ(DQ6Z!%_VG2H7g@h2NZ8&q9gWxM zJL>Un#y6jJ%Fhm$2cxh$h@tY(sJ6xuB<&ev7dcVx5OJ_mxVg$kxag2wO(~!fE3jZB zJhY`aZawyU<lDvhc>KA>Xw;eL)_Y`dS;HoyaZES@pPoUl|5Csq7X;F7(;4RHeXLbg zPHRhG9%r0qa}}EU<nvF%i26824&wln*)yjGPamtuS8OCHm>hLQr~^f1o{-$YiR~Ci zkGb3nilZzZnb9I!3As~x90W33#BIIW2QA)ARYWM-`#l%IbWvL~=W$Z;A3)@7N9_eP zJlpa{YOox26W)QX)Koig(gklHBqY<dRky41sH3DH*db`=yKFDbEMc%8n$hLFM17`x z!HiqzI-R)F8@>MbKl=^79I1E_4@X7ov0M@g8~*-m+cO=GKGCh|iz@?};}KNA1*@pD zp7>{ki3E5`f8_1Pg>ItZiHh!`sNUuenOB!ir_vtH42b!IBT6a}78b93bl9$(W<gKe z9M)^)mA4t=a_AS@q4<EG<W((^`;d-bhE4+!#o}{FQ3%iBf+5X3d*mE7<UoBAwDhhP z8;{RVn#uYG-T+Sm=yuq6g#MYQz;Wkz*r({kzTa3rf}&t~<bc2FsdP~;-28FqX!CDX zp|70MOr~&)gQu(s0I2b@dg33SRU@|kdIdb~TBYZP&3)Xa>ew1+liVO8wmJMz$HBO1 zB*fop{&>V{69gg#0hiJVnOO1HCTK6>wfad5ofI;yNx{=Dc@k+hWB>?$CJD5huzS;> zMl}H8oa=thsHXeRWzXuwS{iB1hH?^*w(d#&NpI(wmCoGw#knN+Kg<SeUG@eLXOj&l zR^XEgteCwcXYH&YIs*&nurhEBx5an;;n3KT+y8E^yJ5si*53Lqx#bZzHSmo5&#z7q z0c<=)mS>Qjis6WtRH!{i`<^Y1w=|{jSX2>h)s^$K@oxH!kU|J*JY`z>Wy)HX5AwsJ zOGmvUFTf<{UX5SMxUEd7h8(oE===;QOz-^(VN*_G13R}o31pH{se1}d|6aG2=U&1H z2CJ3#?F+u;XefSxCvB*zOK`Ke2}+w(+jF5k!ak5QrcIk(Q$X37w@#L7eR#A73y!?Y zUz3b#<*N7ZiHeZHE<Eop%v@qTFQYG>fC@@pp1ZsCSt^mcrF4hvoeeX*raknmJG>k? zEFRXP_>_GkF;B{lMHmnvLb=Whlxrhw4Imp)?<f}+naA9i_h{U0`zOF1Kr4aDX(6?5 zNi#ensL5;_Z*y%=pn%w!M*ngT#LP<@&;xww4P)kf)Izg6Yj#Y{w>HoaWkW4Nk0{@i zxSB;KylM^oiMh_=Qm8|l?uwFq;F1zL7ZmfsETS<(QpF8}A3LZseC1FH&aIo4{n=20 ztzClfJjcp3mWRCxP&99%<5f>d8YZ;2N9PRV5}y#$r65AUX4;;j+l1_7nY4yx^b@St zO!#P-Ok5{Sfn}25rVp?WgL9zJ;6V4GPt?}+LFyug`zOE>zIA7@-?<***SUT)bx`6< zng0h})4yLkMM3=2GBF6-mQy0?;jF7O1@ky@#L-+q*dMI9s6feQuFOqB>B7lU;3f+p zwx)(!&-W7IAEh{+4hqgUyd^jK811b_=*MNV+GGG@Z(L)=LQ@K7fMi{yYZRwGuv}6d zDm(MJ+b$(t?xQ0!FB7akmzXIX^syM*bJ!_nS2y`HJ9ESF7jj#*F3c}*Cfl7^OPDt; zz1Jq(iqpFuXo~l6*1xGWV)I6g?lU|Cf?dO9G>jY{WAwIrV@>nSq{8$9*sY^;<Xn+F z!|y9)OLL|LLr17c*VtN^oi3BYNCLwXSp;zJ(JH&qF#7oBHtifXW^t30W6~=lf2GU( z>TXMPbsK5u@MQOHg2c}^n@3%8hDH2EdZUE(CCTV12rm|S8LseuK*ICi)@nCBxm3M7 zC#)S}eI&iPBW}Ii)0Y?or>8$q@=RY=0zTX0b->36mS*zVy>+cRy46T|#;*lKcI9p% zZXeC|7~)_iqtjWudt(v^f>1jiM|V1VbUsZYV74?VKmQzl67~^Ba_h|{fu)xIqYV-i zbCAMIbK8NoF*^EN6h=_ji~fB>BDbnyycdGFOnU$DDsJgp8yz}6xd!@qUtuX0iWvd7 zMtkqPjMV=t$wdxh#~Jr_Qf#af)_r*b7654PhCuuD>8UVbcy3+ANEV~k*NY{`a_pyY z=$vyhbXD;2rY}Kt>%z~SSP=cg>LW;gwg%oVo^1Lc3UAVy7AUwQ_jdN)7QesJY2#V{ zB!<d%c=i0E@*gTr^1J3!T`CK^c5m%P-EBR=3eZY^n(rj+8e^5kJYUZFaj5t@v;I2n z>5L*IDQw4hY$-Aq7_9>jmGorEHe}ZO6rdnx&v&C$S0^4s5&CQuouLW$?YnMkBX<$% zp_BE5qZ9DM7!7oP?AW57OI$?EKL{}=2sZ6@{EE!hZ0suOYPp2RR&zQa!+}_&HA}CO z<xe=zZIU<FX`53P{9rCP^+qSpPk7X36^5b2ac0;cCOQ|@QVH_K<pXFrr41(rvBet? zHL+3Y?HE3r?6Eg6fOH&u((mfg+rccI5<E8i?ZMD+xpI3fMm#;n$R}uQf;s;RjU1Em zKfC$ym|!MOS<2$AKU4@iP$}$LQKMqcD#7kS?o*i<m9V~6(Dyi%N`!okQ)H^yL+Z{( zAmlyjAJ;%%Z({4^g9qpcf?ht|!O>U|Vkd>oM^GwF1Wa5Di8z*KDhSH=;)rRQb&z~| zo(We!4T_7&yT#3^fbElgT9+TAE$TRMTe`pwk2VI%<Ij@y6Ea=np5uVkl|>Aw>lY5> zpcA-@PWs2sD#q|}yoa{7&i#6>){ZiS<jwcVYLpnQu=Zc`MahJ?**-QPI0tqhH@A6t zmGp?dY)ru)W*}<NUAax2t*whw?RU6<U|ZI(84e%B-mJ&0TH1I@Z)Q8B6VjAIX@sL8 z7smHI>W^$(op{|eCUY%YZ=OjQtb(o2GEN!nZ~To~hx?AfXQ7@I`)=1w&plHeXD!5n zT<biXe5ww_XKE;O#}U#o{YrfpxPhR$bW?2Bi)wFSOVdevufwQc+qYeTB>&?cFCGgb zTr)~?sm0FhN)B`z&V3(a4Z0D-TA;t1-3651)#ExruAzY(rS>^mCHFl`-EhkyzVlHD zhMyOK6QOj40PYo<#nzWyRUTZLHdtSRBId8kac@Teuha%^?_+G1MJ4%AD}M9+a^dk< z##1&*;oijFF<M?At33`k%>j^^k&zJa*&7V)k+O*jhMl7u6?a0DbWY%&R?Y@x=VJhd zFAZ^$ft3=Fuxe?7^y=)tuPm7;DDd7)vQA9w1vG^>GZUJP2wG}_^1mLKV<BQA7l|yL zXpe^CN3-5(3%GbrYn6W!nu8<m%0yi-I15WtwNEBR?<CY*?X`NJzhVzOC&WoFoEP>S zuT|e!DRi2SH!tNPC&}Np(gp5_;CE>YJ`H$lw+`r+CF8Ce+oP6G@S!Fs9N`mw*jCIt z+*@ha5%CT~hr)eQy{|Uo0XGxI=c~?^8+^Z^s0rmuJ|80uk0ZS4F+Hs$%0atM&2}(K zJum-FN#<VbkODo9V7?ld|A;nqvep4LLK^_Nby-n8T(&qra8c6}O+z*vax-B8a}41( zG8}XzPOxT+@E4A4m~i~*Jvejo&BqGm&Zjoq65%Cm*yr@2*nS87l<igKESbW3yr~y$ zG<c_heShd}NxFvq_Bx12mp{C=y-%yaxtp7VsPME=_*b@^koUAeTOE0xBOXw}`ry?j zJhc5gSSdxJKghRxITbt~7SO{i*P3nI2&bd{Bj-W&n;cfd_#krb6c&To^pg{VuktrA z(LsKtn5F}dJ1RG@6f|Ji9R8x{!XxyOx@jm0X6nYh$~_D|+SfXc)V8hbT0eGQ{pPlr zV~3^xzP<K<kqpWU)j2b=`{RJt_j1_S*O7nNO%x<rgKdFcsaU42lxrA={?Sp0IA+yF z(Q(9)6C!i|Qji&=Y1e63LSN3rP=)rJBF=<8;N^QZG1!KO5LGTY>e8e|O)8t3JHy<p z;DMFz73q@Z;H9EEQS3lFLXGrKAe3d@IDYbmlqi0AcCA9*1|)<}?DEI~m~b55DhOm$ zpJw)i&MODPi%Drn)(3T`XX=@crx;V8;@_B0lRAi<vHIjy)3S}%&5H<~umx9C=tUSs zwlQPX0prb)rRg~-<a*@Tskd?y-;Sa><_?B*Nvcx;NJ<H9nwB`!n-pwbZ}l?ozy6i7 z7G2KzkmGb<EdJD{NNWFuVed~ck>VGpxgxLA_W!l4-Yq14Bc0-ji0d}2+u!vyc}>;f zWI)4Q$!IBbR;p*%L|NnmGLWf#bq22pPX15|KO|X~rA|6HcuR!He+uvpl}7##>wGNC z|HC>T3;Un{s~5_`%EH0+f1sQHo3>$L<M{vH=Zk3rSICBLXNW;_cZd4lflxi2U||P$ zMy&!t$Je6J0|aobW`(WoD2%r3o11mF+27eMo~aPtI{vz2>3`$PY?;IKLMMXQ3CTRH zJh0jSI}{q63*R>~GCnXe5-1^CV|sZ5^d%l6Q3LAY+62x8{bfjW4#VaQIaxBb)$cYz zL>Uki4jPb)+BZYmH$&Su0<mXceE3T!oKOWMI5D-jf>JOAq5#ANyp2>rE;Pem+q%Mj zv&Z)Ph#_b$glKSjdTRPHiBEI`<<io^<P1WU-LVOT-;Yf{g$I;H1gl-pHS7O(4tl-4 ziwCy8(aY1bA%m;4AwZ`_^ehudul0r<2)+P!ZW+}A`c0KdaCi#&&E1qPVhM;ISGx^x zoJB<I&dB=TUK^c5eG3qGM<5?>4qad^kb_e|SvQK{GWOY1Tf@RGgiL_H7pQ@`;V;LQ zzzzUpo%{RP#>^1d$%Wndp~1BgLSvm92)L3(itc9TMh1wLa#BCc48e}59*|j{SreSe zwYJB2Vg`im=o*0C-seBz+~m;W>gI0j*yQ@AN^)7pw8tRLqbU`HhaV_+V;2E<lU(lv zq3^SOHT?E&e32t!qy+c}q}C*tF4vLJ@#Sc?<l5-+20SSJW(0^v08Cc|-GMl8ad8<1 zD1pvEfV{NV>VIJBjt}9!q{n}x;cAKcX0eap>OnAp;p$sJf_{lVIx;;$fNyFE`hWle z=)a;7S64vN+OX~cTyq;M(D&{x^;j0q91w`R%PY7BeGof*Za|xL0RLU=z|~2VqocjY z&9A!m#!3q*+H+~<AKiNZH#BqtM_+tqG<@Gw|1^ZbZ;MIy9tZF*e6g9?Ct|FC&v9<G zAkYtBJ!tbuAcpT(6R6WaE|}nMSA&M=ZUqF`1(3d#5Su*>@-^`D+kN5R@%3x_R!8;Q zM*h1SV#14u_oKA<UHbd`ZyL`Q-{*%Jh_NP|=M5-DXphz5W4Elc4-l`0ZDD!2{|0Dz zxG~!kMsja-duxkrwPR`B5tRO;?GF3jSJkn7$4ecpbG<7_W#E>Lzi%~AMt||UKKGra z=31}-_f{Y6dpZnMZ_aO7id!R)<_|YBf*nCXW>r-tB8kVC!4UkNG30I$`P^q6IYfOU zXW&*p1CWC!Fc575?Ll4Sg9E6>uz%!_7%z}o<Zc9JAI&@NJ+MZpAE_Tu)e|5h9lnp| z5w`(U!_=P?0jO%rehAti^*6R}9o?VQ!L8IEc}-z_YJO|ss*PYu{G9{jQSm*t&qw7~ z)W?9|3V@su|6vbyQhbjaxM=YsrURr_vkNsP_sId$wD{jS9T$I6ru5Zc5<dsG?_DUH z_bv#(`qFoMFf+3oD>FkxFahuCE&oZb-_&1UfnS<FQ?0M)_Wpi4L4>{ScS2~)RmRBT z!`l!*TGa9bB9t8T7e25K+MNLQ8dqOOzqQ$k*`xOwz(<F-Z}go9u02`}K)lv>fjIUI zyYYjJ8sjf)H={rI$N~GJAGF)w;h!1ItMfYs!CwCZ8g%$;HVRIV92?&RKX;A@TYnY* zWwXa}{S&a4xb_R&Z~N86<`9qnO9j6L*iG!{ua(=I{1Qg2#ed3%Tf=@L{L_wgx@+aY zWPS&_dM<EyV)QHiv1{lY<je)C+mE;+AmjOyv>xOap8~suXAX(jCg2oA&H!+SnCcq_ zJwj+^bAOZ9lB?Z~`c2LJC7kvjz5+mej%uv+>;B}XePV)m{V+q=)py{&F~2Y>I|$h! z_}gLd@U-XcLif!=s=4E;?-9bn*kyEKo*_ayz{Lv?dAQ~I3o<#@3A`X&U4KJ@g}=Uo z2H_rlX5(=tG0r{Ts{FpkwA?v>&yIZ8l@q<O{6PLb=R!a|L1+;%Oa;+_4PN66@Yr1r z{ih<hkA#+2xV!8wvVPLHyLoLD50oyfnuXVP=tY;uJry$AOD^h0(kJn~<NwzR5p5~` z*Cy~LkVR%GbKOijBY)tRN5zlw%PA2gI8{yFdii^FP={)SxDB&jBba-8&>vo@7U6pN zhv@R#vEIp&&B;yNw=GQ^`Mlu)*SXs*$53J&&Na|;#@z=-!`%$U17eERzB#k%(sHUh z5|bsAOl&CN&|?Ng;M+AWr0ceqmav&~%M0os)YH9WK^>ELxy2XR%Ocv{$=8H*n!v1g z8%%1#aUoMFBWrQfm9xq6hSd=FpVw9II0lyn`_poe0n12!W83m2bvEPdcBOv@ORd>M zMjflp8=#UeUDaf2+_kP=HCGFfnC}2zAK<BivvoZ1wx<t1w$ADppZ6&r)XW_>o`o;d zDh|Om85f0=wT<Xpp^XtDGfzpPXfph=1z)&IaZIZC*qP?D%!yYhV+`UWOfLpU`LSNj zsgbf-$VEghDW8GdTmL*Hg>9Fzg%<u`=F`1UOSBi1k>UrVom@XRH5r3JYTGP)N%aKs z?awlUKZ$C(^}uUvsA}V0t$MMOB&z$uWhveNp~3tjssrSVn*dgIRup5b3uE_D{UN6! z<(loEv@VHUpHI#-Pa6QWi3SOsQNZtplmBC9rPKh{DNu>CyV^B6J#$ih;V`b=U70i~ zXWgjmA7M3KjLIjoOK*W7u46=cXnCj66A?CD`u)$EhP(xF#xf~SYO9ST@MEE2&_b$T z@M6!3B)_0e1LiFb_33^*_}t1i7o@TEGg|1S^)BhT6pCEZY3|e65EPLtt+vpV-b<u! z=iQOkF@T({;yafLZki)}GZ0wEAxi;%lEv6*YY;2rYRLJ4QC^LamRd{C5H4oqWs?~{ z=xSWJxW1&qfU8rZVRQ`PBybe1MU#4}6jp=2nX=P0yRY-m%{Yp7i1ij6u3AG~2uWoK zy!R7P#Y%}taSI|cg*&0A(qpgZB*s4;cvWQ65hR<<6{XqUN%H*czbXd-eN`M|(?f3^ zswg7z1m@`X+-N&Sgrpb*M$%_I^e+y=MjIUvX*lIBz@D5<f_xD4BOi|?oRuJ2^srL{ zg25#NoFPHp<Y2M@LdGlYJTH+6q}=hJ@x0>OCa2v<B?e<n+TMbRDNS$1F$aM36ZdLN z*+ZQ#G;jrM>}_m0DY0xOgdfTTv8j30UHGgAvXy`XudPjQ_N*R$1DEzRqJ9-WRG7V0 zW!3)zKS030%Mu+SFcrPzO*_IxG8xT>F-YyY<nvY&;$r_!aw+USaVrP0h=wA_lhN7| z;Hv1se!%&VsVxZsW1ETFDCb_?Ff|=;?SoG``y6ONN^Q92avE&d*0#%~%H>IJkY#cs z-&R<6`my#A=ku;bEFs$(N!5k2!ku!S9@~e}L{C4SHT-w8hPV9yDAzofkxU9s0^u9z zcR5<$^b}c^74Z*8=zE#)WWOl-nMF(LOUUMSB9fB$EYYFHDAGpubEvXS>!jE4$g5FN zIXoQPe`sM&!CN=z!9SV-j*Z0L4iUl=D2~q2a8O&nGq3fHx=|P<$YAmS1uB2w7{K>k z^+?XhkDB3O$ZTgQMH%cvshWD>?;bB-6CEg0e1~g6kN<VzX2bBzI?uhDMzmrpVPfFt zgA=UQkymHRZU<GqrHY|sOIGptqU!bRgjk6#hd0?ip9{H?<+qwGBG6IbHoFdM+^~eO zSpCoYALMMwy?O;8-#e-wcat|m!PEoQ-BTktUK^_$97dqZ{xv|2$&;wO%~v#!{Q?Qc z6B$@MfhKlT`1v$T_=;g4o}18~#Z>@_3`%)8zLFES=7kqc1@qB#U2U$c?`=8%A-?c1 zZSpqV=u?OMqm9aa<E-DdDkcE+Jv+3Lr^R<i92ncC(jJ;&3gzQN#{scs-S3gr_{G(Z z%jVQ<3-4hV?oBg~;06j()>2rluKIHvI;qv9ISK?wb;Rj4C6riqg(`7RxUniFbH$6+ zZgLz1Yy7_UAkk5_&A*0ml7UU8fRBZE4-wAir!fyo#^@c;!lT<Z(LIAQ7k>^?^am*; znPAOMr|V*@JrgH&qWEkp@4xT_SLN3mcixz}=aRvTsj?pxu;xI>oRhu##OXsynXzSo zrmQ?SDLbhDv|<45_~E6^cOp(E2o?d;q4KVZqEA7j2KZ`TM<P*If;eDLhyLxWWzFFw zTLPwn(~#A&Qw>bq7Tl7~cA5Ag=*mvD9G3k~rB_qI-nXwx@l6cIU+Y9;;0;~=RL`$P z(NcT4@(jzrLj-<dN_Ku;Bn)#6vPrpbN%6ove;XcW%IM%n2!8`qznOh&B4&lh!$~N& zre@|j<x8MFhGSBfH-`OLzlxodp>lgD9<w%4nQ_S6IXF_#Z>4e+A*5QJ6L()nM{vHN zV=Q_a6$P_Kl|?mo-Il3?kFRQ$H0-!PGQv7f*id*~j6!DpUQy;&tHAu>eNvZBNP+{M zgLO@B&Z7CZ>i8A%mi@}_Y2UvZZam$YajCQ8)r|%Ms`xiubV^#vMoR$6ZpQXM3f(Ld zvYb$TlX~Ids*CoD1!jqra(xMm5-`pxU6Eo+3M<1rRiwINm1TMPspOSxpJ`IW=dFo0 zoE&(3Afprz5@l4IE`$^jc8=7>id7TD#qqy*My3R<esd_K*=xGh+nH;mT^NVZU7Xwr zqv<JR3sD3-6X0aB+9KF4eDgps&n4`WMC2P9@D-OU`JTrKiRi;}VUX|Ly1C-cF78oX znS<;sKEYzZRiru3Vea*g(E{LJQGB8TB*eENmKtqXK^mmUASVsnt`cPAbv7*a@+QF4 z+muB#Ug4Im8C%{@!NDZXGg)p;lWn@$I6DZYBNaz>XvUg4VK-go^I*C3U_9Acpt!#j z5j<lG@*QcMqDBO@*RJJzLl3jPcMHXs9VWokWtZ`uIGNc`UjtY_J0`_9dF%LGH7#OH z<xm(=`Uc{smpOZ0^rGaDL?&fi&kvTfxJvN9p~7)$(UYu}WWOJ9ue21Syea2{n6y`k znu%4cgUp{6Eb2L&NpT2~xu=6gnvYYtj46c_T;C|MeE!h)@B=cr8vSvNp(94<b7?{9 z)*x0mRwcAsPbt4plWZc2q_k;-&OxEgdgsUhHI919xJ(I1t#e>=3L`9ts`70o#S|xJ z$Bi2Q9RIO?yc>TMB(3RIH7Uxm>!R+RfXcg)<6*bytD$$zWMZ&ZVaVCWB)TgRG#p%B zm=zAbNV`-s9J;4i4PGk|pO01f&0mUkC{#=Hu)d7x_A|&}8m+LFn)+16sn;V!kGwNf zPwgX;VW?cT)xtfG-#1nPTw9tHDVv5BM`}`QeN<^v<V~!FXVl1;JvMMH$$A{tyBfs$ zq2~e&=%}A3MlOlHnb(U_yZ?zeE(578U3h%?9CtRY7}oP0O)ieMp-BW%UtMe*O@3kB zow{iIB`v$hpq!p}fTrs)-)7t?2f3c$K#z82$*k{_R{uHeYuBKewG37#6Q@*Y1*HO9 zBzU?sF~o+w{I8Rlh}BIhBz}rAO>0YM#`am}t9?#~fw(_Rm1>KO;FrvbwF@9y2mKzS zF+Dd=mDZNqb_=;uezL!(3c_-A6n{B!OU3T{e0kxdzXr{a(JowZ^TqAz43vd!F6Niy zGm8XIE-6VC>xX9n&!QWo|LORYbe9d!32EKjIl|ga?Y$)x^OWIr?f6U<jgpXa_bbd6 zGzTnX|JJ~)M!x-fmXU$9PmEUML%u%co?&DgCJhq4HD99gB7bs-dd_sf!$KWic3jOx z^}mKRD<bD3_+IRYn6?y!Z|$`}4u=ST%ey0kpeN>|X%u)Kkq4Dgedhp@m_7KAf<Ts* z<4MkTx8EEi^DY#5W$pf?LVC^2AUf3QR?V9$SS}(T$Nvyc_pwoMNtSdL8(j~Jf>Yur z_rm4l?(K%0A;ol+0qiY%+IYqf3vQKL{z_*N4qk<JiKojZH&*DAm`~PpKP$X()R|D- zMGR^-`NmRY-3D7i1jsa~_>Fk5X`=5PeQM}!n+Re&M-J@zu64^}l?F5<j7c;k%pAIp zyg!=c&*|j|G;k}I)xKKWJz2s&je)~TXs<?VA_^*hV6`ibSRY&{AP-nIeRpysMWag` zJY2awtNyx`3RZ5dY!7YJUB0-w10iVmJIjI|@wwQ%6Hb+D8oJ5PW2fbiK6sQa)yFM& zaTOS5B^0N$*mO}ClT}<}lZYj2?Bu4vT-?uzg7K!Lb(25J6(yop&v<|XpL&<cYLi+J zMc(Z@bgMfjMG{sO22IoVM1IP-Ybv>5jTeN|B%nn$ZoLxNc7LT%Zzpz$?OpXTOqz~O z_KV<n8_trt3sgeI&^voA+SapNbirJqw=P6Z^V=RF?hZ<l>?yAY0Ni7Q>4+{#a|15l zN<u`pV<&ytB{dm)h>O(N`vXaVBT$+gV@RA;3TeuVU&2!z=+38`sNhN4fFtTVtd7nq z+={%Ax=+9ufBOEV`Bk$RxwPta{nqJPE{}NafbPM8z5bu&u-MvwDe|vrda1{U5O?G= zkn->|dOPLQc?62o`xYhAwJpb_4_U$z3#0NzM8TS{>^A_)%jq@@8`Mz)^++X~N<HSC z&_GSsXCE_efU=sNY{mCUK~nx#@x(^2DyH!CAaG+N#JGc#SJtNJ2oZ0ylSGhm`oo$> zq~z?P3emURa9nXhy_eGvcUk&G7AI$GYYQgq(`yzT1_Wu+YAJ>G7BlNEfN$xornY5# zvrL<Znneq@<Sih?H05a0gkE4el22X%J)I!<utIWVLWvExbm}WP2QSU4#mRkqI<^GP zrx~$xEy#<!&tTF*%_o$fXWwkFS_N>frDYv`EgjmTkgZ6=sNSQsQg)kyn<0CxtNj%4 zc-_?8qBqbKZ;TW?Ge>PVHbgGhbsDQG_X0mMmOy55_bFCzKdNE;A}DE7p~bTRwIRf4 znG%s|0j?5liB{4^G=w`tC|nc&iKP9<*Sg+wv6O239E41>4~@ah*cswM7BP_r4j^5~ zMrFE-L|9jd<}%79)453}JwLl8Q%-*eC{L0a(>7Xphy16Y^?LH1#>axIX|=vD$A0e$ zVWn%|p9+sVo9!DTh0NO=soF!E<}{yVZ8_iGBUkfz_$*VoUZkyDrg|V+1z5QBGjjL( z1d>0k7=6#VC%Wx9M%8AjhU{|Br{A>|kh{q5QjHi`qN_0hs)ihp$mn!EyG+93ihS_c zUmswW6^PzAAMg#!jmVPIH>6I~{^2>_13`*1>APi&zy4Js-iJC^MQgL=6Q?kK&FiCe z(GEv!h2&dY=4sCG8xq^CIXSWAw;@&&VNdog8Z1XyS5Ka_!9$KLn6zV>TYXaPqYDl` zk7W3~DY%8mdRMcOAFBr)51NcW)yjHso5*It-8L<-mp-7mv&PLJJ+H@)Zk{2obG@l& zuXc(yd5{tbaE4{vwW_q{x1l1rFCT<75<6ACGo3g7)+(!bEy!I3TkJJ-)c$H)-qqz) zyqwcYJakPD!`9<NaNo*y|3&B2>G3yAJy-Mt5~-_efyDSlOHw$E66h5`inu!l@)2|8 zTPAG!%{H^j;*mC+%?W;knKF+Tc+EY0e#K;haEt*h#R{|6RNG$GBPpL$!wfc|ykm)6 zhQf+`Udhv?y>!^2b1Riq%J*0_1^C;L_E07HN^N3kPxQU@YS)Wr?0ov5FED<(H!x8= zn9bgO(c}=c0PG<ef;9EG6@w!5fA!&*3}<#ZdcQIAv+*Ji(Ftp=&(wpd*;xT*=`c!+ zLG5@9y6LyBQR&>GJ}<&vm}4_iBIE+!UE2#Kvv54j0J|@Bdm~~GMKL=8gF)VCyQjLJ zVBj)#oTA(k-m^I|p!%WKI*965_+G}Qe!+|tY1!lZLFUY?G(|I9^Z<RTXet6QZ7iqm zGfgWzS?L~es}ybX{M!E6*zoZULo&|nllqs9ausu{2*#z3uGR2d5CuZ~LYX!~hws#- z^`Z5c*>=KPk4BmNsSKfhtk?HGD=n2DCZX;bI-rKFuV1)CUvn7sz2z#G%N#4rn!Cs} z?wxc|0)iT{-)sN43`D*uNlu>R6*;E=Tzr`!=kzugs;#_QoR{LjPbyMFh?T?rNqKPS z=bhV5Y4C$Rzx?Z;$yP-b*;CM)FB4A>j93e$uceR6($I%l4mZeqCi^KE6qYo3QF|8k zNNeGV_hC-$mQYA&zAcFFD<Csg?M8REw!>pCVhUfSsTAx`@pv|95^CvTyrEpeuTe^W z;TkVH*%Qrzn4rBrzUjXUlEJgokyV;yV%)=Z!}%clT)b|~+EU@t*#Bze8qy|i5beX= zoj&OY-*Bl4cQItn8z5$8R^GnyyqJg`y^yYr>9%r5w8+a`;mAwi25|j{j+DZ8|Ma%D z*JuG#Ws<Hj!+4*yhQ){Xk*x5apxzfHzf%hkgo&Y;?ohm*rW{Yw%5O%Mxw$voBYe6s zo=JfwA%sQ}%s}YzKhyw784iS^$a&20yr>U8O}?kiQRf^s7xboVNg(6AB-0!fsI)W3 z__0LY;;xVc$13urK=tJ$o5WRTHKdQg+o-M;wnKz|^E9uw$tc(%=MI`1)P-)aS1>6f zh|Z)!Q%;LzTM=VeucF>7e<3$B_H&Y~M^sDThuFN#Dc+vS3lf~>>)sW%dZ7>W?KbPW zv#=qZTvn|zQq4ArODyvrwV>#YHDRWhNh6%R0-l(VqV-i;q;V!CA%E81An75+Yrp`T zeEVju&p12286tj~cmMJHthd2!nusS8Xp-gK8y^O(o$DV<`#QO4C@Nf53{86$okt$Y zkSrs7Z~0o}QD8*J<N<0#<a;SUgFIUR?sStOh2K05{3)mQqVMPP5sz(|Y%A!|h2n@S zwYBmu^wMvm`OrciwM(+^z36Mstg&Lg;<(HRtXtYqmbBI`<3!uQxeOtdWOulMP?%fA zk`Wc5WqA{~D60L{C!?TtEAMvz`WL=#{t=-8MFUFT8#S?FN(6$fD!)5+l=X>oo+i$o zX(Dk92oogD8ho^Do=<sH$TnR5h)Y^ce1U6myoewCc!%Z>`_;Y6j(zHLmiV6Qa|}*R z&s5Db!Ki{~ACn@PKP19MW5h(N&g$E@*@*8Sv(&>I4VG7hw0mC*5WfmtToSclyry2S zNBE)AzAT~1%^!Ii*834MzA~4he|8}IqxHVlLC4Crv3Z5=AUy06T>}FZAkGW+!|gsj zPE1_NR)jIO3b|`_zn*W2P)Q^Wo@=_GxTU-#ktu6*NB|<U9RQNY*YK;u1={FSOtvBy zA;VaRA~V6<if)PKj#}(kjd-OjZP)<r!16ub$H{M_(x)8rlX7ajy?C{xKlHYBN0=LA zMlhw7lje*vhb7)@=22ln7@c!a3#qs6ZU*i`+Zb<<ZXJvs*98>~Q7#VoS(Z9`O@)&{ z*xuV7l7Zm)T~o%i{hWNi2JmPaT?(t2Z2iCudDEl?=up>kRxeS}Fer<;Q3Vx0>8kQn zvRHoJs3sI6-<wO{7dIxX!P`?rs#%t77NmAx9-WP7XNB3-WNgvxMKNf>DgdAyA={73 zNl=<kvmufN%HAPK3no;O4rjblN&hC(fz$JI+Y)qpXEP`@?*l2>EXS$tw7G*g8obRk zifUtkD@lWb@M$m)!Zy$U`S}uf(CEGv_J)#+IhL{}dV{n!db4s?BHrXATcJHAL~@@b zEsly<&hE7E?4;@Y=+rgZ^kP438d0p)mY7{jF|(<IdYl@cZZ`?6_>gB@^Lr@$j|`)o zolT`2>2)VqHJ|q+^?>}ZrVfd6^xL0*QZ48<(Rg9dg*JzX#U*ttL7*x$U-@*2DHb|$ zGj-?W(=7YW02D{t@=$KB@8T=QwpS!1oX_0iMUGmH`6-d#prmR|<aCdwHQ^X~yq}%J zz@9SO;20p%)E0zlh71_;3QwCVLr2L>GGa(P^yT2Hu(-J%QsSaI=U9@dhpjsD5}G&N zEMMoPNBvM`(!YSrmX9qzd3idoAJ*<*)%w16g}du?-EjYh`$?dVFv^z>nq{KIqG#;Q z22P!<7o1r=sMsw}>0N${177d72k<xB(><SL^fly0k$~KRW?*Mr=Roxy&Fr$%*?kkR zlgqDd@5fz45ux7HbUw!6tD~Fwve-`BA|8g>0&B@`ofkVkcC+tjeX`Xf26ajJYw8%< zfUwv1bDO%fM1dc9MR}JMRoemi0I#sITAt_~4@)<PQZG&11;!AGcO75kCOpi)&t|t5 zU*MXqSLlb66vrlx5u^a$k$I`c)k9xIzD9w*rz!p55crn!F#U!EdwQlN-l~*Pw!Y-e zJNr%S57FJ&U#0rcyQQ#+UFk{Nad89oGCv)W-#Z$he5s6fHikOfpa=tEWim)llsDEJ z8S3eF7}^sgyG2X%GyRZPM`;+>KW3L-UwNlaOOyf9%5CHdH^b~OMVQ=(Kh_DomO&75 zxV#Cnmir`#?5N3|K|y^lXEG}3pcmFiF<mi1;iHk<6e&?Lm*Z3t^~CTFyWFlHc`j*J zB#!>Wk(u*XC4U?rl+nQx9+7nqLkg-|I$ep5m5U4UDjNR<voa**Z;X7OSPEIcwYb_} zS$^1}|Dj*y&+uR(`eJ1usJo34e~DG(7iG+#58=Qmpy{*W<@ai(d*>zg%78CG;YjoI zq}Ovt`Hf}fMb!(Y=)<sj>`Ddv0Opi)ZZ=K?BNqU7sy}3docu;Dy>2J*qomlFU*Cg( zG`v`{%FK_Tid!=DOJ|P6jqv9nzlH=FiRC0V>Yr&=5J<VMgbIKdC0)FaV`PpdfKs&H z6MA$H&$Rw?PL76ax$f=)y}H2fBa)gs@G0ICQ*lNddaJxQJ4U@KLtAk@Ezz6|*6+Ek zvy|ka%bvgV5|Ex~>JaOX>5lU5v*#UV>?=-*&)bU^Q5Ypgs`!wWI%a=Cm}0woW))1q zeH68R9)Q%9lxu^IJtR7(ZiL_A68f~)D(I#}Tq<g=sYnjl^A6_KH}WV&HY%I?Q!a?9 z8{s!F*>LrAAA*ySW!ei$VQ;$AbZWRN4kGr%#hHJSDbcEV(tOQd4(~ytmtBRUqd7z& zt&M|u=3mf$7B5ec@T^iWnjfJ_4T&x0c1p8CAg=ikPwb<Z2O!9MyJo-{0V&3VeE_%m z1u_h;N8=6NK1Wc?r+O&&xBdy4bngs3iUmhE2Napa4G#T`KZuVaFym}~nWPa~ROUL8 z8&nh6C8*#w;*nR+e5*t)+jS@7V~9nJ;~GK7^hH%AoW9i5({U~R`{@<wTLf%O7En+` zADOclM#dX8=vLE46{^ZL#5}V_lotk#=#BOY1%Y0PR(O5M=$t9I>(GT|?WniWvzjkx zu7P`{OkeosKcSl<cF~$|H{38?L>#?GiL{xg4q7}!kPOFLQohW<I;7}Wx1a!!>T@Kq z|AZpv)L}w2auK>XB}YNJ8i~+DfjF+#C;<^YN$-E^l4zM?{%VS;R>N?wrh+R5R}?Pm z+saEC+sNEpVPQqUOgoG{$Ba`QLS=V;pIJm5XgN5o2D3tbo{ZCx=$KMRugGf$ss2WX z4~t*<!=dbqtlY>QB&$_LiWf;Vjuhb2RD}OS3qq8DhbJjLN-myzerm1V3`WfPNdHiS zq_8*byBovT(6YHTEb|wZ(<~(LNzo#TwAPzET{I!FWkR<hZPTGBUzE>ApuRIhO}w{P zAMA7ys4_wyIr6Tdd=tt6LmAae*bH%&;=SYZPWH*mco9p8DF1AS0_HWJ7wqVPZW>vR zV*At6MYmZr6H%o1E~uiEnKNh%Glo=lZqn$k-*C<LG>f<Mw&gW-+AV+A_w?oL*_B8A z4G0#>3pqNQjvVhPYN_0tSFYRXDi`5c%?ehHs^*f@Bz4n@SC7<Te1bk}?u6zfy5UyD zD}p^mMQtn6SiR@PCPEb&A|4tCku2}r-CpN^jjpe+7mk^H(CuNzc2Wb>U5wG;d@g1$ zH#z4OvP&FwpU(^6cVB=rYkgyCYwsn|delyF_qu2QDp0)7=)=`p8EDrH=l1u_(dkTy zytF}sJduMooo~AxzA|2}CXOCMzO`hJoe?8xwF|+yobuhl!(4Rjg8g~j8=kS>+d@`S zmaxZ=)Zq^zxRqA6n4N1uU{DptZUVBimuWoLT_U1!zt5(7=^od+UlS+E*`yFv>R5qe zFB|TgPqy8Uekj<S;Y=mDS$wq7$i*3(rv{$QpDy#3=WYkqW~DrNif1qmao2yO@*>ch zLDZVdkz;&LS~+CV6HiF(esd7=Y2~@Z7V3-;BUSiHOYA@?)Qmmw%`E1sKZvdQd??>K zk!-uWTnJ<Q0kr>Eusl?okP=<oOB_6b5DPlv`Hl>;XXR>z{u(nLz(Rx~DIgJ*_K?$F zK6ak@)p8YmcXz24lkuZ3umk2*K+ezopSL<j>KyGKl^LmK1^f{RSH{@fGWESvR_%#l z{e!HZ-l5PF^*)e>6b%7a9^B8@Nj^q95KD{BjXJ&S;X@R{QS7v|{}CKKGlG5_ydKng zPRd=;_`u7Fr@})mziy|4Cdd!dpQ5=^+bQJ#A$XIb4o`O)!=OBVZbcRRV_`l+Pnn|p z^YT|e6W@+DBB}O|8##cCTXPruQ;Mc>&7RF0=xj&-(OqY;;*0145vt%%MTsTzl$<l` z<VG5hn~S&|I?3KhIw-!DKlM*n!;mFgYTm4G3Mvz*Hpg<ZpCf(N{q&ucKo>F;Y9Ex9 z7((GQkSX_>jkFNIY=nnAkbFha1QV)Dkw2kyWS(WPFb4R+6XSMXs$G^qE4M(DXh|y} z5!bMcU~n%ocA&ybjSVdj)>4$I8hTpoMpr%+`5Q#RgQKAyt)7<%>8NjLq@iC^3eVNH zJ(k@^Mz;@wU-{l}2ASCz@|SM15~<^Hk<Lwj!sRXYp_xLXLS{Ngg0{_lwR}_=068<p z%@F_7TztN{<ZRFG0&9NFuRC3=Fn$WZE8<BYY6#LBFYH2NJ6qe`t9hUV(D(`qWJ|Q6 zm1){2T5r{fd{R1r|GJ4|q^t_}VE0YL#&Zr^e<VRf&1lGll_kV1sWq^_?<KK-ya7GT zi(LYxAjDe8i`yjyuQI!pTwQ1u;!Gnf)2%h~rJ%laZ0#zhQ^2Q1z13l^JNm9@snIj} z)H#FgxKySA!Zckj03#{#O|twA!TZm%PjpEqYO6tX{`5}@;=4+yRQ4Dg9d;wR&@wh` zS|CYF4gYvdlq~d*%!anRye#r_xY+GtfVv97_gAC7^_gA4)eTMg#W`OHvIk+pJVx|` zu{1~>Kl+CaGB1Vc4!38uP9W@XP5?jZyzWf||5CZNRdG4Yd{byZSl}QcI%ytE^y7%A zq}O%$gO=vWAWW%>f_%?fVB1#>D6WQXo6*`17#x%=ft=7T&-pl$pZUwsA}MuZrO79B z^n09qPSkrF%v&F)#3GJfX>)HY*x!;rlGYrYi~8ZkSCwBJ%Zv7t9B#RbajIq+(2Zph z>ab#m?6bV*u+q0WWqU|9e$}lPa6IrMaxgcwZn`Te*AvfG_Go`h>fwhbTjYzB8<ArR zgjZh&1%VY26w}8qAY|CND#zeh2M+qGbS!kLNfhe)tv3aA4SgG5tta8+7=OY(u;tT8 z!`nJq;btvc#uP!2a4R8RQAT&YyS)2YvtjxnDo>XwQQrc_3=!$NY^9U&1OoV;ND%b? zPL`{MWeaO65)T4Y3g3h*DZnyRL$0uC8^{u|j=2T=iIk&j4d0=Kk6M%|>HKxnPS6zJ z9q@&rQ^>%dL<lddCx`N@a@8^_fm~z<rQ8@D<-<V;=75T->G?WGKW~(>JvCoLgau3p z3KGaf|8SVx$gL7N0ajOS8mbc3ldEhcgw1o`koo`@)mlS3etSdBjVC_RX;6n6OX=}P z&`N^kL;E5^`cH-UnR#LUCUj=!p}d5nm0RY#Mx?W)r4UD>%sP3fGFboj`Q6>-I7v=} zp*_TMb=UGKi{v=Unx?OE5+g6?#yEo!0{gOPpF2TO*TIKd4#yr47}VY?!l<KJwZyDv zn!UVva-Xzvbo#ek&uI!7q9_2g>`AyzlW(Q-c0+xJyXi7yIXbL@yM)CWo=Rm-h0g*? z5sEeM@&t)t=Eh$Wn2)UT>}2iGr4o^0h31NnP+(!0_`I#j-nSXa+^RG_9o=#?KVLeQ zsu!YZm`Iy&j5C54oDIeqyIw?9B4As3Q$+q5>Z3^l^vmRUj)MYSKYS0bfd2>FaN)(o zeWi`=#IUOz;4(IG6mNV^KGsFXOfk$F+PGXM<i`W4bXTC)ICdBe10+loXyOO*NF?Ek z1?wu}z|_;Bw#k#VGNR{P0j~3KrTJ7VaG@r23WTzTdN^)<Zkt`319DIy+=RM)c)M4p z8kF0BeYx()71%IhdMT?*)Nw6p8?S@ry<F<~C}`e@PSoeZw8?Bp(<kvby!Ab_sD#gq zyvNc6nX}pp7DNL#&+M!xCD42J{xZd9I!>fv;8|G*8gJ4hIptp4lR><+%2s$|gp^(0 z$~@ffuxgbL3O{^a&Ot2u?%S7)xvz&47;J8?ZZDrC$iB`gXW2%b+2LL8SeGh~H}AAp z=d<$kfXW)o-}j>scGBz`dD8~|JVHtwP1&V!z)d?ikX&2&W?z6E3#7YOYPqJc%HA5K z{ANJ0+LpD$UBU_6Tf^GfAa$}3nf==F{4vEoy+X2-{3kkTz!@7Kil;5X@}1TZ_F}Pr zOZfPp{N8m5k7%pqZF!!=NSSd$6aI_+9*{QQeHkrvop}~C48gZR%H3*|6(l0&WfjSp z?nj%iu}}Q{xg$tGy<-r0m8J0w2ZBBHX^EM-F-$2FfiNT$V$k91ucXKR1o#0D4Z8k8 zhG&P3@(B?Oq$AiK6ugIC&yH!^^wSs5&}|_ZPWaD;PNJA0c(X`5n-OD?cI3f!8m82v z-a+Pvsu?XSO=KA)?>(jY<ts0|O0rqCl|B;GzQ?XOBBvz%QZ!+EL>tzZEp85bsE*rh zHO4?hToA{mv;X}I#+9rX(L07VZ}y0{5IkS++3@?$hVs!DOHV6UW9-+kC*nI=Mvljf z&)nV;A}yyeu_qEC4;hvraa$w9YZ0q0ho=N2ZUi$RuHjv5EC@orLR4@QD=*QRo8BZY zWEr3|uD4PbUDjp);j$T`J^ekzcg2q5?P@qZ@S6*|`wzRdZ`x;qfkQ7338T4vO8vb( znPfwOub<FR7mAeW&Xuth#T2fnqV7G4_a<WBdlqj`Vt(O#XwI=-31`ru%>2=!S8-RU zTlBSWsisZavw&|BnmvUA*svpx7<Vc&ZG%a`@<y`?^_~go{n3My;{ky0>o6BPh2Ctl zbF&sh!rBnDKCU42c5y?nH{z$qz1?=V@9j|t;=+3-8vO4yj@XtTwaH=+FM>h{9i#0- z3%RIm^?*-MxzQi7&}6LvMKdGDh18tBDSn2!0QK@F=yfuLvBNe$Gc;JVeP4cY0sbqs zPU>r(^>-q*jBabu@v2%+`c79|(;TPt$IeFD)i-41GX|{s#o2{Hdu0GdG}FtLg6son z;?%J5;m2aiz_?Ar8<l+n(hGAuO|r*C=qM9v8P9~~Wjh(X1bb7OAtn*yvY-V*(!uOP zI|fui?uh(^vH6`9@vpV5xkuz(u-fFY+ui~wG#2JNksS_s+xN;b=s8*91MVIga{2g% z^s;i9sOWFJNg=vI`>%l(Xr;)YA#GI2+l+0o;^=kGTYro$l$x`ng>VfH2vUq<l#P5x z$F%22e*6iSS6gA$c+85$VkAyb`tA7as1H^e1V7hBanv3_zSZg3Pj^3$UhGWSQ(0`_ zg^CYDr!cKliv5Z5uHPw5YI7!F=`q<XGi%T4YkmlTOoEZU`7C^>ng1L>d^R$tN3T38 zsEB9Y5?vEP4Ph`~S|I%HTlv<0Z|KpsE3Hi7s*0vnWA?I6(t)s}AB4<m4-z_Pguei| zxTGq7JxK(6+hq@Tt?PSPdqyG15K93&XYF7U>X_l^9z<L2Hp7CIc{PIS<#skWtnytT zNXB4wP@TmM{Xx0m&^sKty>(Qxfe6Qd#9N7<!5W8_Fz8qp64X|-z_I7%T-BYmRAATj z^_}F$7!%`l{e4ooC!Xzx>fBult-!%&ip6wd=D{w*1er|df%Y}q$ByJn$x>zcGCU1i z+fM|e&5rGAeDS1bDrl#H#SkJdx@BqGFbKYDuWo|Jm`g2$HU?&J%LzU#&1RBo8+%@- zRXEwC=7iOMqYr(>cw+L(KoORmNd+bzTFdO`yO7Se_EI!L&QeA7R#Uu+6d5N6Z_Ebu zpO$l76j;d2U=$ECb|J*;)S{qhD&EF@VIjt>ykdf|G6fYNw}>$2oLT==HnuiRONUE~ z-kB&(KSU^X1zOZ}igg>9zHMPoJBh(Ulx65yQ%KS99UE*LL78$Wbm{J|<Ki=LXdJYs zO^X|r%p|Q`A7Mz{iVaYAI{RA7v_B?d*TMAG$1e=>S;PgvZSz27P>H&itDQB%E6ibq zVL`ZK&hpJ<*@-AJnT%tJv?)`cmg1J!X*jad9G#`POedmuia>(K=A~OC-A}l(sR%Hz zP}|oqhq7hNO)pQf(bgyd#Fh>Xm<sSmBA9cj>tZ;z{5+84wiz-ZeEDo-ReuxRMNQ!~ zFvB1%Q&i366rxWa(m0Q91RaWmt$9x#&`kO^N*xW=FYzKeIAiL|g@Nd6`SNOqDtj#U zYVXv;Nu@MfA7FI*Ct~^cT<kCAD?MmkIZ}MwN}oR^zljqw7aLT(=rU=o!aXVnzN3NL z70IHTc(Mo&E=0(5aZ*fC+8%A4#CC&&=X;%&yJ7>lDqCDsG9Pxy-u;%`b1}9kHNvAI zf+$Bkchtuf=9CxFq{U=*UT=B99PsfZ%w<sY=1hXj{jsC*+kEE_OwOGC*7PBEw(8_~ z(JK}=TTmeV<>i<bqjae|8qR@90e4MNtUsgOpj-*v^s~02WJgplW$>2>nQhE+wZckJ zmzn_L(?Z$2wK$%!o*i@QCQTg7*2@!X^bvu%h(rc1W0Z_FIVyInzqcVI(F_OLY4^rO zULX<9hhCecpDwA`+qCXm19w=QvtxW2-44R}o52F^SatiMUe5V%a=Lk)WJoBSi9aaL z$$X-^mvu@YG_GpC<5ZSRGVW!t8E5(VgZBH|2{AK>1MTVY?YrZyG}i)G69XxdP!>*# zO$0IN@5g|KXb?WgylD7hdY6TF&~W%jR}o|IJT#|)x#Xjomk;Dre`!{Xbid91d3Rws z+HscA)8c6xjULx%RC5IK{?Lp5pxKhN2-DVN!`BlNTwOwZAA_EgU?fxtvGIYLikd3g zSu7C~0f}8IKEyqWA0<&=D+wMb_v}k3DWJ`xp>5WjEK*vp?mmxzDu_)<JCHUhhU<D} z_Tr08AC6rD%$%vi5{xyo5i$?A`IDdeULmvjF&`6`eCDE+TQ5Zot3Bp=rHzj5G;7vU ztU|pa&$%x@7q@^8a)G!j`xwP=V0S~n+koyvl(6kV$}1HkoB2A|Hs)>giUZ>bicLjW z$@nA#v~^(k&Nb}o{(gp$EaQ2boHKnrB6Krb^aN74!zSm+e4)U1XPM^H?~@)_xGu@K z2N|9vix#&uyiF7C4HTNOt3GaOZd+)}PaZAoO5L~@sq~}Aei^n~do#DD5QA|J;bkyA z-f0-xk9z@6pCp`G>2tMSB^)!O=U!AJvlYdTvK(E+k|`^}*ZvZS6sXltscS++a3b!# z_^d=)0!SrV3ewr^jSh1k72aT?nsrZye|=~`jr>hBnBi=6I4K;~zYR0J!Bni;8k!27 zy=b|+5V&okQodp)=yFV0Sf!O(z$aMLib@}IfoCUtnEkjcB8d63z4yA6Q#15s<K|-C zUz_8E+Bk`Gx9;vf(D0M<;MA`4AhRs}mZdab_bj#9`UT^mV>C$nOx@%St+NxMFS8y8 zjkFfg&)m-5Ao*bB+9EA#ndw$#3ZAb|g8C3{eC?%dqcD$rjDcf=M2BU21Gt5uN^x*y zY{MN+1g^$NE^gkCtBwae8`#7~z$NvRu5f%{I+I_6OOfIU>a;DIXQu{ErgcbQjP|I3 zeMgF!`kYO_Z}a0mY^@HtXyjVdPyUE<hy8U3$>t?Ey^RICx|dd&)ET3Q(3+U5%5Zo= zrXFea`34_(Sg4w8WMEfc@yV*Aa-HY(><CS-C%L2^b3N_=wR73Ly@4F%*H5!}`l`>R ziM3aC&1x2DvQ7`YT%<*YTNc@D9JPK-tsi>}cbD*}#4QOscr1&9k%Cw!3Sh(^`>p_n z!(&ot_Vb^sM~O?*^Z@eg5)$4TKRB;K?s-W~+~%E#GyUFL_dqa4Pj55k=8P)}y=Q`= zEc`Ia`N=|i0D+fX5GzlJMpJh1hU`4fXtfIVtrxe^C-s;D18v@KNUujUn50SUFg}Or z%A97jfDrKa$$R5ZnkEO#<>Ptia#}?~HT;!o#rOgb)FJ4;(Ms+ZTpnqy(L9Yd4X)6H zLt9!^$8RKkFaav`g~G&k=SOvEK;D*)9w0lWNAYHKTLIv*eJon^awJ|iL(O|Zwy&Ta z7~8rWoWylK4ydkcMDNv!dr7Q+xZZ^?UQ%5N?K=ttp(1DKa?V1>Q3+a~34I}fE5u}P z8vU3S(7!VgDjG++)pt8&@=bEz=trKHe<>C>r%hfEZLx&=;@NP4lX31boAQf?9wt60 zdV{)xpb;rUo;;V}89Ag|Fb7U7IR^?^nxEoZm9fMPR*!|t1%bkgFG1Eu^Q;^!5!P<1 z8O7o=gLpD&?DxWlwWb0sxb37~3w}fQeVnKk(Z#V8L(K-1Gj{F~B7P{yf*B?SgL|L@ zJeQKBWvkm^Q5B31Y5}Qj7I5P;E$?%--Vre5m<PRg@r{m|mpwhD%QY*?x*DT@t|^3h zha-gX5=}_yM^7x9nt+_<v%uTn1nj6K)2pVzVjNi~QsxWCek^FV((ZnB&1;<i)<`w) z;mveNR^HE={1i*wiP563%T5cuvsDh>Q$lx;8O_0IH>es<+c~De?9KiB)ZhrJ?u35w zYcHFC-5l5I#heQfb#*C8tV+vlNCI}3uH&}9gWD-*|6u98u!Ac;3_O&N@_a=EO_lOl zQ;)B{6n=%T8%2BJV;oo8km7ptppdO56%lHe>US1R%Z2eX5iEfPfBdHlrs3Hy1WfPg zY4q75QAPJ*qOUYmT!Oi$_Gim9in1%HFLPd&`q?9?N7o!tS=3Yt?iiKRmR>9|S-)IK zz2hO9bJTw|o`r&;QIIC!ZfzZGI*@^1uD#RN`Y6v+-uIlzKqA9s!2a?|J;^WMOMTC% z44E?4mP3aU(dRI#KMRC|884MUpbQ7&A+%!DK9^T*U2Oe>tW8VT$;7+yj3vl8tHv`{ zJjcLQ9d>oCV`g7yBRO1eC^V~!{9yHa_Qg$+YN#mlgJwdQkzvT5W@=LOmr$}Q^+u^G z|7bprCbKni$YUf?CmAosyR)^bcz8I7T3)h)1?PFyM{7@{RQ>Xdk^F506005DEWUt* z6>{VDT@r>|PnYD?z(K1j75)#Ia0(AvQm{+(=O{HZ^!|DZf^DCp-kaJ-zZ##cXAGWN zn3Kw5j@c$@fPU4=86}y+RrOAE#bQp?-?;6wmR1zWDzs1%ZOwjMsy`!Nd6tfs2ztjE zr*29J|CLX%0a`vnaF|};+P5Q_)P`B^Z5bxg7GdpC2Zk*FsRG>bq!{#`MHrjuAl#Nz zdw-_D&rPwI)Kt!uzI-UCUmUe{`@U4Fen4BUdqremnnLXu_v!(6v|=Q^Q;;zar7DJm zj|~0Ow;pU1TPH=6ogd=T#WPHs$;t@HNIW4E>a%?H@O|OS;>IvZaT#3S^eJRjPFc@~ zl0!BscH-LVpGSSG;o22C`dEuYvvDZm7m+S@Z^U4O-jim|c+0wfDU|j0ML2#VSIWM% z{RUoi1_PwB70KXKT;EAVr~q+WY5b5`R@H%hdemo-w#vG0y6yObjSG+FL5_UU<<Sf$ zha_ORrc7}eEiW9@lB=?$17j#gkv{PN8uX8P{F*x)A*5UL{>>R-aU=R@eQ%)u3m%89 z4eh~ApGy8WA$D6(7ybMwqkyMvr^Wu&u8(#-4Rm9^Ah7AXcr>PmM2nHF2-a8Vry!-p z$6lCs6&W_pw+X-z)pb8XRpmJ6ZWxEIx<@N!8%3g`{Ri;xuGLFhl{$UKmz|1O{^~4c z)?Bd)8uvq7uA_+clPyw(ir1!1Zz*?&)=wOaiI)-s4p-MH6#3vPCytR@ul+EsaY}b* zKo65fmd2C84f~@jG1R3`1Z9{AoFjFIPi`s%io5xlCj#D%Tp@z+2K%zlShW^1cpHv# z;VlMFx25X&xADy4_hR`BY>iWPIF|<!g$Xfom>lfP#`kOitJ)j_QZ&vns*(fYBwU|V z$tyfZkn0Q)B~_MJ4t^xiQG)2wb5Jcua6(PnNGeH*J&3Mg0?fkSs=S>HkPhCUj5|Vx z&MbW;S_6~OK#IdI%8C-CyCyo3T~hKQ(XFpEe^<T9jkwmGXy%&xmZnaw+suT4fVscy zyyv|*oZttt4Pq!kjh~uHG&$=;;^fcrIel5h+qtW!tukV7{F|=m*t!}Cp7>nTD(vGK zs+Fe7Uq2%g%wR+}5X6cK-x2h@Y;~2C)4lJ88$>@n<rYK>VFV&nq9~rmxMVomQ4_v6 z4yfQ4mzc>U%^)1;W=W(8k-whtoP350wSj9-Y6+q|#h0eTd7TjQ(d>F-1ZH-da{xm! z=J;H>(qwHvwRW*X+;cZKx^0H_MHD@j=sL^eT(EU`q3b&QfJyT;gPR~b?9%zitf991 zH!PVXLb(-fdIIOSel>0NQ}@pXCT&&c_s3=+wio)g1x@91mhaoSxtB=v%%l@LXO371 z{;jYf^Eg)XFTi&?7on$`sc)v-PVHh4bSpC6H0un`!Gz2-;AU>UjwGvn^!P@i>N?N~ zGj#pah*Xkb5M)_jMf7=b`NVv6@y;{$j#7ZXx?LX2<V&UAGAkTw-bTrGu;O9?e^&wP z9;KCXGCh022RqI@y;xPEpjGu$^^88tr#pK^gwI9pNQsl9sYaBv+OcNs1bHl(91qF1 zMAQheo2x2%xZF%p4&q_*)9V;KUse%xC%)L<vl~~+PvgRvU=C{#wT#9m>Y^_)r9CT> zMj++05SATWNXSdmtq*V)^Jt3y%tl9W+kxrFh{npmDD^^*MBD-x2bQiBR|7xUH;(jV zJ<X0F_7GyIJgvAKA2Qvyu2N6aVPvB%ItO$wHpAGWbYitr`dPUnOKw%n&2fB$c()4p z;;Aq9c|^;x{$>o6RbJx!3RSAw^YR_Ue1{rx*K{3ox@P(J9H_b(0bD_sOz0&stuA4a zwSvqE%@xB@u@+JQf?cG(BjsA1>y3!M0>wZMqulvrJ9D$^&Z0rgfYDEpv`k47T$r}; zltZ^-a$IzOEGQ9*le+J5Q(FD<*)ofYK9;1y*k!ObYB)-rqx<XRDJH0;D*2gZQyd6r zt_4)|yDkS8dVx2KL(uN<<F&mK-ndmmrRUf9kkG}&BwACN-HWd?J2Oe3hf0Sfu*B*J zBB+gMbfaB8jU0WjIEM2XkEWMq4yexiO{O(nGoeHT5F+4RzJ8d?4(89P8+*7W%Y>?W z-=s_q(UM>Zd=v4Y)c1L3pWv#lOQ>YmG%tt3)}c>ocXc#=h`ypEJg+I+H(I&whS0sm zQX#B7UEFQVbZY6%7}+l8+gLYvRIYL&-{F9_>j|cik)gAX{Ov^5VfzA9j?m9DDC*@J zYb+HfA12f*+l+9{NMHMG2-Da*w__u%37+~61EvVX@6|vDTm$ZAx|pIzyK}@N7Ts~7 z_jT9eM<jfmk}{SD>C9}?{thIb0+bLtuk>En80@}==Ide}ym{@i&i=}D9A+zb@g=>& zL(PIBad@ITLND|LkdqPZRgs5yq$Jg{cc6DYx}GSMo>j1r34h?YH2YoJ$MwaUudQb; zrgpk+7TU_}b0XIR223(1eF>kVRpPaEohP9%cktMI%mD6{A#c3?Mj2fT-s5SwI!&Gj zTtHfxOEN+=M@SDb_nYvI^&k#<WO<zc64qrvkin~pOvls;%7fC!2vlIZPSZwST)&n^ zBIg~vJJ-?*1zvbz5Pej^W>(v)MTqYP0%F}JZ2N8;vdLHlN700ZE$$ttfcMC|5)?Z` z=Mrut2Lt{R(BH!_&j;OqMowr##k3&h&?u^sH+&2xh0KLqOzY^n>(afawrK<T3P++w z47EAitYMTmHh6rkxZ79x*<P8<m2fTuin;S>bl$BRA5EBE4o>w*OOV8|UU)}3yu&OB z81$8^SZ_R?R)jTjVd6p$PV~>$$4mXx`F{fM9uVO-+UxmrH=5qsPk4R6qq3V$OMmDs z1hCS6$99o|pE=f4;8S)bp2#{?yQ>k<Vt@=$pY1E3#KHsYLYxgE<Fba?hnlSNLoq9e zt=dG|K%>|s*}OM$MUZISN{Qa30c`QufsU3)C9B(U`mMD1muG3-=aWs?{-a!Nl-n^n ziH6*^x(QvtF{C=Svt(pMlEJ8dUm%%cmk#$qgq4-KdOQCK+$vSv&PY9x@xEY(8ZBVh z9yg=KAE!_xA;wiqfE)S+SgQ?NTd%$2r8X0@VGpH@WdU0n!#mE+FrL7Zye%B!=;N`C zXxIOxER=C7en5JSI7LN2^3GEHy<{r-QPJw}NU2K)aNA)1XEY(1XB1MEZA5`!{A8;+ z|GGVMC4F>ds=|LJl51T*%I}@9ncK)*2H{o_>$49O*xx<z3s8x6mx`Yuk$Kur3Z{&) zUaZORt6~mD(Z3izw}PYoy3-VGreKuzjgV@y;4`1qpM<o^Sz3-jCwiwvGW{`(>eMCf z=xemt(w51*9W%{^+9fM4xh?$!<UYj;F3G?jZxioT5fC_KmIvAVnMO5VP1P^ddELKP z0KQWS-yirD1&Kt2>zznbjWJr36mdy#wvh-jC7MPAKNRQVTwp<zxhp`>f><5am@gEr zPpz{hBIx37Na(M{AzyF)Wm+J|<+NMSc|;kd3ZlyK1*Zl~B@;&O_;_~U2hp8Xuq1o( z0|Um}x$<~?K`{alX1x^XRo6zDs`4ynZSA^M-@W)}Y$|qBMA!mWGid{Q<1pR+7}Ze8 z%}qXdZ`r^cASNjZSJyKx{`^SzwFru&F^F6-V3<Gv%e>k`c63kYd$ENz=mb*95$plX zbSH}PMflwcmc!s*k-)~~q3;e&;OwnOL6Z55z-Ix{9F-du?$N#I<~_(rV|6cDHoCqB zv`#9r)QgJ$;l5>h<jTme&z-ps*jlnky{c|fbzSynpK|#*6IN(!qtH7Y1=Gq;;lTip z1`l)u2CLV>!czd<ej`*<?y%=j%jAa<9-k3D1(-egM;Mz=ocs&u!wNUYXc%LAUYI0D zog@8Up{Yj~uDL1zr5yys@lHYbGbnU(XOcjsS5=%v-wCJ@m;t+$(%eI>E3<kLRik~% z*j>`1sccuE&VK;?7ua=v7R_XtzS~CBdRAg+$&zx+u3}y>`pL{*NQ-D^bD23D#W_Mt zIrRaIB|DcksTfz_43U4S*gU^qfzY111{m#kC;hDO10P@JBI}G%yqsuPR%~2F*<xI; ze@02F{8HJup8swt!=MDzbtVhxT@8{l<*&t{OgsNURRZftC)LB%!$3uu2A8u*gPzhH z73ppu)ekp5$BpBP`eP=iBi)G{=!rgQ4%}&2zi`-l8i@Bf*Zr&|Q>szhVH0+EOGpN@ za@T^X*~@15Tt%j?LoR33&R94;_$13F=(_;H0SpGV=_9zfDp7d%jmM}BVbY)c0ChEi zb&7%AwBMV*=U0iTVrw6!TI~k25#I|0F?;Tdkv?h~*rP$C6hqol<3YJu`cmgK+vtD9 zng5;b4#}FvOL_pEeTsVagZ<?#yHA-4*eany@w!)yF6?Zx0fuUM?<c`SAC{9h=m}$u z>HZ}YyA}nwR>>tyTRh+~{!PC?l5yAc6#70r^n2NAe1fVA#nIl6R^W!e2$HWo@M|W# zfaP>O&+xIvBHqAhVK-~xZ%0u`JBG3&SmO_v0o4q{vTkfc)H6$QeA1V;yj-h=3Rao+ zPy`hInUdU^w@dAXq9Y-hJSwXel}!MOf`|=Yv2;5WcHg!o-&y$2ZNa`tK8-nR-JYtD zN96Fc&b~tSnCDuJ&(^|wq{NYr-=PmArtq-f=eWKx2DH$Fbl945BUWd+rQI)4)ZVV7 zl1AYNr|HJbna#{EkvLnUpn9pH!Ai2h-NFfJP`D4^^Zes7%Psyx#Gd~`d^n+fPaZCy zjn~CYP6G~@<M_=4!-r-*wt#s9MPJ;kx*vG+i*R>oDGPiniXTf_PF`#?#J9DC)rvir z^+}ZX_@`A>*Bv7*+xxo{b-Gwh63l)E&B>CU9Bamw1l1DF?euNhH8yaar<$h;AW0VR zQ!hZjguY1@O&hRn#dF-DtmeFja5IJg@NXK<oGXQB%PU&2_&2H^oXiR$OdXOZkWj5i zY6x`jaiiE}H4jU~XI-IDioobQ4w3P8%pzyn{=oRd{4>UrFb%E-A?KDE1~lApJe{+y z=+Yi;)7|{#hf)e@YD9&14KUVpHG7hm^4;heQ!tGjX)kS<=!6>$z+c3dfEVsVN)wOX zhYktkh1nU+ea^ypv$u^*tkZ?WBkjppicMh3E*xzsHQAo0lO4n%xSyUXf6@^Ug3X)! zsz*uL?FQu!b}Us~FG`)5LX6~HY<;(}2#<YcB*M!|1hy>S^`GxI65z_^iRTZ8>FW2= zSRJ>|_X~X;C06)Bwm(N%PXTS0QJPA3=$9%VQ#x~%7lMov26k<y$WFyW$8m1x<)49u zuH<sK%kU=GZ8z2`eM_%$3ED!^^PM>xR9cPqv)0_qLNaQRw0PYDcy@cJ<tJpBQ4dOe zKWR>O#wle1zv6ik6i5xxco5Mz0QtQDfIxr0+=GRi0VW_*moUA`d=5ugmVM&SoD3wu zY-!bO)4s}Uy;Y5_jN(Ivnr6_P%K^!C8f`>rQbe?!8Y!R7f48C9d8pK~UVzWsQCnyD z;qu+14Kwvu=rF|yZNWQm7aK`;8<2D9IX*+zj<83oZKmJ&<G!1`Vl&wOpaf!~qEmx7 z89Gwmfg}aSpbM0L=f+D?Ot!9}M!fKdl`hy-A+uDhRy2!#l5$_<lI@Re6hcS>8bC<Z za2JCe(_tVy&HGiP=P_^0*x%igDp;PxV<O(5{{s7I!bia$$6>xP^$bBifXL;)&%Zy% z?2Z8fRs_!95T1h6T|IpA_VO-ufM|?#z^o!hF1qlFt31_-6F6+z%mGt-Vs*>Ff}mr% z+n~GxO&n#Hj$6@Ek^rkkF>Z17%VQrb6o$GAD@*Aq-;&+65PP>80`UW(!*iis(YtHF zol|PdfG-@ob|kkj>gneEj(pF17-(Gkg3?*Nf7t{e_RqL(e}zA@W-n<=O59Y4h%>#O zYee#_vqF>g+=I61sXp+snNF!sR*c>@wk)HQpk^f8U3@1g{_3aZ<b0^0Lym1QCbPmG z^Br}%9{FYZjRbGyK-kX-nkMpo)N#}J2u4FAJyo#;-e^9qtFgB#o-=(H#*MkvbBWor zN3aK7`L;}D!UwzTRXs@5*-P!l72P!=b_;-g<CwFUUA}0Z#Zr`-$Gv?wi(B|f07|i{ zjhNOCWQ}^kK)-&B%5kKUmF(Y<aGw?dB<OTohZ73#dvTw;TFF#9c?lyO25(Tc=X2oJ zGbZU!*o`g2v&vb_G>#~TvjR{0q+cc!SpE>6_;JX7OplLRCMjOrh@zbm>drm|-g~DO zVY11iqdM;-6MH5*q+f4H57BcwCyL-klAjJxGyj<<s?^amzU7RQN&}_bN*PpE8Ux`t z)P3qJ?dm{L;38`rABRW~vFW78)`2}ZlctD?Rz=YZBc<g=d6u&Ch!n&Te9*8r0WzQp zEY&Xz<cdCCgBF9!o!-y9KG8bHHEL!PwV+oR9j0!Ls80(&K>#2S?J@*;h7c3UPithc zt0Sq9=h+D;bHxos8(Yb9{oXV2Qf+*HpO>XLFtrV3_VJZlzxU;ps}H!|+8@v3+#-jk zQV>C|R!U}uYRA!66h<`-ZuTO1uN&b~LM|ZW91Bl9xh#`(nP*YAc@LczZu~6D>n-5R z&{j^WyIfjsz87>g2(0}}QW4jox+uBe`?Em35wyj`72!3aF!(#<6x|)VwY!ZFaR(6z z=y8~EWFBkK(L+^_|9niIknLjx(+e9z*9yIzNBXqv`hQ&gnxR@A;DG#>NhxAZxaVR# z_Y&ApXFj9}4B#mevy(Wcy)rVM2HGAQ5LIEoTKiOQa<=L=XHSl-Ng&dUf`&#fkXbQ` zFjga>At}9%#O5hw>mv|v<yrXROtrvxOo%D~Qr>o?b=TfyBlO4c);-1C4%`(&Dvn;( zC-xq?X#zOK+cpYb5yV<IIflre4p()2JUc*L1d|k70wU?uWKmi63n`02ZndYkBEP1! zE<sy6m^}l|(cS}MOnZJBZ158Rvjrye`^YJy$K7{IAQntWz1sYj(V(}tQ7>t-<~z3! z7QX`*6bT^*I<i)whVx|`+JeWWIlI-^V!B6(OLXnE^vV?X6tp^NPW8^th^<Mp49=Oq zug%veEA+2?3;okpp7e*Z(e1afy<PI4&Jvy5?{4EdHGGL2FvUEC7gBuq7TZEx9YT|B zN0tl!LEtT!?Lu;N^3*`p4^UgzdB6tpdZaeW`!fX)rNcZvH*zYt3sWJRd|&-YEkeO7 zFo-Pdo+<qT40Y*A;V4F|Nf4F!>ZQQfcRfWtUd${7r`I@_148A3Ev;pisiVm~d=uR3 z5gD6aL4_-tkj@bIN;5AXod_$ZB<w9*`{Z|q{?1$ffP8tApdbx3c%D%Y1(g17rBzv6 zHWGp-;;<mhg)&JH)pwS0oUA$UyJ-``^dBU7NrWI>bW7}Q=p-|nq)1G0k-QBu6Ht>) z<q!XP&r<4>qB-EPa#yiUAE_)m7#$Nz3KvkSC~nsi>2;iJWe|6I<7q$DonHB?Syq&& z*J_Hk-t!-qUG>NzM{sDtM^L!Gx5#>Kboe|PYotTA=ESMwd&LgAoOT*R_#O2h{fbwB zHLxG^3tdV`R^<Uc8{{SU9#RPB!M4{t#N&48xB`CV_BFOK8b^zdW7`g>^fEi`Li65B zh_F=aRId;sz0ByFc4S2^rgnvt-<Sfh;^HZ2NgCqkfeX{|oNvnJ(`g#1(BX76Ddi>! z++1vqA>$eza#sloV6dyK=L0?lGS>i_j7X^x-}QBGB?mFGxYbe*0t6jA=5|M0!9!B( ze3`eeKW-1Lef+Rq7lrxJ*O1hKOOk|dY~P2Ur?ab%@gaB#x*xp@2av%=s>_|2w*+ph z?lj_W3P!b2{HG~LG%O@}VCcALY@)^`4VL9Oy*4xs3Q0}hX(D9|dFc0vZEaeq&q%It z*L72=MHCII)*H#e*ssHBvMS(nciz4Zq~dp}%<m0y&%&pgzzt;W#}<RZ`M5c}+$7%j zsA4Nn4A%9_Fsf6WE(C)|r5I;22wRwu{emj6K{okcI^r6}4O)1$k~NXu>r#eTQNcud zRO1D6p`;=ES`p%+1Lop;SS;JZ<SDv~aCP!49B#+`UZ^f1M;gF*=v0(+kpLvk4MWz5 z0HJqj;iK4XUZDFz&zm(1_mM?!hhdSPqpb{sA3y40tnww@#X=<dUxmB`0$AHFsCiHE zr3ym-U>fkEefZ%c4oG%V)G2}K(4hI3gfK&Xt$W{Kz2-c{0{)z>9D!BgIJ9FViw6^- zDS=gg5~OzOepCY&*h@fOl)}cquGJ}D{eWbeTvdZvsyn{Gal#c@fgV}#LWQ-qSNLXf zqjSNf7r>;^0%4dg1R9}7L>08cy4cWK2}VjX@0s2l+byzuV?1790Xl{z%Wugq7N`Q$ zZf&$<zREVF^LD7HdFdRw3HD|=-;DljB#4&>-%BI<9i%HS*-}>PO_;yS5_&uUi>#M} zTZ->+{Zk$Dbe6gMMiY_?zqHitxU&)dBMnTZ07rPg+fgDm&%FWg#c#|>Pj{Yn<HUkU z$)Rad-%l8szGcG+AuPtXa(v4r%r~dkDCz;6w%dJfjv&i7I1u=B&)`U2Ymoci`a+Ob zQpSH(lH2x=fIbZ;*2nz2iu=fvXn`e<>nJT`E(fi+TX<dI3Z(4>jHa+6z~9@b!xm$G zh6KT(jQv~0B5_2D*3$;N%JXZi9A4GRp}>nmigb!q6<)P^X8Jaq;+}1!ge{`KSiKvq zK1!!4QRT<ny)H$!ndTOQ5#^VW`f%7h+lP?USHE$yJry>k-ma(WE~XQ92up8`8WAIb z#dBtzg5VAIHpH}ziSLi%(7Dm($eo+Tx$4-p^kFY~styy>(Oe!#pOb~Znbr_(q2q>? zGoms|L88Lxh*U^HDDkZ&qyWxpQzhgUP^<XU15(4Ed5v?BiOExm)c;{M9?TU%_ztcI zhya|zsLB#dr!(r_#<$H`AVAnzO`htz>nkpR(<HId$bdPMFiLO^4>syRp}Bv**3gi- z2T}qhM5J%hUkscTW&wyxP>m`FbTHDr$*PeUYHG3|F&&j?tkPO=60YY@vrgWHhNOAH z&zr2FW5bm^uO+4Qc`z5Mf?4R!d|Zu`1AIN~bE=|VmZp9xc398K|20A|t_ZD+?VE}b z56`oke4h=v+JX3<%|8e|wKNM`CU_Wb$RF-4LyMf~Mk*N&<emo{=BK$U8l(lw)3jUL zK^#bY!weZpp0FO%5n#b4WRm*dxbzXc4_X`CDu?KVWxl)y^W|KF(JTk!UuyR2_z)iv zaqT_LN!a&1U0uV<l{>T*Kt+@9-Jqpctj`?*`Fqq|*eLD&6p8D|)|bgC-@ZM@A8jsg zYC3AK+oM7GH8c7V(ZYF4mM^A6=CPcGxB{Hr3f;mPYW(a4u7U0+{t@zV)R=7}<Tn<p zt3g(Ob#c)e&L3=+N53R}bXffO#V{S_j2TrL|0t&3yHQs8l11GQh^`ZGmYc&FCKFhc zZ_E)>qa*0cFR;uR#75uN%CJJMxSF}jB2UL?J05^PyFaKyQlwv|D@t0zlG!;oT~$qR zXs6}+!$XqG-<b|UKbTXCuMQPw*`xntF8%u&Gx^pD@0$vU))9UD;5iPU+GdtT9TQi4 zz;Jolw32=Q?%pkO?Hg7E#Ms#Y_%(I%-f-MrVtJyFP7y;;Rm&;spmn~9yuXBFkq792 ziVMzeBA03~B1avES+tFW`c*b?_9ixRUT6@i4o!Z$r=cRS8boO-xz}x>*u^(N@LnLD zEU5C@dd64Tmo07O5{!chx-OGO8E@487juV}79m9lHKgQlZRL~+?86pghkcsn!=RRW zs~5FB_#rf$An+oaL9p;->o2yxWNu<2O%-2z#3Ho+l1P6O3e65M?Io;{{RlN&^<ut| z&5VrO4pZ78pfb6*EZP%QtDqxB-0k~Hgh3M`<KO|x72p9abyMO&oz6%QAOHMg-w}Ta z;r_4Po05cFDbH%tO&Ld?D!V~5R4ZIrB`S<tjo~_tVUZ%`=j10+V7ozN<1WZdu=;KV zTTqp1-2ngCFt8a|PuF2F>Ili`Goup5;y2nRfYfuzS7I*Ba-6<I?*Yj)t%Q8)tu~Ow z*ON@T#oZ=`#`_#dbK5q;hu`I=Fr|L$@=MuFdY?ENTsfue$b(V%OMf%1-8bQtM2aw~ zC}+l=BV=c1vKP|7HQO=H?|t@QjQJrB5T8VMNh-`4`YTW#?`^CH_uiOJFTzx5G6Ctt zp`12@7D8g-*|bR1;NggaQKv&ww|}m3H}-omJzZzSYh54oJ?F9y>Z${7OrTY%tLQ$P z<XInOrA(K_Z|T*I%I}9`VQSYn>7{6S1R6i;vg#*>RbSG7tjs45fSGRY=}2NDVVT11 ztv$k0Vb~SVZ3@(4b|{lU=vJzB(err<CuFX-Q0n9pSa7_P#j#0BVeZyrEsGS8cDOUZ z5*FpQCF6Wew*Mf8b<L*_GdKgA^Bne8<lpNE7m}%6Ee{sMPE&Z0*1Q2`dQOaJlbnD_ zB#cc=*S@-RzH{}!+5)Jn$I6R>wl{oRkvyT?Gb#44JW>a^eXg|CcDqSBBZ9bb!Z`}I z^JtJE=<ev+P8^R_di+eE^d;}qum3IZN!lP<rscN0U(y-uG@1+Os9Io))3G?3Ips^X z>_b|=@vUKZ!7(?5bH4)cCyaejjjJJtgN}BJJZX(OORfH(F~)>)70%eo2wL@vxF+H{ zA3oi^Nw_aFSAl{OYUn7>dkv5&v&AZf<DhAI2IHW8%q%CK_X>ioM3%b^nHMM|qmzVC zlYQ4mrj`kXa|q312M`$#8Yhhs*e`3v{VO13h)jphkHeR<EsnOHNI&e6N{~D-yknNb zpx5zSDFw1LjNXzy0<K$c?Ls5a04h3o$i#P#RyD<AqGh=Rd!vtp3arv`B(FajjA&KP z`JT29>5hmH$H8nNsUPKSo5tn+(pH}(_V&oI+55bDT|Qs;SzcFrZ|p*-bz%clMq!k0 zVyVD%4!i27N?;i+lYeOA2kf-yAFO-x!gzR-keQ@tV*-CfRU-fSqv$DOlb270daTk! znm7XmWGw$`$a|LMNBAtA0BK8G2J<sqvE`XT*&r3?N{%5Z+H-gC6oYidsd#&))V$}Z zmzYwq0=`-O!OhBCrr&AK%%9KSkNr>@b#)N3HOA8L0)$PGg_Sy68D250XLzD?w}CVP zlwUc3iBV?1R)6>LUU#$q1In3QOom*8P<V-xqk1lNSr!8irG>4F|2=bwBS)`IEQYeL z09GPV^@wgVD=W+(fx#h~T1nx)ybz{gxzLY-n)fXr9>>zv7mZ@q8oN8+L~7kT#tK<g z4<sVebS*kGdH~{`?Z>RS;8#w)9Z*=DY}p||5hU3$cu4}WLWzi{dX<!QMi#1zHl1aq zH1_^fbAo7>FX<B*J&UxbaR9<e-bpH-$IuI;eRR0yUsbfCkw?97bvm0Uigi`qiU!;M zjMI6FAF*GE$xoa_^?<F4v$Tv){XN%;7nfi_N>zvNuDd{irr!qOp6Ax9G69JCha-Y< z2l1m<+N`y<@dUY9KLV$(;q-R(1o01^wbhCRheq46sg8f#d$H;p6Lst{M)qE1_X*Gz zMDA^~a1jRL4hauO7&~xIF$i`^h)Ve^4S*QY&h4H*A*D*d>D#7U-$PQ-`+;QrihF5= zH?@Qp=h9qbTGn)?{CV8Fkg0agEU~ik^uX6hQ`&C#;b=qQTS3kdrFVgF#~r*q>jd&< z+(h$de)M+Rsi9;|t^ox$u+~AqO-mee@qJ01o==uQGiAq5h8=S(=ot|90uH=9|7E~G zuVJBIN5os{4j<NgHUMy)jH_0u>+DhuT|Tu9!?D4IJ_KDPVpK!OqrY;Ym+-C;eWI6O zGTSf!WjGNQd3cF+V-LXsNtus#3_mq1{d=EYX^53q{V_{vYH{>_VtOv-)W6<BKOv54 zp`qN6k~c6}rxNo`g3jA%nCFueDvWjBXxvf(C_JLY@m2)iPU3ZIQ4aT!>pA#Q5kD~N z55V3=z8Jx+JvT6*IDeAYa+)-U6Es>>)JfbN6{rmw(kGuQ^-{(Wqq1>!D_GuA)Mk<l z+{lo6X!b*bv6LC)lsLzLMwtFc215SR-Mr&stb3=LeGJx|L9dVzhoy&0g5=8M9~&JP z-Ayyomm{LjH5}P}nsH@kHgecHfukBqI4Bi7X<}DYs{~!AKN%Gjf!boW&29qF3@yT! zHc^pgtK0O$mF5(tl^bc&J>}ZC+puaV<m;0?BJD@#d!%k407{(!2x=CuEh73mZCvbq zm<PzTos)_`QoafOvD)aI_G3F$qSr+`{G(X~iX*Mfj{gU1@|nWM)7px~ODv2FzdThW z^&eL2{~+FJCWa=seDQszz-P&qWugv5?zmhICX_-KZ|7jqR8PYFVSN`3Gz=9$iFHcZ z)ldwZ=JT;~cMInGt8x%dm>QziVLc}VbQjgo2ZsP=0G@Iqp$b{QfGv6<i>1TUeRk&} zW(?ndKyT~}P|DGX_-7-v85LjRV52z#N06YKFTQRl+&A2(QO|wutm|>_TILArPz-v~ zGMFb1V&j+9E$cdxTTtKpkGp_;o2)PmmSuXg1_bn#vp*PJ#;M9KW)HAi5YN}W!xM&4 zXzR3{hGQ6pOKBy%De-pry9-tt$jqVc2)l<I#!B~d(#l<TlYGx_nu~1Nr@8_b_ys0c z&w;xS3L(vwpFgcJ+wzG5z|)c!dx_gI0IxX8oT2Y!akgxcB%r3R+arGUAn>b=O%3=( zi&21a!w%GR6J2(`{jpX=WpVKfBZZkKMxD<dEGb9LcjB0LsN=b>d%Q8H2RU9#9VcSU zd9n#yh0BnC)oQmV?igM5as9IM1k>zvg<3m1LYRrE_8zXpBC8KNfaQE^?5uH09gB%d znIeAfwCLIY=gRWPuufZS)`ur?PQ2P3xWfkc3MPSzx8PECjHNpZ;zJZG13F>j9idf( z1>FE#9It&aYy(qfn`CY%6mb=MX}<gXw9Y-AK1T{FonS#E^$BA#C6S*zThVnHW~Y18 z&KuyNVBAZN;K4rd%qs+GhzJlm(g2Q34>S%1ayIV)OH_TaM){x`f|Z$w0}nbl5Zz|1 zfHBslPm^DD=)6*U!a3T-U^ygB*mP|WEp^vVhUnPr4_s)%<ww6G>nu)b<5PE+TQsST zTe>>do~QHq%ndGqY`#BE4!ph&5WZ^`EBADvu9!_&B^0gH^_*yyF%6=@C{W^aK)Omw zg>nN5Wo~41baG{3Z3<;>WN%_>3NbP>ATS_rVrmLJJPI#NWo~D5XfYr$H!?E{FHB`_ zXLM*XAUQWTGYT(EWo~D5Xfq%%3NK7$ZfA68ATcmFH#Q(3ARr(LFGgu>bY*fNFGg%( zbY(<kV{c?-3O+sxb98cLVQmU{+KsmbP#fqPE?m4wp}0eEcXxMpDHb3=kU$~0OL2F1 zio3gOp}1QqP6a4Zpva}Wdv^Dn|DU;cGDGsbF3<bTKtrLf#Uf$pXbzHfgg{w1SlI;u zQYxApoB(!qE>?DSP81p%Z7|dx^p_ZgMi=Dl0(OK5{>wnh83cqr%cOzOXFC-~2td)* z9>Bo`;NTVH;1gtL2XL~p3;f5>(OD264Rixr0#sN5ijEMF3kr>tqm!pI*xCmAoaR42 z0rVCO01g2GKIT8%0TK=%XRrkj0#E@$Z9ops87+YJ04+xgFbL}TUm@s)ZJ<ymK{hsb zcXw8xgA1#pv$ZG#Gr%1TwE<{?TtLolAWOjSh5@QT2hg9Lv7*obv~9pHf6BESt)T8e zXAt07U=OwcL0q0aTp^YqXTWoEfR=(XK+OpR`O{eWPXlJaU$X&luyXtz?l14(fxwVI zoPib=jt)*hh$k3g4X^^+g8*u>%B)ZiC^G;EvHWcaw0CiQ_6NEF!S+D&XM;Z~2Lfaz zGyuTo2LEc$#ljiv1a)C`0o(s>k?nVw=PAoTETtSB96%7L3(D{Mq`}T0i|4U>vi-SP zJBXt@#QQH`1%_B!{cgh2)rn090)FcXQjq@3<XMFBkIWhb1@N%5v-1gX13+&9AP);0 zw%_5kJ)J;*C^>$MpF8mNc5-wASUooZ@&#Lgp1)AMU4U*N0MywP<m>%!#eX9d4i11N z*a8YL2U&w5DE~x%7K5z*#Lvrj273VBus?H;1Hk_K^Y<^~XL?yWLhL>NG5=$~Y?6lh zipttde|G%0PEyj*1K`cV#SLKL<lz7a@bd%sc-R5H{~bjg2>z=I_J3RzAXbh5fj^6V zp3;8`cKd7p^ncw31K_`7sX9KB76hRGhvP=<JnR<Fe>nc1nf`~%{~y7BNBO^T{C^9Q zb+xzuLrwpO{{N!}I)Lpx|1x;ytSj`H|0<5pR{;56Q$5h1H>(1&1iL!?uT}vHe7*w- zh_(ISV+6a%f;~W%>R_ma&7WlXQ?B#-$n3!okh-G_`1h*<VBuhA{~z7+Wm(ugzZ@>l zjQm3ddOn>0PALPiaJ2k=VVpd?0HCuo&=ZCInMj;GJOFQw=To!<dHlg)02?dB5&G-` zcy7-ZVCCqH@_VDad;m77-=aSdA1{DS`5z<zU{m`W@pA##wEjWd05<J^&~p^MzmdQ* z0{(;e0c_^~py!wte<SYaD9?|C!#~y>&m3n1{R=*4wf-060kDDpfgJ1rHpt(Q=Q%Ir zd20XCKL>OCC);yw$A780pS_))A3uma$O`(8l;bbypUnLy)^n}S|ANnzxcmz~PwpS% z=WVe;-T#&Oc?Mn}=RXDiwLc42=jT+=KQ8Qfx&Og`JeMGl2gm|tb;;2}D8#lQr0b?m zg4ms9|D(t}&Awhb1B>^nbGPdqI#LQlZFbPM^R-0E_`vIpT^af-@ip=X?=S65NMRjG z8lAs<?oAUkXZJf%R%Y-<ri;HwG!By@ldx!uANV}H_0bKqgKLNBRiw#(>&lO=UWk3; zJ|ySSI9#zl8M?HuaZt;vgnC~w#}cCxZ4_9#KvQ6zvq(UR2xTFC$%u94fw6FPJ&%<) z{Y0*qz=Y!aHHNFi+wc=-?Cql0W|cOlOCKRMp&<b&+!fa3EUmZXQK};TvUgd@w)14# zB3}2@jzcns{Sm#_zN+Sp^YIT8TAFD=dO`v=I2?tj=<N>qM2Av}L`3eKvkk><4}~9m z?dC4bYKh<{HG95B9!*q%{r<bWMz13zdfWzm#xPAA+>}Og$RJM`DNJ4?EqZv-zV+yR z4E~nUsKw^QCQfsk0J@nBX?u6TXY1?+_rT*#ZHn;?k1>UXb49PYaJS=KMthvION%VW zk=}zT7fT016POg5=H?)gqq>fiJZV%W;wZev98%Y7fp%g9q8O@_?9BXju4Z-AQB&iF z{V%8tS+z%<!|o_I;ln4pI2Ae-PZG7&`TW_K#mMqVak00puwgq>u6S}YJA%?%SYbPg z;jxeOp@kQE)dLq(Jr}3OMJ(*XtQFQ;k{D>J_Q}|WxoYvsr}G7|Jj5mfO@la(f~86w zj0is8Wl@4cp1cPm0Bd0Z6-zSA+l0Bl-gd#_i+0<xo1}SsNo~*=ex%bMJpSf?{4Syk zOo%ovMCfTau6_k=gWoNL#S?w1U)gXvB;yFw(yfE>jT;qw-?vo(ys%`q8Cv%C_ZN0R zT;z2BHkp@t7mEANnrFlhE+}>E^aaXoFbT1MT#!vbwBPi%iv<Q@F0EODSMMx)D`6D} zUo7D(lf7k(y6UANezz;^PREh&5_n;vD(zO(5}o@xn^kV8Nej~DVR-tzI1$flKI<22 zj#gBX$|X5N=(_NDYxH-w2laWI04iY)1u8YueV5JR&Y>~cpVqE*gS+4G%s<(#GeHqU zZ=RA83(kJM%5zY!WbmN7+l`~;<n=alvRbmih`|3jeg7IM1`PjTeNL)UIc?Obid1!h zeoj^|rkhzdhwm|$r4RaULF@#6KcR%ypMi0l#<wvbrjbsIm&FY`WH_|IkoH*2L=@qm zF+_(gz`L`ez=v1}<lm>0&W4?(B-dvzI-h9Eyk$C>w%jz9JWj=#dnGoSXk7~QY&n&9 z-!N;k*IHqQ7<VOrm&wC=3{GJRj_y%J@Tf%->@Palm_9Y|)jXWG9^Du4tDQN99^32O z;d)V27}JG0i~SN~v?AZW@rhr&o~198xs>Z4=@m!lM8kyGW%+p>fxfLp4i~9iiw<t> zD&|HvO5`!*eoU_ndozTL*ja^>NvabuDDr^dc^X5&bA{`aeAcF!r}MMz2R7{}dsjyp zc6<<BD$A#=@&<nFlv$|4lY|H3WD)fa#fCMxCLDo$fYu9=N+HdD-51|<J_URgqp*J; zqq15x%V~|RcC^ll^G<t+FNxr;#eF)-pFyl0u0-nPc7Cd^IS!x6XS=N2@+(E5DvMVr zs(s0f7q3=h<VgD77k^sy$x2)pBn#ImezKUV*)BXnA1||C@ZU+|owLd0MR<eExw_pv zlNV1$ZurSf=Q8uNeV4iq4TJ7z8@j_;$8u#3DHfIpZ5I&bunO-|F?P@;J;ao>XtE(O z1Hm)af0f9`TQjIIhIgnbcOp$PEsoDt;U^JNAbwcDSUP7K(L*B;C*r=82JI<boR1q- z{OJYm2{(NrNf)aK%y+;PxmoU<4V_cf+%A(xirbXFZ)k&9)Fh_d5*Ma4sbE@=NlRRF z!F*mkBW*kPxzmdCXOEcs9Uc%IS$>>}4Mvuo__>zpWb8h<l)Z@w;-v3d3(H#p@s8PT z(9;&Oczx&Nd!+nUpGbF=NarLA9D!|hT>8CSVLSd#q*|er3cgW!wxps~?ljFcd4f)! zp6dAk#HD?mX53|FSrVTq#*N_U5IF3rNFe#XQv^Ceu&Nf?%o_^YY6R?flKo+7f1kyl z4m7Z$+TGK3bvrMQon7D68HlSuB3oTQ>Y34q5n*WXlU};ZaaofFJPLK8T9zQTZP-sZ zB2N*ub3ULY>Fiuwx%TmXPM2DWq9GbK(7vM6yo??tvYmU8=eWc{s!{>*Rep?PdU2K{ zsP@>*Hfi=#Jos=vZ$5S(_XX}acUx>zr6LM?h$LFn<QR3O0dTQS9v4|6!QYx4PeCJ@ z@IrV?2r=!Kn~(4}UZe%N)je@&%v=4?XwjYVI41@CYMMHFGW|=pl!*gAUyddL82d_z zTBWs`02p%K63myWsm4kDubDFMKGoYNT$=LYUeKiyewpFgFtcOSMr)z3DL2j?#Ng%8 zTw!_BPcKvbRYH-1%S8|Y#3)gCvQadNhG6(uF(%{Eq&gez&}1=Fan8!Rek+O=HV{7l zBU@CXH;lHOICa#cX8+4%yB8!Ky*E76PO7ZV>a8BjYRW?}@7oARB*t_nCe~|fTYJNN zXEGZoaok5SE<w%`=<4~ZCoQpT28Fxu^;_~&^lx>YvaBle=-ve7J3^Tf?2tS2#2PWT zA#4NHk4%bbBfGWO!@RWl)L*lH#S5c)Vx3SqVf>t~gM$zSU)t8OYVW0>zPJh_IHIk@ z4CCKl$n&Zn&XIEr7wDT@pftg+z75cPU5xD!=3_`<GK|sVE(2V)s-OEl-U@bj%8udY zCT26QQGNPKN0f05r?fu6wcm|-{^Phluu{!tT2W#&BeStf)T9(kz%6e+-jk6SiB7=* z+BRP!XsJqdnif=)tUOPA0MzuzAEbD9Z%NUui3*dP<sY8e%y^!U7}&cfaFCC$RWmGY ziEXzsNR((!U3aH@J{nqK0!`)iwc!CJY{{#JI}gcME0i#+wIcD-eJUZ`nZ~p)Y$OlO zLJ4^aRaHA7Sfla)zCfN()6RXVyU)@|-%6p_+-lh4slScfT}EMC>$SWgzRcPZP=1Sx z#`7)W#WYJ?lC*LYkE!#j{QhzETkD|GS~fE0!_uJFN7hrd>NH7F9)K##lit)mkNgFR z2a7Mm=@T8(1%>wpmYeh;jDop0jxm;I;e~|~DtGGUA<>~Mkm7`}<60<uqA^u-NyLb~ zHSPF3s4T4-<0#df#}a#%QB4M!C;nBvj<(Gm;ikP?uRtfUDFe*y0^uaJlT=pb$QRPr zOq29&DzV6mU2E#UbfXg0oC+pJp%zkR9gF#&*|TDY8Ukwgd8!N~=!fZ!6T>+aGf^4P zh-$Hu=S3zUVlqy#u{*%Gn1zu>wYMj93?EFnS4n$(l?)1MnVKz^L`^KVbfb7ju-Ih` zN1)7O4>;I_3{~K3IFLU;jl8jXK92{2`JNceFUj-BcrX%@=J5&AEl%Dq^9xp5{YkVV zA4H9#aJBx`qz$s#2Shcf5XHSID72&cRO2qz?=-m6^fZ+;_^<<Q&cP#H@1ro~0Cdd{ zSvog(m)u*TCGIjO&58doW?E@U=#G?H$M9;uf?#^XAG2$I)v4)KI*%q{rd<qNJ0>Qt zGa?$Pj^EguDdbR=tgD>HqEg&zfN4JKyLcQtZzFZW$7jc#0^q#(sQ*q83o}89&rn&K z5?GXSX?38$QAQ%RU<)0j8|N2fqmNd|l`F_wLqdEp(aak;3Qri8{z^EQsi2|U`5JJO z?UB1;8~8yayve_|Q=oU>Yfzzw0{;C-i!&xjPPJEG)kz{El^apV#n@cPIst|(hDBNM zF#0DOZq-`Nq!Tu9CG{nS;O-2E$L(nHkFh<o1Vr7wlyh1c8Q8o)u@;Nh1n5gQIA~Jq zX`>l@d<`sSqpQ^Lwbd$a+ejy*CwM-M?`U0yqCcY5@aj_xSyMqQr^DVPxnu5y1VZRT zELUUG92XqPf0mlQ`<m>?iM}hm*;#=M8(vQ``l=rTmMqLeC0?P|1f~13`VF<EwDyVN z((7Baxk1~Z)=xo6U>`NsLm2^gb1m2omtjdHulSv%%&{hl=1flOGuYy#dmP@f*Pqs> z%#kdd)5+U^tS9IZaiIH4P;Nu?3n$MxnqfM*-$4=rl}P*5q*(A&CCYb11n{kSM84^n zcuY;wBX|Th4Lz;p%J`Gj^{+ws@n8F@=3Oo+#7a+uBqydv^j2n;koQsq#uJRgZXpCv z8vDYu$l~-4_a&^#Xk&AZIcS1~k>3wEa{=+#N52eHkXe0B96dtljMU1e)x-7HC0=?_ zgSc+`^r`~=(@<$MTUv&m1xnzneU79Ro;=S4{zhUpw2mc2-HzSb(#zG-_Q4;4K{>A( zO=NwE$f?B8)QJyb+X7e+?@#?wi5v#~Y|oOj6JN@@k?4*9$Rm`_R#;yn8POROUXR3H z8U{t?VaJe0gfICVU<uG7Wp@vwZ&^9>VeGU7Xmt5OT3G<fJP{gL``_5!M8bBH5WGnW z3Q*H@1(o98i|)$}O{120y|}BjRsT@SY^!$|n2e{nR^!Uo^!C-)&Kp|?dz8?~Os+hN zjWa?4=fsdNL@{9G<JV@cL;MsCJk&&u7Vu@aIyxEmY7;_!zUyTeZJ0Nfq9KuEL@y`M zCsS`<kz054AR)lm>)boKl{`e|F<~}RYS4Iz3{jWqynt~PZpBsP)s#!So@m;b40ChX z+H1t8xw;+f%xj#(F|HC(m+}p{-!SFe7+tV?xWd7v{W1cJdMpI0m*ZPbL?}^6y@~E- z*Rbkm>qxjpj{HSVxP6+H3!>2a?86zGBs(J%vlI`(4d4>IlCzBu`^n&Emy$WTszN6b zRl2SzDn-(<tzzPPXB=v&Ea}=t@18z3Obb|)Q)I+AUFgw@VfVo~lJXdF>@5MSMh7T~ ztBR*bf5A!rX;nM4w|N`Pxm8y@0A6w~;G0DVr6DQA_K2LF;x6Hf`o{mE^;<|leb`tb zkDcG5;A3}=w7U~!rI77;odo<{HS$L@Elr~q19<d$);V|8Pxuc~^$B+Sp4gRsTdwj{ z$MpQ@)2e)p05^<nHU)e#RBNH5Bz6@mBJY*NU$R`J$VoB5TJG`?CtvA$_HRgcUoJhb z_JCH!!2xC25?o?3*Riacuk$3)VYU(W1Je*JrgePOev~n_>yT16InRo$hDF5J5JTc0 znhtr)CR2)-KkcwBoS8Ta@rV%#Ost$?h-zf3F3TB$k%FtXe`Y6Gr-eF+c!$oLVvJ?5 zFUU`c(tl`j)$5)w@$$*io^0CHRZ!WjwPM^Z3gI2VMVhoYtXVS=PRrKhnQ~)suVLI* z!B~k4zr9H12+}Qlj|L7C+baxGl(c%6Pnh$CRP#M764-lBo~nu429^FDOg^#ouwNGn ze-F!2?DEOG?kODc8+zZbSp@eH2YA}qh}x(sY1tv_)%8JUr%nsu1!i8+-j8%y+2I~& z5vRCJnTaSL@P)q%Lzfc;R5MrmC%5et<Vo{4U2+CRPF+A4b(5bb;qkBii#ZfOR+KZw zEZ6mxE5FHT9g1;bw6MMsU-5IWvvMnw;@_MY#SRI5^-4h7$xuAb1T%PY1g<nBAI#^} zTFKdx5~QJA*~r&W?9}(F70*)qkU`V9|H(#d?Ty1bCo!t89z|*F%<%39Vvb&oKeAdk zUMhTcRh5*-p!*8bcovI4tgBan8%?3ly8z16@4R61_jS4PoXW}kM!)VWz!CASo4s$( zWi>r~2=S*YLd3x({$ZWVXp!72&v2t+e5oIbFY*}zX}9|vR3d1I;dk>Vdyz7Y;3azd zXC{B}IZ0LJ7b%xwl_*NKvtM0fUS(<e-4;1K@d^dURwKKqe`dgztG(adS0|vsXs|M- ziBp3H`p32J?-JNsbxGJEeJ;Qf9bd|Ox6@4S+aexrI^Ei^`-D(_p@&0zSjK=rb^CES zpe{3d=@(N0KJ|D!=K<I>qg*n_%MJe2jKo;#c+}W}=_nv@Ho7CE34t+q;<mYFUxk>x zy({!*!LrfR*dwCj2>JR&?1e*zE=oCbiT0bW3&f(;C1A)Y-LP})TF+|hM-irc)?=t? z^Bgl>!21DphP8{C(p+c8dCVPdy?0K_)cL3+I^Lu#(Jf`OL6Q-~7l6FzP@=bM`5A>M zKr^*TpSQaamgxuuTRR`Qj)~yr2Ro>DPS`Gd=2SHAT3O7Zi9gk%l?(A6sNDGs=M7r> z{RsGJ0C25%Q*Zx+-mz=-32`CNnkd6w2IH%HQfpiPQV3H(w7=7(<yxb@Jx-jozAHIS zVXho%JDEAB3M{Dl)qVscXnFZ&8?3pm@4??Lag-(l(ZWhG(!?!5%=b)_ncu+(%o>2p z7zie|oxax=;2=0vPbzh;ZCSlE*7g~ib!E@+`lP24sdXq)7oP-o0U?IjBnqCh%eu{a z9Ey1fT8LpjiWyqGA(tpxlFeDMYhp7uy4pQza8ua)c`y#!iV9btfwhHokpm-Lzi@K# z%kIV{wa`YiCDZI(LLM-tT)mFo&z45LCbVsAToePPSx(PBMLBR*3^pStY_Iw3_Wd>d zW<oh_f257;)eG8gG6|Sa>etahF$*+zu>uxG>S&a5^psm@!=Ec|AFi51cfKNw_x0nX z%)Nf$^$wmSIxmfhGHEY>xD98mEx1DWvwUPm;?){qa}0;vTHa52kI2sk7+uHO4O4TK z<1jAqEQ3y3(TJ7(QjHDyZv|0;-~<FbKo*F`n)BXXQuT0Q9b%qp9a>AQ2TY%|sm$)p zC|3Z1$Rl<M*>;=~S)%*2B*7*Pn@5D2Ub7-rm=VXR3^&%c5}QeM9%1H^>XyQ_yCo)b zvCQ)n7=s0Fi~9~MsEQN`^^C$b^=w)Vuww(TA}W&tzWStZ)-}0y?j$&wRD&(QP=0oM zA<K&_bCvk!log}k<Gi7&YLGNB>F&TGxeWnsbde7^)|t|wD9>CJD-XTW&K>T&C=*g> zFcWvD=c0HS?iNB$?2P2%_csRQZC%M%$W^2)X7`xUDG|vD=Tiw3C8aDr<yV@zD$cyf zmeiQGF+VHaYd}PK9n~@4=xJEZSg(J)g7zh$m=T<h`G@BoT{p!+IQDG-7!a@7b&zJx zrvNI*t-~J9mRcR`<7y~@`+&QeE2HY@4Z7V64~xj0j3?cqg?@o5`GL3mb)4hH)0kZ6 zg&%+XSoUAcx-1N44b;j+WE#U4r^V=wOfVXnHSWtX*V`_jC{*1laazR%4t{4(w2JGp zkK2TF&ZEdk$DlPiAstCM3!c|qkYesHeARdjFH*GkBH;+<^JI=*Gcg<<zc*QegOtun zt5B;3^pSWs=S@wd;dTWUrtL^(laB$M1~>WGfs`<=A!vH#JHF%I{+)F62MZeiB!A3@ zwT7cxL(YU_f44q3IvlMtvQ2TbM=t$0XX#5005XMU`2I>UV^*@<M%z?Lte1Yr;j|#` zl_v#X?I4vo@EJ`A6Gp=IUiij|4a*4YgtF+54Eg-%NedTF${8C!;xeg$Pr)R^<H`8Z zsvn9c)o-v#^)P;nYol$srNEUzqy1MVgDaGMvVkRd3WwZyJ0{};7`eBtAN)!2l~|Kg z#I#9-LKb)?Um%%NgGf8j8rbz>p<gq?C=ub>s5Bo?QYhI(#fq)HcIQq`*HMu+QWM!; z`F4)JlU>q7si#gKT-xFIDMbOBhs}W^h~^}d|E;6jjK$z4UJaL;3R~bsr2W#4r3Q<M zOEaEYLxVa0PH@l^(sey$SdF|byXU=E8Q=76HY+NfkZv($2S+lJR|K*yx(Qd9`ATB# zZu{wj)+d5ZEatH<vgY4$Sn%mn@T6ZJIbg&f*5ek+sa~q6`sB>v8m%P&22m1dZM*4> zHgX4a_WAb7;1}>I#-g&3Z?TXhMto1O*m||=wnWilO(|GfJ{Yv+TrF~#4XU)or>5T) zukTlXqJ_ms4Q0PJDOs}cP3`(sRX~Ye?-vs5#$@%?G}~wHn91`TJ6VNl<TR?_z9UW| z`9`4KohA26%F-!l@Ld7_fiRnQl3~8G>#w_<o3sU{0%pChMytArzCJ!7Sn=QK3P|$> z$=(wu`6s%eeimQbD_Xw*lOio<i3mWDbVFG=`(J&SEYb(4JtpUdUpi8}rnK@=-jH=f zOui)H|B9islO@V|bRzJxpZ<eNMyq@mWeJFEVvn|{=n~Dz^gL&CjBxDsvj*eRQye8; z*m8pu&db~cA4`%rk*a8KHvX(a1;4Ao){hW&5ymWo2_@K95@%6YLNrNCr}?=i?e7yN z*H~@|M+*^HA2`!R`1&4a^We&LY$|!kcC@@C_L_S*oda3%I_oo?+KVqtHG1TWHxEw) zdibD1ixxDdJLw_qpR;M&+De9LUlv$xz`{~f=^?i?o=g7XO`C4?)~NF!$$E!U!|y2C zsbS)Re=S8<Y~nrGyqb^UGkLG!D1V~&b2RQ^C|JK4<w*83p9id>aEH^z7CqHmE~2q> zL6=n&GFq>atd-goq2<i}4>)YL0~_`SJ<LSMaL{#|<Zcig)P{k|BJAWtIn`MU4?d6K zWL?{07gYVgQ&0@$8{QRw26r+#qM2N=$lZN32=`4vTbOIt49!oV(#B>TgD&AcgV?r| zDeY*Jl8D>!&ZBg2|MKw1WxeFaEfl#Q`}kO-FI_t=(nu<gUtn#(4AEev3E+-LerCXw zPIRkEBT8*>L%YvA$D<7<ZBAmtq2QX~fJ@6jka0=E)Bj$Q@s&!pacYqbQ@dHmcrUz< zS+svWokp|<d31mJrAr{D${UVljy?$|wcx|E{U6#e!7ze%Jos;vFBjawE8<GU*gC1h z<zhj!<TGDOUSp_zPpqg(KE5RoY2l_A``~tCAO*a0pd3v~@vtfoz4bhz{TYIXmx??u zv~0htXQL`@y=XpbKc-6butLxWj`bN48hC2u4U+&sH^FjzY&T!rZKir&)mr0TAgRdt zoq6pJRTW{V_9U>`i+OI*J_xjtEI!C&ViI3>dE)p?NYvmevip5F6YS1A25_62rdo0- zv-ts7DLNMCu&!T$MisZ%#kGt+PgHhwBr0Eg#YJu2jH7D}fXT`yK3W;yAR=t{Pn0Wp zs*-k?@cfx#puR!I`Sh;&>sT4R?=Zez4<lk1>z+uE=g1MS2$gI86tUR_oHLX80PyM* zxn}1KZgYWlwE>5rv(sh4Yg<OM*u0wnh&9SquN6l4zWG?Cx&soVwY(@2dxY9d3MN<g z?KP`#r}2!hjjj@LQGqQ9gwl2B$z5Y2^FE-qpY5sk!(^f6_P#k)d)T`*LqYGOIke|0 z4Mhsw=jnmL1?ek^jYaYp_}f*hwCizp++GGmcGR08XpIe*mpU`Y<|cnXxYqGHAK%}y zi0!*1MfKF#SCd@i6cJaE-YL|ldRxf6RgOUDzf;$B#469t#Tlkf%>Bkp5tgG-un-@2 z0CQ@4G2<+QJDj>|TW1#Tf$&BQwc6#IWRO3}QA;SH`Lq`^sd1_6$i4TrB#S?Ocm!uX zyI5)~F!+2B?U4kH$Ir>BDQN)L#T1|5Q>X6a)ICackT(VcnHz>($n61sGAZgd0gr4A zfpIU<rMYQUGgKM@1#h_AO{OM`noHz$9%lBI=e~FUH_QkZuf+@*xs;CBpBe!%twn|t zzwn10d!4GSqKxz1dhjrRDfx#n@ZiQ-Il2hlRN1Wvs732BHZUbbO2P;62fM)sF+ir` zw+Dr4&Ah0}-<XC7NC#T%Cl6BVW(>5;zt@|`$7Ck3DQMshgRZ?9oxh(wn=kx=L-F(B zm+@VPY`$AlZp5S2Ptq8BZ#R#UTI%}}Ol?`)qcX(u7)&Zphl=x%ih^SUt9)~U@C)Yg z9b35>&59!nb=vV#VNFbJK0j2-nEpl{ed{sX_}JTe#S=*-199#wu80NE?jNDchuJoF z>~f9|h)RLp87($P(X%$Cv^)=6>8Sa$nt?)O-btH*h<TVeuS<Ii=2L$i=1&{p=A?&v zt57y{>4d2fdw>7&I1iJg@pw09VmMPc+fWVI5>7VbtrXbTlYJXQnv#%hJJg@)xr6|4 z6d<PM-uE4fE-@{90m|Z=7-m2l4KHhdKz%45e&`utCLC&1E!&|a(?egxKkT~e<cP;+ z41cmqmSz5KZN4k>{$WOrs4ZPaa+ILKbmrB@#@0yXVznzp%I@TcejB9);8uJ09b?i{ z`Lsv1I_n9zfKGxMmAaEsz|fvuzZ@a?XwvcuUOcwvD4`Kn2`(<8n2_xe+_vweb<&h^ zn#3eLsru#Yw)X^|z?3M>M}&Zl4`~gql7<vcePFpGm#K~+w7oaoXeGZOU<7E;)!FN! zW67tOwzxGUm52e*iN~8NX_C0OtD4CVU)T0mwqGisVj`tx@PG;=-K3*9Xv_}muJUZY z?%pEdh~|cK+{AIFxb3%E?C%Myyz1lItRJ!-P-WL|%Mu`V7v7M~T-4=$4V(~T(jK5h z((j=9!1akFR$}qyp;DhL+Eu?575#E0H}R7KKwbVrXhMDuv?KBQK`ljLXtlgTfSL5E z7`d!daKXbML-FPoDZ(<AUi7O`OAw)FvT@%RiP}?-cX{dcrBg{<W{-w##!xxS*S+z6 zrd%M@6zm|%bE2!BvD=QN?xJ2>H#5nYW8?mC%teO}mUAiF(hL!FDL2m2c3A!qksJ<? z7wb7qQ?IfMFsDL>u|F3FDjLiQt!aaeh$@0`61{OjEt1~Q>bzsTdrA2;nb{&!%e4s@ zFtliV7()%lPM*|yJ0MDZSI2&xkL6^OE#C6^-@PVUlk?R3WD;0H6@63@?}E}9p}ozh zHRgmB1|;-!dnNiOx(<=E5oUoeCghGAKvKN1I%b(_XPU$*DG>W4a*j*rKL1-0lXU$s z1z^Iln~`#T=)&Cl(jW2)qkZ?r<i?>A1>ZH1Gu4pC?JfMj>#89{NuqyH9QP<$^pq*y zCELPH0s+Jjuf8LXZHhW*hMNdi>?PVQR+N;-i!GgGU|KQ52kPi!PO!;-t`%Y<{7%-8 z{q3B!p}p?PD1i9z*RuM-A>o)2{&^#_+Goa3ITsgZ)qF#|K-x7)9Lv(tD9h#y-1{_r z(y#iOeF^F<3=*SJlm|^AUkUUJq);y}i;<%{yg9Uxv?qb;tFLi6gz9Qt<@Yzs$cjBW z<k5DjqJF-AceO!#WNQRksTPS2K7FOeNVfVkQuh8G>cEv#XbGXqBZxd!2D>~Pr${s4 z<dNL!wZJTpp$+6m)>xK$n_O-ci2LrnQLT~Ih^U&^B3e%4dl_mMy#pWu9pAuC(YZfo zvAa^7eT(|!eaL~sSO~-IXS!JEMFy3jc(UG;X?hLL`9KSOUeSV-%k^>Tdg(Rul3>K5 zE`xi9Q<{0iT+0iR+I<(iZGA7Z^B{bLs`~?{>ynj3@@beVtSnqZ>*!dw`!f1C_Z%{b zq_`<<WqJ6>&q$XS3qE^9;>YAx!UeXDQb!|b4{Vt5$$V&D7T#|;?V~2%94dd*8t>8e z*od`6fnywc;8dcqwJ8hx1rxOe9P(7&r8(OWw)VxGFSo+(@dNVM;|*Ee!{Ote%?!3Q zdQzF-qI3zxE9m#FeWRBsDT=d~4or`{t^4jNnt+|?UQy*k?$=?l<v{Jz*!X1&`2s7p zaC?Qo+yG;DwNQJ~pm;*~rC(f}9bQ)qYx8llOt#DS$-sNJp|J|M8_HkDDyhbo-qY;W zT*iIn@RiLJ?Q6O$B9HSv@4|C?cmh=n+$@Zb&U)IpeoUKx6W0DNTIk?d-3|9Cdv!vK zr$lm$KV7R)s<NS*YDL|uETnVtOPG&D9=iO!Sp9pYMLS6B-BGzh++!q4zv7Dqm<0}^ zSLIyL9zN^7uuSmvDZa4<jvB>zjw?E=0p}Xr@_p>>inXs+lbl1S7W@EhZhcZ5`dZnM z28PS$&!_zmT8qr!reYJHPY?scm)xuhsj`t)AXj(ZX`T#Gs>(Oj>)ej0p%EpFFol-m z!YhwgHYVk4i3UAg49NL_r&HZ8x6#yhyRQ`VOWh(s?Fc)Nd9QhzD^5(4MXdKLd0GI9 z5+mi}^v#CRup;;BUH}~du_3!+>E))|@`o*6maY#vk66hk7{fF8C^2Jpc!wDV1<qMR zE`mN<Y?q@%+Ym%%IF%$kTB>$AA_u?TuTk(cnTq=2L#l#vG>*_GO&=)_vL)3SALK*a z%U@K7%83BW@~Md&-P`Z9T6LjV<egDuygN-%1>Jc|asI>6S+{BiZPhe6EH2qR5<Rl! zr5!fw8QoN_j6hiB2o)u~)Btq-0m`n@C>+d$#tEqK;7*c^e$Rp$Qcymp$+>0c+Bd&B zj$h0$u}GlBXkGgc;ReTXdzNe*IM_hhW2dd|IjtVrol_P!mTDi_Ot%lL9wxI{I31MU zu)&uWjNMa{Ai%aI;Ii#5+qP}nwr$(CtuEWPZQHi%c1*;HnTa?L_c8xL=FV@g^_uoU zp&V;I&UY%!?>RnU=jBWe6SvbSNU~`tzGepLrYk(&OK{-pHqfP^Y!VmR++?MFj?4da z*c`=mX41dDIh<~oI@acrzi1v~<&-T-{U^j0d8JQlP3{<>6oUmJ%u?Q+x>IL01P|TO z_iLR@c;qAofa})_-dDRnAKv?jR2+;fSO`Vg{-+kQvh_+6sSXk>I@Car%0UQCc3c{M zyKPu(v<S#O#n$mj+FD9;SR79N+i^s-u5)t9Ve=2oNel+8K9~&@;Qm1}OYN$;@Jy`4 zK}l^Pl}2?B)^x6nhhL{Gr#DhOWUD3_I}GhIK&IHNc$NNN5u@izoJ9sAsYPU05M1q+ zmLhSq>fmy<M92xq>8fpz3sk~yPr{2b2^N=+I#wb=cg+t4YPGk11m3N%&Rd@a`K?^H zlQMd?fiTAWOIEP7A_LX8tg%NuvIaceez)#=Q3c(XTa8@#VV}%`(N$mTJ=5lm^?UVB z=+F;~bfe9=FJ>sd0V58ABo?~4Kij^jvF(J@mg2Okw3qApWUi>S#=mVH#$d8x$d2#| zb{u?j+8_BmbWoeJ+i!jVS5mhN|INIz{5SK;LeKht%_|!VBg=nI|F3yvXJMlMKjig) zV_sW8m6NrwSfyK=l85AxfP^IfxlnOf`o1Z7A-6Q7K=IaKe4GW?g>4+Lm?nSk@>8Bu zp4;ErXP-+AtK8ELtKHR|)$UdL1xxcrDa}D@0Z00BEG~5LG6a52m8dAZzVY$F{_*jc z;jwaHS0|8flM%xu;P$pa1NnkqsCZXEjW(V&W9lv317!nwf21wMzG2`!Puihjx}kB% zy^|x9FFE`v5eR&veYh5|az}t<effAQv?AuI@kvl?tJ9adDL-DoDOG9!S^)vymfdpz z35YRJYZE}wa?Q5&0DO2VO$~OSCIeOd_^j1lN&2X@_I3_PzyMraTx>K1HMsPsY7A(s zKHw`;@HwFNK<zDo6@R^8Kua`)IXqKr^=JSbuDVOSPS&ZB>A?X|5O;d^z-oT^)i4<L zCCnorcXjOi>T)1?Hz0vukjgJeec-QVHUL_<n%>Fpl<!Iej1R8$fe9!uhX#MofPxkP ztU4lyeA=>s{gd+%usVOuU#KQ~=MbJFtu`%x92#moAYV6I!1$yk5Or>Zuc+M06zH|_ z>6Ag#tG6h^JGG23ozxIbsX=@Mgr#ZJOEo`6ef0R{!4@yT-|Q-2loP<`cjz_$f)&<Y zarMC*{|@;&ChTJJN42pa$V<E|nlaeE(ed$dx-oD74q*OVRo6bfW0$UM{@xtz-YIyP zFYj!9S%55XBz(R)*t7kR<3r1RIH0!nJ^^3e-|IKFfrA4e^`Po4fK+@fdX&q&3wYD` zX}mA{H(Gr;e}>bbmo|Xx-rU|^X}lv7*dR{NZ{(j(?|{UO3C~2#*&q6!O)?VDN07I= z$2)+v_IGx`z<&bNS69G)x3|(<-T(I@@G(zWq#PCo|E+92Oy@&x@WwBP?@_O@ALz}E zhGi|tTmaz2kJ)x$eAMFkZt(fH>S>qa*AM7d<@mSs{?|qv?&j=mbNXxZ_t!y-zb{tT z50u*+?dB!lPi1Woh5wgL8Slx=R7GG#pZ&<MJJJ>n-U%PF+2zX%tG~ukUoO5GY;Aht zCQkil&BYHkg9rm^!M{DwZ<`Xpl~#7<_nt>OHDz#cdjBJTY?pR!aPP}YLZcjY>SHz7 z;gJViy{%2%-N1ntA|fjeesA!ZK5_+rb{7*2fFqy2H4LQ>n1|0Fb_(=zHG=mP9H7K6 z;|CuQK>oyT=ocG6`5m0+ZRtl8C>tPugfAQmVCe%35(>y))vrje%75h-v>kwdj_=L@ z&A;w9@Sm`qw0on=RJBJ>3lsRI84BZhga7fV^ykmTr>Y9kNKdgZ_i-_wR4F+^hJVRX zn5P)Q`EI4Y;)SNIzQb!f8>dG7({DwKo;aS@ahKL=oH0v+W^v>F!n;x^#@xMP-E-gV zlaS9+zZlKJC%eF=T1Td_C>0_xUPE-h{yMX+MmGldPGs1LWE9J!4WLF8cQ#QZw$oVJ z>TJR8?JD-@H0)$@wYebilGagADj>2L-JY7kWbABid!>v~6+D{jzIckR6ufTq$}9;v zTle*%_ki+&QSH>*k$bO8vAFMgjc<m}Mpz`sONO26enIs79D{V8EqC9E@g*8daMQ(A zBE9%cUgbfeY1)|6XN&i#a4hSb@g4PiR+gK8w^A^h7T{}+F}mYOv(SvekoP<YbIijf zl7*j{Tvsdyf~_k4CW?ODqsDXxToO^pj8tc`S7b2LvK%*Gi`!X@V8j4@{>LO`<g>n? zr}-3`b2HZF(b%g<y94y17zPr?!EKefbSUW<{n7DGA&pt_ee+Irfs3y!JY%%0?`>y6 zTJ}v5109Ll5tWOotf<3-sZ>q9s=~iXpqGbj--LKK)7S+`s#3|KF2V8K>~fDf{V%_G z$8R|C{#Mx+9Qir22Z<|c4XUfX%vb5<dFs#94Ts&_DzxgXOy_ti%T72arAQo`Y#bP} zNP{tmX&kJ_lX!1O*|VH?n^N&f8*FDtOs(*RYF5RB%WC6x&Gif0dFya!cHQ~X)SUW@ zQF^T-%*9$hkH=4t|M~}bNnt8}U@(N#`IXI&T#Nh!-1XXOT0rw`gAI)+dNbU)ZWOlA z5ipYm5P2D^<sJD%hpsqbKJv4t>R8}kX?A0q*Iv05Twe*i=mq<4!f2TK>I(DmGcN6? z<mFf?8P3bQNu#=$w7U0lu$)nu-6nT2u(vVOwUmC?N*F<XYlcf~6Zx&DO3bnOZvf&M zA<Om;>(7u56{BB@DHrO}dA>8RrgFCk3K@=viReR%Knc7To&8IYJoEQ}$^J7dZiQD+ z*Lt})kO;_6JIHSm%z2}#J0%%0=@jynu~6OSl}N(}!{h8JFaNmHa#UQ@oHB=`au-qc z>`Bc{Y>^@1)AmG@nXxKEg#EbsPxlNGD^^4@n}3`3=0H3L#||dID-OY$y{3lmiV!a8 zG<>{ikG=(G2~6yE$m9->9z68<U#SYjB(lANHOtJ}^^R9nuj9{7ff4BnYVaHN#Gs6V zE~)~{{SutT720kTg=>%S-B^aytRi;#rM@f34ho7<EGT<<)pORl#Tta5Ui-!BZ0se) zn&mCKhu3xfiQJ5hKtra2cmXKTBlQjF6Df3P?!*k#@{cCLOwz4Wx-Y_sksL?e3)T0i zJXB*L-Qkyd0bX8s^M$jmiHEkPkS5?wVDPu2SxSnC_Pxj}Z7CLe5_}1FE=mwWCF#Z3 zZcHSuXG<w#69=vP4vY#Z97BCLNhJ(DZV)3>)rM@CAy*Pq_7dC)O6Y?lyvqiR)t2np zN8U_LZR%v@EK<RZ?}jx@qz0n84bKM%=yU|VcS=r<^<oJ<1+uG_dSj}41z6W^yXOj> z0cK}a*2r#;f$m_gy56_IRqhzjkXH+Exm6FFjeoslMVPbcdY1#lSZP}*+^j4~KN)f` z$uH0dhdADo(D<OFvt@3m+b^@M16lOgY2tVkwqYIRIs#H@U#G7w#e~&c*^`zE8{|e) zX%cM@`nv@`7bk&2b>YDp6vBqls8khkRGr5;AP%)H74D~LDU*Fz?qm4;3$%;$ZWdf# z!EfqLo<q*e>?z^LgD;E!H7aSqq~PIk>a1iya!9Vbwh12QUFMq3`n)y*znkTB$aJ7c zp*GwEH^o!|h)olT_{iohPy4=~yM-A@=rLS|7gx|0i47EoH;v_-U1zGzLD;)(vZd%% ziDb7{=IT(tT}%kqmiFXD7~pW|U+b{nWG~$XH<_q($lvnrgd<`AW5Qg-^PSi&L!|%> zL^yEQz_bO?em{dh8&&|w5SXU9GVX2PHs@UD!(ig<8y?oaYuhX_X(dM5OoRw$YLlg~ zkyrMoPJ5n?2`%bZ#}sw+<o&!04Q`Ir2fjW@%gsqgVoEmHqu1w%x=kV_zrF3K6|Q>{ zJ&uB}Pf#U`#Y!-NcWb71XjH)->d&emXpoI!5R674nWrjf>d-f2*FwhUy%4MTZFq-c zW54`et+SJI&dI-Zm34egK=&jfF_)N?hHJnk$@IgJM1DFPMb)%c$Q+~}9iE?#o#HZ` zF>FB9g#@1OgT$@8oqnYPS{7>N!hmzuQEPE*<d{|+62{%BzKVGrCzT$1uY$aU@HB?d zyw2kO*WM{Ay}L(F$I=Sv={9(qGOldJSXECQrliFMT8V(QUt6T@0%LcL^0*3IPGC^F zLZw59XYU>X88I<BD>Zv)DC~FQ*EJUC$Bcox9GD}Ug<jyNG5z%~hgL|ze1;zc<*}yq zNN=pesNuIzJaz<a7+@#B=eRp#?ZWa<Jsb0cRzG2mZq`h3(We)6gq$10rz0KXC0a>2 zwIn%3gvg|yeOGm<KGj9l3v~afW4DN8kUoKUUO~xkBkCD$2uNIP4{X=Iq!Rx#E3ce< zJH2V(tK>T68cy{~DT|TxaFw7~Hpr0))9l33=N>vGk=#T8WcH;Uh~&}X*8Yp+b4v)p zzuTySBF0~tQHcp3BSbcj^mpy22?9E`xRaeukjbdITTkB2hJSei6s6trxoWqcsVz-* z(pH%#nqGdr@DhQ_qcbrICK(tWeyOO^^RAmd8^V=V+_I#-B`~3;C2U=b)k20jF5|Sg zs|@Rzi6p9wKpZCKh5BsHRCDiTf|rmt*9&tISm$WR!Kz*i_Nzvtn8(Xr-fMu}vsjsg zXS@4BXI`#^h*om5t@<l0$8lq0b#=IFijqe;OrrCcfkJp4Tg1e<_$zxomg2?JC_yG^ z8Gjgyb+%uY<;VYqq`NhD_f8cv>0r<_2uxdb>8|3+0FFE{;aSGzFLM&Wy_^x@s%EzD z2-VlQQhPEWDi$f86%W4%&v+RwH!>#&RtMJBgD|-gpb&7Rp7~PFEUZu>`b66FU|nsn z1K9#L1*76SbYAbCD(W(sPX%`09vAQE&<=NlyeD~Re1Qt66Ec1uH`w9^R{`&)t@$ax z1=8OM%c8lh!OYVu&Zs4%YgO!1Dwdye==IYb+8*aPP+c+%tYYCXKPeUGRqq_hv0O9N z*N~#1lH=y`h-y($0S(2$2=qx`99{}j9xB=5His-5uEV#>5{!=WTYnM1Z1d6i5=T4K z!qy@|wi*%DYOw}$E{ei#UG*La(btQk*%dw*yGF^NhXvg^vxxrhok9p&=nb1>2+JOl zDbKdSUW0t)3<ZqX`$qPHOXup0)0F792ZXbZUATi~zO=a&)0oPuM4(~z(pYeCY<ZhD zDE1X#SHdr(oa6FXwnjt%bEM_d;LX=SqJJ4O#y3(Oh?oPx{os?u6svso-R!QM33p{S z<WCP~<a3y-?U8lyL4l8G7;NQ@&&b(?kUs1=bya2<#0zJ-ko7MWqYl1GKs0E*wh%WL z%9Bgp2X#NbY+LwPM054$19MW`PTlV21v1S~sp(reK34Npf{4oO<3Auc9OVQe+Fh#f zrzMA89!4Egh!zH+vHn|zO^R$wJ|~>h<AQ=!LlQk7cPcrrWjL%xt1)I4s)LM(fsxbX ziWo{BX(RmS!BSp=E)HND&KL?hBH)pY@SC$K)T7?kwUkI14zFXRfSREvvD{cU<LNo0 zQKG5315Mcwx{==>lkS=^boU>n?{`MDLb}>hQ!O@*WKpoYA=q?CytU)fyS#Lwgm-`7 zPGGp~W|)06g?>mS=$3k|of`({JTtUq2>ucvEPl^xxiOs7JL(vYXb+erOXP6rjC5ZM z0WmP%UvbIn(7u0Iqh2MQ)dwK8A9JzXZ~w?is~#xR#b3slZQ<!?d7MGSxo^f{2(JX$ zXdFwJ!wKQCd54TJ7l;IAX~ynyCSR^dVz7YB=RY9_Cf#MVWg)@qs<5-LF|#kzq?O2K zm66HQCErFAN|W2!FiRrllBNpHgQ$3w@|NMCX&TMEaI<Z;60ZaLu#{83Aa#|_@@Kz6 zMF@H+>X25#cq-^56X}4R&6w8ei$drpYU=uk08BD_zJtl~P2PH5mTu+z!g$~xcf^U@ z_=`ZKe4NOn4hb^%n3<R}9&XBY<H8Xs>s8$2rd1)5qKXh}6nK-@ig5{z#8;tSW=Qle zcxIy~p77zXVWQJkZ&z(7EIa>*&^sf(Qc+eU0y#k4_XR_Qbal|ycDr~;#WeSk{h7c) zj)Ao|8}!PRDL{$&NCs@y{z;Z1w%vR!=|0w6_Ew3Vu_Mnk_na|`6C5@xJuPL6_tsCs zTFT;M2<D{~BFr_M>4n7#yY+P!zI+nou3Vhh#*c?}8rtQB>dF*STBCcQbxaM9Nwyq& z5?*C{mX@yI2KnXJVjVJ~QFn$+>HqOnd5w=)yfoWufw6R}Ih11ddel~;MA8P9%kiw* zKam>UltmfxB4W4$9mj9XB!7e`6bpqHq+VUh80H#uBd~|H&*0m&ZII*+vO8s&oj$>$ zn{RFmSZUkJ&~htUZMYaSmr=;GW<x+7@7Z4;^5tSl-`n{Da7L?gE7z&r0p~Gjc_}wU zU2TH$qg%u<?|1H4k0|;kPfUK4rYUj<lF{tCIqb;flSOExR*}wW&JGvPvm6*%b=pO< z_QiS2k16qWXlh<oo%gYmcb@N8eEK1Z5sfYGKc9?5^*GPQMH>Ag_MMKij?J#{L~K=8 zz!X|426>xua&fcsL+Hd^r~yE9VC52IR*?-;s6I931!@?YlxCJsL*_|~4|ib@l)rS> zZ?08Fv{yu6d`$-=>+wu<b|FvqiVQEaella4r_{Xca}z;Se}TlNauF-wGp*0*SUluj zW#!qm>J4_^i`l?KvEzZ&&+2cjtPCP~4)<VL%EZ(ONKk=TTe-iKvcD6>79>{bq^~>) z@>H;8!GRdC2Le%1<lXj7^-kHwXK*e!@|^)|OF1vkFm`7+e7{d=VXL#t>Mvpwc`>nI zuHOf%DdHB~-BHoCjQlO#mg-2Si&(z)#7h>6Hgk3fnU!M6buzH^nTjKI`)%M|>&pt3 zT|5y6S2Gn2+js{FxSL%Jr$&98igPSE2O9!<Y^iA&X52;KUB{g7VW&AZq9pypBMa=j zykJ~<UUE+@v@6S@9Gk7bmYKKS*~5q3yy-hoURZOE7AH_+67F;F3aP0UC77X62Upf4 zvbe`GFR55EYxcBT{JVk`6wp-W>y402r?OxpJpV*FUG-Zvh_UGnD^1g!ZV$+{aS#Vr zuu?#KBc&Z>WRDv^e4ZuTX)tM6kJ6HE$Vo;PRgGpI1Sen^Zj_0s&bRHixluA2Se2-h zN4H6muenp&!exHzP;BQ#MYshlvdf&M(dNF2o_^R<(BqZ+_~QX|%&h!TZdM(1B%-Fc z%QS&GFIC;a<qTmV^}^}<Y(c2@gk9b>^&m8stmlf<q(RFqJO6ysxCYo&1?68JXbp|C zkhdI9s-fVdH%V>p{3w`=M5rVbon&t>9e@U#jzIn?;yate=Yw|Pq2T~IZ27=?Ke-V( zsl>KZ^G(af&h@B}R}$5#E6hzF`*kT<J7CV=M(Iz>xqed>DDc%_>$>Z4#~cGPb1 z6SqpG*c$~BAjW&`K9Ro4Y2~?w!qsh&LZxHbMO$K~>PgWbe8sjy;z=$dW992L;26Ja z>V#Je7c8*TE|zn!F1D;H6fz>P+W=LD9~E}|EKcVxSXLNVyhtVL(CunCWbx5-?m&h~ z58MnJV)*#o?*$6=V&qBZ_17t*viEn)DLE?NW2NL2-<fM*CT}HuDTBy5eLW5&xq}|P zCRW<6jWNs`r8A1R-d=LM=Zr3KxCT%SvNC}DAj`2B0|w6U;M+~%yk40mqDhDZp3dlK z41~Q#)iBRdBO+|EENMZMPAZ~MCFlEUQ=6WoJ1YtSQ#b|P|ED~~L3U$Hs8eN{j523s zORZrDPv%p<G>KOwY|+N<(FeQ9a?D<LX=2EwTo9gKWXww3O*)af+O#)45_5ba8~aNT z^(w<lsA5jEKU8x^1Z`STezq&irs^+VvHBJ*<X_Mg^(}k3Nn*~7-Jl_jIL<AnRP`yA zE!j5^=Qy<zS&4y4n0AoP`vx=LHt@ao55b*URlQ$~#zx*Gb((I3t}c2Y5ILhuab)h8 zDG3V1NLV@~7@4)oSBdS&1Z#oC(6d!<SxDyNqNsMK1Q)%vh~nRV>2`Cs#H{(E#r^W2 zT4VWL;`9y45|rb-hafe|har#rqjfF1FmJ4f0FjkF;NL1JGtKEyG20oSe#~i{JLD^; z64cs+?Z_cO0IiE3V|uaieVVnxPG?C*PDy9GkNL)_y$tPgf6@bRKswl^nFKsCcNp2t z@-<f(pS!Qsr?5TfZHu3#p?Gd@vE}n+h=2P=?xAt9J~NCdS`uqM8VhGb`A;#ar>3)F z4|)^vI+JtE>=fwnrQZ6WBFh)7{mfJeN0IYk%k%KDBQfs@zH94*wmscEH7mYH$i^Gl zO$>tOwCwV99->8r_eVTDqvmJ4p~JRHx}m5xh=yE}Hw<Ry*hZ0M{6G>XT9##to5Cs` zL0rZ*B!p%SxADZ^6Rm%co{%3Q`C<mTSi(u97~}^U-9Dr*tpEdc3}f_d%pBCTk90b` z@-DiCT)(r;o?;r@&C?JLIWE#n)tQJAlA>Gp2{lVaSeu}bz-uIpu89_S(65<o$h$(M z`1A&yYE8=aPa~0+9vh?LERqNP3~@s6qDgy3;p|BNKwVP;Jn~3#EB$fR$^@xMieAM; zBHSwTIeDR6IUZIAgup1_dUb^S{?W>ij#88`{PVPq8LXxsO>+4lG6Sdl)?C&gy?<Vl zJ>|{(@`3e8$&x7p65Hl=9@{EDi7vXIZa8i_k#2U$v!OBZH<<7Y|EXbkGCt8Q%hE|% zr-H}ugCP^a?JKpA;v4UYpx@(RF2Q+#z>8*Vp1EXuQ7%vASQ;TTiKQ&VtNDJxDmMPl za9teNzqmi#Z85e7p|Zs)F!n-xoG~@B7bQKzqAbppF4y~3TVpK^i5ryMu@Z#dz0SJ6 z<8lTjrL(}_DoLwKlTse@slgK+bpB3a>WoX00?CZD1R;$f%x*IW&B@0a5MvoN$b)Bo zIA~qE2~p*iDW3NDIA7+9NvL=uDA;Xil*393KTzhTJ>%ctrvmb5lE)E{*f%0~?t{ma zG@-tEmEYI0^@);2G6C9+w)!rf+9rk(%vo?%;pqxychPLBz@uCkni0f`2wfd6`S+I0 zr-e0$Yv5JO)7?y7F1oDrXAd6g_L#q!(W9)wk~MkE%K~C?`Mkjn{jwlc^g2**C5U78 z>Qo>8vGo9c+(+($<h4tn3m>urqYnJom%BVFSsYW7kIHqmXZ(M<D85LXD}4lLGEcaX zYG)6oON-1+ODlwck#dZA66E$H8cqZ!3IY4WzmO82v^7FI4x>pz3je)*ln?HFKaM9; z5)(z%3XRDUYI+s8$r%lmr?%dvwY2X^XI8ynfJg8k0(kXM+bibE>ZI9HPs1T=eVhI; zq~BA?odmxU?_UGF{NaJZ+btWeebM&y_wKv7+h;{cr!%5oE>^Xw)t5O-H|f+MK@*N{ zeukI=kgFi;<9&7a%aYhbkyYJuDRYwS=-ONl-LghAOegr9DVz2qftRwae<66J%#W-N z+z0Y?>{$_aMTB0YvK(MhoRvhd8bCXRvrT@_CVw?BXgFJH(bzS&%jJ+eLhIHB1}9Ei zxYfXhDw7mCqiwLx(uHQ$x8O&bC2D}3+cOEWchkx7nn(QJ!+&^9t;FzUL_gR+{1kx^ zbl|;T@o%NR^O_%u;G7^*^oNN3QLfA%vN}WeD{$(0KyuDcM^xnpHRL^H*Kues^>HPp zcsy%+rAURS6e0+Q%`XRr=uMR6o)T3FJqE2#CuX+SF<DOZY5MJ7ki9=7d8c}Bvn#ul zWGoiDik#rMYf+GW;bh+NXIJqd3jhKPQX@l$1A8w)2btAVg2~iBOw*nrI;>=JjYQ-0 zaZ7Z=3K+WMJ}!!>eyP48_!W%akMHXG^Wj~l)yt`#qUHV0Lt<NjD5`yyi4zbffsPH? zPuoIj>a76SMq+=<?UvfJbD~o<On0ek3lwhTZk_A7%o^EL`}_CQJ3A(#dF$&@EvB<t zKLID}gU8#KHs?z%<{@H$OYNXE0ESl0NAF3SuablV&y`P+w6Ph<t1N`qXMNy$I4kX_ zZ4@>g@5eQ*yPzu|gqfT*=p(}&d((Pj-82^A(uuORMl>y^;L3|Fzw;fTBm>FzCM#VH zIEZT;A`Br#w>=ukG<r}1;tszjwcM(*V+};l6L9OUr}v_wq*+mpp6~7f6+2e1WA2-z zqEBU#l%8H`h^%WU5hN^o0*CrvJywZ_*Hyq0fCe;Cn#M^0Yz?4HFn9T8qC~ecy?UtZ zMWVPySLN7!DO#E4fXarPmLXj5(h>br2pSpS{A&4{Ldd#5=H#D78bD!T>9$)63W2Wa z2my$=ve#_oIY7VLgG_qKk*tPDLv>-OdVd<L;7jL7ceCt`m~P@NFcuOZ`|EyHT}~uo z>r8slsK!aC`Mc+vDrQq*36q-Qm#fZgXd}(=0<QS307U)G2tFV!JPG#Xb!CNKgD>&t z^qsA&b$O^HVjSonqVj5;z8gpH>0bKR#ZzH3FH`EcZ?3CIH0>$7G*G^Rc%AxlGUHF; zGONiqnFBGEGp89_(OGR^Fe%;2M1e8)$^DybgjFNorD%hrn}qBq2qGqhbK>4Ka_w5) zE$t98H=XzmjQ3u0`Mh!#oTQ_@u~q!q&LmqQ)EW3m3AGGT?h%ly(v_}Q&-Pvy#vngs zv>`N<+B)*3x=#m-;!s>B&+NeFmc}~K(dxno&rlxlZr&w_)FXPF)+I+f4*DTWm2gJ> zr!|gEDM!A5pAi12QP4Vl({7NW@WPNR$omMC$=p!Z5)496ZtJQ#Jcr>|!;iU|jRj7r z+sXQk>1kz6NA-z}^;M>(@dCA}oJ9to1Bzm@PkSs2wHA0-iak0JU|QO+rWfSsQr%se zMcwqzYDkofxmIZyE7Fw78m4!j%6=OXEf}WkM$eN>l$%2m=D(x05#vGCmpKv1iZv0x zTaUhUjW{~YER<b9Nqnh)LxZL7Ix9DE8$;uTH=H(e^0Et7qHkZc*bIP8w9Di$US(Ru z#B8dm+q$b#-Cx9j<8TQ=J5+jRng+Gxh!9<b|6>$la_;=0yTWPHm79blpqHQit@ zSreE5lc6wb(eW(}Z2safPyme5>zaqITS)<fzCMvyHHq3AAO6|>Gs)0+m~=xiu|B{P zqJch~*y-f5R#9`-Y5{I9E}|h4h8y>uVGuc9!$4r4+F=z}{jc=-4ouA2JSB|!YLFjE z#<he9zr?Ix-TdVVM2YeT+&W}7nu5jl>5#)*^jQx)PXUfVgC0Hw1{xoUPC}W%zbyv1 zPvtG@-hFbMgtlDb(Lqmu!9k`6#2CgIdm*V~!yjpvRC|P*k$#P!Wis=yw5CIe_@wIj z5kTZh0xmnmJ`<pR_rgBF{P}6K<9)j90zc`xG*N5=8){n`|0{8ZH-sd9>T8iHHJZNC z>oJ)O<wW%w6mM+3q#eA6F-B!!E@cdR9`o@mJ}v4&q^d<M{Ltj_esyC@B@^i+n<xPq z$99ZPOgW*Ki=_;K_OBQ5mxZJ~{!xVVa?e3W#!>D*3Xam&sof0vSXxnz=(vZe6}AOO zgE!o28+p`>8Usu)7mrkTzY^%dza_xie;ZYso3{$r#)&g!Bq+hO>=fVyrQqBw%?($- z!7atUT&0~O`jKAqg%30a%m8E*SfC9tOnj}ni(|4s7x_P*O}X7oU+C-9XZXkat)XH* zKeCEaT{#?;*B`DWt?K{g@8YaFSlwCHU0?gaTiGc`tx}=0hQ(HzLxc#q6Umk1HoPYz zUwniH!Nvbga<KhZ$-%(!AG^Vb&&JBk_@C4NCplPI8UNRk!xdB++4_?W2&t&kz_~F7 ztfaHksm~t~D>|VlAsK~2K`}wTn4}m4q?m-57=%JXBp%_ti1+sKEARDl=DnxUspa!S z$3gGD^M=XRRS4OD1ictp8YhAuT1dFBfghE}hyovjniL2u>K_Y`**B+K!$aw_ffIV~ zPk>neEm0Hb&p)%0Mvd%YT@)hp-}uqx563_tq<~IH1Pux()c+?nU=qkR@+p}CZh)4M z0WFCT>G=R!p%%z6K;4|g^mZTeh~j56@E{Tr5|BQw;glaj3-)H@LFC~hUBf)|cF$m* zfim%P_UWDPdIj&cUB!xgj0N)h`uGvcTk{~0j!9?fKwyH4wgX1!`7kH}PJq5tXyx%P zU_W)zA^fq-FW_E3fwS;+<^$wWVBBHd`*RE+dac0yf}vqRyLzz93rnDx?*a&ZFfM-> z5P*J`G4X{#9^Be`yZk@{iF~<)a&i)Oc;$uZvG>88L%jO^!7e)f-F2G~5F+j0O(32h zgmgcJfb;F?$`_maZ-)x_T}X)VpE`PaD;}Lh`+eqo34QHr^-u$SL)vW{Fb70H&#z&H z^1lIkACy9h^k-Ie;K9CeE6ITVg!g@MbPgcW*7Qo+-@gK85bX8*(9<mUQr8gl@ug$I zz$OC(^(!*!<4>VOKs&mEe?!?~UIBkr2Y&_DKEe;a;rsa4tdjH%?A82(D*z+#m;k_q z3O{x9Q@^TTT0s2x{OD~=m}ekPK|}z*!o8seHGW5z<3)P{{8)D^_xSvGwX?fqomRH( z_=vjwzv;iYwBl-$f?_f%cW(WDmB}dy0{qc+<tXy%%0Mu|{K6suimPFDeqs#41HThM zUvaf)1E`S6?@3oKX+KH!eR_+hpH>WS0l%>&ab2d=Fk`Rq{Wkqb`lpw4W4~<Eew|;t zYu{88zd?JyIdL7mX{&ZLyL8XL1tFe;-GRRgdXLL^KGQxtN6%pRKbuQHFJ?N=`n2|b zx4$d@GC)_k@`LRkKRP4q`CQx)riKw>U0r{LQux}|Ye63aiS$Fo`QB>5LCIkNgMOvl zx>aU!SK~r=S@8TS^;e}HZ>g3MX2jF<Hc2Q6AcG6#=k)uY!)r+(@xdIsLuu>scVWN+ zg%QM`nxXGHy6E$%kU-y9<Rm2U#oy7Nv=RdW1Tg)iRsjY4Ccd!{fdjSoS3!QU5W2zQ zf699SA=EJ;9zL{C(f|W%^t%17h6C_>tyF($^z_1A#rl8JK;JMSg@2IuIdvgmp26SL z&S!qem!1!POHW+%eu#d3P4w&V)0y;b!Op!eW5u>})XG>Sr2_^oiyV`-F45Y*2GTi{ zJAXMSe9?ZR!saK-kxQ!jSC8;kmfm7fPuFP~xM*PC?yECIZO{w&uo<JtRyF||51Z^p zaBs<%U+WPVp|dD$gLOYbGsQd(nzqiCPG}#V(@0sU3pin~mLV!`E449VvozQ?+zI{) zJrzCV*hgwK*eoql+!&ULEk0qpn;W130Zt6!H~c+Jl9(8%r((T^5#V35ja);HevUN1 zSa%*fU{X@(r3Iq}v+_jCHk#On#EpJXZDHN^l73GrS)kDRZ4j=9*HL%H+-Ir`R%{L0 z|Fh5x1<ZbhWsBE)>x#qzPY}$ERB_sfXQvINBBK1MFJ*201AvDPCmerkWU5X{k#)h& z>BpV=FH35yNFzl$dg;X2EIEnmq<hviyn_p`kCbn=^gf25Gm{5Sc)(P+P_|+fVdoU; z!PEqaJaqS%YEM5*%^4lYnUJLXDB@Gn523>t%3@QEWrUGo4+<xCU1T#2K#=wP3}Y9P z9?{nZMf%RUHht)Y9%9S#cds)_#{F!ZD7k$<A0dP7%Za`}BZUaLz+RD+(<UK)TrWO@ z$0seOBFZ5dv@Du_xRK0@h+@)#ZusMU@{=du&Vn?VSa=<X2udTy9dV}ME$^mQ>#3c9 zi}8htw(QTY>MDoJV9B<DZy64YsPWw+S5WoA*TwK3GiAVOJ2_loOr)&a+O)-)Qn&X$ z9;Qqj9=K9?J`UGoHrGm(jC&%;7d|#kY$Olz%g&u^-80Kr25e@T++iykFL0MV&NWg$ zS;n*43qc$<s#Hs1`^2IteVYT!D>~UO6?xnz&yuR=!-wFX_3ONl@pz3=x60vEJf6nl zGt%Y<t)un~U+WMVQ2<j9^c9)Mnm4Kei?*gVv087nn?IHgE6|q;rm;2|;2yDwJ#ZJB zD%zeb&3Ew=o*G&UJP&*C7hTz%3*OTYXY{$$9%N>m3l^mLE)ke8mv!C7pQ5T=Zig-o zc+l)l_LnF1jr-8Y2-0{)5mc#L4;D$##OIHNBfz@S@JBvrg_Gr$?sX&;L{iNgeVpCe zHuA>Q-$7flq<F199$ex}U6mQJz3oBw^QUe;-+6DT@UQ=x1O8}h{kgMKWW*|q3_Qn4 zL(<E<@bm-TW`8#pPO0#^rEy}G2%o9KjdG*e9820DgNOH<LW0_`W19sbU+x9MUk>%P z1gTd6qrbh;=vjhN9KhvnFemqp=CkLe!DFs{=xA^fGX!Eg`Dq1y={u14yp}#-x>(;K zYXp3Kx9^b&hlWfO9n|&nU|Cm{%m-kU)!v*|5Lc;w4S9Dp>n(LpRvea=r_<I}mPIIT zX@x)H{E5#J%+e*q5A}Yo=VaTklthR|TtesQwT`|@!jlr;OQDMNT(2$h>E8mjZ^nvM z+rN7h5MD)z5EX)8Fg$g%<U8T1aH|`RE310mjRdOG#l8%N1`%zh{OY=odAVQVHFFhG zz^;)dIjpwx2h%Re`htfEl87iq8sJ@H^ZaD`d&`%7jm{%S+4EaPO1`D_z_MfG<b^|r z-7=5x*tB=M9LKSgE1qN#pND4m<a6P(zFCmHH!s`qPWg9~c$Hy$B{%y1qCaF0xf6)i zJddQdAaeBE1J;`)9iM+BGOGW)u;Kjs%w6>ckV0es6UTHKw)M4!Z_E?qn35t8zNT>Q zQfLtVnsK<r59v4~B!-AC5;X}j&RU!W?K)5roY?pRmpP>0Cs(j{Uk@cG)T!$lWJam| z2~m-K4OP0Yfu5vP0}c|prf4b}t|;t}Ng}sS>OeGjdGpZ5e3jC>oQkpa0XGPy4^%l> zOF`oMaj^$*$5&n7s>#zIJWt0IPz9xl^O-DYP!YrWZ9xC8Y}A)fvj+WWz93rv<}zdL z2vom*BA7!eQ-j)QmHtojgxkc(oeRhne=Z<yqj{^Y6w?O<z{$J^7^|MNHzY5%(T=$4 zQVJ>p*xUef^(<d1w$&YOy`{X#-lPbNCoh85V;d|S)STsWxqXw`{TjYL)~GV~`o@9L z?4%npq~J|gT8Si%QSGQp=NfdpVJV8cjQj}nvW6--N1gq}54b|5zvZBhb@`-mGUYVz ziT>kiToP-j84Pd_E9hqC&)PeCMI%tf6L$AVz?V4*Y6s3}wAS8DDua@S<zj#}Ep=F_ zkPopww6CIbUj0$Q(UW65jPFc+uv3e9@?qKNbTYCX9aMm<6&@;t>z`+kG?Ch#&EqfM zSVF=Pt_l=2KBrkHd6i{Mm8smtQw4By{WV2Ka0W1^J4d+NBTA(E<xZG=5m%&*Ndhy0 z)9AjDKGUbQcV)@c^{30O8#k}IJm0n_s_vVO^Z&*vv_f*-j>{ucT7Yq8N!2Jf#Y~#x zT|?SzTqvg|-6FyV{5>37DZIM;$KnXc5!IJ39lb3~R<c}wW%ob!fnPr<00mrk)?P`% zUs*xf<v+{T>9~^Y)+O=8-@<NdH^&+vEz5-`d@GgEkLJk0qvaSyuZFZvJ(-Tk3s7Z7 z1l{CDpt{jPjx8ytz5X)aQ%Ay#stxso>guDvyPpPdY~(tpw~O1bcHin_)G@SDvyUNB z2(|Xg`)wkIX4*p8)<e-z+T^?C*jeM{os|9w=YTcfid~-5Vt~p^lw!f=l*f4-_;`{@ z8(1pay@-i>*??pa3JiKooF`iUHldE2x^8|jSwDB$GglE%AbekmuMVz?E?EbeBZAyy z_gjxyyaCu8XuaPLaB=b&(bPH$x*-@kGERV+DXI?Aj|~(K%;AKW?f+T+0o?5RBYiUV z9llpJJwe@h@5&go$T$+h&$7mY2lN<K6eYhGHHW9^x<Wh4iWi85m4Jgqd$OS&xm*D5 zrm=Z=mKXuTo5tjN1P+e7pqr?KaEX!_Q}0KUK?<s7cO9N{@CLSb5?-#xRi{pAf?gSx zvz1aO57#nE3NO_XpO=XO%P{t^-RJYcJkUy7%A65V1c330T*89E`xX#$`L}Bq>}O%e zfnrC-J|@NRUE`9!eaK@N?OiHb)$4+~g?rilZhHER^QcX7@W2)(E3sTV?O%eq?|G#y z+#yILCVy+zV7|Qj;;@?@VzWFx5C?av5v2!ojef=vGc|7G8x71ij_TYqau}|c<<CXQ z4F<7y7@5-QuqW|VmU;HD0&mDz?AziJM#49%*9~F-*&+3FlTd|I0r(2kvzJ@(O|d3F zoE<kA8ooleO&i#shdM4PZ33wIn|#h`O3k59Z@JuK=w?czg1~~oWk64C4Q|Kcq~w&E ztf5Qo4Ck*z&`bA-JK#r0?|B_NPfKKOj|<y<vGK<2f<J$US_wtfY@!L+FCR(V8nJr; zF;P(yWQxL-+)f772$g(Jn4&HMg#rwfqe3|H-ePFR*)=jJXC#et-$KIu>ZOm$51lnh zpoiv%QP_=!|B7AkjShUA3G`+ClD3bLTTlXTI}Ui0PCV^6<0AIZHK?HicP(-ZC8KJd z&y7mDi1%jid@VXf-?o3GumRMQ(#YQhtwTv&MGFnVQh94l346T!`4pd7MeHRxR|^g- zvWjvbUe~zWI%&62`I{=Bxr}FHwk(!?Nf(RW5pRj^8M-G?CkI;S_*Ro?qkOCV9I{6p zrTn4=UdUQ>3qrs!(j7r;^klD6{LmfdSRf(-L5r<GhWVKL1qa<?2OhID67~}Yf90li zg;^}jahU5ig2xLCBB4;*%dAjjlT=PI%}Ab(!$<E$Rq5~j?`Krb)<Ejzk!Cv0rA2U; z_==H}bI_!!^=xyL`G#!;Q|~p-n;8wtoxmkcdK!|d!>(vqGf*@3UcHCxml~Y!w$AQ^ z;MszLOeU)nvZP+|yQa(h7D*Q-puZ^){ZH5}65e|7g;`MBn~~qF5w=4ZeM`s>&<vDe z6<O>@4&<r+H|3Z411osSvzgOGtJ-nJma8+2I6=OXIoBty*OxMBUeU|k<0}j!;r;hW ziO_LBf;aqE1D$R-_V&kZ>}ideQBy+7{L`%2fEeZXW@3{S50J{}83AJ$Fy{-JVuu>r z8|JQyr=_h#(Ffs~s|x>k)3-a^ze~m@velLH(6!qEzAcY!Y+u@KcF&ge!z`(FhdPU! zKxPZO@?VExo)}<R`3ud;D`5^FQXK+38L6^Uzlrl-WYv!5w!mHz`_AAktXjHg$lFL3 z>ie5(h|AD4gaxx**~Y8lOve=jt@<<#tej%Uqr?a@u9^L+?ATd{1kc!MO{%;bi*jNH z_Sb6j5{%vxr;@gLei#BJ_34dN^r6;;elx}T(%9pgu3NF`+eh20PsO?Y@sv`)oQiv| zSFR59wTSV1Xp~A+R44$Kf?2XiXu3tbr&o8#T1W5%MHbDfH@lws;Ty(jiV4~HK(rWf zfE6+fFke#6@oGXjGDVB5$s8qIQb9i;R{2oX9vM1~a@|hGd6b#RjQ$CzXkwn5{m-OZ zvIe$9<KzOOm1^e@_GR8*nD9TD?bfNP;lxVVz1=bn$JO!<b55uI7ndiK<Fb|C*d4Tg zExefQy?@bpMq@do3flXTiCx9lfdvmheLCA7^6+Ty#8sr>q`b3DLrJ;7YplUX=poH~ zo(cuyj}?`0Z4QA^{cs1Q;w_=fV5^LnnVioEqg6f+W?n9e=^qe%e8c<8Q!H8{x52zC z@SJ~69zo^9`g`iBcOc+7^9P{lMu-o$JMQltKuLaZM$7KKS^*-T(I}&Yc6pFRs+rZs zZp*Cfugzzlapg=-FqkJUAw(1Cp)2UHBM=-ez1OJPJ?$9eL^*rAjSYN~*#9*`t%r9V z8E&wrbWr;&J~0&M-!s@N`~WngIwj_HrzLw!`DCjYot&fZOv0h9cl1OmqG#%8PQEb+ zm#<VBbtXJ4;Ooti@&x1mh*jcsN#{+DlW{%d%ua5a%8u&K^hZO<Jm(BHdhYzdvsIlf z=)y!p^Wad@UYGb_eQz{Ht997SkzG0f%+Xy^Ku}4Rs=>*fBdLYzN4kj)k7EYYDZMZu z_75JftAQ41K4ginPep%X4Dn4$?h9>$<e0W@Um9Y$-L}m?*bt9`h{QCC2N4qxKeg)4 zUG~As|8*jNhh&Tqid}@#3OBgXHu0-6PrSU$h2%#3BlmLYW%H%Lo<%}{vB09+*mUOU z6|Tp<_g9KT>qF73l~eaYd*-HKddDE_5L;iwnlt~B`CS!;)GIB5H=D=~ocGyh#>2ua zSa)&p+UO<?lw)pAOa-YJ87wMlbXK>I;Muwo*Ll^a-!<XIKWZjxbVG*^>KDz|2iYtr zF|@cr5Lru)FZ=<@bXIm+DfIC$OTSQP_(mP>JX`TI#&){l#%B?tp_cza_t|r_cD`C; znYYgak5X|3B_qw8z&zw}U{U{T-D`buR`P@gXcd4@U4)$WM3k5{JaisUs!Qy|tvi(U zdwL>geo2C7Aisye1d@-?l%e2iUK93oJ%)nxs1lc%Mrf-fcmV{>NfV-5KW0y?9254Q zpVSz@?D&XZK;(SxZ$c>jSRy(QR;soS5(kA*ai@m&BD7`sO?jqenm?W@f1~9$Pf_fz zMrM<obA}AJ#h&Y9IDj6iSQe~YieJQ4KEMpo67a9jKH>mz`__XfTyiAiz^qN?`O(b& zAY$wIB7?AwNQvgymrYs6JSF+Og8i8G7iAK@$@a5fc4d6Mm=ZL;%l*_-^*4Jv+PK-+ z#)Fx&-Yl+Ml4@g{Yz(_`sn)e~5Dg1e+prbLGa9qQT!7b8-~G`|=OT!=ftl{VMxDpn z{QZfNv=@PyKZX#|`W&RI7FXoZTS`Cqn3!p$BB1X_3N5BmQnC?;JA&q{`vPymk0bJS zA{#z5+vY_Xcof4oUs{MCMMcNZO;#zK55jw*&KZN45&lK}N<bPBYQhnoouKe51B`-l ztJTk&Qy;x$H+4?5Nf_N$WJ-U>Y3D9Lnu6`{GkTB#g`n+|RNI~LmBWAL@H4`yA-xtE z<M<BzhWTL^v2tt|&gTNODZ0q+&O-Vup!l>+yeGO#7DGsc#->HV&$jFMl1?M7E!&c< z6Lw;Zjg%L5iucjTy1MCcb#GWWgpTn!o7{E_=ZhMqMP~EMlCF_e7dplR*{TB1S;XW% z8RyfrBVJ=9Gp2}7iB<*5=GNRpOb(u_Nc~Zx5OWRHU|Mv39Dsug%0H3kyrOc<eJAMv zp>r}+{rmCQ^-e)L8SMz1acL)+FGXFHNYtR^)i_$9%J{>HK&>1)dQXn<=G45NV&Lh_ zeR&%AH%a|={g{4Kiln$kmZJ>Zx{bsrZYwX@)I7?AE1)>kLX0OX(zHBBO;nTo-vG<i z{VCHtVx;Us{#IO-y;eY@`}&x2pp&rwL2qF=BmoWaeN)Kc9~f=IBTv=u%rUdls4Hcj z%fKVZy=Aw4HKgNWX2Q3nG1Wy`7|#<`w*RAbwm=&}MOd<P@wWj`vp;akQmXC9Zf+3Q z@@a`QmucipRL!haxWQ)#DxB3s^G1_)?iOzoN~Ou>bi^YF4_wJ%E#<c0pn*HpRrP0M z>N1kRS23KN*|55C#V?4ExkgS1B{k$vYnf2$U5b!6Ys=#q_6QznuV3A}r&79gB7gPM z+M<z>^=S~>K++-ZqE|#2E*bv((Vdx<tlMJja)pseEE0R?a$|Qj8YSzX(6fq9?rAz> zmZYYWUpvMsu`}uKeAr9*7bc<VoBd8I7`c637cPjci7%nilws0usc@AUX463z4KJHg zds;wA<I`b?j}OSa7(*Gbt%;~ejU-Q6sSd404^Hn?XQ&-b_GDEJoQX&y>61s#hvHtW zH^MBB>?tK!a+Vh8Qm=2(dhn{C8Bnz896ur?WwDBiIGk^y-t!>#LswOeJaIit0sfD( z!st6ixT2Dhd<qvwALrHpzDR#If0Z1JSe`hKE8|7M)En#<p+77*gP0c4#OI$Y1Hl>D z8w69=i?VcDtRm%&(#=7!?`Mu$*JuZv80TWEb!$2J*V9Hqo&K9qk><X!&1JQPrQv$w zeuhRn07gimmRgv!Syz=q&8xguA?GywK{soo_PQ}EWzMA>xY(|zXxrf8@VaKWYBW4c zny$Wz1Y1{F{2HWOES>(7Tsn6{1eU+nmcH<5vW<rQk+OA@Vq8-ob=>Nw*NX+y_-Jap z=BQqfH1|Zh)ZQ_h<obrjC7Tu2XZpz176Fyg>sCi69e~c<SNd>fh2(PE&5)S7eG<U? zhTxx7fQ&$qd&1KX?*uRcb`)lxtKXwx-dA2+D39#lz@v6iwHyi1+fQf^l}{c&oT_}l zizgq|;xvo`^D4dO!!b?j!Nc<*MYRl}i9KI`BF$ZL3{&Ufmnmuc<E;s|j6`|FWls^F z0KAST9Mp4?oISdkaF`-fTsN)%Ze2y-Q49LpU~5z^GS$nEoSv&Ad+2^HaAB8;zBto> zZMiL4{YmotJq%ATw&zY!TTTYjS=!f*)`4QZe~Re|CCV)Z8B>@HPYsXI&8-#yt9tRD z$%63c&AngTK|5V_gB}riC7Pk~7PjWS&RTZ#40cMS@UMC^cDOPvO(SWW;Ujj0yLJ<5 zCzi`O@09!wb|Q1F<#)sXek8I{rTp~VTgn&%O3}eJsd7_`lHNmA`lFXM*`z+53#gEb zny7`+-E(ihSZ$+O36DdBNIlF4D*nu{<@=1CLw&7))QqT{q~$EAu+_}P_IE=%#~M@X zHnaU58Pab`-7cz<BE4jbjECB{%?kOh6e)8;ukVp^$?S#}fB{zt_Da_6bW%gIc5<nD zY-~EFC}z;6(k0@iyq|TkM{1yRc@~$33H~!*qdod+BI;H!V!!P?^TaQd7wU?u9(NmX z&4Qi|GQu&B=%WhdHF*C>EG@4NVn)VJ;`ZQhtFH)@Gih(%@Lzku$iiPUZuWUS%%$Yx zFWxvP<<#WGyZdaui2H+W=N}~d4W+dOnefME9*Id2=9$~c?Bg*6fmp`&JF?-fz6Znu zNVEwSTvFaf=W3np*yC&W%_{WP+cVXBot~tj2b4O~eP3&JZ{2jpfM{>g<qw?=kK=RL z@LJVo<e-NTyEv1JZsv-Zn*)5**Cxze2|De|wpWpFUyNd|Q_>eTey}mbdfutMIN0gk z+8Q`p)<<`Jsd+9@t6fMh26{iH*qRh`mm^5M=!CJHqmg)5?<P&P+*8)~Aq+SbV&4Y- zmRbI0E>{e?W37rC3JbuRKw>`xGsp~oh*yY8ndxvV>xx)EUK4fEo|GC@MK$Z>CpDSP z>DJxr3|hw<74Fv2h_xSUY;N-dx7%k~m|V+{?^Y<2rls#k1w_pdGl?^1%5RJW_s^7- zS0PkcrfZUMlGArHjlu-WysVqb4xE__7V=!1P9#=<apI(c6mnR<i23qbHoXkrILI;v zP73H{fzYPu1z+=J7zbPK*sSPcRe$Zw2)`G!q*NBC*JZE<c{sE(Y*oTeyZmwR7# zD#7X@q6CXlTu3VvDJe_`xOQuRgP*r}0lVOifMxQb^Xsp~mf0bx<G78*XqRFxnru-h zg6qM5LA~FIc1$E7)awX!Xu!u6+FMlSqnDm9)m4uTb|d;II!sk?KXQ<=({0P;CjW=A za|jYd>AG#%wr$(!vTfV8-DTUhZQHhO+f}b8U&I^S!9UD#4l?rWb=C%qB6yaaA+AHB z{8G}dInm#3y?M6ySgH2WVub~0Db(zLjLp64^jS@~y$-m}NpDYTP*L*?PEEhlt~s=6 zhwq9m-E6s^^}xH3xyf2<FwOx($C)5ZRhA5IOs@4^b5&M+2x`h+tNMFmt0)t~03JMz zyBeGxbj^;8xN{LZA?qRZZ<Wqtw*3w60rmC(9>-P<4P%F7b=33Q`{TWE)W85X%Verb z+A2mFIbOxK`a-~<B{8EOD4*o02}g{2e6lDPx$j(Hlh)<d3zn>ORGr@BZHtOb3axMg z(c~R7^ImBQcW6-Na*0hvYT3Aw0LROqOA>)6B}zL>H9jBnGpsQEO9UvzxHhVZG_yAA z!~VxyKwLhoI`v)dlKU-KOH)HMkX&bwuN5t%f+GhPKFdwy9&BsKN(PZBz{kff)w<+9 z`{CJS!VDM^Vscy2U;%vTok-KE|9e<$6YYWD0sHf0!lQDxh`lNP9|&ihinj0}ZI#;i z@%?j@ewkn`KSVr2e!kZ6$`D<<(41t7H~H(oN1uiU-U5?2pUubAlQiEzCcT6_VKlt! zt)wMFyfA6-d7dDnP-<Q?f^%)JD(*9+r$Q<75`3@3Sg@Z%`xz_}v~gDr1U*_Qyx^O> z#Dd=+e&BT}%x3#-6AEOiWP*j5mNKK}gGK$>U@Q;!FhoREIgBYOO|8jND|8z?w+^0M ztMU}GlXEjUtVUE+Om$09mui!n3Z+1M@=lQ8kU+`KR+F}i?ddkQ(^HFeat5R0i~a~S zQUfASesTs^L961@by+9=cqk7m$YF0L;wk?a^il{Z5V4|^mG1=X^s|K8+el$lJ3ytd zEer<SY2&lNHZlnjjd<oMxMxEa%sfL#UNW$@<XHL6yzNaq=&jjc?)jt19EcPdP?P+X z1iRkuhL{ZHVF8z=Z8*KrbYi!$xO;{)0b|pSz{gZZaC3!<$iZ>F?=c9i3mIe7%CYC5 zSm+D4e`QcgTm|i%F+_TD)->F;JtZT@{=H{!*(SOolcznIqyAEMO>$P=yZ6Iak>QD2 z>*_JLE|+Aq#hV4`Qe`sG<bsl<_7=t}xQE(hCt&OpXbMKGe1YchJ3YPTs081#wImm1 zB07Lnb1-WnAM6u26zIP-nde4Uv81Hc3Gl$WX>5+f9bb;kE6$`Uq{Ao>SI_wSH5f-w zuS+!@dZbnbb#Dwpeu_m3OkiOTtR<XqsqeNNQ<ru>%(Tgb9=wlqwFR`}#nJOS&~6(K zD;Mzo`7Tk^MVd5NqF<&~%J8==do^+Wm-R9R&;aC^!3~OH@gF%*pz7|t$r9X7>gubC z!f&#%V?xs4kZ_RlkoTf-2h_+>(S8N(gQN4r_TJVTRjNM{5Z7Cg_NOs(#cMd7RP3pT zUk;zPxxgJ>)5OGl+2Zg8h|UK3*wjQv5CspP*(Q>W_LxBKsg9B~NBA1=e!By<go__g z^S0q}|4PH*SnAIU;(Lxr*C3)yF|DLjt?9T#a=*<?>sd@go`)DsvbK=JAgvPyq>A>{ z+AP(;s7i&5<Kch>YfYfQp>HH?BTgo|aa7!O68uM7RcrcF@u`Q>F5}2Uo8-K-6Kjhu z6%E9tIOH$95Mburf6*kI|3#B9b8`HTA7LV3V`5<V-|7FSN!S@#IRDQyiQ7Lf$n^@F zA`%i&HoW-h9Hltbb~Z2!1H;rmHHhK@K^T#EYmuTN5dmx<0qM55xEo{`{>Mj-)6V0s zmCtTQvuRHEYx8AK?LSY*TAIt#`_VOG3j!(#&NTTLd;$;(>+>_H000EZ6g&_lVqHDv zpLvF{U0)zJVhAKqk-p*|;QX+^{`0GRqzoTeW#Rt7mUs+*<S`IX5|L0+fdT*s5yT(t z2!JR-DFS%&U;N4V^FsWE<Uy<>AlUIqmgXUSwoh-x{1;=O5t5QnPQSC^#ySP#<hdDe z=0FOw32IhxulpGO;2VGk=lT371S*X{M!O~=A>2JY9DsKgydjE<Y0&BRK}Wa(JrPhq zEFc@ge`#XQ0d)%gRE@~>fnjh6DENUsA;Ou{GavzJbL-1<L*Te%9{{$75(He{`1e$R z<z0gX{DQ8$LH9v_apL@m)4S6<{xSZg0tx<=1>0OF)ZXs1$EVmrwD%t%@NbC#<KMuZ zhW6io>GjvgfO5!&e*qCP(BHJ`yPfa%kLaQU=-IiO^`+n@S%Qr|5EC%ybwznoIr&IS z-hYXJP*a1zi6(ku%|$|itncJ=!w=w3y#x|-@Avs_!O64t3e~e(^J;^{7|6fDLr^K^ zPqRYr@AZj6U?G443LyD205F8>@4m?i`DLlUcL?^5i}H2cv(vx33cC-+p<N4jAIkNo z#t*_<L0=BSU)1x@m(MTrom}J}d4#&qjeJ0@Fk%$hyW5LZ+ps~sm*;Qd{2hPJvkc!r zfV0(8J-L)sm`1Ta1HRvo-yTCiVp<<yTHqXh>R;-zJpVf|@An}PKt4hR1OiG*$goIB zpr2owLg0`e%tL-fm3=sfKM%DQwXx^7;k>`{{*SSIZT@~M3xe9n=s@;AnWz7T^>N$J zse8Za*S$(VekA{NAb!X1esV<zfI;6ePCuY;eh2z$6jP`02N`X6XI6;jL^Z_#zjkGe zNA$;*f>-%?HNUtjB0;so1n_Quzb^^$DNxJUhjhUsTAV&2>HXee{U~9<f`yzBD9&o# zp!>)nfWFnPG<99+R&U{#SSkHN305!O&7@4)a0h-;r~V2L127;#z7PWFI7x^rquil( ztrYSOeX>Ub0{U_Q`D6oW*Pg<25X6D>-Y9DWA<TUof7nPs00Mdbw)_PI{N7#R*WB<R zh+m!fl!?6b_-XN*!~wbwSwobLA-pOQ%BB{=o~1fE?|M_^JDj0s6X9jQjzSS>j5Yh@ zve=ULVYsT%H`0^b&Mab9z~NgYAxTDi5E&%k3zePe)*&fjV;svAvReEhCkMjSAY z&2zy)kc-gl=*BLc{9|YoV>5$j$K#4gwnO$+ZOwWshJ2Bkenhqhg_0G=M81%pJ7LCV zV<?)*)JRvrpRO4<l0Z0}$P1$k3+}5gDr6*wie+Tp^GTCFTH>9NeJy)?A&ta0rea5r zP7T{DB=jR5&Dr=mEQS@)=G^Q?0pkifk34+fzP}ys8g;cJ*EXot`eoy?8SBiPz*ApP zXWP@t++VQGQX#WuuuvA+Uzi*xSZ43B-FVzf1lY``kM1I~GO9|pbCZZ>k*j}XzA#JO zK>Fx~#O%01$`V>=81fzgbHwmSONW!`C6ZJemG%%g^a@R95c{C9B{-v<uxp6_Nvx>n zaLPS7-JGl1vp;`8bwWzz>uTdMJf?|&mF29B#`GSqJm3G8N%omhbT4*Xh9Kgg-~HmT z0Xr|XjZHD2=^;Irf1e@&1AxZq(k8L%f}~48lQJd${(#1tjP$M9I5Z>b5Yu`jp657& zh&Ab!*f)4vl8F+e|DC0Cy<SLOFxqsldVUJ;g*OTzvhJy*y7Xk-(_z=`%>RzqV}x<6 zeOGk6MF<y`{kjr&9i1-P-GG^*tiKQ3##s0Gw3QWH+8%7xT~?5AZH%ZNn`GX07>dtG zTQGh9zI-Wo5N^Do5tWf2_JCD`+d(a{Qfo08gUzXM8|a9eFQ#FSK8yb8>FOOFGXrAM z{<u?3<Z65=8Y@QR@U`uFgxt1f?H<@cxDcpILgwzWtDgx6iH~(<%97?q!rIatUXLzV zbslkd)j}v^D=XmzgBF2>-<jP^?&oS>?d$r`9u9LdZtgsre(Y5XL#kUH=kd!{?&dS) z@rP8JFa5MrD|a5`)mEi)8vL6<gP*jMR%s$yMy_BsO)lllJ)^5fR<_zhS;2WDllhY# z<a~hjwRd#Xj`uarI%$NWtlu2M<C|_lqq@v<+T@eft;Z)WDXa&&3XC=D9G@akZ_Y7B z4ji7(`-3@c=5etJ>a$}$svIQ92})v>n7;jRL=BtZce|x8otTY9<p8Edz}tKdRja}| zAv3P#Uz1N+=UX_2N3&B3@N`m^;)l!)RK3{j20^n}O*wadgZsk0$^JOCvj^5pMJ9O) zT(M27mrYd!Qn53%*qP#5tAt5x)05D-VL3ytGOU&{9|P;ZX|HE8Eg+nMi8~DNG=ljP zKHRtaab$81KH<K(VT|x@p_W10ZRo{)QEd}|(GJ&op-=l(nv0>9kWp5-MG=4Rtp`La zS1BBc3lZCv(pJKLWCr!RZyD{XX3M6!Y{1H(i&961khZku`b1m14Fxv@*_QU2d2j4< z_Wj)azN3<kvQVSTq>9(Xx7LqmUXm5&sF3zZCmEXAVjgK^<O+JpAEM6K?YB6(V>7>Z z(&vC2pu+Mqkh0vWL}#J47eZ9Z_TR;hvvq2j%bF^qgl#dyeKM+RWS^C1OOJs5pK8TR zQe(uDsUr@j&QxM(eyIUm*;tR~$b&V@IxNi^lFnFNqA7Dtv*qXA;Zw2YHq@;GSVWHa zxVaTyN>VlX!EOr!42dkmCprqvKIVc|@F#7rk@`x$e$MzmWIH{3!AF|tifZj)NX8$@ zVeRs+mO8o`w-3`ykTYWJA9d~Qj~H~8yx6YFMT3By^v{$jj(UnOuSz{N337FGByxvl zu5#|zM5IMd;kyTEyIwoOqXPQC<@ES7PaCe3_V{k9EXiJ`DveOZ*Y1WyxqZ>hkrPJ+ z4)uvevD8^ml4A)os%~aca(oHSTkn*bA>`Dn_oR$%_%_GxU#i+;+@KO9tsv+Lh{xWo zw%<^@3z2%&Y@ZOpx$e1$3j_B)AuX;b7k7lZBbwe|&J^%6q{an1P1l5(HIlO9wZV%p z>awlk6BmCK$jvs`Q{fl8%2m()bzkA0e#fKh`??`2>85>I1NQjH`nqP_!_?VFcpMJ? zwel4DJv|Re>eIO!^F2DbNCO$op9)3Qz>?37DD+%%Fv-PA&P6Z*fpH?nFuO#$pqNbh zPF9~Fqdn8|$3E0fzC!c}@N()bn1#hrZ+5q=oi3cJkgetxOC;|EOcC1!9^}VYd>?%1 z!5U(0Qf62!yU`q?%C+u5uA&L`?vh}K%`i~i8;DYa$fPG0b7yW9c}%)XX?#9JvaRZL zC2cTIPY_hh9$EmR9IQ5dga3#)C<JB`-;gyrh9ssq5Y8$Ya@P#mjeTYJu$&9Ph>d`+ zfs;FJAPwDjle#$9J=I^xfDLyzX4pE<!%&Dwp*+t0=n*|}C>O&jaA6z>8ta8wl#S@D zK34iU|3ebJv8G)`8+bn>V@~<9vNOWG6tu|Ak366|bgV?+Wr!NZCzR8+L16M2OL`Xd z^ofTr`4+L*d;U7gv~h4bInv6-`v@~30LQ?yJ7JI<ww=%R>OmK=u-b0dw2qoqX?ZhI z-P%}(mcV3Z*YAFK>6)1}u9UTHCr6xHcs7+Jt%t1Q7hkJ>YjR!nmDI|N$Sb<U^ePL~ zHoD#8Jc9lcLcODDb#3$-$QIi8@MsE-RQ&|Il>`*IReS$4;A8T>O&oj;R_$P-OPI*^ z!aT}?m)wIvI_7v-M6Vji^RSf_R0O0AJ@WTXHj!`>5_WwMRVNp2;g;t(#nN;_<k|-b zSX2gL@!EdlMO^?!J5@Dt0bt<T32wOJO|kx;jZ0-TKh)TkPl&4VMeRVtKn~X{%M%~5 zZq{34+1=@m>gnd^Ix+@(tIP1BDBCt>_PEFVSz_2Uu6vS9#eb^Yn^6BXod2G|gKi_w zXjDL;J4X&E_9EBnj<z|Fl(UC;#P>|1PZ8Y|$SF^oGBvm8LJck07WbuU(c68qPDDQ& zdemdLH5E;(S!Mji6bAU9cAa?Sj#OZcrF|=LKm18V%xB|#TeZThek7WV6%iahD6&zx z_wFQW+|hPD2TH*~-?d0tE7kjPx1>5AO-+e#EE$fMPb6ISSm`^h{@J-TF-_fIYHnfL z52N!$8E5IOfC?kw1_>!;q*Is4k`!d|^&M#Z<n~<LT8Ey8;A&0o7Egn9`E#o@i9C=a z9?PrOSnw-@=&oDn?|Db3Q?FxrFH3-oM`<8OdoI3VOi}txG}0#q;SpWTTelp>Ei2{6 z*Ec1VWHZ>o@Qc&8PL@zjU8ZOWHd+}k40?e6L&F?$h^8~30jr&o8-4Qlq`-D+dxa7v z+xbkha*_v^hDxk0J{tIps(!-iF=b6QZ;$roe85aDgG}R$@%Y&z37rtzmH;c5Vw`c@ z*tA*(5DqFS+O8IOI8IH*DeqitsfQIkYJWSXO2F)^g3gbH&_q$E4eYRM&qnQ{tet%Y zmVm}gmSXV;Q;1fz`%rVtTw~-@Ye7&CII~y*g>-D0oeQepixM;qQBAn_Y0=w0m`8L! zBB3TF@z9@}(ITeC=%`|)Zywvp37IR)Zsi1?-1uwk{2h+bZZ{)relBC%OuD~Ytur0Y zhOOrOCfRN*vXqT8ed?~WXz_Rq8#$7Nc;y&KmA~nV<uUg?jbb0&6e=M1+p`i!ATyK+ zQr>o|FQoO7$iZ;3z0O{cmpi_^qRQT?afp>owY_R0!kcPo%Q=>p=3?2a`FvXkQvY&t z;QUf*w0CdD@Sm1_p$)GaezW}D{l_ji4CEsNLs&2;#HbSs4Ll~bq_3-mV%rpUXh+Mb zM3FtiMHEo;Rni;l5omy>HzYM!5hR0KVLK4}P_brC5U*W2_usDw3eRB0g-7Jiv5(gq zofUAI0Cd(wJr%Y}CeMVYX|G&M04VI5=lVLDi&E^!h(i<Ds$KiA(U}mC9@7o=`mJ`8 z5en0OyduZp4vIMe#tafMY$y6+^!O!J6T+OBc9Z(rQ-q(v=lM+HOvTnmq&5NV9S!D7 z2<R`-Y4$?T^@F04HV4uM^{nhH^Dw(ieSq$_iH!or_;{K_3rTIMr!)PrWQLuCgT-%6 z>ZkCKsWoym9Jf~9-oSk-$B|VP{G5Xf_!Y_V$?_H=8sw!Aelqh7vd{cpi;J|nud>4o z^GTG>0uZBMxEz2fOg6n|T58m2U0>-lRo&=*XhgQajUCLPfHDF5@SAuBkymZ92&QXj z&QNC~VifcB@pkXkvFCdB&w4>n!pZeC3EWNaxlp9N=FW*fmJv#r>gr68Uoc8F#RQr5 zrJ3&`J69i~h5#~#;@T~=7%N>WvBO)nWc!Nhd0b<bi_@_(DxKIYQxAFcrbG-AS?&qB z8f-Uz5L5DV%Jk<csHUm-EZ7{*WMP?VCdk+lDIdvOGsuRCNjsc3W*iV9gboe11V9$D zl23}LlI5io`1IPX9VyoQC%|}>$`1;+M<5Dd9~N`YS~b#oJN0LbEF!r(4%jI+8#=Lm zp7L$R$&d$X*>qT4R7slkueIKAEd(Chn357gOaPs}lJ6XyHq}DTy9u3wP~&_7*<XZe zehhYOa_^+gozph}tFE9iJ>{Gq?guFpMTiq9PSBemiG{zKPxY77YHufY3LNwE>QfnM zJojc<m<~t+1HTiN7l-3Fv*^5(_M&CA1=~Vzq20tT<VlVqSGk02R_MTQpl8@-`M5yP zxcv8g=U-|2(F(iaYfD0v$=weH-djJfX5MU|XPEJAyxQYI+4ua}>DVAn8Q@Ud;=P!{ zQyda1TVI^NRv}o3TpQ}G{a=a5)3b>+AU|!lhHA1I0e8M8+%_8JXjwn$nYx^h+f(nC ztXqjM>>Np9NG^7u@WkbExuq=Qa8e@uM1&TOsL5r=$OJQ7XBwW^ep~uQ_aA~n*cG{F zATjR3D@WXiQ`E7d!~5)E%^g)-Sau!uwL_fEAbYVNH?L6hm)f=q#Wf=4y?D&>M(|Xw z#e&jw%on9M?%zTS*S=ELLyViGBRyQMD`4@$F9ht0Pyft>IyJ}~z=j}$O<U8^k6Hx= zL65~w>96!;Esdal63*cq_Gmdqx;&YdP>=IYG(brfra1CuCRp?fI$_1ANUYQwyM>_{ z>}T;Jv53mGnxq%7I_7jtT&Dq1joUfX`;EN}1($-`Suk!XJ=lb<ic{}^ZOf#cF{f1f z(&?#E$p3C_jNZ^ZD1m<qfy~mlHO}&8O~Q*%%5Sq6T*$WcAln*HCaCs7w#OYJTfPAo zv2wy?`=wpYqGPM2pL!siA>qrrSGgsx#2=$37&=8>=|~S8m%tqVeLQM0F|ME4KeA}= zgO#PjdY)cRvTg0OIhqcoa9`?4t)Rxt#WrP?Y?2CTVfe9?ZbW7Z6mkn#DbvnA5f^j1 z&Z(hLisQx8dyh*sV}5jNKd#d%Xo3zIiCO5JmIH&Mb1$7fecKepHfB$hT)<^k_Rt$C z>q6dRgF?az)n=67&NP^ct)ZZ6^q9;llaz_`(%rWpBU>5*pv|T$e%*YU!NC(^TH<NS zyb5oT=4N}X@5SS2$LW(yVr-vu-~I7+SwagBg<Xgq=_SXETUK_R>dkd}&SN#8jcI!o z{tKHJkJi5(NvH8_*koH)IxoSh^(}E`gi+{!jUpe#YBD~A5+L4ZH0E0rxV>m(Fw+#i z3lC@#b6}=WRG-eksW!qx$YKDy&*FYb7XAyuZ7H}S$-D&n>vgcUP-=IVw;IA4Q4rpx z{a2&%@5z2~1fmVTcwzTh&m%7|-Dw7jxI0`_#@lhJt0@oLQpcEa4OmBp>;VeJb9bV- z4#tcH?hx=(#Cmntz-ej0N$Ed@RZtmGl9^QS(AOAmtnTsH1?+I{XLuAEan4$Nw$2vZ zGZ(bFUl@t<WEjK<->rJy99}At<^+q}KNBT1I9w;cdcoC)p_J69K+RcI@zsvks6>NM zI(Ku*WOD}d1<LTG_CIxDhj+za4T<1Bc@uI%t8121M;Diaz|gV&3YMYnED3$)Yf65f z>@{YtziXT$crP7tvF)pOqQoI4NU%~@Ud4SW2E_^Px8&69oc)qXGx*s}r|?Juyp$4! z31muA4+_@&u`3l#YY~pv>Xwqjg?9Eh2el99j?uc(^iy&u(1DR9dMlGugpnYJs^i+r zL@c*>hW<NXqxL!Qlr9g|kZ_6t8JMkXl}~a#(K}PW;~XDxLP9c{*?mb&DilE`+E*{; zoNGP38u_Vfh936o2)?Qj)QrRXk9Rsp+`FWtqZL}q+$D3gs*YVmpt`<S3v*FiH+84- zmkDj>_ORXiBG%#WeeIUX+}oHFAP<~CoeJgs*vBB5W+WcQtY|uNYJ!(JLAex|H9I3a z+@4dL;y%vd>kl<|<cWdypb;Ih!kCXN)!*xoDPdx`#(%PvUFcfO*&Y=K!`yaDf84dr z<kOb1PD9CGd%mPM_irv8!J^bF?h(mOag{%}b39uXSPVnV=x^Ph!0Wq>c1Ig8SrvN2 zaE+eS+j%2a=k*8#oDtOSJ#WV|?>J~HZ%pEtuw^FHj(v^x4<*Z_!<V?PiQ-hFFUG3h zp`Fk`LDf{!3p;q3uZCAH9%of-LZ|?dM{CbI3{iD(a*iF;9}fT^_D|EGYXe=rVDA{V zY3?D@`LPeFrVmu(*HkV<Q4s^>j#gU)UUw2LA6TDxAgQxbQJ%x-tap7<-K~zhO1u&7 zn>wvkHrq%Y1^pC!q^hcirKqYK)_ZEg?vPAQC~2x=k9aP^)7nONh9)u=O005keB)Dh zoKw?U9ErTlFctI^P)1Q}M{2nHMQ!wPNgvun6=IL~fs)T@AM-cH7{3kc@s(8NoL+6% zP`+E=ZdCh0aC2W!_f0z>)TAZ%rRs7U7jwHOShrT<*0Q&cI^@x&W0n>b)+Potz8#&v z;WwF<qX>N$5Kq3#bofdf7hJ94TT0x8-YE+40p+owK_%B$1=RYr?u~Av@txqOoX&=L zBXVl4Xj)gUz8K%xY+>BI3yptIz*N+FNEZUsR2BMSJ-z{*G#P8*`?D0sXhmMt*YEpv z6fbJCEb=A1#_hCx|2z*6or*-vmaWT~e%OQQ<HaIZL5=4sL_6}F7~(AS5|?({GFGca zM&v)`TOw)4v&GYBR{t@&G^QJ3mW4>4<H|->$;)s<vetq=JQ6DPy-0e$dfGX>?&hWs z>dQ6%-stO6eyuJ_erI?AkL)fQf0@ro%D;n`VN1U?gBnNlp4Ln4n1SRE%?xhAP}f`| zLRFhVLl5l=US~6r)80q-R(^;rKlkIy|D3M|qaG1P?S@i7^sXgMg^_Qr^!nW2<E+^! zbY8lJ_MuKN%=XqJxYLNCZ%-82$ZYY?GO3;4`e%6Q-z@&21+?)YMbBP&%JhQ$P)qq& zKww%;jBItP+Ffxq1Ya@?7(rij8Ba&&LKG^8reSl-RG=l!TB6-0Ezy(ioTq}w(*H`f zRgV+;!rIAl0EXhk&4`nU_cyT?*qY251u1bDnxELd8cR5xWj=jT7Es;yAwL%;Nvv|4 zP&Od5y|85v08sZ4+`46W#e2IAy7v08u+<Cnk<~spn$2Ymefy5q1x2VE{dLUdAFNO^ z94*l8n*07_?wKN>!K+ikbZR3a&IkHSj8u-_20k7*Z>eY}w1#DG$8kP5FdAyill>ZB zIam`viM*(xe4ifNYGQk{W1Cgku55LX!%vC1mO88k=fzSvM2X9htH!ZaW4$SEEk<Aw z!H9vyu7?=H9eXs_c6;#d$()VM|GRW(za)ul2EJ0nCQ6e4jbc5^2RIN+t+s4xc2Xxj z1@>S~fIJR@e^#b9-%G>0^A{Ju0HXx`e(III7x`3mDucK0qr+gz!V_Rp=0p7BL|RR< zgEo=)Q1<f=8R4}n-)Qs=`2`(#sFo!IWx^@LO+n9!Z0~*M8j4~0b$KJh@~nZbT;>%c zCXWKEBu_Uk19fTUN^lFFOD>;EqE7N-a<8lE9#STw6*Z#ArwEa{?uJ8s4SP-Z1*ubs zwu+qERRSR{AR;)E<PB2qggHnsJQ$3rdIvhFJvBNKP#c{+h+f5~C4Y>A=r)_Stk1ME z#_k#6ul`>M7Aq2<>sBnX5p%w(G(cO?d+KVD+;*!gi8*$K?q7ll5@T)U?7p*jhDYP5 zDRRC?k=Y;<D#8*%yPMC3JEjN6@isxGLEv+5q<5cQrz$q6$moK|pasV5*5{RtwOHn5 z(pVV2B81q%Gq2{=@xKT5w!$92{#%xXOv9+XA6H){SaKhQ_X|Kso-NSfQu&pdhE{>F zIoDZQ<HPM%rN_F$&!=DTqB5(!{}D1WGyYe|$i~X@zgUrpfP;noKSM@NRyOAUbI8~R zs=RoM%_f`bED2x44N}zEiA@3qGZJFWB3>%)2DLy)unhsExS+Ej4h>NTar?B{`}>>q z%FAu`xwX1I>$5%UIx>}4I7@2<-waA6Kxl94i^s?4-&N8>$&c?JD;F0UD+dsoz77Ba z4*WadkQVKK!+?N7^g<8q;g$!B6F|Av_iuqm9^%h5Fw7o0$Q^X#ePr1EJs`;2oA58w z-;PK?6l)%V7XTSNe=HQBzxxc6LfhV30x`1o!a2QofYz>80KN(eh&8)602*p}++#Cf zKyyt2+<-cWnAg^Q06t~75D>5Lau95g<Q!WvQK_qwlaZq%s3X8GZb^oxK<)v1vH-jU zFlRTAP2gXan0Y3LP+yI#csQp10mu+9p@R4q0Iv-W;6Mlf7{=g#`w-~x5WMoZ0pfA< zYAXQeT!96D7*^f}{h{wp_W|BK-hSa;OJ8gM5RBQGVRLhrRc68tfrB`JaQOHA@oz~0 zgWtlQ0j&#I`(<hZ9L$68!<NHFSQ|kzxa)Mr_D`sy>jRtL&;9Pd+7hs}$AE_c`B^5u ztz`%^QvJI&DWszlfWQHBs^$Yl;FgDbu;t_ai&Fy)ashh(Ddh+taE0sJY;e0jVg&)n z`v_1$^<@#{Z~xPe6JYO;kXu$)hrkc;1_SWa;&kwx+}Ae>`=<4dE&7D8cM9eL%t5dL z0OpV59|n)ZpB7Dy0O0lt0QUB+b*~2*nv1Uw-w*_B9S}nRF~dKP$S}7LkICrg7RTO~ z1uwww3$R<ex+|9g5wb2ssGsXM<rkZ#HmtlUzZv&9oARqVF)q*z=(`0}0AQ<Nzz4w3 z-^=hvSQrA~ZkL0LEsy{5Ewz?v2oMV4yHI<G^IN6iG#5wz(@9_r@He^`RD=N?LjN=L z49#26+ck{+=hv*`*Y*9^=)IQWSFPaJPDBz<|IUtg6CdmszdM>5;_9&!G_W1dehAH6 z5U~^BT~Enq55KbV-`#q&{nV<W+6JwGX@n66&ToCidc5KN1_bF#64>Q+!$H`dK7m{P z^uhXFV`G2-Ui>l0(_@Djh>X4Ua}FbIbQ0JiVgO<FtMm`U{jk#&3Bz6bS#5xXfCRSQ z+P3kwM`#ok7X;w<9a7x@?)FQ>?3)A*_@@v65RL@|059X7sqKe?26jL874Q=$0?>W$ zB}McFsD0Q?puqQEy|R<|1JP%7cya>w4955P2j-SOD;FMdZe`?K&mREDzO^1WFaYk( zuRqXl!0+zJ4hL}+jgfheAECfS_wQqE_AfZHh<=T&J^orR3@E}g*H1@Cz|Ai$6k;DL z$i4r!Q8)lkpM4zm0m|<T%$|!73UITSwnZ<|+V9HOY27u?);8kAu2w+Wklw?s6&%D9 z*v3B1jKKBKVAgJk%hu9_qL;&MltGo9vj}<Gix_0T#);lLr-i;Lr5tafm!;mfJ&BH4 zK98Z}Om4>E(Me(JaA($DGfT2JM}pyR$`+<u|6FUNTg)FWFN);DHgV4<w0VmHI@*3E zCl;p_<HPn%`*_{{ZuU+Q{!V=_(}GX{wLjyighE)XU&YqCtArEKN?;|hZ*}FM1~~Pd z9wDIt75i^;N$7cPR_!tB6Lx%BCl2X@m6iC8U>}R1v(U?*mVYaW#VI6wmN6bg6Tm3P zk(`z?48&<11=Svo%ORtZhHDUMtjgp>R(z$=;hM<dpgdW)EXTq5=Y07#juhZgGZLpR zb+}9GcV^h$Mj~J9NGUhME7`IoV%kUW&Mi3(n?w<^c0)yF!TZW?HG5XGLQ+z6GA;9H zSceVy;8B}4vfbSupG;JVdi_l*NZ!WxN>?2Rxb(SN5y20OwZfGFAW@maW2h?7f*wOg z$B5~2YHL3QlF6RN<0ijT;Bg1L<IUttkTo01_dpV7ss>-d!>20*)tH4vaUurpxSl=C zTUoulb-$eRbbawMWW7=w+R~%W20)Cu;t2!-0Oz{`M(`9v&|1pX+pOnU2>HS%B{;7$ zi>dbK)e;D46UyZR-*V{XvIwcq@P?6BY<TCcze8-3^)LVFp8ZXVb9PNmo|=>+RbYQO z0GFK8>^terxKO>xm|9cl-OMn|WfWhwh<5jnW7}%IQlm@X$r_#&O!v-`Zp!;;FINkj zvQ2><STK2!#eA}>%Dr}|qIYZOX2h*SlZU}D2P68EW$p!S9x8#2=R;0_*|2a^Y1MDK z3*lr^ckSP&Ylrdez&kar*)6j>zRTRnN&yJS^mQQ6QMW2qU<?tTg$ARUpp^SQKmKCO znien$>%$EM9Uaa6ZG=rx)gz+kVKMWZM-o#0)mgv3s)#jBE~<_RQL~v_y}@ec5I!G= zm&5H(mg^$h7{K>7&fj(+pM`&=iOyA^{%hW1D4foxOWz%4PDsTPor_D$GOxh1_(oZ0 zLOb`7*U^kqk#G?@D7VimBEjX{x3Rr1aJ~yS+}ZwNTO}e_nOdCYsOy-uj>RAC_#Q-R zLJcfk>nvxBSSIkd;B@FWM3!>)MM~n?9l(qPL+)n;NnWvQYcd2?^zfVk8ur*3!!NDS z!(Cbr-ySxlr2bGn(vYXT1!}2sqq)jHdW|d#Fgc`L%^Y54n6Zp6%!m8?Wprn-)>GJR z<<7$Be(GkP9y17!$vT#552vu0WDy=l@A&QA&gZ)VTc5bCP#H{A=DNfEAX-%<T7v~t zPLVN%_Of~hrPfTHNi(x;FwqX143;%;rIg;Q<rtS#;&r8TF0%A!Ng}37+#wj&I$70K zgF)5TN^-g&ZHZg-btzF!heC96Ud4VOe<(Ml{$v811b>|H%$bnP&*BnbCsCz)zFx4r zZ1zcWiioma4Oj8r#h|eh4d(eL{tr4cigyveby=b2?Oy3my*G>~YK#|?spg`B{gl_y zJDu-VSKjj|kWM66qievFL5ZZfFjM_d2Aoya#%28RpV=Xe8o&}TQSw1Wne)jHq4Q{C z_Lz1CM7b{ysBsfqU-iBeCV>X&c-4fs<#c_^rheIP<j@uffaF+P31jn0HZOHxUDVvM zryCSzUk=waCfoT}65ica5_EL9+;1ZCsxXu+RXWlZ=x-)w_G3jcxD%kBR~VX;eh?h> zV|wouHmhpzUFqKV`ldp!1a0tqB##j+$@a)9JeSWk5v_!Sw;Dy$8H70H7N8T&<p8Q4 z^};n5f%NgCKJ<Ri5X+t+e+TF9?)SripC-^I-XY7J@^n(y(}S&qGe{0r-%iYx2_&?a z7<L1v#R%TWe*IIQIM^M~3DM>81L1El5BpL+qX73W-;3%{)C6Can5sFClDaICdB=Qm zW6ni==t?f;9^0-UM(>A?tf2&SqbP2MK6*<>eQ`2BuINWl88is|ceD2FX)*S(xd+w3 zr&5hxD4yyEgd!z!)3w%!Su+oSqLp{pYNCg@>ujpR;_KL;{B5>ljg-{Sg+}c*iqX@S zJ0N?<kbi=WgKpO(vsxF*ke$<c&v_6Zf7FT@#-N%_)|XC@i%V6v{mU4)gW+dWi_dM~ z%^Yaw0=hOnVTYq=DhWQ@17#?oM=gJ2vk9Z0EXaE1ZidN<Wos=x6Auf~69m6K%X;)d zU!9G#yUBP%-fW+e?Gx4d&l${@{27j6G3d|Xmnsz>?(L<mYMC~CkU019Prxa?10W*w z&T=DkRSJ6@u>q?o+wvWB%RPR~+jebl3wFnO4meUB;qr*_6?w`W3njhwF7pYa*|&&y znph{_^_eB|X1}U#4t{LR&>>AHmX}i{+jLK9K11TD+@-2i&O;YuwPXA5hI}F*uk&Rt zWF{7*7Wu`wyVq4Z&5`I5-cd<tq)$h{XNz2&i_}ks)#sS?6w}da5VSPNcX?wwKfLyk zX5wLAk~f$aH`riVKMpEC>GIA+QB_>ky+o;lT%6t`2|4eHcb<HT+#8<=!$O^{sZEh3 zlIeg!kDUu@%?F`3L5_=RC<ban1+kv}#?qB>yut>10NZiI9Y|B(91~){02&cNIcuoW zUtQWw*UI^;)Mt$22C6#ounyp6#`4<?ub$`nBX|>0{*{PPVnnhGf25Y1P@i%a#L}dm zF6w8Q$Q~suA5(*$>UpR!XW-a&$R3+JO1w_iVfplPKfCrg+^w*xfryIVI)U~%qR#Av zj~ZmSn~Kk}hsHjfae_7M7lp<+Hf{2Z!hKW(bv(TT`Gw%4;|7%XxEs;nTpf@~8oZ%5 z$AVjyzu~d2`*dyj4YT4{OES_p*IxCn#(BHFo$3=mJL{tamnQalh4GhrwjW@}jSC85 z?*<b?kwc5YIW08C3VKg3xIq-}&3|@Y?@n#PzcCTdisdz94xQ)M0AKGlmeE1wPq7A# zo~e=SP6OHStm&fav1PS>HriYD>_3$o`=PK(J50+0`&VVSwh+!tMm@+YhyGfea)HHt zhULD3@w4fXaHI$+oGEnp9HkPOYiHyZdk3Q|;#MHF)DjO0ql{XaV=u6DI8DK{uEg#g z)*sYcp1mi&`MS{Sj4r3za^ifclDrY}I58@;<9oqh+OtL#<m&mh^>#Z96N7Gg4>cN- z@g5k^cx24!+J1|+VhSURH(#$fE#r%^M}<R52_io1GeSm-6{ll)4gQ#<mdxetVU!<D z<mmDC&J{N}vW$4J)-@nRVhx;1Ddc~JxCZ@bI6Hmi%e2?un3?X@orhZ5X`xF;ltKL~ z#Hir&zU|a~%#-1dxM7#`RTjpsxD$6EBN?Br77Z_KxU$;T3^^_Dd};a?3xhZkK%7UZ z2r{P-gME$<Ut6u=E$@$^VT`F~h1CR4s!uicDUhIHlbAWkYVtL{_Ksh>LY8Wfi1BH@ zzya?kyXdBv6qTv!i8MtoY-p0YT8m4pya#`71jD5i_DP4F#KK>_Uxt&L<=3M0pYY8{ z%?j@)aa7X;@x<(jtHBiYeVrAR^!j@*Ge&VWXRyF<vX?Gv-}ii-)O+M(jdt)VT^rZZ zD~mtEM<ewlMX96R_aeo6#Bm}!lmM!U)_;dd$tNJ#Xaj}U)V+t?;iYQY+P4$bm6 zfG5`@d7`X5R8#B?YH`n#6WfN7f+vba_m4I?)r75gcAi?_HK$tZBXYC2d62ZtwyEY_ z_w#zdm2#f`c?sS6sVyg0;pC~bSwTdw%@O2G0tY=!F<|m%yRYsU>k5cq;Oej>dCcPW zbF9-b(`##EtnnmOI6GHvH!eRmVV>TtMyB^x7^V=qMiPU=z^~}&{yvQBGU#fSuV2sI zu_`#%H1%tN;^WY=TaFz6zAMYhx4VSHI_{ZI^^|k29ImQ2!wj<g+{b;txug^3@PvEn zg1Tvhj*X70Vc5~&g&Q0U%GeVQaW*OsMwgc^#%<wqPE-9j4PDRJ!*HY3dD8i!p@NId ztd<Y0$-rGdE9#qx`U!Cw&hA@|!-Tl5$uHUKcog)oHBrakS(%s=@EjSa69ESeGk&@8 zK1wL<%KSGU6!kq?gUHCL3KJ6U;1gH@{Y2mWn{JB@qM~@JBT_I?(=Qq+%up4aYki{2 z>TDRK{*ytiloLX~@aNcXk@Hm@=S1bv=Al>cNYpG!*SBQ>86?nIA9bBreWdh|+#r!{ zjH*s~Nf+*v9^1wga}#RzEZaOY@%_T5)aYjpEj9!pIuMznB`EJ=bkvw2l4je1cy1d) z_a^%99EG)v1_?$wzWp`7c~+Ja#S>z8;O(e(0Zl*<9pOsr=YwHtcbk?Sbu`d@S4HwT z+>L*3H)$elx*M;3)GqP%c!{AwVbiAiQ(@5A_6HXOM+bujZ*O&>5LeUFImNr~kUAZ_ zX%3ka@1uiI{Tr1IY+m)&6P1P=TT_;dYf((h+D%Z$!(nQypd&LK$waxis#{Z&@PrP+ zP?8SjwAbL83kP4Co&%)DZ4Zq8np3S4g7|rdhmgUnRXugiF+V<LNTxp_S%aiyW=1+Q z9`!|&pxTt{kD?>EbXrz1O6+XVcHVgPHp@IFx(}6kWHcscbH$VU$3_9wUah)ZSK}&< zs?#0494gxUtf6vroR*b~T}wXGPub_yB$Uggaql?iz+RXF+^&LB{ZJJwUqKof8YHH0 z(*UR$d=*o(!yX3@FSYDUbD>+?T$EPt64`zy)QAd*u43!KgXa6?qZ3uDnGa|dHnvyh z%U5a`Zk#Jm8p6R>E{)dJyN!|9_~w=^`z$M=`@Gn9#ugQrJt=y-h)aT&3k*TaUYKX@ zZ=?x>TpJ@+cFqsF_Kv5jspuFz;<ZX2mhOdvYc)TNM1hSBMiWiY6oN$4YU3%M!JrML zB{K`=2yV{(C_Z9SrWF&}2++PCCzs)Giy95xI_r=$sP!T2wQSNV<~Hw%*zB7sVBeZu zg5b|p(&UX4_wDw&jFidKMdcJUIoJvko!Leo(j~147gdbZ5-p)maByQHhT62cs1%j- zXB^A?tCkFQ0!p|od|^-tqg>1cuR58IeLI6GX|ht`-LRs*9~k%5Rb%|6BOCWlM#<+E z{&;L)0uU#Pc_JDJ^Cc<%kwW>?pi4qB!VK(jcX|6;PKSA)O!7YKYxH7Ho-*>Dd_N}b zC+)}Vj7E|UibQfBf9(fgoD*dno)|bkNUqKlkrUkUvSC#m&b`5c3Mc?(gG@2r5igSS zk6$w9NX8`+(>lTV6aQj)8U}6!vFt1IC9opmX!W-|l<CY?-*N4KFE!k_fa<T5Wd0;9 zZ9*GIPF@Co5n@H_Ck@U4WgDX*a%2G<PYA86X>Z@(FAN_^aowB3yN=90AMC0<DJ^>P za*NH__D=BErrxMR+nmZM8ltcrl^-W=4E||9(pFf_hC3`Y#>uJ4O5%a}0s8E6#kqi0 zY1~Sy)yH`5KwZ&2hIEfd2jRzoL?Pm$X4$}@tUawFqOz^2xM?p&4KHW^8*JR2PK|%J zzKQ9Z8)XrPPfhP!d3Dof5q6&=Z=OWS$Hbd5+{@Ne&kc6zaZ%wo{4$W(^#t4%hy^1v zo9)782IX#Xw!#H)JLyh%H0jWCEH>$@lcaDMy1xM(uB=e=##3K=STS4oJk?1-#+0Xt zG!yGuf1@t+vg3BAmPoVr8U{XxoE5BP4tBCJT^~*haCli%J3!nbKE;H;ST4pXT9EvD zi~gK)ix@XHbb_H=3}C8ZQ-hHXzVw}YQ338v^;PF`^Y0x=#EHhY??-xi{6<#D$#p8e z_G(eiadgcJh}h0rXcH17RiM$Imr7K{Er$#{ByFi!$Vqdi=P@A!6xx;lEZhd@Y4q=^ z^tdmTv_UM_M?bu!8xB6srXVI`t;)BPGnX23f*A88g^}8wv7+Ul_ut^AA3V7Sg(NPv zXU11h@{!2=+n7<bkr?hs6|t0UVPm9kvN6hcf7!|t>tZu~99`tia2L!_>%$jQwU#rH z_z+Af2@+zlv5eb|z7&1*;6x@=a^RJ%jYw*7HhBL!!v#{1dAc06ev6ZMZ0Kmj|3ZI} zHKY?Usc}AHl}ZlndwCM)MWBv<0cas+VyUZ!+sEHF+qyCWu)~|(pFgXAq2Y&x)JH2> zGWpr#F4l;Lkwo5oXKR0^U(te?9&<NlfxXOBGW1e~{ds!&5+r#E3>ZG1S>FUG%Q8UB zA!8>}{q8QSgHo*7uhZTljo4^fU^%v7#^Ww=7)UN^K2!y&LS1{kV!Yd45|6abkURG+ zCX2p|3uvT38QSFkU<$B5H2qm3CE#wXbnK%Q;3Og}k;`vnF?e$<F@Picvlqv?-Xt2O z#3z|W$*95m38XAO6m0!X_m1d9P$HQCilmnOD)uX-4m<VPrcNp+D3NV$#q9{_bG26f zBv6@tH#BHZqE^!^LGEK~#C+iHy%cK+uaRk08%jFaqSn>q>Ue3>hiW)4&AuUc$+c;q z>$8G9AK}dib72)Yk4zk;%AL52le-=Mu*^vTR~O#ND7gd6y*B-5+(|JQV|FYC7u0H4 z*WByF=`G0<rE-yyw7=S*TS6sGm|OCrgqOTp$+nt|(&%WS?iX?%eFNVi;SoJK5IKbA zcnd>+C8tB$v@c0(wSGq9K8rcnf|^)7LiCk6lv{xKbm;k`-;=Lb!N|bhk~vt%0}EI% z#6VSwt;pG{T{{Hv7|t2w<vAPSv35z8;Fb2Sp4h`$XC__aZZp~bD$70K2&jGd9j>x= z=`FQ(RLx`18pxIXujji{Jk**^43l0e6sd43UiUGm?=-ajOLCWQQ3G)d%2U+<-qzC0 zOLlpV1(Lw);NZ=7m(g6~lW(B4P15r7j0$_5XLHqz$07w1c1*ANiitYOwwB!MDXE%Y zdxTy9X?s+?;*-Ww>%z-$Iwy9@_SdI!f5fe7*N^h4JPdy0y*OLqZEQUvDF{=&>u_^s z&SZkvOjfDB?HYP6g`2kpo+i$7RNfVn8K_o+S2pB(9HS@&)bEb9tLW^~-G=p(?3nP= znygi?(be0k`en-vP_VmU2Mp*I{xeklNulFgJyq8+201(vm;c$X<<x|EM$Ny`X12zA zSnHBW*~gR?<#c{G8b`RZJ+<BZfNfHL><LK2Qx~$t)c-T2aQ|bq^ETZgD0cnTWBUor zZUxPY3IiXC#dFV?0x0pXEyphX%7Enbj7E8#_@$;)uc`M&WAuWLl#7RIB|O=T+f6SJ ziM-;wp{F7dVhyMbpV<ka!fW#!5p5XcX6JSXnHo>u(FPC}q%@+0rQ#onHHr41<twmg zKGbj-1xz|9=@xO=d$DOhaZ{4B6;@j>)Qa!NOXCA0IGbI38y;6$^ch#m<Pw_JOKNE7 zLy~(j@PtsJA<7bXX6zbUzARk(aVUWhmDOZJMGvPUJ24|B_B$FIeI8iNF1LrqYl=7f zh~!+V{Ru(u9l$@DS_)OpK9VVRoGR+MLGP|xoqQ@4$qVHmqy^x51?DPR&Qe;uro7|p zt+e=-_@%c7s7kq>7ssaTwto`PX6qWPePX?e69ja;kQYB3S;>g*4`Np6t8=|6_hgGV zmto*!-jnKF37E9kn{(1?GuhX+n$4jTG{+ei>8OgmP|*^tcTH<qHf_v82Zz+t@B4nE zhQeiKR*|J*k|&7Jn|-5_Je1qqKCAb9qp`S4tiy<hwPb^K9?v3j5*M(GV#4-QZ{l2N z&??(^lHoW~xuPDW$X9K(^k2>`d4`eO(hPyx6QC4LlFWBP#cjHInyLF8H@YliJiFWa z>@%i$y9h!knY43^Y-8na&<X~a0<~snMl;JkkWDs}tgIIZmX$vd8n_lWjEV)`yQ-%Q zR|6c`MkIdW*KxbVfN1EACFAoUyUI_YEriYcvolTVkFkj>lpiM^0TiusB&@rkzB4y< z_|%$>x^>)USA|82Dr3P#xHxCfqWF~AYeF?mE=xR>h=<EQxP-@qSF;1BSn>RP&T87d zU7;3l5AW1f<<HSa7%SxHcL`={Md$yNPhB}C6+FMP`1Yt0`Lizv8&pruTonkn4tJoe z^DZpn(Cz@4O@GfFu@$XiAJe{G7h&KKEZ=|Zpufp5k%1>O-qCRutzF0KZJ)(YfVgaQ z^vaYxz>gwd2$Do*mIUaYwvlY0ZrqO2q?>L3u;PPF%Df1Zj9QQI*f5-=HdS`5;&9M? z=vSG#!@!%VR*AbhhbUV)NzQ?7$xbjhH7?n8E60jh-&_cn@DS-99&`=4_lq~b2EmG% zM!O)7YUk6`OP=++goYhWuHIgE;rnpNkbIO}+$@*`;S?Sa+}`jm=fBa_jH^V{A=B02 zLRRBL(3{~k3G_hR`|X9Nl!fiCKr`ozY+WNFtqKQ>Zb_Q!BS-@frdt9!RU;be7|O^| zbOtndWhyt<5_E~~wyE2-wH><*ZG{?C=si30m<Qt8xGte|-)8_R2toe)7~hrpQZTtF zj-pieyu24lvh~|49tH25ZTn`nX=2SD1!<ebCx+4Pu0}m%|EgE&(J0G#Z%Y$@7Q42s zJNX9oFl(xPP@;cC+lS<2bfSiO0WCLKx!Ufhlew>k!%{@lK(-F>?2ysI-q6~`dpH|L zVLmC=(@esz8ur=%G>+O<^aQ(#bE<*L*p;tnofFK_{DL||A7}DI)7sfIYy8~ZOM)*G z1>BSgHB1Gm^4NGw8=pqCRZd9GTJH}q2v&vuvj|=Zo9~N7vI4O$Fk778meee;Io=|n z#lX_BGRPDh=X|#b@rt=!aH~(WS=fP>=B6;26-&(&#T1FrreB3L@Z`hP><ygzyj_0= zI49sqrB`U`u<?2)NG57b(#u540fW!2S7QWz5iZjfdoXtuc8SHvq3*5c!dsol{1Z!O zgU0pLPLQ46+j{5WxTR$7J*?Zflbr_0yE}aTm=tant3_!A9~RD>nH@>MbFJwdQR~T+ z+$Ip^Cxi_3K5_0FVen0-4etI%HA+N(aY-5KNyv46Ms#nrT(!_66Rpq%@Fa^Xi?nLm zffe?k^@U^cSfVTboW~cBkL3I~2Rk-u%DAY<v&5Bt#XTGvH0dF}Y)HF`gE>^><%M;e zdesrx{j}DGH`8`?|LYtLEJ1p}J?wn$5%ID<N(!+iZe9U3$o*@m;*34w4a(dp-6h_4 zJ(=My`cb}k%cg=w1bfyCvoF^*vA4~R<_hN&SFZF|De`{VBslm+4ul0oKS-kYI=mh^ z6pWqkGZ31Xk(<ip_#H`NjP4Uc%|X5L??6(~JA+6B^~f6a+@FPu^Z&=#IYSA<L<@3k z+x*71ZQHhO+qP}nwr$(CXZBCto(*2GVTYad>8e{d`$Yr?btQdWoY50}M>IHj!Usa* z`yx|cWF|l)&}Ggz8*f&ToXyljJ;XaTeAYc_wTw*4zTaG-XLX#+0|;l5cHs3*cxBZZ zd%B|-KH61F_4dR|KAACwyH-K9&g0uc3lcyPeiwbhDn)cIjTTD}&aMxqB)?QTog6eX zbKWR!IXxY(k!~6i3d&C~?gOlE{d7(FAGcqMdL;GWvGa_ZT?w9e;9)aEOX8>YXkVDl zo3)hG)OzQh!nwX7f#aJPIWEg?{GE6W<mg3}qhxM+{S0!#_9WVdO3OzyRe$2bEBJi2 zvP%5?$!`YT+Xi~)^l;b(I;`RWzG9Z_!Q5SzZot#<``q4hqbW+VZ}hEsP!Ji}pmBR| z=84fDctuWhE?smlx<^2do9y}ffA&t_wr-zr=gLG9gEs!eBPL@B5A-k3vDNj097>T4 z!T?9z(o=>7UZ3QR=i!SgOu4PUY=9i;Mi%N*JUwkl5GyRvX&pOYj=^z80~-mf)<^xg z!q@Vxv#b(jS3@x4o|}~8n<1NKoNu?0D23N`L;(%CSk7{|NSOmdyLtUc2=4QQ9)q;z zP%y!Ge@NEG1=PHSvg5|D{(Kurl{&0eimDzp)t0LJtuD{jx$7cJ<%7}<$lL`=(-wpd zeZp#%1k&Y0h~^u(6Wm$S3R81-O9ocldYBayNSZ57Lvc>jE>AI{wcf~<wC`Av8{JtG zC5r-DoO5Pps{fkwK&rZ8jj4mmw|=Xvq%r%3LG`mthlbVS9E1JJeCP)^S0-|TRI?ur zRg6WdS66N>&U04jWUdJ2?m!uW(529GXMlkRh7INuExcWI`r@=05sA%6jQ_q`oY!#! z((-i7(rU?07WZjf_NC0Lh8Z*2;P#UiZ+}~;^&KW@Bh+5^{uo@&Jl5kokh*&<;&Ta_ zm$GBV#NFVI%ug_v{0QKTQ=wbEAK9?LC+TXR?8OQmuA*(ZC7Q)4HXax?SUSJ$8pP@` zv9+6FX-~{6JjeP+op1T`lYLs29on=<>NTD*+6E=99XG53Jrug!Q>0icfL8mi4HC{* z>g*8jfmS+<i;K8L!ls6`VKdd!c=#@N{!e1!X{;3Uuq!gkzlUic8;|0BO}gEqWA~>r z;62Fy-us=OB25zHvJ1Tp!nnJ+Um^|Jal&-#^G0Uwq=!$qm?x&62%NCxGS&QTr}3Ho z-1u3e=(2z66RaY80pbq!DDe9_FVDIK{_mQFl?gYoQO#g}7^aEi=tfD=j^Z{dj$}Ay zX0nu*Yi+CTK6*wISU8s`qT#7rhr7GH3>S)c7}>dOID>R<_zsR5%8C+CJ!8SvrlXe6 z+0J|tFvLh2g=EeZllIrhrEmE=54~w$iM<jY^RgG!Yt>E6dQD|ZM{qQEJt7FXy73oW z_+yJF6_qnhrmTG#MFNMzR2x>$>|0fiAIeU8Io@FgJl)XRK(|N04UJC&qGV7Z1kd|) z%cyd~3Kk{Q;as;#nM=kk^^EJ_jp=GJ>Plt}El0F@Sx1uXlq+*xxLb!9OljKpFz{;q zleW^7H0-+SZxOsOk@PT;;xT=QFBGIhr3OuXH1EDaDNPP6O8SC!a|~9KAati}GMG!s z{c@=eq@m0h?{A*I262VGn_{ANvzt`HU-MRh+x;&&)e1AJNvxXk`TM3{NiER|=0ft* z;EO^MAJ00=)-GeHX&nD#9*FC34xeVE;$<+b^<^Er+hg)*)U&~ets25^!o6Nst~{3p zI1uD$kal?T#1^Mhm7zx1{>75(DlfnVzK@G&v`=;eZCT~#WKJi&H`V9;_c<oXy3j30 zLFM`C$l#{5TrBe+carp1leueT5xI3^1$@@DlgrR8`v~|K=i>;QQ<Xi&W_7znW3A#e z1*GLj?T2#8rhWNvdy!$AF&K9tdHJO4Wlt>!9zgJJ4Qyb89l|k)2H&=hHso5~;{}pI z2-^=#xJT<a7!RAq);(zWQTZik$Zblh@sMw3L`<%SZ}*KqLX$4}zbRe+l^_W03@xF! zx&KGvVjy5(Vq^H96C(i&2P5nMoc`Z#1S>lm!~eI^<qEExw9`r>4o`qvEX-RBfgyA* zk_-p5sNe}H;V+LQdEP@IQ>l!I08-4R;F&_CSWG3JMwAb<DA3W6?R4w6i+$9Sz>s*| zajNN6({uKXq)V$4bOj||4J(NnHK2nYI%o_)LIaHK004#@GN?~PpsOpyJPY}P4)(As z)X`DYfRXVhBJU_P;NUKe89VgUT#vy&Gz5u&1{zFa986-OPtOkmmh_8`ctr|KKE$&i z&JPV`uFpX3hERvJIx+@pV-`1L_f%I0z$XZRkeZqr{4EQPlC5BC4uS)0KH%_5ZuT7u z(T=R|FOsjop68dmpVl&Vpluu++}+)sZ*S&CzB+T83IK91cytZulgu?agB$|l3kzdD zl%wEB8WiXbDCE`rg})7874;O@RRF-fA1s<rfBOyt4})|9w$BC*vwR1@NlQMB|CqxE z0&)Ll4Pa1y-#7I$^Q!_8^N|B1Mo>RXYab1dWdy!nm?Q5Wdx=XviwzFAk8w;#v^{|v zH5cYJxFBnf&3)i@X3wu80PlYU{>_!kH3)kX=oHpjl;ayi{#*s~o2)`FPEy^(1Qp~2 z{&OjZc@rwQAGafRJ~zW@Sg(uG*9Wb|3}*3V1yLLpHLnA+xdL2L`<)gT#{V~PEzi!6 zLrOzPND7#*4VcU}sC%yFA%u^<e3ySuhruV{p9j4PT0a6G0L8ymc#luO=hjXJ)!*Tf z5A^-(wx358Ur+BZOl<EDI|&y9_*2G-C%W;gaYVNVdjp$3aKDKRrr)Rg_iGxEhK>~F z@c04$^Y#N(fpJxdZK?gm^w4J%8L4j9FDH!APD?`y1`!n@0hqWr$luRbbw0S@*X931 zrh;n}1zP;a9K~1S$8!Dg_WSYYDFpCtMq@**+f45N$A`rh7BPhI&UWx;SMn$O(Fggh zmhzW2`qxFM0#8=9XYjlC@J9^eCd&2kO|s8&6)<$A2OZ@Gc-mJXTF#fdB1pJ^H~U{X zVr<}nSH6G!pv7B99R>>dE2wBkWnq`Rm=-In{;w#V?|ny4)=AJvzEj=pxlRn47aHuV z4r5mrLhSo!2$ybZj}T>-=WkmLG^n4*Z$nyG8_2(_W59=>zB^NRcm$Bopc_Ad{BBPW zEI1#78ZHlL-wX!8y1_PIZ!J<SI6ev+i;ou%?5Bu%aA*ehu6_@y|L&{q#g3~;ewQ5N zeCQvV1MzkNY4=CDWWdhV=On?!x1p7CpoCj7d#oMh+T1UkM(JjGRUu2`_u>}w&fCbF z80pUjXdfP|N0ys$$aKl>>;Pi9GaZ$!p5N!`yH^<QB_q<5DI0YLT8s1>jRL&1k&URe zE6axYBeh_ol5>sW%SN2)8;jC~Og|<$cm9c_$rz9Fxb03ig3;heQ}`7dLs?9b8<W%< zy>cJd_mLnB=dFALN9xPE*#<Rjk)LZTT~!&Ej5C{DQ<Y-jH!m<%Q5~4t>sGO@YUwa_ zjM^=TcjO_s<Ol_%nmTm$-O~)BhSY3M?8yr=$!nzN@`eRfi2Nl8T=%p4fT&=d-XlqA zFjFArmVrEKAX>4-8T1hucT7Taq4}<qy-KfG7tQ1pWkIsm9oR!b3c@Ncv=TW5!Ff%w z0wM(ihvY0(*$)~t&CARbLTzJQdKWVhPh|%GQN^&A9L3n{@9%0@6%7v_7@TBMOZqx1 zIvPaO8uTyz-Z{czx5aEz8Hzv&G;Bjv+NDOlE(QL(I+({byR+wVR}+a1NvLog7pdrS zmnb;cg=uRPldg+ufg|>@#;GOus`AA_kT`M=Ud3gLX5<%XnkVV1UEaDLKlz;L1Xr}X zGwXso+mb!wGj4$`<nv>7M|^&o0Nzxxw}*He^m3-KSw;5b??maw#oUmNuzi5rl}+QX zzGtj8x~QGig0@>uFbMBd&G^tSK3(5lx_4cj?0-G;jK#P{8+Y6Vd1a%_(DlN3Cp}&I z>b_HUhMyt*$!5j6QNek~RMnmFa!wbk&TR^TytmS+N25>D2`v;Rbi`t26>jX|QgHaE zSH)9Xx2J5bP2>czOkGJ^<2WT#vcJ_@WPYkCk58nLN{=KU`6OrcsR^Y2Dg~T1LCe-< z$EoO0C|R5+`0zWr(e~KL#Smm3T)s$bq_ZDG-8DPLlVnbAng*N#HaAt>=k78sx$e#7 zwyiZ=F<nfeo}UgwbB6he``UgJ4Pkn1eRU6DFPQXO`21b7<a)Uu`V_;i=LQ!X2Eg1S z#+k4y-ejNOd@Jw0tD9G=UBX(Ym##qn`AWXiP{yw4?)R#$`ywlrMrmir4KGR?;j6po zXc;2QaYB995UpPGut}D!-0~*h6j`K8cRmZr(@r2?C4`R~GgsraRjuP~Y54Kg;F0+I zL~oc_>En}~jze*4eO5?kJ`NMo#oDZJCJ%K~quDs+`Qmoqt(!RT;7*<(0z$$%5Xdr; zE{$k;#s5t{l-b|!IIRQ@08w${FAJyK9#`n1dqe7Ae=yJ?ZHOy%@VeiXw)7=SmVF#W z5%;iywRS)eD|E`uYH@rPH%C@eWK7i{h758b<hCjjZ^eV7{JN@`#zb@V9%k<;QE6dW z2-BERP<%JHwLR^9H$QvP_ZJs>Wi<sxU%9+J7^?q%!HoNw@vKZycM1^$Skq9#9`h_` zw5eJvkDSXc@<>EiuJ+NrFi>W|TJNE4oU{pe0VT&lSGP!eGq8hD2rcjWVvv*3njI5s z!2DC~SQ0_rFEepy_%4~$_zb*1eJl0wrG$j&{{&d>I>nfS_&n~EA<27FJyh&LoZ&u$ zI=~B4sIrFtsDBnxf-s_gy(Bw{9us@*$RrlIsw?iC0tI&NxjAv8a!m%<Vg5WTRcOC` zo%XEFq6N$A_~|inG}?SwaN!|J@EVEc&G&i>FErCio6)U=#Mx7I7iqxn`mztR(6~2H z9Em|&#t!AA42oI;$I*j5#<-(TV9IP4Gu!}+4~8(!JA&$n-6W5A&yk%AxM1Co9I9I> z4Ww1m72l{&@Idx5#^!q&GvxJ#i}x7Bw3k!0K>zsJ*44`CVgmcz?+DjS^b*-o-$?Ck zSAXBWB#u?>QprxgdGUxjw}h&?wRFY@pRax~;y#vaxww%;O-Pu>?!mHThMP^?DMhSc zJ1lQzVw%J~M-q#RUEgGF$;sRb?O<8%yKnoPO^pHYaDbsvOs|bijI#sB&5ViwnZK^& zJJ&=40`0da;V3x(UOaV6_zd_Qa;~P;Xmlf6?<p5szbvjQg9XjFt#)XzaE&XLcSf3K zK3ewkrhgTjo3YSMiu9#P>f@XCxV)!V-PO#zlno&asnpC++AAqW_b@`+h%=wvgSbG- zWrLwZ4FqjBgBkf4Ejz)$Ya*i~AHo*^MjF$j+J&x!@_=hoB&*Pe$8Yu%lux53GWTJN zlsgXMf7FJtF4w0<#f-)Emsd@eSbf(;Ku}+X52O!7d!12sF=Diyl4kl0qQw>X=Pi?~ z76tYU-BvDn#!hSmfy92)!KR%fnNn!LLH+w-A+@;uieKBacKu+G8)+OCZmu9u%FjX@ z3)(ht?Dg~Z<)k@5bEAj6m=J(RKZCm)KhB5F(o(B1!>E=jMW4cplO(XV6&?Yn;iTen zc>kwj_t)L_D6#n<=(l(Kggi2sZt`<2i*}b113VgVdv;YsC;>I+(r#`lG093+5KSzu zhpr_jN9+VP$8Ewv%OP-o92uyf5%zav+fyHh?hbcVBDJ6hmb$Q%H=||;l%f!)Tk5QO zd~SDIe&=hp4)N<*RVC<<7G-c5|CH(Z2#ES|u7EXAwBZ3-Bxgf;!_3@V^7(}?4tqdk z>KRxCS9QE^XTwcC%{p~9+Fe)XG{-ahuBB>%ky9cv$VgEWlIx}zs)uu;xUte^3dDLG z$)lScD0`fK5l^$KG~n79Fm!X#-KEOM^7#EpYzv>=rX~dWhPu~YKjZTPH}p`|B(~P$ zc6qH;FgZ^QFMGhrdzP5wnL9;^Jr_YJj&+BMe2uwB%+JJx`MCuqUX+CAo68kpnC1>} zpvxG288|HMxGb#emu8JyT=n};i;sG?fmGX@lT}#O?=IIQ+_Ty4UBVKL)=r098)PHz z<u=>L=yqbZzy#=~7%*)5c{&WpIqTbswsPpw;1s?Nf;U{~E|`;9W=?NmIksEvq1?gb z;D)QG7%U91N{*+LcslD&*JTqr%w2p+0iQN>@RN@&x<?9voM2)PdJi-=V(y?*xh|+v z20uJqIXb#DHk!1OB^wD{Jw?t?%gJ2awIxUMr2|_o**fDAKi5yYITG_{QZ{3Iiee{< z_@<$Ed|Tp*3{mCi-(o{%mhmo>(TXpZyaCt5eEhY=NyI9<D`Z$RS<NP98vgZ^C7yQW zUi^S0Hhi%k&si(nRX4@<>qmM3R(B(0kiQ5u@MO(Iu4>w;ih?6;Gx7=LGsUX!f1z|u z3zT>{m^x7nc)hCCbm;PhTW_T;LG%Mp>8&lq1iV339DE;78`+jVCRr`DDf==9gWUwN zxO!gI#TujekBKT|UZ>Iz*`|lyh~wU!dLPxrDl;K(HawwO6>$+t;xx!HP|+8gl^M*g zOD24zUTIH6Lzjzmmrn*HZDFp?gQIKe-~RU5h1n8!erf8XDT_U^68*y*lgt8<0RJLG zC7t~iiIYsjm7dr*%(~qQ&_$L6d|DPjA`1>0G=>hhD-~3YT&3!{B#1E+v*1LSslRL} z!_Q+bAC@S}W@b0jt06>zHNkk#K%?gT;Y98DQjlXN8?oZ9f1J5_rep#+IhRj>q1an` zFQe~KdaLCsnbW9U)H1Qzq3>iL0W^7y$1;RT88!mPy9S)v!pm$qk^Wl!SChy&D;$Ba z2?{nLE0DEY$ULyis+skpal0MfK#hSUAva9$9*D3U*=ZB}oclUF#J`v$0*t(pbuZLH zd|}W_Xfmo->GKM@jdYvOmpM&qvqRFmClLx~w_UAW|25~YUkW%L<HreF;iwS8pigc= zY$<!OyvP>AM?LNtMCheMhGVY%D{k1+%JODY9Y>x$Yt{9;nZGB%R(J2(S6fH#ZGt#F z_>Ks`PffRKPAdo%Q|&Gd*g`G&SPg^s!Ef(Ca097IVBFfbuO@gfY#YU%5&vE6`Yk?- zXl!&Jn<m9Q!q?PWfq{Gxa@&01#NHs2F(b`vElxO_m6!O)%+;m9seJ`Lt=NfdKl=5Y zm|6M!&E6idNUu<iNEo!RoVY+Ub0ODp8Mo6EbwPQP<SxV;(ecg_#{IAwT271m=etrN zwzTlqb^tA4W`x^<6gMXmqYTZIgwiK!vM?VUjkT}w;#K~fWUrZe78Ob^k1sVBg2W#6 zKdsL@*bNBe&(EK(28XX45kvu#N1lI_h$)LohMbW9ArO|Nmcty&D?~Xb5$I{lSam(; z(t5n6S6fO<YKkXCw8J<v4p6;o=<N~LYlKy{?4QD&L{8>&J8;z3ESBP~0|Ta<j6$a1 z+@=XyKX03?G0qROgw9=%2GXch&@djn)TCR^q3vq68VvVu^&ZOnF%^<>LVZez{6TYW zUr2t53@j2;VLx(0$O4ajDOBbm4f|bgAN01UI!L@oUpbmoa=9KgC{ShEva5KBL$cIO z-VcwDDa{X6Ml9Ic{#3-Myz%z?JrNOaS<@Q7g^(@>EBzNSe|dD?p1U%gC|sC}Iv=*K zHO`0BAloC)*^`sA&K+-?@SsPV6WX2eZu|T(M7dl+Ak-1ft~wAcVG0-~!70EuPd304 zKb^fSE|6ny+=}a@yF|<u#~rS0nL6o(mTYp<yM&Z}OzuR>YUc&$A}|1rVSQzT%t9a} z3!MXTzVKw``tm1BC~<)b8sUz5Geid;yV?jtJ?}Dz`{@c}CBZOG?e*d8dXf!^)_2IH zEe(+*S*_nKp%gALoYx(61WL*qSPbZO?XeKLn^!W5snV@@vFLAkVOkTpiCSPfL!{yZ zUx&s6cNCYe^8$z&-JAe2oMCZx*}R{v1)0pzT_wNs0B4Mvd;U=K#3>E!H>I(e4QRRB z?hk6o+Vgam_sr%Tf#8fx3SA7FnRA^JhwoHF>4x>>I%mhsQ|zoU{`zcI-@|NV&4Yd7 zjnlq`SAM}>p(r7)qd+T~rOmnTuTRg$yX$RgTS{)CMa9XAjAjHM!tk9P=#X^j^+2SP zaqYPPF?8gcjFwu(EO!pq_+fU}Nph%MvT{w(H8~CZ#lS$cCu@|gg0pRmoT`#i+w|(K z=5?;zl3|vm?Kk0+LT6-B5I^4)#Vc4_eEe$5o1mkL;p|foSaL{pL(ewBvQTZdK`;8a z9BL%kRG;*xd{%nKbhxs{{1%jJ>h|e6Ca*&f!%gS)5_6vFl~t`d3GT>QzbW#DGzr|< z;6UH&t{F3<w-g$ndY**u(#c6p<D=5y{s3>5b*@P#m}|c3=EZtKR+g;mC9%GCFHv%= z?3?aotPSOMvy$gFEafnDF5C1TVqJId8!|i2e0MS^4U!m%Sa-{G7Ge;}+m2?7{fzOV zN**2xyyemFHqVaPrN+r#vRsAEHFWpvi>!xcHU<4WG)6z5tX5qn;ePzl3UX7?*QwMK z?bb}YOS=(>7ge<l`NlN`%&ZkmK$#JN7Ql$2ssI))B%2mMnkaa~RrlZX-spHf=DAew z7a|~=)#rhd)^bT;wxeS{ll-HQU#S-zZpzRF_tp*@EkUPxO(4j!E3E~m!N~b{7S7jm zUfv~7G*@khCOFl<<Ga})pXST$aO$x$My*g*MKt1cZauY)QBbf>`scc_<-d9Ae!r20 zUTxJt2@hP<!E?g52s76U;+Cn33Z@d8@*JqtdC6;{kbhcXCS4{yv<H6o9AH!X%94vH zHxGE466U(3tUT64C?1kWG*cxF>akpCgD&V{P6i0rtk?LiG0Af#RhMPji1le&d}O{T zRS+Qad-cPaNZewn%K)nRU~9|i2Kt0e+gHIpy-JfN-Ld?}yyUn2U<lfACK(NXQk&D< zJllV{(|CN_2s@)9uD=um2~jCL%g&)2UHjmD{AJu>HY=$xwNx(Pf-nMY{}(1!ZvZak zK{lBvB-}}WsqQ9WPw5@5>qRJ?L|$@{fdmjUeHL*+Pp`i@6B+fyvjVGJYS#wQ)t=eN z;E{-RU_Zbu+R|NL!W+axwK8~gZCJcuCZ@C}T){;(*0i9h|K(v_HXBnnbK?l2D%;6) zwCcek65}A&p?h7EM(4$t=v>v#@lPp>y7nn;7RBYOvWW&RS<fr^TXJgRtRzYZ=VYrY z+eYLCaW~ISBogP-u7l0zcz~R!wH_%Z(l|5Z$x6J&zp2w6XuzJ_3RGx=;lr6H4{1X; zp)*6B#)L+)@+@T-cH?;yU?{;Pmo;e_$kprss7^n-4!>Ds=YR*cg~P4SOx##Ml~(K> zVY~ocT4GAgK-!)BBhtmJs{*0x8exUF^v>hL!MbLqpmcF&qBWtbG}*DJW~TSF5L;{= zbS?TWuA_M>wj6!wQSG}L>*@3OmibAT)FWxP`0i&?1LN^SX{PMQS7k}lsNuwIVQ?>k z7&t`&B=-WY4#u|SU1SEPi&?};8Qa}E-ze_)zS8In99+@TjKvRqM&pG)BD1D#5~uWm zT5>{v)~autP_Le7)|cN%*co_+z{D8mGVAie*N}|Jl_jyFc7clak%AT;Ww}1P34ygn zx`v?)t|-=d{uQ~r#eALG<&d=9b6AnP!DQ&|SL|W7nUSriQJ915O^3q*X&KFoT4Kg< z=|eF`dt!UK%<@AwAY+QGfOfn_$(h^$7u#j1COpNY!cqOl%x-fgG)8i`1v-&#t@|lW zJv@3{!njFjJ#UV(7Aw8huJ4&Vzoq7(OrDi&PfBX?pv^w}@a*jkZe7$u+nKZMGHE*% z6({7`YMUO<xpno1>P91dQm57y1nFjVOd8ehC%D_6<j!VPZcKH$m-1#uECmM?R;OZ+ zaSzEfvk&n~vcR`-(P=<%&!)gRbP?Lolv}d@q;E5!qEBg*QK=D3ETJhSrEG`XQqLkj zqnU>?3-!bHQ|6Fs!756Ycrgo3!a27gbN6j&2ZK)`(z42IVyn_8g0CT_Ht7vbPEF-| z*|>qw-a=<#pA$Ewp`|IHLO0N4U<IsCE`T_L33#K~fIufODJIG6TT}{nb14q&gM%4* zL_2I#s78`m$4;KS_)7{+I52PAzL-IQ>{a@7hz-gqdac0Gtc$t~QBQep@1O77CUO*P zwJ1L3eP5KE15Rh!pUbvKBS67l<9&^5kEGDbmlg=+SE|C1kbnPm%=WO^)$(aWurToG zFhlf|e}gi$SYm9Z8yaGek4Lm{bi&5Ne0;0mSGn6@>JJ0E|2W>3NFT3vl<n~1C*uJ0 zZ}MY9Rq^ay99p=SS|nHa;*HrOH4hWYg?e8NBRJm+D&i-Sftb9?AX(~PIb#4#LG|#( z48Twu1q0~6^M_@O$6aAM=dX>;Wcgd2kU2H0N;1XXmA%VP9Fbq=39l>7?m_^KCDOCa zrhlAvaVe$2v1ridS!04CR_3sf8*j7bMA<qJ2SPVk0qnTrD~&=Og<3U|ThTJ2r6-=U z!^SKd(_o37hgx;byY%fgMtOco*NuzTJ_Wb+t@`a~j{FeWOz$s&fg<IW;%qivDlnz( ziYk!Lr81+6@*GKy4!tSpc~CuWmEQT!nRKK$M}=|(qqP*0_~{$yR3JA^95L>d#?7kP zdB#nS+s4Eq?S)g`R5Ka&YQ440=;)Cg+BTQTQ;v(r8a(Vh9T>98?;qa*I=*uc-nbQ4 zCQ+m@NLYIz8kR?D*F?>1u5Fe$z=YwZQXHhEP`JQ>6_Hdm0bU?`l9H*6f;w(HOwcXo z5>hgqe$C`e*hD5tVO4HjA9GuYYy-U;1kuW;U70`$(Ib*rV}O9X3Kp0vW#QXEpEk&G z$e+u#Z#9NdjLJw|j^17+Y9LlWu(yK8G_(=a9KPdpPMSezXOziQ0k5Gl&E;8fG(C7? zcY5>g#wO6cGpul}oyl1XA{T(W)ZAtGd46ZLJRh9(y0_<INf`MZqA*VijQi$}=I@Sf zmGpJ4QK|~a23#RV@9EBIWP7=KF(FXvu#;!yI7ByVjGy=^nB4XM8%|^S-*6f;2h;xm zG)98|a_j#$%Krc2G<F77*8gvu<_xN=Y_mnXL%zd6PCy8=Lx{Ubpfg0@kHAC^vqONp zhzkWoi3=pjwn(x=Ko~;+1jKjw)pPgfdsgi-yJ>aPb9WVc)|-3QiH}A~qeF{n)s8BR z2q)zD;P?~{c)aWq6AZ}B{k_f2?d?uY?I~YOd`yQCCxRbnA2MiQ_(#PL2M9=bNAH2~ zNGppA2VCCC0p$Jx*ez)IAA98H2H?fRTlfPRL^K5Oi04|y%AbXm4;dn;b*FZ;H=_et zUWM~$oA&bswAOb8s4FkOKiazh!2GYF4Fxs;a7j>%JA7d)LO+g}4-GCvC|>86qMuYR zM3gh)&kqj|ZyTRP#fD=*HS&wG4=Az;=uA+H5X?1<bst5~4}1*rF%*p*2bymN?(!3K zHE0u$M*sq156&()fRKKr6N){J6$r3R12?at0Bp`Fr0*BF@(aQZ_T9n;pliGPA5Ba7 zsX{<`<-!C38_LNRpr<3BM$-p&2?k(BU1?9q9UlWgnEq5F7+*m3O@ns?7r+%zbp!0< z0tZAfX$H*a3iMlW0wvC$6<4!WD?g%(?AJ57b=3egr2%(y4D64ub?^I33L_%e@3MIV z`sL67$JhoweM&O`4$;{9CNj7=h566J?`#)PKK_I12)h3ruqG7uCx|PLkN1ZFI0W){ z54`d3o4oSi5c1{n@EdT0`S#8}m<7n<LPFpxhdsUxIy-`L3<HRVU<=Qi`*Z!?8az4y zRTml%_eUK@gBtoO`^1H5_%PbT<psKgq(A6b!lUy)TYGxT+sNszKA;z?`)`y#k4|1j zPDDm5=?VU*&!@4`Ud|sLy^g?NN;w|Af6DC*3GD#*{iiD$4dPP`oBQv$vfp|iV1aLE z*JjC&)AdgZz}gQMoNIrtg?ZntG6Z1#7qNpPjsX7scI4}i=4FrKk1gb{^6?Mp!;h`_ z{Pg^NYvy(9&#zrTR$i>G59n6-DzqCLz~y}hqyLv{8Q{^(e1&jTo~`WfwUR)<Er<ZP zsRx+}y$*mat{)%gvJ&DYSlvn>LBESH@gs=ui^Vcl9zz)V7V5{PZQJDG{yXi?wznV7 z?Jevoht{u)!0qVi&IMIpzx}0-;|LiA$R7bB9vyEkC;J@)6p**u4cG$q;k(8dARZe` zY_|m9mi-gZdLN=&Z;bLE2*BiT;IH~1K>qe#DmgrW`FGpMl$V)iKtEh<EP+~=pFUoJ z9{r)+eytM0Fyf;X=ilfp0U7!9%!{4>9h|+Buwc%e`S;-O2;_Ar|F+3r>MriV-+CV% z62vev&}ddpV9-e3mKvYkrvio0)xe7hgq24N3FB@#mmtCf=g;DpEG(Cj#kR=mVrR4^ zfsECu&H8#W9nIK4oPpfZ>vevK@(K69NWr(xYs9rGIrP0v8$y^>d#o+QgXVFU!yyox z&#zQc4AQtnm{Q+RD7SmN6uaJDTZbJ+v>i}(z{p-?hLS}hBNIn0*M-8E^mMg^AJI}_ zhkp=B&TKp>X2fge3-j$x8>JYR&~+|J?a{v@BfZzTx6Hpu-(@+df+hyV%f`Ev(jCAN zJ<G?C8<j7$<kgLVdndc4!+iO)&QL}=f^L<$$0bEZu~&ts4nQbN8}Q@&#PZ09nQtm$ zme^UNU?1vV|I&Ruy$pJc6L31$g6E|cKnemrg9}Wo_i^hEe}hwJQjf$-HtD98C~k)W zx(J9*v&naMi7Nws;8;7lNrueRh)=w*GSd{Ov~DmTW@8fP4VXl490fiYjyQHaS}cL| zYzjogr?2K*_gH04%Jt&o<tKRTxmmZfXO%g3cLZTG6JJ0O$c&b5u#62<xdj#088uYe z+LcxLA~4QTJf|Q@by_l=W_4IwE0r)vY+=U-xN+#i=pd|@Z(-j0{)H=4F6$g<(DyKa z(|Tj`C={1Ws7<|w0XGZ{f0z&8mk<Sau)UeoXgV9tS9+)Rc0()k*Nm=_TpiY;mJCA> zT<C#}8hSBj&x?}BNX&CrZ%u$^N*hB=Gox*Jv3Ye>M>BAj$`43VRAWQrQsv+OY94fW z21Qw>%(|2md<O<IMil<VgD6wWP>(5K$TVa4KRR8)qSUxjo;=JH)uq^8kZH6nj#zhr z>i#Q+gk_mRM&~y@>zT({y9FH<2PvxE2F-2>@GdkfS6p@XFCc@XvJ`2t$WiUPzvk_F zEX%|<qs>RzbiQDHhI_Ek9&LXo`T}dd{AMIg7>7BG{S>p_g`mJI=976xX4W`(xZ2)q zB(0eA{bxF%@Zn$3b*yYOOOQy68?CfA!tcG^)f%a?<(Opm=H5ZgY&1+&5O&h5@;d?^ zw}M}!y3gMWz>Rs_pg)iXi(VF%X;}HH9u>iHptH|(v~b|x*`Z_#ctT3^282^f?1RjD zX%laMmzWRxPsN7OwYM^1Zg9yJ8prfk^rq=95wy0R+P#h={B6Z?jkqj|y>epzcCP*8 z8O*)Ta^Ii7s!X%S?#$*B)0i0@iQ0tQg5kZJ3=9Wy6Fpd$miz5_Nxl4XW+w+*8ni3R zIwK4>%rTFfzpEY4s67ZfJq^!v+f)WO(kw7M<AW}1F4D(H0%Va}Z8kLv(iU8P_W+fT z%y&u^B`X)k6KHo0Gdm2DV{673OKHp9D^FaE=ca6gEUTo~IF`P%Tqy*&NL%(3JVG-G zeu&<XHOyWXuD$PJ6Q?cL&s#P<sa%p&iu>R}JpaHa{+T5q?;Danh{b>3Bd?*@SJP5* zVROFA<-jup05UwTZbD2~{EQ^ujz-=|+RLWmyyv1ToW8m^@EOZQAfT2bz(!W_zr}wi z%hs7p%CPe1b251jpO;}q7Nu~%O7;pT3ZbO{T6hL`vrTcb=@0n4PTR<%4jxd~p6FDu ze!&S+)2aO;XrzO5p_Km!0ljxq77T{dy&QI^Rb?U+nyBEpl!POBhOgnT(0<~FHdDoj zxkz6pf&k>|_JxuKws~dXPq(10K?Mw2P`_HFs~*x$d#~gzvKnwxjY}DKBVzEUMB`$Q z^_1vI<)!3mcdC%R>Gt67Fky#!J6%kij@M$L*85+p*_shUXKKhn<LKcyl3)pQpB`tg zkX53lMLABW+Z^aJ-X*f@p!JYvSw<&~9Li}RzpnaRXQr%@fs}iyzfrK24$#||^JG4J zM1Osc%YM4=w9?0&Hn(E(cip<4*bBIHYJ$9^l|l;zq2m6zVkq{yvLDnp;tyA}BEVjF z%0tjUz^~ojq}9Ut6jNzT)L@Qc;8Z}uN-h1}tFXL8O&!Izo0*K}%%RIPD)X^f@s*6m zOq|F|Ay=qF*JP0A`wk*&Wo(N1x-hZXMcr(vRj8X(w0({o(1$#WQ0jTkx~m>JTg$yG zYz&c)3WR3MapkJ+q!Nk>$k|Kro(%5ub|fLA@L=aVy-^97d#jWKJIUfpko<Qiq^|_+ z$4k`E)WP1X9~@Pjim<GV%b-v}6R05RVaUn<Qr2A6jrz0r+s?J!Vb=J_7L`QK!jR3; zd*`%O!_gDM`$o)^N%)OnU+z43TjjIGn(b{$WSP3V>EdZD52rWpuT%TaH^j*i?fg9= zP>YOf+%O7U?a(^1iM;0ro2cP1lFU0(IDScj5wn5d4i;YH0(>LGZcXI!frVKQCjt}| zWwoCY35)(LHUk#+TxP@0OFhS6R#>;{c*3cjyeZe&IjwKz(3$P`8>hUH2lOv^pI%fY z<GcLf0N;yG*W)o8){w-f3Yf;18%_d1Z;9OG15E1VdZxh^WF96}#q$XU;{+#`-G{tV z{n;!>uBtK>L`&mICqh`(e0^*Rv`{E-VdhGbJ=MBl0WhlR`DwegG;)1!<3LpFE#!7s z7oR{BjT;0#a!+EEV0BAj=Sr{%+P<IDTi-91x^-vPQM_^(XxjN~a`DjAvM~h7tTKgX zaBF=Z*f?);Nb~uRT2jtPDPdFS{1geLXa*@EZNG#y{cRo!kU=62;BSwSjKJ^w)*kC& zpWaR~SnPp{k7bs8)fC{{j4Z)I48z|Vo_g<4+v11k0DN@Vv<*x}wpHG;T1SInN?2r^ z?`QSo2&CaUuoDOg+yYda7zPH0J5$(I;;=FYZHN<Dj@{c0a32-5Nh2*!>1Q>EpfEAH z+}I}x3vMKF4LWT>veeMA>snQ?p;$uGj&Y0<n8fH6R!R;Vfg861g`4hzv4}KlG!0L6 z?Kc%KG$guk4_b7vG*Jwmi-j;3S(SQCU&S5j9U6N5O|}g-A>+Vf6slc98!@3J!J-+i zu#jxi-Y;J{y+%fwDV`6Rj}p6ad$cqc_HYsyB@`ZxoFXk0(C|sh=7!FzW+>YF2~~{a z);BmkZqmhXXlM#wF+(B#a`_4|EDLuoq4~cA`<a+AZDC|rQAnhez#kPKwGYOZM=_g* zb?$9XrNeb|z38%&6qD$_kbP?quEH-d^Y^1ODp{LG;jL!-l^5BM<|&(t&EEIrT!#Tq zA;x&V)EA$l;B<DSX~=c*kj0!Atp{*>xX%QPLZ#Z^VRPb#<PAW)2}&J^Q;;QECCYy4 zCfv?A)<r-$|1F8(@++<-u-1_nDl@BOjpCH51Nsg2wST`{e4xHbwJWkeUhx&ON|O@8 zmk<_dUd-BuDM1q;l7`HHH|tuWB*BuE`UP9L8u%zBREEd_e`c(kv}2utppcaD8$`qY zAQ+aeCiB_)huGzkKwVTS|1o;iZ?`Z8yw~JSiZGqkK=w9uTGRv@L{to3+G?R3v#8Hl zw@~7sYY*kwV7N9~ZAcFN;A=cu_%s{W3*s5Y;l2MUt0E#!_|L=$Kz?I?33VD4)v~l} zhQ!$%N_susj2kg?VlKIupZs2un9s#K=ai#Kekih=E<R{dVAw;b4wtsb=RPGY6@JH! zm!&r0RVOC{D&)ZO-g{#8%sjBf8gBd878)k!WE_YXtyvRxK+ftw&<h#Oi$;W%;=JSl z0@>0`$7DA|XZB!#LEC37GO@pQ&F0Kx3uUw4mM+|B+!*8xq~D!Tmp*l@-IwHD*?nXM zuqqs9C9F-;p3;yup`T~~v!sl5?hB+XVDa{fVJC|gHn4H~-{K0xplp~#$FoSN;)+&h zC9Zd%4U1MMY7F6w)k|HeH;W9%a=TS43~)A5gs;xx)oZT^`=QlF=5DmJP0Q(o>kf~V z%>rf!q|i50%(UPIkwWBe>mu4Q(H@<T?A-RXDYwQbDAKAouvP=6F*@6jT!X4f{>>{a zGW8}A=}wwLn~TsOh>JpNmnZL0Aj9l09ZtNY@e^JWVlkO_Cdqd@*>cDht8zr>^4(rl z9u1wI0SUQzuP6=dzgRD&ApBmGB9^!eWh9)MXiJh`@%Z1T1&xt0$i*KCpaD3{m#nay zsUmaKqR#S8SKO)#(3OZ1fVXo|bXt#fh#ZH2_q5E8&i)sC;=5%&BYF_l9_HqD(n?j# zD%xe|S!xt(FHlb*4AQQtMJD3U)5`wqDuyMbkLhgo{vXbL6IupQlldicKua1j>new4 z1*p`ILR)-lS5NJ=&1RM~_{j+qv-5?zVWI1!ow0J>51i~fny+a)rw}fCN-HE>LseQm zY#7uX(HwKQNQwsq9M2K)l&<7P16o?#h(!o}gV?1ej%NKy->zuJy0EKgzdb!HX24Ii zg$dAm8YJaB>!Q0R_WjDWkm~p06^^j!eE9_)x*wc+l6R0p1$-egAAvpRT$ZYfEqR(= z#O1`zRqWQo6865gl(%!-g9I@9%-7-C@p)eNwS`&Y2vNBn+nU~?>}+1LqP_07tq5cg znGX{!&P`TIa_7^Cqb6`-=}{&hxSY9?cJhA~4SJQ{L@GPSiwOtwo{DqFt5_b&ZF9SP zdmJaR24E7D?tVTq*FGkQnY&new6^z62nv}#$hyQ2LEiiU0Bu^*GK(>X{CI9kCLhsd zBqfyRXR$a&a<8Fp+ICm26Uq1E68zKJWN}}ea4``lVVa@od1p>L*A3Y*hP`QYyMyO} ziV5s1&9x4?#OK{3zqanZogH;VF`xGNsa#FF5F@hqUL>GSz$fQ!g96rdHa~|eV`gL& z&mEOi?7rISUGcDL8Qw9M%=m=S>9GWx=7NB;o(hVtBnY#7i&E8rs*)Hz0e~}S<}_iK z=f`<{J15sy?8*-?ec2jvlF`-?220%9rlN64kW9*`^IMFQo^Sps|Ltnn9Y5=WCYtW; zFqF2vB@ApyF}=}sI2U7iua%^*N$U1|rHI$u8A`4Kgm<}ssXWL1YxWtz0RhVU1;|M6 zAXs4*GBg~SaKEtcHBFX^bU<FnYpTQ_oR3ecnIkSUAhZiEGSn*cbIjYLGt?I=xNjYY zD(SRL^IXy<eqEwch{5<oEqu&1Rd`rk()gl2allp9IhuJ`g?%?6-IxHVsS%jryjT*3 z48<-yI{n_No9mopMtt7VYcFi~#W^K@a2(*FrVE6bcPS2OX_gSo?1j)a>s}j(9#!c> zfb!kpo}#~qL6SsOWU`1IAl>PG)eX`_mApiBeQzSN#d+6td$RTz0%HO{GtNAh;n>A% z_%j{cDB@<^OZh~B9RM#5`vvg<;I(`lej}R{FgV6(La$pr>fHx`{0?YS<w?ZtC&Kd5 zrSM~<_Sj-*4G^yk5O@-l8c*n=0t5zSdQ?|5;3oUCe$d8w^!82c8ha*F<C9EToM#9S z!bS$~%;#EoZPUhSjBBbX#;Vh^a=}*Pb9uM84fw^4hSb(h;VC!k>`o`q12P+GdMIVW zJr)jG=9(0>655J$2cGJw=-}d{Euxt_rhT&IT*kF-7O9BfRsX1HknDjQeU9RQd4ypQ zv#Eq^tOObH$rQk!+TU1OQ$~xbWs7T2^I5?YnWwy_KTU|oD#h=XBBkSSQJ5AF_uMUD zyq|6JdiOwA_$j+MYt-pQA3MOW>r{YFib#aul8d5TB+yeqZ{@XDJiS(g9s}bV#qLwY z|5IgGBc>*vuT3jXxzWzZsp9>9&5+eHu|#*xpV0+*<u)^t6qJIwOG{qWjTMbMNZbdk z^Af^aVufdjtO^@iSA+b1*1tIEn6?bP>d^!&rxBGn?;wgM<d!up(pHdnc9j%wr`3b$ zX1@wbF!D{!in!y!gYjBQ1&wGNuF8ghOtO?tj_x4~#v{AdA<7XDyT4uqJ>=i+P-T7f zF>%$JxN*%p!8f{l;!T&JdcOi)PHD{9!I{Gnjpwe6X<Y8I*3r6=^HRFcM{bilg=7)` zC!eO_W|d;~vvE}_i`Km(PQE0%WfGto-m8|$fQk74S9*nFQHb3zYpIpI_i`{ojZMMB z_)Gk<Ms%?ZQ9kkt6y8}n$ad+0`D@n2IXUl<*8zWGR{7Se;xw~-twHLcdNK7!Z6Y#N z@60<~cJvMQ?pjx688fPzBqdb;41}!GC#g_j!c)dk;&NBYP7+DHfAOuNCeUtCHw5N( z@{4&u*>hwygr#%eNq2Y}5`noO|2dGtYUOUhyo5vEH&>6Nk?OPRZ5=r7Em?;AJRq2F z+p1-TvsXqC5#f*=l4qO{n8i43hiR87)tdM8p?{`0dgJ-10`Gjw8BUnL^yf4V4(W36 z7SLqi6FY(Xl|=0LU5ia#YZ&C);X9-A9d!Ml=!@=oCk%omu^`3v{n7Oj9KMT!zUTIx z%i|CSulp825!VD%H#SHTn$q5+n>5a9Ro>-eEk@Oi_7)n87Df;!pxVdWrQ<xpn{c>m zqDY{eetOeO5F}2ZfhOo$L^a~BJ6P4)>OjUFB20NQY72p2fB$S8b@bqtuOkza`ePb3 z7fK=n;ak<cT@eOafqP;BT)&usUkIZ-k?Qdlf$O<^aDQKUfZ2=LX@W_WeHm^uAJC@( z1<ic1juMnHTmNPx&B*vpA<DGNc<=uwkuzOx2b+m>mY8e(EE_v}y5I~!*mt_zFx_b# zWHgpOS6X!hym(-=>txXXSuga*9wP!|Y!n@J%&N;JU8JnQMRm`_Vu_~vC~&Dj4c=TL z<yeMCV=SOx99Q&-x&akc?1@=}tf`(Q@i0%t#C+g+vX8JoD~zuSiTkeuCS4I;R$NhC zEI$K^0JXSuLggJx1kLIh!p5|;H>BzyZ;FHmr)g^VDgGzasjq986PSVV=&NXz47^0{ zE^433=AB4y%6G~(wpsNd75Sgxv&Str+giW)1v=B%W$vmRnF&#yEhwYH_=N4hP?ZJO zj^xO(&RqASW;`}n_+-4C4Di8$4!PC9gMr~uvX+(>=z4J7@SInhEraoEO98Qp6_6*g zS3{)U?M1;G(}WKkFx<>@y0E>^<C+tgv8H=V)UG~CFZdo3FQ58ACgu8ATs(VIWQCE! zl1dqEPJF?%=fH|JcRZHI!1&Ox(k(B6(ZExX_{ggV*ppu}EN)=KjIg?DvbIWTw&@bx zpb^e2BxgA?2T7OtbywS1hF3R3IPvtOc;7K3828EaH2?5I1L`_YVhZfr<s#j};iERr z9;<>9V|>h;y~EEQ;<JB|Ym|JgYWuVh)Rh#u-v;aaKaI})s>c;b86$vluuAhN-^*R& z1jl4y{uyTAKe}sOG|R78+dCS*Wk;q3-%bFATfZw|1<y2WZ*GdQmSA`x&YD=X9D2#A zhCA=F4t9y~wmBo{M?GB-%9htqdQ!I)%@wQrOGh-mOCK3KsXZ3q5)&F?QUQrdvq)0a z>ntThUY9zNVIfSkdt{-a9j02iK8H#c&WB_8-cm#^9t6(q?IQkrPs}&sTes5*`R=7( ztQFyeW5w+aRMDJ{Tyb05IM-sbV>g=GisF5SyeT#RT&R3>U7YCk^EumnO(8f&@TG9a z!XFOUH$q<A6XU$_yB+MLN~*DTr_s-!GU)^?fz@Pfd1&A@aY1yg3uaDz9o;-E8&a2C z2?tsfS?}iek-IU~3Gl{SwnB8DS50XVBgogC$vF*-uNHapZwHx3xHM?`atJ=OxziqL zHp<p|7Ap%L6u*{pt$Buu^HQH7lK@sPJwdey1iyl9Z#0l6yZ>Q52~_{Z$jMf8q+=z& zeqjU7fK}f_RvkS_;-85P4262lN&j^A&PR(EVUjkt#owpWeDqeX_i1<$dy*Kp9v~-Q zD}7EM2DZ1N5r^IvM7X}nO~s|-{Z=Rfd7M3Gw26*ay@F5j#mAVAF}1)#D`#F2z4d%2 z1IIl=KH(h&OP(7Ki>2~p5|VDGD+vx9nE-|zB2h9#y1P{S*k$$At6ovxIIZE(uvvP4 z##YpwF!u6Tkk9<P7Tgs9r!m9G$nIRX=3A$E=vTDTTzGQq+>vj^A;Mi<h%#0=EMbWJ zVc<E~GDjP9isW3K95$wYO*~O(l3N4!5~K`@TRUwn<m(x=%|k{9Pxkw#@0{h@Ku>t# z>P>Zq>QN;*s%A$d%OxDnHm`r5xDGE@ik0rL=eok5<~6gC_|u6K|7YCpC-yqo>Nb8S z{fWzZF44;|GtMSrANZ$qA6^=IN!^-TPBwnZqqaS|MIAO(@bqSHWZFdsGG5ZmT(Mh4 z-ek7korLxx2t1G8xk%a1Tp@ks+((~^KACmO^-3SNeY)LK4)~y(X}R+v=b?~(3z0ju zMK&;eBYgK(Ciu{iv<HidU`2C!bq5v=P2Qg6Dg4CntTNnv-x-EBo^xJpT5E@0eu(lq zJYAdTyL(2iNaNY&*$`q+X`Cn;g?!XBaH*~A-9B|7u~kFG^#%PSui7Wu^2JDp$3$0t z$0y#w#sK{(u#nZvFk7-{<Wdw*C)-0~xnU@)Hzg^HZ{=KZF{8iL8!xc(UyWl#q-OGU z#q@pQ>!TU;FE35l5UiP&Au`#J<TLs}DJzwbyGY};Cz%TU%izR!_ti@<ht9TF_~X)C zX~2pIR2yAMXX={aBk)Um!;J`wNj|Q;!^bo7_>H5%@uS;@VOWAPyr>F=auGCm;;;la zcX6ipkOuZbNn_ZiF8s+!n`d;4<JztO)0S)W#d*f|;6rpQYTM(>8eIYTgzx$B)alcb z6knqkuu>|D;Agxn#%p#f!zNF@2;VgCX{I?HE<hEe>nskY)*!MyayVorr!&IA^rdCt zC|GaJv=yW|LG{Q4AF3nVu2a2ap~OaBIB2kLgx(OZdHfLJaL@bt$s;3|;WE>Ar*X-D z{2w`Hq0db^+9AY%=Z8)aWxhPF&%nR}XRBYal7M|x`G_6&CBZH=WoPDRj$jR#_3xoV z-mGeO8f=G^CYqQaiK0e7l)Fgjb>0i5ulFpl5`%4}ptZ}@*m>$>)?#3s#bNH9d{?iz zuJ>EyGrQZOUxytFBam<Yf%Iy+i~05!^Ukk;Pik_o7m1W*d#q%v!o~0tgTU<M3unWG zIU}Zwch*w+g4sJ8_&_@NIIIIHWf6{5+>8rglDM0cr31T1_)Bv`WuY3($tJrc3@Hyl z;KlGzYRda3w%bXdaIY_ShuOP;6eBUu4NAe9m`$FKZHQbYa3Pnv3J4i;n4|=xrZ^(t zptR*lfv~GH^IJ4D2N(gao7fgH@RC<vi&ST*KmULs@4r0>5>ky9upJT$zST7i5!QGt zUu@^7cmP#$W;yH}tqXTLovVp7Oy*UuIV=$H`}9~ByS=yCwZdm`Op>uwd05g7R26Yo z%<W>lmo~>19r*4`SK0~Y2%7)H*g3_B(nZ_4ZQC|?+qP}nw%xtkwr$(CZM%2d?$f!+ z%{>qQ!%ZsnP^&7bRavQI&H0Tn@~D<Yi<&dK-1fSj70t!JH4u~U{5{83RI?xsE(dHE zCuNF+c>NV}c6=k>i9Tr#N_}F(XV(XZDMfEQ#mgFb<qU+tGtMWp4wz9$LqitM$0bqk z6?y0!y($9~;Hxy0j7!_2-Bu#KtnJsu)VKsG(X(7zq~C(6Oo?g=TnvGh+aL|6rPQaB zev?E{3!sR_%^v%Q!b)j_tyYWXe}D~-)+_#tE@1mFx`35~<^RzI3=B*R|EbnxU}XNo z@_+aOD0)!~YiAQj0(wzv17{Oq6C*og6DVF@C?{t}69XG4_l@WmP<fn*6;P<d>wZE5 zd)VviYrMcgfS@S=rnXK{B${A?{_SlYLHic~Ktcb#>saEK9H-u&TF=@N%aYZU<!-Oq zZ51K8>hcH82`od%q%ePj+V(Y$5I{!D4oU4S09jc)S6NwG7*9_fgek;Vd@itV-Z@mL zK>v^*RKi23CV!qyV_N;$084~F{Oi+*eZ#<e2k0kA2q#A%_D+saU*re}R4{SP_TU=8 zOKX4=2!9YF1n7Yso*hBgH~Mp4-e!^djE7<NkdTn{KbUX{jzOG3H8lJIEz$mP<t;wM zsG`LH;QmF0fOvSvhaywp!kE%X3mP084B8%moPcv^Ml~}9cK82<6Kn`j&Mx4Zz&;fi z`G3b=-7GFK9szW?5FY8n;D*3X4ECWwxUq2rRQdlraty;-!#aa<-@wf&D1w@^1NZxZ zR(_-QfxUh>0%%`q{}g|4eZUhTyv`a!Q&ay<Yy@3{25A9Z^T!DQfb~#uO(Tzj)dy_( zCY~EWgz}hawQmLB&{XFI|MYN%_U}qU>pN&4==~R@*&di>An!^sb{C7q@tx<<W6Dw2 z3^Ozi2@xv5@Xek}GlpvZ<b9)y<HxoN2y+MU@d>`}-?zf*m-Gu5Oyz@vwYLE#8~?<3 zuo`?CHG&QRcxPp01#Sfb<Us?RS(uF8je>RP&h+tRYx||;THQW4gt7x$=S%{;2Uz>h z@?r4GL%R_GoLqoCKD@Oa`XPd$qxWGMg957q*$C)I`K{$n^Jn(nI{oMf<oLH{&E6mW z=CR+s-Ao*57_1=F6|VB_`?aJAX-P?~@CQ8IB>enKN(prb^45L01=MwVZ~$s+Yx4jE znuYHDIi7C<`0|PIJEjV-Appqljrs7F`{8K#*u~O+_u@|j{Fy9<^H8Nj=zENvi{^M^ zug>Xh`{tYcnoaugqxuOt{!uymc@e(1jfwGlPydE`{khX(55VdEj&WD5!M^l>S|XTj z1o-aF2kYw<Rf9E$b#!{~)g?_Eeqa_4u*pUJ%7{$OPJE%~f}n!G2hp?&)K_)&D?g#{ z+`)f1fdB$#A(WrPr=M~{BR~DQ<AG049(<q%@<}<#rQ3Ue`MT+G)TjRYgg-bkJqllE z@6vob;C}tYbO8Kn&m&jNGWQ_I0L;GDkFe$hwbw4n=MOuCdKf!${{YBd^!?{61Oxzw z@rOVFAncM)9HNi#MUSKpcu)Qv{0^91`A1+j9_vRWFbe=~+7IESQTIon3jl8WhbaGa zoAz5^mPYkQM0-}K5AYM+`=tI2-J7i81Kqm@>XH6c`uGvv8xINYws((-=}7N3ed6i& z1ock;s!e%`KlYXN?}_{~w?@6ay@Que!7pakY4SVh#~VI?UoH=I<N#+#l4Pletm&#l zGGgHH=^2BK{<+WMkt3r&1t<L@Mzt>LY#LL}b}CSLb!s*((<RX7x}a1PT*y!se34~$ z3B%xExP#Rgds2pV7ZRv`)2FNg`$aB!MwZwKudbQ)P9gDGE!Jt=!W4-$HSucwQ3v$5 z8yQjQ*h#EB61sb-4q;T!P*xNe$gK{Mf2DYSg}Sh;xX6Sn={%=2ULQ1+df&-b{x!Je z%?Fkuxwa>OU5?`AwKhX_dhT_Q>-%(@SeYgVP;%btc_e<r`v)|)H3W=7Lr~0_#9V|i zsfA1yRj$=AxydFI1$-6pLkYoTg>Me0wouCFuF3e*fNEfYQfmpRJFP17W_oZ`eL+dH z;#N=^54X_{P{;S)%^ddk8>8wiU*wO2DCw9xjyPNLZrX1|g2`kv<$BaeP(SXcA*`|^ zWIBILP6J#av`wiie|U&BF7G+0H|y$Z(bo`>@vzuFj&E1`Z0LV+OX_{!4I+XP%Cjm= zjNyu56N^2l1%kx*v|R`_^y~iHq#46mUFXm3w~tB}G~UG#l~Xot22JUtif#lgn7JBV z6$vTgXyJlI^sQT5ftA2#3_UssXIn(aJW-IuAncjskpGm3n|>5}AUn1X9#=B2rVu14 zfAM*;n^W2l8;vpwN-C{O^;{-qy_-)f_B~vut1nTtHb^iT=Z$Y3{N(u-vqGAm;LK(r z^=ZCFca~^A&C|r{NW_YE!{Ep*?>VEl9G1Eqto{}}4CSJwJ=~{vm<*!F!ee?NE^~O8 zt+ojIxU2AHdMTU}Id!#Txhl(0N34MDB<(+cTwRd4_gA$JQCn1x{uu6U4QwzoS1xm; zgh;XNO)3JSNm7hnw$kAA#kDe_#jhhkig={FO(@($M2d63VwjJ<n)!W=MvShYk!vd= z9=bs4xhoj_C*iS&^$*%I5E$^%R|M}*g=NKVHx%$cTrO<(iS(Dy38X+0@7KDv-l7b{ zX)4XswG?eifruab-5|0Bwn&W5mvs^rtlEc`dN@C-FG!#uP~|q(vX`F;_5G16_eJ$c zKB;X@C$+X}crvpd#yu#6T0Pw}Scs>N?hPO#Na3gK?aWoPRFY~zRsn<ee;R6l?r@&Y zMvK0S42q2oGKcR><Q953qnPyM-L)i-IC}WY$v{lZF;ECx^2Ll0Gws+*<-A`5BTus9 zDyN9)MSAJq`U$CRBP_qHCo+f;@|Q>!pR4F8(!5?B>-d*m>3*e~h}^b)D1u|BCBj`J zf1b8E)gXChNAfCQRV@=7jRLpoM+aqG0`xsPw6emhVuR%Q$`A3&92B$_V!t8@$3G2L zZMP9B2t<@RC3=If`Tk@GGFiB-QN1hUm(mmP%NvMgCQD1jM^td}{#wTl3MwWC_?cuf zEEZIM^(8i5mYN=$?Kr(N@ZJzosN}aTqz&34U0O1pYETP9=K>PdzeMJqm3F>0EQf{j zta(`IaOd|LD9+1geUylQrWN1n0Nto#4b)|~*U^TgT%C5|LMx}ezmL`mGEX<X-8RsW zI|q^4oP+RnbwxD-iU?xadpNrD>N4XqHWhKtaLAHD^J^SgJ5kc+I_+b<zP$w>k~jn1 zX<M{o)9>vK&fOiV&q~8_zW25xr-rO{X>IDA{qtQyXX;-VBt(3~$K2fbOA11htNS22 zM*x0*^|y<g_}Ut+UT;kq&cnD{*F4l%e)KX4h0%+&E;FKsKXdEjp4rH<^16)Py8*r8 zZ@c4Ul9;;`i-p|i_deNo$Q0vv-0M<v^FK7-)lBOfyqqEh4M!y`s*=uSq}pJ^@PvtD zEptk3c4gKi6xIHZh*%_*ko$MflbvBIzEXL<AEm>d-Ispe>0<-Z5iuK%&g2w<p-#1= z>VR8)%hN$^K6$HCE-`eGkuH!sbCByz=&aama~3H@tizb_{H<dD3GR&{EtIO(YLvm; zd>!RD92)1g6fTXm^X;19l!?i{dVdsyUXd<WLbzrT<jf#dltB@(%*CzM)_bEKX#X8H z0BOn^r3L%y0OKtxxN9*1f4KSU)2o#O9=OFM3o9QBnx<AXp;wQIoo1N`iL9G##+JW8 zmE_J?sf0J|J86ZC8;lQ#zSQfetTj+AgJ1V#<0|>tobBt-1j;=BHmtzylJ6>K3U*dH ziwt1}S--<&85e{Rm`X1rpJju#+J7Y_;Q=~2_*(<!ovq>Ac<~E@uB9)ISGBnnMm@}o zjw*P*3w(<on-6Z(?9}cUS+iS%?#;p5U@E*GO}UMMCZ?a;T=b{<zyH|{{e6^3O;+n# zeJUg62DYNWu&WAyGgq0HyH|J8dcN={`_;&}mRGz}Ack8uNED3{<f>O%hPxX7ZHdw{ z{#TJ3YnPr6ac7`=ZknuerWONETeu8hcI^SCO#cD;&voU;sg1{78Z}V#tH?&dR|Vv< zteC$G7dmsH$4$DE@&>Vjd=<<y+~Z)$xhvSIpph02aWIJ6nvqJq8hDYL=$0yxOBDi` zQYUk{%{AL){$g5J20lqU8Uh3rT?_<95DJ_eP`dfb9riPE9TeUMqYK(FXC_SiH5XqY zat@vrp_ytSwWspNeLSUob-2(@6#C7J=*85mi_Nsk+j{2qUi_S`_h<?1jMbUX9kr%N zl#?elx*Tg<_#WN%SM>6-3wD8Sh|C?Qn!00o$=tJVEyOm8lG7xMrYpCl!a=3ul^F65 zE*G;#bvdtB3i2~hU#%tJCF68D;qDD_OA4-n*3fh+B+s0&p@?xJ?rUzt_Y0%j)SBsQ zzr_;6Ba$*y*2*c2j&K%7sC_^;M3O#cQZ|kOgulVuA+#sVdX{X;WhCD|xNt6eZ@~lD zt2_D~?U%X!h4f|>S~_2=!B>Idt^*&>^a5w+4V$V-h=FiPm#bkh;K@8~JuyA6uXpOh z%{axY)VU%UO6hGZGQ#t0eQJx#Osg0%BR-5T&;kDj+Q+eP7BGGE<b;B{2mYSC?geBH zHiSqh^M7)+m)*@{<rJf2eFox89R1^+!Raynqax*y=hgn|g=T35zzX%*?F3BCHt_f7 zecrwFA422b2Jwf}@i7;Z>-TO-dSurc>?Rp@QT-V%(V1*q_QL`mpk~*!KgS;gn>Eb= z0ebgUvi)8)65LKhEW<Rxf70@yLNZwks8rDIadv!f?G=1`A7SV}SrxbbmLThj=IWr# zIsB`CuxT%zYc089yVw}6$*(ql%%VE_Cl+*>Y2(mK3;N;gq-f$@u+AL51sD7${><VJ zC)h$8gy;vF=IyLZkjmq2a!Pk*WDkw)`j+()zuVt^PRvN9V*xxUn5|u!hjC*O*xf^2 zX^I#f7ov_?Y4BXb2<(#E(A)&Y$JsyDbA8fVT#xRuVcHFuUc3OfE73?adJelFIBZ;$ z8)6P`?c7Z%85WMnA2pf~-!u64u{d}RW%FBYM<H7%X;(MGdtW7=gk&wzaww6$DH%68 ztjPEdXpwHJoJ}p<RPNQIFD>iVSZ45zUI`vAIDd&w9&HYvwd!scg^*XJX?|lvfLg2r z=77U@>$*HZ4z$fUPLr2q57F4gyhw|r&KVclXP}FS84jjTfuyUJ>s>i~fO3Kga_gEI zlb+rVS??8x3G2Lg!LAb%zi<v(M2UkOI!0w#Xbq<CTH@&r2WuE&11D8unA{{j$m;7$ zU6_`Q$8SF?kz#e9%E^-C`QA{igb<rfUhU??@EC&lVn@!jXqF<XJR5<YIUM0A<!EU2 zK+Ecoii;gOz3H3l`&Xf2pojmliisBV1N;yv4`+wj3x_dz4qfXPB&RoEbd5<glu=H| z#YP1(XKjhtbqz_#4!Ce1kr~w(0ra$yLK*0kL3du%`Ao?~4tcvnZU4)wsjnV{Gj2Lh zwl9A&j}DwJtvte*-s!KQ!-ykCY*-Vv*vCur>v|hH`8qGz<uWZ`Lc@GA6CmY5cX7nq z(pMEyv1tR0Zrpt3As9d365LF#G`CrN`tG?1DUt?3F0l|LX00+fl-NvaB;Ynx1{JkG zV%iM1qSo;eW9n3OcOkKIlIiXtJHbwruVRS}XruJ@OBh=U|7Pu2?G*>)L%aB%;3as{ zDiA6sE1^9m8)dMl#+bmlUOxtBLgr~x(}3L`-|<ooSMLzBc77jD6nuRy44V|SdOE$y zz18If?b`d8uU}DzfX>EUal|ZVSC`IKw6DYJ++u$mpX7g`U9xQ#aF-7m9sCqw)E7LX zBQ|-7v;{~Fr{9zk*S6P_lt*X?n`H6M4pUOOXQ86fI?WtWqoH(z3{Oics%l=*2%bK1 z_W>_UE9^XexzlzB=_lOHsO=uPGJWJ7RT61FfPvXbk}MNGM^|A7Ykj}sY$f0+UnBm~ zUQuZ~2kEG7@P$;jL5D(r>1FgcWUc6F0|r<DK5>E2l@2Y>dNVPSIJ}NX@B->b8_w@j z$b;>X)S{(sV$oXRip2I@h}C{vs~er%=*FI#M{K60p#z1p?^!-h)3P@F;~kNSIiWYL zyAo}bxC9G{d`B_t-9?o{_~EFoa`4q`(_x?O?mdgm?iCW+b`hsfdcx!GZBXx0XwGXT zD|UaE&<g*9hHk`dn$7Q^(9fJ5gcxdiYkd3X?aJ3|Dmo!{xB(wAS@}%&YZSrI8h22- zcvq3w1`K)wY9y=Arfp3YB<#kfTe^qP&2w+64$uL;IZS!N4l1lxD5}G<Ab~TnKffOJ z3N9m%)wp>20I9flW@1njV6(%1D}V~;37adMDtlz@z>41JT+tLQtl$(Ku0q9Sss7FL zXt;+-3|4+|26_P4Ck#y#+042!QDJI{`lJaVLsz>BBGC-p1cj)SoDTb+#J1ZAp;n}1 zM!a{WRyF&`+8jKp!sI*e$SJIsu)GuJyE;6UyR}+OmR=d_`U?Pu%g==hF5OhmRvneR zRo0Xvf}FfE6*vK!Amubw<@ELQ4$h#%5n>Gm-Xe8O;kqzs21pvB{(P`a-|U@_K59Z{ z8qwa$l@PAQ`@2%fHM?x#n~nR`Wn{#;)#V~3`zCfh#Jth?lcuf84&b8fP|UjEpFoSM zJx)S7^;L)SQv6iV0^R7GkCn}rj%dVn=^S`@HUAEu#hNG4EtbOy)QK*;A(|S46K}1H zGd%f1FWy(9u(aUM6Hb?nK!DI^Bi^j?pZ6=`3xiEuc_}Fs{hza8!++(>eIA%}o5n== zY`g|Fhnn>-FFO7xU)MKex@%mz)StGHLhXCeRKKl(C0((U^Q!uQH6NR?+A_63w)*53 zN%uVL>yDh_#O92;a|&NSk4TVh+zT9(a$EFc!lH>{TGm@s5p6BoXF!eco0*k9_yXu4 zT~b4#E{gyMo}cG?=tf)PE8>yblTrw3M-$r!V2%i}3gE*PxiKk#?Pm~(I`joc_X|(7 zIm4L_XokSYxPm^)*E{#crx^O-QDwiB#qO_~>o4I9OU`!{pf{N!+U(Z|YAW5jrSE3v zv{qSSZgV?Q(y4z$AR2PO+hz1p0z`w54h_;Sx3?B%-yp*Zi{*?Ey@1E&?L!(!Qzxi% zLgQRw+)%W^KV(}s<vFUk0u9&&hUWb;UXcN4VP{|u`j%~a07X#3kG*B(n>gb?EI+_v zT`u~RpTjJfpKiD5so~KD>p|szIb%`_bb%O0sc2yzD%Z)?ktYzn?(Fp)(4X9~#)v1F zn8GiM<@)eaQm5XiQlg6Ori8&QILLI3tSZExOdI;3!>)&lx~ikdlYMY&7N6y`CeQ?* zb}GSi=C<~W9IV!<jG2XowE~@u{vAhwe8d2l;?1IZ-U1gA1Jndj@QW1Qwk$|w&bh0E z&teJ}?az|)8c@HPrrS}cCwn)Do$ZS)dK(d)%InZ31m%&;_$VJEsIHlyV#iF1mFMRS zp@OV`m7VD5x|}1iH7(Z2&|_Q&w}v}uJgg3oWPG;8ULx@jLnbCO;ZVm=+u^EVF1SIA zLl!iB?P9x&E1l+$Yi|e0fPrWvzjE)SQFQdGms_CE7h--2yWll^%VtM4d4Z<qy`{Y{ z(|UU+o1hlo2u_Vs9Jb>9ctKQBeVtXT2`#e_B<44-_)viCPS-AhYNBqb43#_;O7<uU zb_(^66XCW$c!D;`_GDA;ha9`~+F>4W7!-;Xyzh4d_N=Jnkl42EOjvzG?cHA+Izd+= zIb88GUZ!pIg-#jm)y+#t`V`U1yBvBqV*UmOJx>>1G>k|H>?Ef;rmGS$nWU0&6S3iB zm+k9k;ugYmj8sw;K{94N3RRS98dBbBC5_wf*Sx*}`4@7B8E>NR<?5%ZeNc|Y7h||C ze2O)fJWqE@CFR_d4AYVZS|v>&F%P&Cs_)MFnNy(S>K*H>@LmsfluSua5{W{F!9(>p zn)@E5{3TeH5#coMT&8kw460f3ZpGH5rfrR^+UnoiFf|UB{j8Q0GUGQM*%i?pyP&>u z5hzbqfzp`NwhU{&(9a<~?Hk>f{Y;zPy?T#6iM47Hf=Gr22Rxu*f+9`3zd;{o^$|A4 z2#AqX4V4A(Zg~uW_|9rq4#nqil%+J&XDm{8wF#LnRVcUDmyw{@()Zh;bF1i=(t|;b zPqJJ(kl+VxVJ|oh>)^V;F34&Vps|*2Rw$2L!i=A&4Cy!L!<j6V!MlvXfxA9_iI+Du zT|^i8wZ_bwJc!*jT4?{<^np$XAbnW$g%3^zM!7r6_EpeuT%1w0?{ai@&9)?JoPDd( zP!IDo-hw@tFc|~Gx)1FEZ7TJE%Iu*+nK&%EK*j@I%O^ZofR|;*yvWX;WSFV^mOb1h zd*J&9Y$@7f>fQuXB5iJUa*o+}QI&Oxq&qvYgxDT4gMkx_Q(}M_qHFkxsiGETba(wp zhw$#w@KewmNp;cys7ghsBwuMkET`!H=7Hf8vVE{eoCxzYfYnuH@&bx=ERGeST~Gd2 z!1E=rc$69RokNTo6b4eW*tB+o@7BPv!`?^2)vy)<^eSt|E$r0{V4qf7?Ti5Ijjt5+ z)mFbpwf#7?6RVE;^puh~zra*T<(eCw1bKry&Q4j9z_Ro(){=58|Hw|tyC220O*lLD z{z$8m2pXRuJ78l1wikIwA$v3Krv5}*K8ZAr<CiN0pl~IKOdiW7gq<K^MT9s)9Ss3e z{F<1c9JO>w!OJ<WL&=V9I%BM3YnmS3lwjB1O|tKw&fsj=vaF0@2Ucoq^0$=FC9Z^& zcO%JNUOnUQM+V=vk}n=+LfAEhHp>{@wDGI8hnz8DYdB|bZZQHc+#YdyuzGp|SFcs6 zW_bIjf}C+}jEjNo+u++V@`AsQ^B81o|16yiQW4kPgIGHa&g38LEJ7nw{D&1!9c-f4 z?`8i<0y428>7}}<I|}u`%=7c{a}w6^=R1c7<!Vu54c}0ME`#;V;ISk;=gv%fT{N#o zE6b)cb@J_Ft;uKo^DN16mp<@9k+cP8gp=P5AnfCj4S|J*>n>K?HZiHrujd)nP2?&| zj@sD&I$;v`JgC4X^-E`q_%r_^m_6}_Qs(%u?7Mkie5UU-c3n+5SSyhVik0nSFR0u5 zhF6n1$HjB09NJ*dcZlzU^l5-~S-WJd1(R*in<NVj6KZ>^(=tQQay{rfW%Zy+`G8k0 ztrppr*&NS27xil=fAO=j2yCP{5yzh5?n{8E4UV>T1<cUy-Xb(L!o!7WDQYjHR0V4x zhjc^jLk{k2(_dcBJeb6mO2^dEJ&=jReZeXZoNv=VCrvf6T1HOs;TR-vgk6XADn;ZO zFz~tpPwKcRuS>~tWb%87@*zJ%uM4QP=qtL=D@Hk>sq}ih%Bq15;U}H@l=Pd3Drwnk zmrJE}(^Aw`GB6`CiPayLa6Fguy0)-3Wv?A3^YxMfCLk!bZCmP?o>6t(#HMVOYI~W7 z_9BWXMwj8r)PRJ0R_0iHCGLOETtmfOqsQ)1GBOd)8}!-iGf7i_=-#u}`HEVO!w_n0 zndMc&UDAwrR>l@@pWSy~Iz{En6t7~;Qi+yNqKC~jvkJ+%O2R}JD<Dp-znDrEl$akh z*+GI~jP|Reof%CKZ|_Gh=L%-n1>%`fV_+h*me_l<`~K6KD*idS9Rl}bLAhRY)9@a= ze_h}NLv(VB2zX@R;S^B^W}Mb}FGq1Q{otq2!z|BeLYf@}vP)zZJnB=_0SR~MB6Xx? zJ%}1E?U@*P+Pvg+Ml#Ei+M71&29^282^=bd6+2Pk*K_gfs{i!z*M}&RviEj6xV~*2 zACb2VboDO5F=-eh7=JfW$*$yrfO1=vI{n}_x;vTrDnm{CA4hhY%1et0x5l2ZFp!=a zzEF_66zD&z%`hz8E(dKBtIV-u2E3;<UGxyH!*4?6-k!nVGBZ2L%C}eQCaoK);pfil zHk|jzIly<7re>F?uQ!qn)=_EKyqmK`%Zpp-UZ|LF<w7UGsGC~|Y9XkO#;zuI`J1Y> z8wNQhd7Nb;ohAz<#uogj1)d)SIQJPbs~X8l^VYJp&m^=qY0%S3B<1<7Pw$OfS!8gM zIYa8kEXd<<rf=c+(r?6NohrP-*c4zwy(DecSAl$;BGat$h(UcL7<m{oGddP|m|=>f z^}*2d(O-?@s`SYmuG~y-SX90Nm_=X1hmmp8hcqh`_OAxYj==C2LJv$M30Q&LXbSm~ z!h8aZx4rB#)obueZ4Z;l53gvGwuG&aB7reX**8kY5~+Q1x$l>^*g;a4<q?n|v&)%i zC__kfq_mm)b))8deD&H!;SDtTbIUYkF<f_4fVK4V>g|gM8#<>vY=)WPuvrTS=uiv@ zn!E8~HVUH;aUcm-Uj=hE16@0K!&$O{CX&oQ_mmsejfs#v5Y#3RG2=K9UN%)7dU7Ez z-52pO@n#6U>mM5!be<Qy@kZu}Nt5K5;NtzE%O{(12%(Iv*$iH;J&>`LH&~H{CRVG3 zSs5s#dZE9}y@~PcT?e;tZ6-CRU}sYk`gv2j`zRjg-*&V3Nm3`$jg5vCJ6LnFVxiRS zqh6i5yne|1SW%#}YK~U|hK@6RxU>9+sCu}Nl&Snh5b(2xk{oe}`|J=Uj&P-rzGd=E zLkL1n<{*`}H%tWVpt@pbux^T$^CMZ<og@a`#az>jcimN@B#9nkQqf%6N$+7B9-~c; zAHj$^Or^U94(xwEk3&4$zN-_jw~7}vaCeIwz{#tfs2eE+=KM(!q)6S6Awj!>4I*A? zdHNi8h|+Fby&+Kd2(%r$ea0qkyB&t;lGp=A_!VhV(*n*^ZZQ{Z_Ro~NwM>c?iYxS8 zt#v+LQN3HR*dMO|B9eC^l~CIcQkY^LzRqaW)xX=k4yg+1uH@6asSiQVov-H^3fzmO zb1lBO!q`<#`s}%0jg-y9Lsl7LVKmB2JQ^$*ZIMwVA3vg#sih4kO!)Dz@jHi4s;C!G zl?|&k$s7P-K$d1&K!DYx0w`*Cka;H$#$K5u_!MQsZCqPIR`3+yxTQH4wRj%Dyz}On z{o`<#kfgQO)i%W94}`}pgPDA6GGe(-k~l;gP>YG2ao-^L9Ud|X>4MBRMrh3?aBW6Y z)=OgJ$1=d|pxEk4`N6MTVvsVu(Kf0OH}N?d_~fmuz*jzl&P!nYzL88#`_dfM2!rNY z4_U9*ko(vR-W0Y|u0-laB>Jj%dpIrehYW?cI@swUZ5aG7-yi@r+F}Yr_DebXC^pP` zp1Z;b4J4<K73<K_ow1<qS;-H7qG8v#rX1DXp)Z%ND|ejDS@L5yvT=deoXu<r)B_dP z)wV%XRJ52SHp!5LrT#YH@m!*dow4DFvE|}M^a)2RRt>s;<W`IH?#on;?E;}DU1y=w zM=HG3W3R%lkE~LrGESL=Grdim8G|Uj8_-fCpR~H+sdpEYnPT6c(qXSnkHx>@PwCt6 zhf_ktpQ8q1%Y(SDm$*eGHT5H}T>ogfN;vcQqzh|=4G^QXO(ybo1mx()f{?}ZRJyij zw*sD9>hO%uEG&?^Q4g%&t<$8v6FMy9-ok=ex+oF2H8zRI>}3fNrAT^lnQzKaVnFL{ z?*&8#6?KTK-v%wzN=16XG6QW|A9lxOC1IVT7`{n0q8()l6kgHW9_k<a3N-`v0?~TK z4VA@e@IO9cK&H#-WYu%?ajw1wT=`y&>QrbZM=$wLKsIr7t|Z?hx{pE2t!=l@+Y&rH zJN>2|_*Z3^F!3RnHb6j;;Yyze86|aNZ0b)<-!Qzk!8e}e&uXt)smMtqLDA;u(5z$b zZSWSXnB<DUxpfrierMI6Gb`?%bClJOdcuK<C79a(sGds*cJ6vyM1)&?s6e2JycoWe z3Avd({^fAm{$q3(@(32AM%UYn1z$yWhi@j`9IId_3n{8F`kYGlF2^3EswdJa997T_ zFeGiz5lKhHgSGJTFhu})YRbQMf|Du$Qui@FXI-l*EJfSQK;7ylL06@rFBs59__#u= zoLKSi&2vCM4#l>J*|pq~J+m))lA#zZ5y`&>`~J9g2s|Qg=gAf|<Q4d%wzG5|d%}^h zj=N*^TQI>M;Ncpz?)*p8q0(^4+g<H@8L8Cej5*t?>CRHGCj5CV(<kjQA|!e=mHO!O zLjOsH?Y0gq6-0uKc;!v+U0l2E)(xjYOnirA&4g##EAw7h(5c1R6uad~!Ba0f^dsr{ zv2WY-*Al;u71(Q=Q_z1sgmiZ&pln#d?NwNO;RJCx(|!6@R>=1UCE_~}irkZK`rzYq z!Q80h!SMa&c$1tGE|>CYq{YX4w|T*+m#CI4hgJ9!E2txbj|o8<OS=*#Gb$_<4V7j$ znK`??0Sk_a%MpQei8q&Fr2RNe4rs)?E(=x_cQ278l}JC*bumryD3kO<JduE?V*XO( zXOj%SC;WX?-e}n~TOa#2+cmiXAQF{b%L3-uzhKSjcKOQp80Rj<QU~wCxHQ$If0hNh zyezgTuaV}GKfoWLu7tFq1g3z+^J19|Q}Bc37_DFEXSHmIumn>!9V8n-NWuodd;RX8 zIFb&0lF)?Omkn_g=5ZA+lKOZu7%dQKgBk=k(b}4IHvXxGtX-U#88(Q>l&6G_=!l0g zD5$k#?8Umq>}11Ec=$?1vC@rCxl`|*Y)lWEy6=JFi|#gB*45GxbrR7^gpt?VXRVNd zH1iOFjX<75hg(&;9=-^a*>HbIbZ%!?dv~V^R#x7bj3L(z_6QjwuZ+$h`XiJp<M;qI z;nG`S6T&(L(UAfv<a0Y^py$WmO>UT;0@<hc>|)B;WCs`c4GmH)b76}^3$*;YXat<V zuHca#)9cxn4>m%@oHEr+4X}@JWlEASP!*I0lUh%cR4eRe5w!cjvU)dpz04>Zm62wP zGssQqM4UH}8n7S`%ABDPDS2n53D9G&A{^~OsVU?qz9YXqaj>r(0Zc$?G}Dx{YH738 zkZwA`6kp?1Qzbi_a$fK01UyV+9;V$!jK8HA5~&qg1J{NHy|qXctgSxT?KFhdT>T28 zL`i#Bu1i7)o#3wMN5;HiGn(DrU&p1?2^Atf)*`!~Cpk&k&#wFw8)o-x=tpBVbdIom zO+8O<VN;i+YSL>Xtj>xH7LDPiiea9!Zj^osIUEm<I~mk&=MC)NsB2t@mmc-hZaKyN z56DXVAp?qZQ7sNP==@VlV68<*8>^OHd@IH_x!Ggeil%(nJa5QSQARY(s?Ngu;IWM9 z{?G*3#OY%FQn?7j!KJk#h_y9_B(;QZbdsFW&3>PrRAt}->8W2&lb<@#@$#9<+5zfY z53iKYR3maGPZm~X%pY%erK4qU$$Ffk8O=vR6D%c0GTJPablv0nlT2;BNaO%YdOX%H zQf(sD%FhyKWA_cfCWjpint|}pHr4oDNTxa{s_U~g7>k65bhOcfarII7Id_E#3l+jo z5-w})@~aCpGUgu|vrzw}c<h){XXye_RguAc2Oj_*wnZEo4=Ys6fdn&KYMq&=>FIY! zB8zR*f+-z1xMi3poE}zNgO`*ITB{MU#-nd)!mHllBgz1Iy4CjK@UKQ~G+PdL2r#bs zJ1B%z=-E(u%TP#>+axiDoK1Mp`YCvH-E8GhtPv6tYqd^|Thpf+Q50-Xpcs&Hvo?(q zZ|`3{7gVFMoSJBGO{=Dali<Hq?=4!!{k<c;=>osSC(Fhp%>-z(Ak!PTmwNEu6k;6u zdY3;3f+&^+7T_RyVlLmC^2TV3Ck?48vOcE$QOTlB%+idkZ+X%&1isX}Fm!3h2(8b# zlu~b*1>-91wX>d(7qxz>)vtlxFcOF=bQkhPcngf-s`YV!)6)V;bB@+UCR1BUVB@eV z@V<eX;cUtOqAb2811NaUnHA*R6sH37<g*0e?{7JSY7V76VmO6`V~JiT7Fd4Jrx_nc z(PVE@K#(9*yngN(f_$#e|FQ`$LtI}Fm;kqOT$!F-lEUA2b4iKM0n0`xF9>=)wY5xh za-PV3F?QMSe?2X!NX93{eTHw($|1?gBQMCBda^>zWgV{?YexXkKCjORc#^I3DHa&d zR4TifK0Z}5dU2j4%Muk-ZP@MxrKMth)?jpLV<Iz+DMY5>GQ~qOQIUicu#VizbPA+o zg&v4TZ3}JrD3<!WQIyF%4Id0<h^xm^m{Xqf7@DFGcb4*~DPCy%JFUE{z|i;Auq5G6 zmzN#;V;zZ{|HhOx?GK<!H=QzS*=5dL!jqKxGLzhNd!@R|XwI(ZN`Uuls!2Ve^(k>e z;miNrqRNGPI8o{wdbh7(v#38<zZX@Y{4v^Q>bhv+(5had{o4=c=w9u#R5Pb+;Phu) zB1{Jqe1{1Bj@hf$_w~F(RIGXNTuA_xhIkEA^d>Q+OD!;DC3I-%nub|zva28r@9ylY z@e%vZx^l0mocI=!ubVA}JsX~-8OEaTMu5HP+~*U1TFHPGKG!=v*jD2GCdv)E_o|~Q zaD@k}4UeFw_nF+|xqaeS39GWHr~~}W=yXeE{12>2IH*N%J6hqZHm6{L36D1<Is=zd z8Xp86{0oRsS$98!7wzXF8YZ7F{#3?rZa?;J5Z?XFXB#uvciktaSX8mx<qv3c*6v8% zFq-Gxis6@#s+vBC%|$`R_%|-d9Z}O!!mr^tR%dxv)Z-K6yHs)PWN#T+kWHxWu%@?T z3XYpe(g#I+Q)LG-Sw~O(rSB2Ve&MSBH9TyQ+pfAftnmch;cw5T8e7!~*0cH%>QHcN zfTb=CF;qj*7DEIQlaM*Q**SyFN@0sDdTJVSck@r<{lh4=#>vF>Bg+E7Y%X9=J#*~8 zLOYm=YSeM18QfTwcna`g8KSAnnS$GBkyYrA96!t^v#cbpB5(JPbQH~)#{m%SWw3iC zzAu_hq-T~jj<OTe9fjhn{zFas)yf3}@Ggb!?X<V+t2V5ou-KK!?A(O86n(cAw-`NZ z-`(<D91ZUwPW+df5!B2wo}&0Pw=^wLfvL2}0YqM3iQl-5spxqMy)Rv9P9$+GN9Y!E zNxDA`x`_;LNPJLPVs_6#4N7*_xOn8?<L9hwsW=1LLOmJJEScg(!d@93NZ4@-RTUYr z^@EF6u_6xEsB0k$>CDy9HyhwG;n_sJqdTgSpRbWTxG|Gvd@g?<h@rmSz`6RmmYTC% zItT3DnRQdBo9XpZU|mqwlq{*r)6k2ER4H)lXPaw+R?5+IX<!ExV5+VtVh&r$rm9gf z$4Pw%rY5m<D%<r>$2f<PAC&R9lbSvfQjC4)Y6JfAPfzGdv=%3_*Us_Q^lJai7gP9( z8pP(XM-V{<5$Jkcv-N;{AZ^{UO&#sVhaC&A*`H7Y<$_c{2W8sEVwu~8&t|jjPRStW zI1(|_#L}wx3*o6q8P6})RCuLeZ<tCPsAizo8u?V8S;9-`#DwfKjhANA&;xan;S_MU z!R2ifbuV^LodF?^tNy}Cohtm>OLsXSBep$SF;1P=wOEFN-;W`J1Mr1iU~d@Ob5^GA zMmwF_LV|z**N!WDcMD>Pq5Ke-1;^S6x2@rYNWM0KBV!DTJ5h~&-e0K<IrMV_j(9tf zZ0Z-){_nY4g|E0xf4WNfFQ`@qEf-tUs5N}0-y8{!l6DwLU%=IRvJ%C6is=+tx+&fX zDGBio9fD@j$6C4HfV1#)SmVDs?RrfQs$TR&Q9t>M2fsrfl6iX~%3}h)*<KPmyT&6w z0>Bp+&L1#<^>tcB%uuBM=@#Ta6Vgxa+4X`8`m>4#(ws+US{+pt$bN&5!qlQCiW}<! z*>4^(y&RL)w~3JzA5Ub6_3OzhyOcfg86l=_g8(1kckPf<VH;t29oZ93+s!^E-U+im zlg}|_&H1U1AvUnmL4ZRgE8X#2d@EN~$E`(gy`V!~M7#@Aw|Im|95dl&2EepDzb`v@ z9y}^~oR(dc4%Usba1@%fB^_nvoF(UmCBd>X>Qz3sCdH$a?H<-i$E8wX`el2MtK43| zo}ZC!#P=1p--soNGv3E287h5M$p#>xl+%VDcuZ817w;8G?mD;w-qiD2J=!PMdhu>i ze++q@1S^I301sT*uNqOii^8XqPjr@4tvEU*iegB_Q=<T8fSo_Z9M9Jp-^rdv2agdC ztEB5EiEjLhpp`a6^)Hu`)Fg&L)LnB_2JKdE{2VC>WPn%{xKiSqtz{grd1uqDYc<<{ zLc3^K#K~-o{0_yoaWg;r-YTVbOG2AYmU<W)<a!aEW>PIH+KJgQ3HK8V2TAIn`I)2F zZMj0{l2S}7<#%A0C|u%Wr)@_Vx1NfpQ%UXt8)y-kBfvFAAJ43ufLQ9Y=emw}M$Bnf zQ_Casx)mGLSi&_}D{ynI6k>QE-iu89JOD;m71txbT?{Q^JQ!2JYZA@^qD1pFU9p*w zxG$?DIG{taO?K9+Rvx7~e#!`v)-*Cl>@n8tlqx7Ep#2$Qd0a+%Z(a<dD4CB)^e`vX z3h*^%*+Kb>9#`soLPvi}ymEZnbR~{A?aI1fT(>r_w4J!*@<|#M@GMn|&&rH3W09aM zAj;tbYPUSKH;Vdrm5z3SzW&|D>{VxKKnnKWt~@xdeZA*~w8BG(rL>@(by6NzF4!tt zP*1FMja}D2_ZPS|e)I>p9G5@%ztj#K|DkqZ{KNdeqRAMT8Q9qVulV7An<+A|Ff;u5 z|5ZCY11pnSzx2VLW-zZSm6C0?T#?CK8*jGQ{2sDdQQ?VKJJ%omTeCkOE1tW{nl8SZ zA05v<vLwOxlFUG%EARXYR@C5FV49w?{&7(ajKDnpIXU4eIXQ?a!NTiH{Xnny95mx> zdD-3N&8Vk*G{Kkto^be#20UT#LYP+6{zZkL{sEAEeG}t-BNB4(`bDLuud(^fxa9om zv*Sw$1VYepO)Wqhg9#8Cn{6BESefkJM{l!Y0PTRk&jkfVzuUR_`;*SiEb-4m5fq;4 z12uh)ndg}S$~Un70p)D_mV<D#MFt1QmgVF$Gc(iVk@C{C;xf{Ovh;5(4}#=JG>30; z0>T3Nw!|c;G=uzfvudg%0Wd*U`tYMns*1+Rdb;%YhYtuT2b`Pu9vq&ZKrjb?9fOlk zhyxp22dMrwq4}Z*w(RSL2k+ybyxq0`dH$x3D_`E7@dN`~Nn!O=ttn9*0U%a_Cg7J< z&RFRm4#3JYGkHzT&k5;%3hT{D%qb7a`3~#fE&c~642lBaiI4l;$>#;krGyRcrRk*< z+3Q*KK|M9f5UGv{rJ<z>RE=|K@KYhTwghK>>u_D;{L`cDL~Uh8{qhqRU!I&luV;h7 zxiMF+p1#2eL>l~K^FSE*Ma%@o37~#<e!iZL0m!cfFgM&6d|eANQN!BTn+)R@&gXgS z+*;oPh~d)&_{hux<og-m(z@yd1cY;m6OeQLqx?zV&-e!bMg|rK;GN${iF%E1o^Oc1 z(C=>aYcstAfccznBo>hWXLZ((&%#GKEx$QA<RAV+Z*7{at~S4pa>~Un?T;EIh4~eb zeW?N1+#f~;K=rgWfGV6SfZ3mDqFS@}8>;VpN&^#P*u7V^di>JI+`#N_9>Aj?U3jRz zpOJ*-?=&p}|IgVpzf!Y&w%6C;+aHg$AJ?}ZwnIOWH$U8mAFcSZ!jR!z&wD@2&!4j= z8W~#cADcUd))+W^E&`*kdPvouRb|xI+TmnCtPD=gZ@uc^pq)`V2z5-Y&ldujD-jtT z|IqsqI50B5*^%BMD!;4rkaAS{osFHx+Eh^fL4LU(KWF?&6aDWy&o#fOqg|@K(d$n; zQABEBtHIussQ3`nJTtS>Qz)q)28k#d8UVM@SQ}=Lj!&K;08UM6t1x)<J~6i(0Aeey zwceVfWKe$c+tf3?A*ej$Pa$gn&V0ThxIE-<AshhC_#Y%}9)H<Kcm{y8p>G6Yf7wrX z2Ea3t?>RBoa=yoSop*R2<J31H{B@I`-%IU3NFQRZZ@&X_ckn((O7B8b0Gz*iK18J} zc%LEVA9@Gxp`}+L{N}T-e0aVuzQ=vDTRp??vD>?Qjqm#Jf2!v&KLPlqz@Om0Nmh^W zpJl7B_^*gFM{>8Zhl~!*3~%m<KkD9N(!Vz~YkUIpMKpc};m-nX^Lg{(5pn+eT?*EG zJr&=#qb_USRb@}P2kE@h*0|MtEr&OxugGVG(w%;LVlvM^eX;z0QG8_SGyUuD_!qH* zE}ubB_@1eLd!uh{U(r8IFJLjQuK2M(yK;-8il1RW-z9)RI{sjFeCXA%Z9r2OK%97% zAokf7&n50B;?K%T6y{rg8!nu@go5OX%4V-N8{3d1G0%k6R}pc$_q7OJ9Y3}<{&2RD zYUX~=?(^X)S=&}&IywCq8Fa6-@_ety$av9=KRu(B)uU{BPPeLawh{?AT4JukZ`@1Z zr+^Hp@BIzS;d#S6AzzlNlx?XE_{{NCh`T<KrxK1&Oz3rg^Ki_2`s53=+q`pnyEBEx zb9~9;qKX5bxWkR9oLAQjqdc|kwQA)}n{N8aMppXXfqWww8Kf@g+|x+H+mCb=QR>GV zlSJeMpc^<C#P=9>WZWmpDQN=&CF~4d5{0Y-*BZNXX4I<jzm-OE5^7*gvZw8aNNK2u z&CC?)x!Y3;0I$B{_vBs(U6n%_W#{J_YOX&v`3P;7{dOh4c&js4oUs>~H{L)xgL+nI z+UP#9tpA0R0f)FX&h8v4=%?sPYX94@WA!m)I&HWqSmIEob3FMA0j(34_KpeJOi&#j zZOr`Kf|mUDQED0E>Julo>qW^d_FMl`QMIt4f7wlwb0TL}Tr1Am&dR>S(xF8vi6l{f zRLFpwf-#h1nWOGQP#P>dTyKCz6Pqlu<iPK_m#V>1y_;=`%<-3<0KwmSxkx(Z#U}D& zDXH*!pI-DH`{05x)Foz8pY1H>&_Jb^enz8}&JxMCHA&Sfv@P4KBVcp?gNFjFX51j} z<Q>6Gt_V~U`)0rY4M%u@uDoDIgN*G|c!HoYJpqFR)1NwDUuikd%WE{OT)yC0JvWYF zTg>6no09V~JC7Q|-D>h1*z5jv$JcDx<5?_iKJ{ct(;3qqr7X4tx(fGEkpN{iGJ_jX zlvu!g-Arqb=&;ueKH<gd={jud`Z9a5O_wo$(IqQ#QWX`6%v_^&C1#1w2g4y2J2TEa ztI(m|LZg3KsYY5TbDL8|IJa??uR64b(Y^@%;$C;3if@c>;%I@psN$CHE<HQPi$V>> zZymKFJ{_cGs=j4W8(&fLrXN}h-+9P(s?((z0k>C`o9Z`iEq*<sqaluK5`ma}pU?+E zWqdd)Z;Gs*=#i2r22*$(p&1*FfM3W6t5`XGa9<VaH72;phOMmDiK^j9Lw+`9hH2ZX z5sjF1MzJvis|2Lqm2^_KPT?%dxQOi^Q948aM~~eyhk(7(?U}sT<jRE6)tqzc69ZRD zb3E33Y>%m30@iANcFni&^9?j=4SdDEOr9+Yg8&}_KMil<JW}{5)k#AVQRO0^(Ti94 zoofIB`Jx_2rLDeiAJAgwPkSwUSSb-tkjZ_=U?x;+`QB7ib?Q+o<&PKR2;2n(BPi>c z^;jDt?pTx!M9joS)S1GSk2JMVV9;38ZtTeuw{P$|H@-C3<@YD2f{jQINygOBRAmp5 zRuq8w70kdX#2-m8qtg%IksNK)j)JU9v=ZCz`|KMQYuids+tEfCcQKUw=_ajm^wpky zB0Ap-W1C;ba+HR!0Bna_)l?^nD;ruq63je|VFu<lo*o`KOq%z79Z9nv)1bSC)+I{; zxfdY{%}HuCX7KPOhCVV!Dk@4&yu-#Zw_S!F^5}Mad`qej{bB?$dvZ7FIobc*_;TPT z^{}yx>nUnciRUBd^`#)0HxQb1#VOvVzO-xu;k$d>3`=BP-oDqbCy{hS8H_M+qJ1`^ zB>4HCO=)G!D=(k4Q+<^g%9s|^RIL25w-%O@7XD<c6k8tw#K?llf~sinbc$Ob>2P`Z z`V~*j-{lT9Wode3DwM#v8dHzsS5IR54w+##n%B%%eVep{G`^ac#x(6@>s%~uj3XI) z`6?K^%n>?UK@K(w2SB0iCGZ0$e}ZNYGWT&n%7ho?b_j)zLz54=r|MG0Z71C$4I3Tr zII#Pn2@Xbz$)!?ydqv~iV%HOdG55xJCgGMNlX4CdxL+rwv>^;s#5avzGrPNaZ5nf< zGLeM0D!d)fNW-~}jG{-OoytQ~Jsz#s^W<c9xzD6(#rkxbmFlXlb&16NvXJ-UATo<j zq1|+Qa!lWXLEk<%={GST@nU=Uww_&z(hA!Al-6_k8Yi!=>kk6~N)Ts|b=}<SlyFvM z{H_MaCgJvEcZ#_KH6=X9Q{yd_B_F>Sx{3GggBrVt+3f{R|0<AOGGpZUEbs#D?0lD> z8g6E>Vy~8h;A`P)NJY#P;nYWvSss5JDa*J-)w3aI#R%fsO_ASeFI$KmndGdCgn{xI z({rAhZAz(c06fX4*6+uFLZ^SXeRt5hB)sC%^3(O4#QE5NBvw@|caQk5p^`LJACmY! z*k2V$1F5gd)ZRVJcM;;UW6(A|m7^c?n;}iOYOS8u+Y)3<54sc63~FSTKAGWD#v$Jq zIk^F5VS1%+(|33S7{6AHILKL(z$aD0pdch6UExy?AI(z3Y|E}Q=2_BD0+})d?-JB} zO>4Nvgo!UMJIP7k`ElxjM|<g~=$n9XK&pgI0&lyD5L&Vk#X5_8xsl`_LwHT>ZiPCA zeLRSmQ?5OLGU7OwCzMvj`r(oHDXS2@zINuHUn6^Vd8l0|sLEjBmGuqt^DE79itnYb zjnH+6>?th-ov!7)H7&m@Kj49k6~I?|V;N%+VTA7(esJ#%5}wW#jUOR;^c#x7`)*q@ zHGMvJO~G}imt_Q+QPc3Ots@@yxK?O|q461>W%>WBNAV{hd%G50&2pfST`3m8L3l?d zanUfX@aJjJr>6202eu$0focK>&9qtU*4!`!ZvXkl28E=Wc+P)Y!%Fn)lc;EL>5q&{ zCTFs19O>K^kM`=sHLZ;p;R+Mics}S-Uv4p?VH$<HNvUCJu~{X_*6VLsMJ$+<Rcuns z6AMKI?^guXi`^itKKz>(8K2fO23_4qwd$l_!QwJYJ|!q%;p9{<>Shi{jA3+$ZYdv0 z9P79Mr=5$h{+E&1GwJPN$Sq&5BfF=D<u0eLJPQNIL++VPAT=nCB`6<Mt9i^fM<Uzs zuQ(Tl;x-1AUl85f+qVsD53|S$VnoED&oL7dwqsl6n%Vt&PwTWyFp^$yPtKnL$<}&Y zVXJoDY>-$e;Al2(w*EjLzi(4me89k`no(NcZtpy)1-u$wy(vKYc@$5gvk!_UPr1D} zjS(W#vv|k&di@|!kc(MyxMa0o=+}~$2t@|Fnzs#gj3JXU@$d0YR(Vca!XyFeAJ^RT z5ck%tplG^tf*#LY@;dh^bXo6m`<jZ)Qtf581jy!Ke=UfEV|`iaF9o>FZ7>C!LFRtS zPZ0?bNBQ5yVKSj)IuJFcq2_|1!<asz=4jt0nRc<rfVt%85l|~6TF*NnEb5LZjNsk( zam3baxWGPK0~o)*Yp+QfwZJ<n08CJYaGUB)hH_bieC8bJDK7f$CUF;>X7flGjSeS1 z&A1h`zi0WFXPXU^IaD=tHk~uuQ?Zo^W9n7HWnBecJESw!%s-bA>e(ky{)pGSs9e)f zIFRo`efo|%TYQ=-8XtOxbgxrfe<$I&@p^qh5ef^%K4=zY|5Lkag!Dg*okMUYK(~ft z+xcQoY}@9<wryJz+qRR5F>x}n%`dj?{Ij{Y>Q?=WyX<8zy6beG^FEJKvhJn8op#2L z+~U~uTAZkYEr(x>5x?xvb{1j9$b3&TZ+kqt-h$T_ev&cDUJ%+;8!u?#ogV``)`xbD zYQtL#5pYB~s`X$N%L-<labRA#+Gg7lb&{VFnDBe{o*j&C5}T*DsQ}QS)NbJHTl0-U z$;3f<fxqR^qYkKc(LEhmv&w}s0)x;yK-9~1I7fnU{QbTacSG{!^Z*Fq%WjwI%2Jo! zNH-`b6bf;LN=3hmHMHG46ODXPaZ=(^5l9?_8lDz^&49U4!@bcsSU@+Vaghu%O?RRv zw(JmMC^wsnQB<W&=`qYt#XL3*?IRjlj&U3LcuY^Q-dK{E_a#Zg+1hqZ*n2Ynq4jKu z-_)(p*lgLSL~Op8_t31Z&I$qOIJii1(BKd4r>=zRm#2gLa@J*S<?YeFh##`7qn`>U zS)O-?5xC-$;Frf7G6k875LO)52}qJ0cN9x0Z=`}2edmjDB~jAi3@LkR-m?(IVy>6I zKI}=OBi_ki{+Re<#7ziixmuUj(~YO~40F8QoL40zszt-diiLSWtBD%DPZ>|%bGP)< z?2ji5&kvtpZ|<z&YVc>1&F`}GvDe3O5mXs;5zj<<cZ^i9NZ==4!$}N}zb<6ST%tUy zH<~kmTO+OnD?s)+QAb!nw1ZTfcBZ#zkpbA+TMy%^)+^+g3>q6@Z<wM%Y0puldX~mw z|B|S_+gPR>mB*f{UERe`cA;u8CoJ;|Su?C2iin>n{3Yai&-TLU()v{aUHFO?4qT^3 zCw^fpA2ifcf&CFQ3rqtMGHe-j27HCH(UBh8OV*~de5~nqE3;aNBX+jCm|l7K6Gi&; z>{I*I%^sDH8z^alC4G|6S!TkU{u9@)?udRT8CTZj^u7Zhc-x)(J-3Y4p(~p=!>r_r zEauTenW6k&BWLym+`p#OIW8Woc%E_WU^q1ZqFvH-*bro!o71qtR2Up%Q)|N$5rL&0 zdGAoAlk<9ww)nc79v92Nx7aWjsH3|#CVkN!;)#ZbjuyX9WbtJC_AWG+)KE~E@h|$_ zD6=7##jqED3MyCbh+tw!D&C$FQfj4(?#IeOMwa{>wJX+tWbSkgs0!9rx#-{}H%=Yu zpb70W)x=g#mfw&mQ<?g9?fmvOcAI#0Jv8qktRKQ-XRpHTYXjPL``Kx6nZp0%iFwYF ztEA22Z?S-Xm#x0lD36>G@D4ED;8Fl^%*2e3Eb2AHSe#-bG_WNjB~8(WmZp@fd`faJ zZu73NP7s8`pNW(W02~65^Nd+j&S!u`@C|B+$n(+N19ke<Lz8>WBjiEu1LfpNyLo{F zicb96>&*KJsV_*GEJJ8kjSXL!M?Su*`;1n;pI#68XVxa%v@GrqbLokV<1`|2_=&H? zEOm?yK?pd3J6i=Y%nmFUHvF+9fy1EsW4glx8)V8?DLwzBg<s^Pked(|+0;$04=<4D z?BVa;42>H}xT8>)q#HAv3kSz5+lt+E#{7<;Lhj_bINj8CT)JSnis56bScl_cS1)BX z>^utYzyo#WyI?~hlbC`eq{h#2xew0RQx&~+7aLOx#fT$SoY%UTu<2P0--)@N^*-+^ zSs_`gH-4mWC6B2s_>vsjaYYoNiR^4=U^Pw1)iCxDvF+zFqEki^{I6spnWl`$o}cdJ z9}4vdoWB%VNZT9J$+E!>Mxdqh6Kq31{og44<`N2)m7*IOZ-3+zP{Fs1R3Aqhuk`=H z=<SRDv|Lq7+st;{QJo4_M|R&#>jx7fLg7#;vF6xG<b?ETV>D2UHv7Iy;}A5l!o5mv z9sft>q4(n}NF}*auEYRp{KVTtc=6_)N8Hl$y=D3;E%dxDC@c3narp->+p{CMGC5-~ zJm@)~5&DIRy3cI;4W{Y1ydggdaRyFSQD+;I0tVUwrgr|TFsHgEodt6bJ4sIf(L6Ly zz#&I(QQ+IXP`yO-FrhDDLW-mz@}x)W&aua4r&l!@T}OY9Qn8XrKdYv>q}@VF+R>22 zC#nO#Hr|>8pc@5sw0T;=s)-O6CfWOIShZroZfyo!!K3}O*3s+dwWVuQGPI90<*hUp zX}w>B1IE&F%>_#;m^<B>$GR?on)=T=knx*~blk2#xlbzUDz}*sByr-hyi)Q099=vq zHoqm&rgvziyV@wP5bvB#m@j*R!oBOQv0ur4*b!Cc#(LRKZqq+fJqqpKdKN{bK^U_M z6q|E=9HchOD;_L!wcHvkN030vG2)u?s*VQ<A-C$(+onS!&DFJwSN!%ABF!SZ81j+{ zK4pl3g`tb60cUwiZx=%9b(j1Z;`csgkR&kO00khF@3u@B5+TcKdMPuK?Sl_!ClY%m zo^jLB6V>ICBLw?xU$k*H=}|R1A>+AcLY=fRtR;z|e{D&QJN%ZlHR}AYeG{U4vKBSn zpItjhno9TTE2dTDLnxpNuZC7*k!T2OZD<Na97HN5bhzNhC2QEig!qx;L>^C2u+&;K zE1!u^hM}C%m$G1|W&Fs0)9o)f>_o&Y@Z4Z@4(|!|W?sIBAyYjy@tcrufg~~L)EP}~ z#=t$8-Ia4FZKo}$$e<BVQYsJ)7^O_rqd0of=^aIYZDtsEtBf;LD{QYzRodNTC)<zO z2p{Jrp%oZ6U)LX^1>93KVPoJ5=jxYXhyHOZKX2oh?swXrG&kLd1-hZnrzo_e4$r&@ zE<<AJgXqBiuH;85cCo(Kiecjx<;q@myhCqKJYc~^!}F;Rn^Tow8LZJLNr;)EWFM!Q z;n6Ab3d?6ZN%2y$YJX)ae4%XR9U$Uh<1z<Zy#vN#W6@3fRf3|De|F&Rl^}2u0E+PH zHHKfS!@>tjx74d>wNLvkp<a9J92AEPl<eUDb!)|i-MmGsYpy7DLdn=nvzzt>ou~(> z^LtB4Qd$zgQ3N8dFuzz#y&ikn*^6Y6LhS*tPD2rKO-*3|+nh0B5WiSa!VL%OaepM? zTa;9y&Fusk*nlpC{8i4Dhf28&9xYI%NIkJBs!|UZX31NKI*Y4(yW5%aPgSsjhVte4 z%W^~qSO#A{x9q)<X*~Z7z&V5n@-ec{i+a4B?xo}W%0noemKd*;T4U!RS^`5ilC(Pl zR~*w{UV=|7U1$lS`SN9IaTyx5gwww}VEX!%qu>%4uo5C$VTmp#I}_*TA$*BNBGeKF zs1g0ahX5glw9lZrORlQdb|9poBH7>#4=nNAe!7E6CCE##NqMsN#%arTF3{0F>M?%# zAlB>UEtHag<JFqc18URg83V1=Df&7gSG@XPCNO{MUW=4S))=Q>VhbEZJ2#fk&%77N zC`K=%MFV?~h3c&{8EEk0LnW=xY^~YOaxx%y)ed_p8ZcDT6UG{O1JYngg38c#U84dK z@yOsn95QKn86UUfR%o63ce2zY;^%AILVN3T0bmmPx%ug6ryCBL>vt;1JC>TUey5Dm z7VFp1Ak%UQ*vkN9dL2RRLJttnNJR{yY+w@}aG55LxVmYq&x4#BadJE(>LUin$ZQ|L zof#Tx+<uVoHz%^an_1!v@`cN@^El*j@2Ejyb1pB>^zX)C)|C{0>2obUYxJMraG4rS zy;cgg%5z7j5NAZ`D7>4gBTV=U9A0q@NHdRs$sX0NZ<^yH1rMGM1Dmy>3`d<mut)yE z*$^FafXp!i=-rHlko7+62a568XBSHu0$CDw{w!*p$xnB%Srz$#Go26Sne5&kS>(Jh z-*b6l17e(&8ktvdQA^h!{BjKEnqw=+3l48@WciTYmXjR4mBV=)75t@v+G&+TJ^;m5 zCBckWl9+t9?$eYEdNdKWxhn*+T469F>TE#BV{buq!{veT*s$S_V~vWErU&dSPtiS> zoQD?2V`7+r+4VWh%~;OAQCk$D=L+Ss$w;(#A=TV7J+rch*qnJCc*0w$O6=gF!s_6U zMDuK(A-2yLFh%HD>3!KlA6;#L6opd5yb3S?TP*u7A%IYEn%i~%Vc`Ly1eHkemO*6F zn*D%KN|Q^iV;uP5%N&!jFa-VVB4qE9?e;ayZUbhlG@7XDR{~W(<R843ha26VP^nKc zW*cV@^cI$|l}x=#cmn*Hkw6vtZ6yt0sO2eSif^Eu!ctV$a_~J~xWH?6CE&%~5EH|j zU%0i0fDuNM4k+CW`qT}fW_3Rv84K6&vk5oJ%mYI*kXV&chnS1~yLcAN5jat61<m!Y zhUA2m74o@3W3I=$)MJ;zs>7@Gw>w{y+`j?W4hz{f*w0<haV5w{{PFzSTkU;GQO+sP zPpao#UwfeutiFjMRQ#q~0v4OxK~M!coX9%o-G7hdB`5Ubim1L^|4LnRGuBe+vL1#J zJlB$uuHMXgb<VQPA%m47XR}P$E!Z>=n#uH@xig4hweG_^!)UmEMhMz)z*!#(`6o&F zwVwGLIq!zKb`dkuY-xUx33A8gAv0ddD)rwCP6GH1lxiBl?TN5~Ndmp$IO{rJU`v?A z;sWTrx}@WaRCB|E=7H(xN)MyqsWhKb&%GW^&Ql&0i&-_(=zM+tD{qHN0%4T`eK3m2 zd?Trhk!f0E5__|m?_SRtnKlt}&eXu<rr-wh$=<^Ol+L;CdL_tiSDM9{iOwwZh=}`n zac(yhb#mQ;q$4pT$)e9gz04*$-@`hc&>yL$YI(V#N#;O#rm3Q#&q`=?gH<{Ys*`|9 zy|M=COQ!7-#p&!7Akj~onyVc~9r`mo7W24>2AWZc>@p+~EF+RSNE@vL3tidQTG51% z^ARU^Gz$%vzUdWW4OG59WO~-UXjHxVXepVKaGkmfnQm24P{X_sJogd@>@U6?7`;s; z30qTe`j6eX(kP6{J4=E<@Or8aCbO}31v>lFy=<2laSpLKqC)avTs>q$Y1?-slMO33 z5qZo<sAem^j66|GsXddw9(kQ$nxB9=xDOH-x8r()U<uEKRuvsjxq>2alrSGMOq#a6 zjYr>Gb-Ks7u8JKtQ|(g~p7(56jm*^HfEVbnHkMNk%M~<9KO+QLX^K;QX4YrMfY`ZZ zeiTaFyJnl;jQe+;!Znr&7l-ZH_NN_*GU->LU!>TybMxQCFJ>JHaNYe+<F~1b7Zb#f zJ0kp{QQ!R=th|5Wz+vn@{6nAX@+BxUdQ2Ljr|-V{j2&KO;zk<>rpjFe(@-Z%APF;e zAv(_x8_}^tLT42=q}sb>$<!vFP%ajTduGsmo|&PL<T2$O#v%nVSeuRVyfkd)Np`eh zd+>mN#uwg98GOA=bp;<`^rDF$9hU4!3CmyyKxz0z^&`1IZ$7j?i&r>d@8;hkh}d7M zH66kfV=V2WUGsNL)47l;5PfML&AFWoxZ0PDa=@6oRqEKB#PJiYqhgSmS*<^Vs+ZRP zIRJ`vt}A1WhtoP)yA!*`6X#RTc4fPf%M`VB6%7dXq_lhJT(AW-rix!S_?35e-9HXG zDw)^{;E!S$9mA0ISLF5}lR}pO_*v^I-L%vwF@CkFbp+&XaW{Evjeq}E2;6iHaSeP_ zi-Id&_y~FqNtfh)QPP*Miu0nH;7LFI*vq>5jd!24YvC1BELwkqyAAnNsgPP<)c|H# zgxA4ss9W4<vtI!g8yvXg)3S6ZtBq&>so4Uw58u7VFx17}J1sO;@2}kbRp+3{pT{<g zhaLo+d0Fhg#>g3MF<qdSb}*|n>~D3`%bdJCeQhsE1&I<zB{JZr4JF9ASEpEh<?m57 zu*kgGcSEa#8(c(<7bdJQl1ekY%|THOC!t9!(2F&SrRT^aY}kH<Ha@fUi?V&|Ad9_3 zOuH+owiQn>@1_2MPbc)KUi!qGa$ry=aAc*8)~)YupM!zu$|a|Dd2ew&le#b+GmGqH zL1@xZPf~3nsBe<eC{)th%nznS^-`WZ?M2eTt#}h?Hjc`Wx)cvcU}9}0JW3yZU*@#Q zxRe?ual#s(rhDD8N+N{n>=<&(nN)9Yxy6`x|HJMTXZB!p3Lh(|g(CC2t!)Gx>jBj@ zGm4(~qvJ6?y0sUJ7SXqd!;_;h5K+Rhz|7`}vpmT^6rCKI;I6ga?e`yUzx<3eaUI^` zl!B^<Rsa1Da%h)aoW0);cR0F=9vTcjt_qe*sgKn3ZS~~nSJ{@?|DJ_F)_bE;&+U4S zmSrfp_`%BC6QFv?{)>U|`LcH}L<G@PpFcy&!?J>h%{cy(!1#SVBQDK!(DY$#lgIP= zGyLh*M@$WF*_QO5!~J-kDtxmunr7UnVaY9K@cCh_Crns`F88ctV%Gz2s^$$M9-f(9 zXh2l$->e~-Y$8Oa))BN$<?x%oKjnIq2&t{$qUbr!wMe;9<P<?Z-wFB)hsMQpIQ`~f zMgZt_-D^$S#jKiykOE-X!<%A7DjA5<^zMP&D=AnZu&|wwUhXXKOwqQwfn?P;n|fw% ze}=p&ezL@;vHE6CVBlBzd)vk>xuj<W8aN9&fFJP%<1u&{hUvVP3G5Klc!^3nyz`eE zlbtVpxTuk0pK#`vr<SMUc2Wx-FtZ3kf=&pyc0f7}B@{Erp(Kk4G<k}BjCi=kI*-<7 zEKO@-v@tZ`a@!0RL(+jWge1AHVc4xG)<iM=gs25A4sm0DVhZ}h4w^WMS(QE3c?Bne zSwkhBc`MQBvj28J6aKk_9u%P>Qh6`R7IcDc8^<?E`_IUS$GW){ZF_=cm#6%itZuQ4 zuD3-|9M}nG<M3~OPAFVY(es+CgIs^U&y05HhLDK`IuZX{W6#ztcrtZF)=d>6DFu%R zGc7HS&-tT3&||!xWL3<z_@vfZxH`Iwu4IMNeIx`jsPW?J(IprNxmX&%#EBt1c1b0d zl2TV)7{w==Cp9|42A)2l7SpmMKyXYmhmz2u>5bdM5Upk|zfK*3bU2FnXG5F{5xo~J zSL^!p=BgFYs$L>_e5haUk2foq17KZ}IoiHvdATKbaSn~;X`Us`l4!SiBYpN8Db=Wj z@%cu8<)?O8t9BKSU7x`;F@eFpdyxKE!_g<G4)7@K?F%}e<VGAD^m2Q=TuH9<e{%$i zs~_WJjd9!n;Il>NHeb7FUyzq0I$$Y>+m&SMYb|9?gedEfD1$KQc;CZi^=_9I<m)yu zRbj`PN2j%YLJ_>O5eE6`=E@9~(5XhOzY<{b@dg?ALc;BbHmiDs`1B);57Fg=l`_S| zJH4ySitl+KZ<KsHin5<UjR=p0F}<Ci^r=-bbm!O05z+Jw6_GxInu<;h1Bo$VAlz}Q z2%H8_s)o&a&^;0AUAG86ExnU_oUOpvU}59V8uT}0mdZy!-GkiDrv2Bv!jH-Y1n%`t z*A=?()3Sp)Mk-Y+HLh5&e(sM*Vm4EHpEqX0lzH^>n7#rqhypBU;JA7tX(LvSVxono z&*8Z~&+5PebJKa4YwWSCr7&WQT6_0m+wH_zHWaL2-?p)5SS78VG}2#0<j%N;AWv^( z8TBmI<Wnn+BjAqb-;!p>G)-%T-4GslwrGR1;3JAG2V^Xn<Fw(09SGZ{jV7TSZQpS< zEUdNDDN|?a1{T81=9g}}LSmD=kS43>oj6U?n{E);@7!J`n+gjJqQ%R+4D6k*5<F_R z66US3xI_z{I-Pks`}vTQ7i}5I4`<VbndxDDNqzSd=t5jvq+>;bHcVx`<x_F+>IW<P zi~kTK-?(}YwBcXg3}q(M)914-Vzph=q6?#39E>^wi_tRJ9+T<G*F+USk{CHU^bja> zdkkxhe<0d1{KYo{6vpU<o~p3VC9ntLQYzxNbX?0kZ00EYGt5M1IkmE>Q|ZV4!E{8& z$vmMSJC7Lm;TDkaHr0TF7Gnk6L#G*LOEu(y-wT41Z7^wC80V6k6*y|JHxbfThi2NK z&|`ew?i>L<kn$Y7)1bv~Mdi>S<j>UNeb#i9_TRP`^W3p^jucK@AY5ajpV?dGIOY>? zAw&x`c?Oto9L*&JFM+K`MzWQ=_r(qr<v2lR*9!n^BrJ7yWb|<~g$U*#RlaOYIoV$i zPmZ9`j}N~s9P;;i_lTov$QuG8IG^F5_+!Gw-xX$zHB#um&ofDyeSL@VSCIzd63af; z>e}U)|CG6hLOoQOroP&d?^ZpDL)@-syBT}sg)>eCpC8A&2va{PL8_GSfWYmoL|_k< z!r^n=%dUA2i1un~2RJCWd8S^CclFc06sAN_Uodk*a+CNG7;&JN-Dh+>HAN?y9)3{1 z)Y2ea0G7DLmZm~>G6S<r9C;fKa^F=#szZ2cnZZ+b;f)#}#=p1`;Nw~-3;B3C0flkn z()4n2<F)l7IS0%=bIEwtt#DKGTh;F(ddWt&n?`Bnd4&qC>z4Y-ppBSYYQ2!XMpgX7 zXQsLM%eV<L|Fk^%^=I=mPyHDkvrtJ}B?2T7=FuBgeyA@8*d4_bv;*w3A>?cBtblF2 z3gRvzo+#m<Dz8h0RAJCjQO*jIOLLjSafyZ0$lopK=3=7K5@9NZ0do7X@cxnE_pe%L z^GQ>8`Y;O=;*38w6S`QzJg~p_B2PH3r`Y$8Bvk+M`GHKGh|3&InEHM^q`~wj%?Rer znVcFM4=fZ82HeD22V-}X8MJt%lm^;yvH=iu!0q)Ps^QGYRrA22Kb|YvSI1+eAxzf? zr>{i3MFJh2XXen2t%HmXghq2-I&{34oAjb|P*w#jrxpP+K;JD>@thZ`AcxDfw!!gK zJjJceVs*av0#Y$w=#>Zouh<k!f}V+U3%X{VGlEJ`=Bmi$C5fAOe?q4PWfWMeWD%7v zKRWX=5zAKEJ5qP6X?}`nS==(!R?rM2&AL<{JwdtRjPpKfBDlkKb^cB31zbEhG;=Q{ z)aTJg&0=k^8KPfOYyTXW+|Rj0h`Xu^cy);i{W7r7_*|S}50a)sN)AVw6?Js|H5Y{~ zIQjCJn}bwrW92!|Hq8!(=LlW|Geu+7WaHM{zd-oRl8fG^x{OXo0YB1$pp8TgaC>~+ zp`lrmRDDO}MfM<HwK|);E|8#bCkE2Dx`?xW4;M><<=QMn+D}!6G|_S9bPS&BJY|;; za(XLzTp=_S6}!}0c`v8s2=N%q{d8!sJz4D#(I@hX;Kr%M90|*eSl@tOj3?grPyTQn z2(aL$Vw)l2NKv7trWHg9!aWn?76Va-wXn+NInZuzY_7soxK*7qP{{6e+gz4Zd)j$j z;dfo@QJC<Ulqi$MebV$zl1o&Ihbwd>Wf3rC!Q+*2bp1gnt<`CiJmoYEU}t$`x3ueG zqyy#S$!fjJo8M|mb3D6__o5{OP4KR|NV=xdu8)KB+vT#(xlqTBQ3mb;6qH|%qtn#d zx80cp_6=EI*#Yyv-x~mek6V&C6%S6<#RJ~{P0wZLC9VZx4V#^rQHC`ye1gSJnU7n6 zaQ^!kB3-gcX4N*`f7^JNpA*Pb7`NElCj#ZYwJElLmA8PU8(Po5Ioh3IHO@}BsEIY4 ztv3j@vm{VpF*Z2O;r8wh<UK5a(_A>K&<OtQAi>S|9ccv|T=B}V6-{nVmESR=l!yug zU!Vr}uQNUEJHQ4r$&pd9PLCc(O+L*JiYHYXWe)sBW{_SYA<AZ4i>433&$0i!48BFD zr_l7uM-rm;O80<Avw3t05R@THjPV=1#y>=bwj9gVFaXtHn?pAhAOI(`hgV&BVX z;spHrrH};8B?Qz#b9DZ3J7>P&UaKjdv^Ao1c%^t<!k;AD?u75*bKx>s2S#$2RR~HY zRZ&SgV2S};O5O)@!=IG(ko)rp6ED@<OC_an9=3zJ4DmH)Mf%RJYpbbw9Gk(34WhZ{ zZehUwa4Cpfu6&=ScE)UpR^^}u<KQqZmYWE&Y>x<D`m13|$d(4zzlMRcgFmL`Sz#Z$ z0b;f#6{y|mvPmZZ_mhp!&JwQ{mj-*yQ{onJyNt>#C_2gTQ;Rt|6yZBw^nZ#F+Qd<9 z(|-`HOt@{T<j?)hzlYhk<sCEdQ`fjlo_jPJzv86^r@(=uZitp?i6KpT`)j$Egq2TC zTu$BL^aTmZ*E|7(ndtk|TcvC5cS2}Cc8iu*9PzHHa)cs$YHNnNX7+9*YAb%Gx=sTn zf8%afwS=ht5DL-pQ4?A=3J--;&BsF;3^Y^6B5>H?NTKeCw%CJE7nE|wGW8CQ#!R@w zUAT6D!N|}H-)kl&;NOcU0_QQ8(v?1mQW)&C2;qc}@AX?##igl<&-~@6<Mj=&?MPaU z=@yzIuRBp2S}Xq-vSh|nUMe#4++KA&V^3KmPvbS%<PU<5x}XO~PY781WF6s2FtPL) zNT&-GvK7##7W^`baAtLKG&8o6PqM0_%EefsdpHy-EOk+npguc53ZTZC0Jlex=MoeE z6L?&iNkq8a&%E@|DY=>pqX#w5-%L-`S{gWn4xiEWVIs)sW$~T9N<TOh-G}bbXSc2? zLDrWK_+;7Z3An#C^kr<HD_)wPGUX)oC}R0ngQWX^F>v0u;0*N86n4Z?HO}hWUJ+~* zst5gEDE9bG&(Ml2m;Nvmw7#lCc8_phM#WPOC5sEL$Z-w-(5K=fQ1Qo&Si<|y<cS1~ z?52cBpKPQUHy(RO=HJc&gRYeA$FV9xXXc6dGMzv1JjW|9QRiuV0Sw)cFTO-iq!qHd z>&NBG8u_0Ozwe2o!n@W<Y2O@Eo#G@56ILbK@#*r(fd$tOe0Z3VMcB4&tJV<;U3nqE zq-wEdt}H!zu%eQJ(Vs>bPg*=@)Yv#alkAMjlRkn|p(`IK#Wwvy&afs!P-I5#$~Z9z z1d@6Dw}%)e1gu~qKUU#YV*$D+$qTTNLxJH)O|m^fADz){HYBD~`bOmsGNN}FL9`85 zQM98ySjTGu%+c*1JD5hC0vm*o3&<;he{9tA5q2ejzEJ29SVak^QfF(bAa<2aCoBli zX?01_5*DYP@{^0stpuyOswAYS2W3G<aG0MiNl=SPq+|8|Ily2mWg_kV`gdDTRvWMr z>3mf^)@_d$@otC5Qtsfec#9S~>bxRl>L&B>8$+~z++}G&RP8c}d&jD)pSmQjOb$U{ zpJ|MbE46)q3)!a^1OFY!#8Ai8RtT?zAlFpThDDMuAs$PUI~;;I{!z>Qpa_;;#!j%% zV?6%SZ4H|Aa0AnIt-Yx*&IGaB)}534CZRxH`qtOs1=)@MIJ>eBGo<8aIpH^uvyjq( zPP_>$PT{VnO%T)5*mTp*mZ%i7p+9XSXAMahfGiCsrC!o^i$+YpBa^EgBJE`Adr2@= z0vaU`bjw0)GxR}y-7U!Whz9xJ#<Gct{5<i{vQbMmTjwhXSB8Q|Liy{>{KlH(?>^pI za$()8u}Z0DzVGRntHOQ3>afMr;?*lvaaDZ-^sWugMRe%VJZ^*G#as`A8)tDwij2P~ z!nd@{7shWrD>!HYAuXqV>r2TbX&PBd&dUT!+$k^dvPz4vZ4Bp>m=FesIloV;m*&yO z62qiqGk@F^yVZm!k(*AVgN4Z}iy>8suk^sLd0Tm}z%rVZPcii{CLGY+h|mxpN~1{m z3)-}lR|2cj>)%u079|rL*zm~8yDd{4lEe8cgpn@mJ43w;VJHGL-&2H)hCXS~4c9M@ zZ5X>nel?gcEta;F3k7LJSEyH*V{E8W)I<%j^E|KVw1cI6uJDB{u9Sh!O>91ZXqo)s zrk?@E!~$C<^2qFaBod5&2)g`D+lVL+W4QXRD_(*LGX`!iPUWZJEaU0|vylFN63(}d z3dZkn#s4UIJ&Ps7)*_RwKf|!MUsS~{+*SW$+b?;Gg1XBpMDW~^ub%X8`a!S!7&ZWd z2=z|tx^I%b{A<VNPAUz%eznA?hdfz6R(n61>QZ|Dt$G~IRg)PcfLx$?U35`?P5Cc> z*Yas>hlP}`T^~wNrW@ACSPB+{48y(qURSl@-EsH$ubPSU9{lXu(?o)3w*9EI$;&X8 zD-Dcpf<<Z#jw1eN^&kh$@;ON6&f;iqhFM9c>1|8+7?j$bL%aEcBsOE(HpSg&0s|N! z|5Qo{ApMrHQki+I13!*8S;~P$*l?)Xu12u2S-ID}z`>yNcL9r5#b82=v|ekbV8_XL zo!vKete@UZjen-7xJw;h3&z?`_8gXw<K`g#eUG={QkNkK^06rFx3m!jkoFfa5jKLG z-B^`EcS3DG*MG~kt1h4>E5nmiIJ31$xMI+hd?_j0)Q@-hdZYPz>5`MssLB^+`UXQG zp{#k$L(=|Xr^xo~l{mRN^7nMZ{(yX7pByetYeeCAli!mD+{vS@75?gUo?;JY-sxY7 zPBid6n4S2=M#T@P-AIAc84ouZ4W+M_Irq8P$~Lf=t%0RuiwlW#8j2M|g$b3&^)9!1 zI(xYaRX@jjW|MN@y>Pdj^)M3x<>pQk#xXYKc-O>7d%3-;;KYj)eBdTD<xHp<Xq;)H za(#fK2V`rS4#_rf*7xHckJsg_SW7XLHkRxkw7TFIvP*pPTr%BCZm}}8p!R(YSR-Rg zL(1)r|4JmBuS)-*Tf)dG4EA0K446O)vc+Q`x0)F4gM`u$>QtC~##yRoRH`OBWq1~Z zqu4G|Z@<g==0;@K?Af5?&&*?V!3q5sieyV&&InM~eTdO|8`31;5yX~oKr`%*E`K5! zt-)b%Ghi2q!_OQYr?JEMZ1Imr|8yLKqXe*NKsni#g9jb7z}0AI&=N(*SVIbI@H-3) za@mZG)G7DpfSF~aw$!<+7^#yMXLShst%{FSkTYYpv=E>8`E<KNoLy!gclQC!Zf>5F z!;r4LN2NmYsQlg(HkOXW{i$Og$%+x_vq$G0dU55ehS!RL%tPXh{ynV{lrbuwD27@! zJ$~zx!z5QxL*z9v>6V!>zP(4>n!^K~<nl$yAno5;pp;)cz%`6W)~wfPCwzKg%mqBl z;$J-A8j)$7qGXsNl+S47!AjgUr}sfIvB5NkB{S`ZVX3YDx^S=Z*Jwo?BHNl{h4u^v zA3(E}VMf3cHhR;sNh!S0=Wwbfb%kePj8|;e=oRj&HwK+Xl~q?+AZZ1Rp}CiwA?sW= zC^Y{|h&3OZ-eBI4(Z{EQo6{(jI@Iu^Z&ABnH=gtM0;aBBu*bEzl<N}&ivs0{Z#g#P zT$cAl=kA=#qA^t1P=Y~{uqg!uTrjLyih98#HC<UoSCXyjuwZdSkT-Fy^Sw`vHyNW* ze8_vM39<E^&2NUgo_B5wo}<%T(xn1#YYe$nt$yEQAPZ!bE*$1=Fp$88LQwQLMxB=u zFt}1JCN%c5P!%Kx_3<dj-2xBpE{9Fn6(l?kZf0x!4;3O3G=z!ZGxD&bLqCqGTp7w- z6{@FZ^OZ!NI<IK;vBf$Wk=JYiaDv)?G(YN;Cl_;{gM>bhW^;4OH;0^k5jO9GN*xP5 zcgGlisyTF&>6Y-lfU2s>=jPOcLkF>lrBICw<?{F3EfsS6Gy0lwOJPm2Cko1$t47Zs z{D+{+nF{+<7BAD#p7kR>BFRz?+aLzHVHJiF61=L_t8)8gGUbr2492-cyrZ-T0eZT8 z1@9|W#KGELn-~-tNXP3u==pzRRDU5ea!nd|`{NRnCjOYHGH^LjV1GK=h^tpgB$-mQ zwu)#b6FMi($In->*^4;AX^3JS(-!rJK2*AO1<pMZV{~<hSqQ33K1{h2&qrKV-e`je znfygx#hwwk0_l*Aur-Q-c$)1=Cmu_O$0KcutRgMpg6Nz%0H;94Pz<gUdr^e1;j0`| zs&H3!Y1<}PDMP&ISD?60Qyt)#x1S}2tXIG#L-@tnFgGH(nj)5mFI1%ao6#=$F>zO( zHNd`6dqQyT0K5Vq!T0;=X0sR0&u*2!0yGk<)<8&p`nq`KxYPPw0MY`ZcEV`0+I<9R zht$Lq<0h3<IR-OFacJcEA?|Y&90>FiZ46PjU2B~@4JZ)FMtt-bMjDcbS+&N&F=6Np zI?XFAH*&@<0V1iUGU})vQT%eP-w6NnB7JF1Z<BXfRH&JwTpkwRR`|&VotT8BNg1vj zSA|DF_nKzKe6FcG|Ks#@_Xe<A6!pXX<x)VTeAA`6p!S>`07jT8QYNyX7?$Txabj1I zuvUI*j!-MWU_)n?M$qJY<J!P{1G0!*)Mx23|NG09SmiMxz2@UDTmbH{Zr3Ls`qxZ} zqDaG*XB*1!M;5Deb%OQV=CYiiyO(5+>C=UOtEhf^q=*hG*UkE;?^Z;B)CDhYc<=TZ zJ1UGx%PI3+giFW7+gJ@ZOGCQ5E{Ca!4e1~2N*hd8%$HEBCN}-lZF3LLHi4L4$w$Hw z(9tr1E_0MkCV0b&-f%|`Ko&hFR`x0)QO!=97w7ZOxt6S(RP^p5gnt4sT7l?6#3Nc< zVZ)^IG5nAqIS!v)o~h3@=J?x5r=fb@hs!)|BB{$Mbs;!L_(I4p5MB!_M>_5{q%0i% zvhjjH%lx_a+daI}k8%#4h9NI@`yHRL_oE=RryHWSp{0SjILo0G(Zds!d6Wx;VByJw z$aLnAVPm!@3M2u&g;jmV6CtlrR>3woSWwB=Nez`V@b2<=2dMH%&f>2)(LH*RQgthO z@q$t*KH*X$UOpI64E!5R1EXXLq%J2|5I@tIhIMVyR5~haS2CklYN$2;Re!N&U8VwB z9mz$`L{NW=Goz5K;@a)%Yck(Gic@p}u{D7T7@jR4ye)1aTzBjGL&?1)Z8=Yp^7S)h zOX4=4<gq6dd`=bv0I+n%BI!lD9vw?_%Mwf$jEE3YnL^>7G~^;%62F?hUnE8`$7<a> z|Gr?vIo#*$-7T4jKL0cV?$9N(I0X;%dO;BMz)_3CGY_Z3a*_l8py(nR*TKPLO+^UI z%o|W;y3-U2g~Om>vf8Jhf-lG*i(k&=vSrJjS4P-8{FLi-aW^kAd61<ZU-Gi>`tya) zErP6Jr)CydTH!pWunDR7%ETDk^XZ-1Et95)d$w|Hrh+mAIfmU(z7p9lvWv05@Ej;J z3&nY52lp*d8P=blb9PgNidVT%n{T6p=UJz_KkovW5<u^nS1EmxGv~m7q^`8hk&pBA zIaCMD3e3YaPW)Pf#)jE&!Kp&jq-1LVVeX+gN7=HLB08hm!--ubqi`tgGu=q)Nsr=j z@$!tg57OZ8Q~KzEIU~Kg1o0~5OL+0tZAnK$P9aK>tQDe4zf90o6+l5*Cu6c6^j97r zAG<)Et4FZEo5)qv9$_U5NzowXNOtMMh0yCwSfrFnpQqRum!C_IKm_dO;I}JiGFs_$ zNngZ|SkQm?nM<A5@@1UW$y;F|sjVMA#Ly=j5iqmc$Jg?!^n*%PLaXhEC&xA~#FuSf z`?d7_fc_Roeu@3EcsB!n|05hTtN)j%G8^-Miz>5na{W&>nT42}i}`<7|0k);%)<2l zPAa!Sv*p-ebJU=t(v!?dUdL>UN2BRQ>W>)WuujHoqp@qd{`x@@sZZ)1x$Q&MNz8+q zdm}&1eJ#EH{JrwlV@9v*W6-tj1AO+@#C6NN8Q&PN>l=5(iP8u}{sF7BxVVB14H6{c zD^x&CLR&2W0SWm{MrrB?CqYc&m~lV^Ar7$$2uq{ZDxT$&=R&wyMTA2^0fUK@fs2#| z3jz@)R@xI3;}StDFug?j4QY7?N;qg_NKR5sx;YFF`rAXOaPZ^U00cS`otT(}<nMht zx6n3jOkiM*5s17^3iv860jen?BwtVnv0=(eK*vskyHKGn`Rgk`AKyz&ZlbSaXg3`d zavylGGssC$qG2fSD%MT4VPIMd>&x}{3yc=%8xqO^@Q%unHzk4{3_%FK00jjnTui6E z-?kqHgokVAR~D4e1|-6JcFiqk5cG|r0|=Ne*mvjq$XhxY%mt%~4GPTFg)!oNaNh-} zJIW87g4&w?h&!=ckeYwZl*nZza(p|7OMAp1?TrH105f|;rL+}D&0_eEaz1hxP$yxM z*94T4dbHPo4q=a1)Jb*Js|$qi!i3P?yPv_teZ;OC-7nt)T2wfj;79k!4IzEDm;RVW z=SKq$AR+CYK}#uLg$3fFy=G5_7(x&*5K-`;poSVCtLO)P-xJ+E>F_U%rG1RdonV4Q z*zNFrNO};f$i~nT-y{#h+Fc=_KSJ?VXO0zz1IR=`K?CU_Lcvx8FG-jNfZKD%4O>7Q zzZaNDsy>X!JbqA+o0XZ~@66(n2`r=#@6WPtx1NvjHyQ76p3MM_k9q}R&@0%RT};p$ zI5=1^u~2c4A~ZCR-f#CJ6U0|4*c}I1_6!1i;#-fp6Ut92gXe&_{Qdl;9f*%MMtUx9 z^L~&xAelWB259hXFT__q^e1ETckk=h;o&#O-gkCFBOb<Ede%PU=eMNYB|?z*r>IbT z4IUi-SC-=gTHjZ?HO!Zf8GC;#3g_|nQdMEioDDH@Q^ePX1dIyq9&GDUP=OFq0ODVu zafkseR9Ighk0bfPN-o$ACJ5NKWW+XY0{YvwP|@)%BPLEa$2Y+(Dgs2?XNy5FX%UDG z#K3wqN+cnfFe++bJcu`{U4LGHJX2skGL&SYJjlt}2Z*~P#BMz}=D)p9e4~BFih+K> z^(Nv38r*WCLEq4RMh`)Ne9-hJq68XTa*FuOy~NJyvjvbfWB)6w!TRby8PTA@Uflf2 zgh6_@9YR}K->{_%GAVmed4eB%rC_F--Q9&1PwIJ(1XYZhIc><_G)bh&f#H@_Q@v6` zD0*Rt0|1Ed;7g@|NbxV!Z~n1w0Q?8NJ6Q2oG$YAF{YL=8>~OF@6?u%r$;7$GUT<7J z@Ci8*3FHgANHLx0!{AFS;8bsG7VmxoLa%ho0o|3-9pzcj_d{iH3nc)jfcmMIzv%I) zSD)b~AH(%EL6DdSc|?%7^I0K4$W=1nm@J9`=FP@C;CznX@e2`h7GjkMMGy7EBVtzf zq4+fdkefH*z`ni=`RUmIRsB8y_AT|@^*nG=Ge-s*^v#TVGOt%)A3#nOD3Bxwhb@Ht zr9&G$4F&5S9=N0Qa-AaX@6>m-BS>yZCH2t#>44)JlAvT$GDs9RH};``=tpr^jE}M- z7ze9|I}ZL80lFTsam_6<@^Ky{5xf&AxDj&I{Z3>O{j~QAEf#V6mW!Enjwta#u;0so zk$?xb#lL94De%_%iu`r{2o=KLPdtz*%_T*%`kS<Uw?;SbZ-|GTlG2O9vC$A}(C!%- z&9g&iP}KafU}z&*`C<0R3fWBhXdC3cgLO{Kk01rC=pO3Cq!iXv#CCTM125l*F*AnN zM1Xzp`I)>trMd`{j?eg~cDH>zSqJm<J6|1eg>s%ltz^wwR#6uJ>2|H!<0Y~Is+jDS zC^8xz)d-SvyqrCa#y5co@4M!2FkcGZrhLKAZ9c`*6Lbu%(+`!=5LhjR!nO6z{UZOA zR*HA;Vzm_QEo&U6zn$xEC;eu0k~_+xH!etcro9S$%iQ$H3Z90eBbb9yk5DR5ev}2B zDjK+B-fNc5V%7@eJ;_<Zce*_Uf^CIZ0kce`UxV1Y3m+0-D<QCh(9TnCtwgeK#VxD` z?sUBxw`vWoPB-f){pbgOf90KG|H)rJI8rgu>mT$fS?<S(`@Y?QLq7+9)sY{r-z}Bx ztMv3}dRcreRZD$wY+_l~SwN*U-(+S}=`yZZ9MwM;Kdu;&DqgTqPURu4k+s@qxtJJz zUP}bC3o=IrPcdX}8+Y9l+#-h-b-#vLY)e6}zzA|IQEni$&O<_V&(gRgncXS96Pw?s zZWNeSloQ=?elE+nCNTB#x_V&!WV!?AUX44vq4ZM!iRgMlwpG!4{S~T8R)f+iNK(g} zGmvjehO1ISw_w618fN6bM$*#3Usi?VywNz4#Zoz4af(USimR(Q4IgZ$5t&P0s@#wJ z&$bk(eS9+In_aL{;-A&Q?z~yMCU+6y9YAs?6MtT0XdUTeV2bCaJ57N?o#~+`yUyiO zzG43^zEwB9w9?8CpwKt=XBn~5jEgNZ$XkocnSD+e(^D1S9>gg^hZ3mP%THj_+Nnvi z$(L{v978aFN3yXpL^!K9!m+OHj<Mjit2%$blv1d~%)Yu*92v0%wD|aITP0&6BdJM{ z&_!b=m8H&aN;PRJYy2_6JS%};aV~PoL9U7aI4mN|rKCMYp7y?>WQMK}QIse7dzM>Q z#yD68!gFP@#sQNw=ky&^S5KWQ3%1ROCkBpeTFE87EC3n6(M1=c;WJ>TfJqE7b2Tv8 zfNLZF%v}P=2yDrRr|41~<`W73^+%U|ce+Dnm#)BjMOej+pA2FSZ!#N8i5*k42}Ppu zzUyy6JDcJ?$)v?K^0TN0SgL4*sK6zh&f8$shvTn?M;1(DF7Mr~zxjmgaAenOTN~Yt z2d@&!;M>*Grv3(u@wMcdkL&_}Sts2fgGcE|vs<T!+SHyx+f>$4fU1k(+v_l0>Gf8` zj(@TKa)*+wb4##}okia-W!Ji^G4hCFnnrqMk$(B|_4LuEcAVAeD-wGQ@DKxRiF==> z_JsS&srFkQ?TX~7%J9<Pb<F00=9-cFCno#BT+mBR_eogI_!vLC1zMF8XKRw!((QP% zkL23usAvV2S$hW(GEzxY(3eoVIUhh*IBXMlwMZp6T&^sMOWRu?ZK(-HYUlM*Z<?%~ zgs*$DDR}WlvYyGb@6=?TP%Fph^&LLc+E-@W)8*w^z3@g!5xSxaT^Wm*^$*9fiZTM} zuppB;56bNkQ`38Hw4>9|(#MyGDz%OIj3_3h-<~2HalFur?d2?Zfm0E|7DPw<XbXET z*SZg!-A9AroKT)fY_^01vVlG=j<{vdnRNUF5aj7&{B#>QcCNMXBb=x?b5%k8K9JJ8 z;(Eo4bu;W4y4ZCB7*|4D!*C+gPN`_FMRcDtvOT0cApJDmD`=Tbo*X{UQ3h;V=Rd7u zOCzps<fa6qgjwik4h7rJBW!`$7$?p@29f2M@|byiYoal~K2R$mrp#FB@8a%Q1jAO= z7vm~j%VDX`+y?3tilHtW^uz7fx=7#AB2Q~%u?7E~iHWq~sz}h{8kE58N!w$U%LV^X zV!m6m$QQVuVCTNcIs`9nFR!9YQCcAbDD_>|FJ>|R3aXcD8Tgn<EJsIO6~74J$S+2^ zOzNUQ#TTa1s0+RIN9%B*MAW9)CFn@hwZzRIq-)Z8Q+<L>-r2&GL{BjzLh0zxvHH^I zuplBqf1`bX=*6HfWD%B)Gc=oq*SK}Lvt!F-ApN1PKN<SRw8Uf`+KmHh7<N}q&ikpV z@Y$1I1Ry)oW?yrJXw5~<KM<Tff{U~cX%Ly7idEygaI$b$7!Wlip!N6_c`QB&JO51< zRdJ#4II_pj>up2nX{=H+=nytEb^NGkD$@*f-y<iC4T5Ot)|{b1H3}tC+WHuyPt1Ey zx)w4Br&42tA%n-_><Lr;+0qj|G1D<ouSKg@Pq0K%F3K7!vsK;-T+$@!o6XJiTR$Xu z)q7Op{gF5o*k|R%98BBtN^w5$)WaE=b@S7oX==?B(tt)@sl3$%(+f&m?RUFc$@p16 zL2@AtmI(7iUB6N9JTcfOajxXVuLy@DuTEAQ|4=}T^}?$*z`_>bGl5*!cWW}x%4u}3 zC11@5`KQ#eDl~HHj6N!Iis|q$68=^&K7x_O*QuPJs9ZVcPx9%0P8yciz^&*z&)jv> zm`DDPPDF3);70+*&NX9)j{~nU*T?Xb+6^KbFpM@)-_hi<PtQ31ZLzj?K=tZ{H4)Z+ zj6Y$&pp`Df8?=)fzx%=lwO#~?jP>>;$>}qjIZ8YTfxtZywV)Z%<4{<IL`INtrm2NS z7def(U9{DzRC#-RHbsLWS<*IvD6;n+q4@kEr&HqKKh(+7jfP$^OGP#;x9k+83ia`$ z?#<s{P>{I{_P^1~*V0|0yO^>Pz3f4RjcH<RU5!c<^JbZA2?)(g(c|vVN`8kkU2k;e zC?*Gtbquwns<4>&#Gh()Ikl#gnTP^2a07(D@7JX4QJ5cut(jmR=={8=;(ic*#(H94 zPWSuyRK(-R{_5Vp?N9Rl()YQj0E<aL-({Bva4kLUE8oa-+S)YLh{t**?wAL0jX=5t zvF3SwEue@SKKdmr(<1(bS6O1LsgYF7;Or_*CKGHlRAmeC=JOtL5Q{rpU_kU0%1;$H z>#m4N*{^jB8N&kQEA!o--^%$U*ig-*l7J2oH3Ho@7LaW7Z%q9~m8t}*z@3oGIPUu! z&)WrC=zKzjO{DOrHSMs_Z|9Dfrg8wr-eDZdKz#=2eY9dkS0P8hncF|*&h+Yf6bw3s zOJ?-AS1uJ=9avYz8Q-I&ZWm2C;ULDmh%H<2dqc6?7S-+Y0*&5FQ-n=O!q|*5=qtA$ ziK;rZj<B%2t_w@-6RfYg;zNxo^0c5h$L1ZDkHrjP_zshLNM-XYg%lu<0$NZZGgffG zxkyFzz{f1Q-={F|(j{pUWDGU&T&HtrPkE4yu{_ga`x~i~kEkQZp!{^1hmn;m$kUZI zem>&V^r4g@!N5HGw`w1gIRDK9I|*7FPn!!<c)4q2>>3<@OWxnMw0=XyB|-6+#MyAv z!84p8?mw?s6+6;~ozF1v%JWUz&#`XLxU44wY3c%0nWl}^O+S+?R*X6cmI$eZfcZR3 zw-LZ`{F}3*BOCkEv9pGy9Ngpu8+N2z+mhbm`?N}Gn?KE69|JvNP!!JM$z!cV+n*-a z>~(EJkt+gU7j(^la)SE#TyZ=HGna&QH2;eJfnGY0bhG-+h29~lNYY7Z+BJ;(HJa+7 zOTmrt_QO{s4uXv5+Ld~=Wg~(<NGfS&HumL72^@mPni^aT><gdkBQ@LVE12hfW%-I~ zV+3wcbWlP{*VC~=u9<(Izsh;h?vwheBks|G5&0bO^q%H4Incptca1kTlQRj=P37QC zVpE#qDt%JFiaF|29Do}xx~AACa+-&V$yQb2j-Dv=cRn71s?V{vi9;Hu$`Gu)UTJGu z7{0^p*=t@ew%{A{d%7K-c2<dGbw8<510EXFDE6FV_nbI@FUI4CKEB?_KjIw0k2(}l zs_VW6QL>o#0!^dopP$3!L(2Rx@4-w`ef^VmEWM7poZ4QdM4>Dh*>FH)yfCNkXWllp zMk#9o_-0y|oZ*360KZbbWJ8#6pzPGL??Y1%rbB8!94-@aKPh&ViP?DPyg1;W^shS! z=NEG)aLOmNgh~p=Ko{xuvu8K2)ssxEqHEKVT10FU={>K@r;`<1_;aD>@{ie`z>-<E z9l8^+dku5D>V;H-=WE^PL89Ij|7f}mKPupfRVB2iR|4@&T0KA_!4g}mG*v_Eu<5vo zw1T7?M9|~$S7=2g>vH^_y*SH<Yay8?CURKSefQxnLFI1*CENyuh2%Bxt}-J0oPH@m zUX-2>SK5A<EOpR$9gQq?=Bci)AiHwhVX<YddDeaPgM0%ldiP^3@8@VmQEb7~SA9ry zBq6WW>=&E+g(yJ-`S^bJWk%SG^J$0Z{O4s^S#YZr-m}IlKeIO$mMItX7;-?n3vmKq z#UV=a-QI)?+!ORn#2RmP;2)34AvBt)l_v}9)cxnxB%oeAFZ5sTuOCL%Fm~lyqo%9; z=z}L<T=9--+Yc*Aj<Rx1Wb)`MPg32raHhzPvr;;Yo?^?HrKEj#Pd>G6TEx9=giiO^ zDbyU8Kr2;`eiW-Mpu}B<wpB}>f9bE2BV1U{kzy_X6a>oB$Ol&A{hY$`m@z;uQy=^D zE_E*Cx9Lt#-Z$j+#D<^}O+D9}UR}UT_78iu_tEq$C4Jnd%j>onqaI+YP5hiA)u5T~ zOc#=Rf!8eGi^=@i)<@T9_F6=U`MieKj<+x^C~*D)r&@xvyl9Wl@9aN~ePfU(-IMjS zr#)@kcK5GsPusR_o71*!+qP}nwtM>RXLtV_8}Dw!Zbf~lth)DBMpb^u$a8KU?MEr! zoBW*mQ8TG0$RYkw<&M*6I_s@lPcdiywA8Hqcy3!4e8?D;7Spa#@Tz8qTS=}*g9BpH z{0LqiyX1DCAO)JN0Sh681O_MTcB&k;kN(<5SF%W1wtU>*Smx~-JV|Fl@hNTNdT+0Z zLy)&UoBq#bIBu))e}y0<)c#@zO-++D%0Ke}lf58kqjL8)psVy)Fm+#4tKq>DdN-gY zct#3(AExO5R(UI1RB~NdCe3x-mQZ-f>^hOUGKX>%IGo%yPC}3!xKmZX+bphUOwrm4 zDG9sKgIl6(x78o3F(50P_Bgq3Y1BW}YOuuk+!XseC3~eFwq_7SgDqTR#6_AhliDsD z-ZjJQK&kX|cqKiLWbSyLVkZv$W^d0DssfX@no2%btyt&)LncEzw21;{R4)OSX$=Z^ za50m&QaHj|l!yO3^1iSDcD#OlpMc+wRX&;yQhGyt;To7|;)*3{j45ynrDqY_Yh`jz zLcern={~AYRkxYFk}iMbf+s{@0`SCiG$(GW!ANl06sWgp=LxyRod8NK(F4&^uiH*| za#akxe4IUnSCRF9(RoghwQ#Km|3xLe#Wf|{zwlYD!!~DLuk^}|?}K@gHa!eSv?7gU z@XdnXA4{%f+Q1xl7pqlj_@koLk`c43m9Dhm@m2bzyq0z9#7tim3moI?dcX6UCbD8n zBp5hYZll>QBS?uyVze6-IH^iw?;UQSry0Y#i4=1eLrr{zR)B?ki9`Y!WSTota$_)b z>2j-(?r%*=%Ta7~QGiG$`;DYEj&pQ{zGN*EX^)zG0=ozTLzB3Y`FAY@o^k(-y`4vR z<rtjA#~iL~6;h#v+G%HYzbMkx!c=8b{3a6#4Cfy~q8z8WNgRjvL<mAuqad|oM%neE zvKpoqAnQ44FiUFxQ4M;M9<h=y>`bVSAhMGxtlMfy&N8w$3>ULkTfmqBCY0rp5;&*Z zgT^7xyBQ|BQWZb2K3cHLcmwYsH|O5Iu(BmqfL^;gSPy;$4|2gv9-dY_u87on_g3&x z`?{E+$;@KuFeQ&~Mp_P%{@~Kxmgfotz_CU3%Jyu%X?Z6rME!Z!pam$e?^)FcivQkp zLh5eFzFv3|Y68Wh;H{M`lGFF+o;*N=UYvGgyscw<T$egVa|>$cCZU*O2no>-R_J+t z$wf%AWcUFIUmmRpa?9_avJ7<g;h&*kj9e{GyC4CAB$V{jPP-?<7VfQ|c98xv`eetU z^sbhMyaBav042FAwg`d{AHg7c1J9DHM}aQODO8jDR|m}_RO$Zq;gmswz9XV8h9rF# zyUye<W>MS7d+FmM!lCGaA~X5Cvh<X4r?WvJeMOTxEU4^8KKuUSF5-DDCzpiFUMKYd zs!;>Q)zUq&mjZt`LS-j2l6^(aQ9<3+&U%?i<;$M}(lDYwm6t^(oo>n$)HNu~r!|II z*-RfmpDu0*zUu1oRc1@Tj(cBzm;jE#^z{)P)F=B&`CY=A10S>)a1Cld$#Ekkgs6Xz z?(<2U<C&q#ll~T0B?4=0DhB64Y%5~KRBnu~1EMUt$PPfJ=Z2qH@^=~`^Tk?ChwjA2 zp6BNQPvF4X#U|kGg!bkeE?ZvUF5{hV80y_FMdW!-XbY$yVSCDz^0^+MHDHJFU()qj zF8$-XMHU)1G^UfJv2Gj7HJPAP@Yrl`#9rL3VLXCO6)!A=X&PP_<09?)NzvnQC>}dW zW>==k-#&BMLxL}T(1^Tzpr#EF={OU0^2fvD&M)(P^(H=7K()bFo$ELJjj~hrmWib` z-$FOW<^i}r*sk5`-))ECBnK*6o$68}twnm}fYx%qj|Km0NIx^hHB#Idg+>5N`%Bk- z-C+(9`SreyM=KM(A3EG276R22@vl?#yHa`pAG~DpDeEKTN}lfDwc=aE)qYf&s!Nn! zw<JO|BqR@|_LSJgZrjY<v$4{6ltY~@!(9ijzebw(-hqin_tOm_=x)iMN{iX}Zj7?~ zrTI_p+<vm*Py8Y(IevV586la~g5uj~q-Jo2d<#Uh6j0vhH4k)a_d&clFB?xR5UB1l zSxlZ~D(D18Qa(MsYHtGu-BqQ#z+*5=t$N{z2%UN@j-6_5*!TH}i0R=(Bg&>|&8#t+ zAC1?pc(ZLY;>)7w>P-VB!mvH|rpK9%BnzEhuknVnJCE-EynH8)0tIOVx3J3`PihF) zLWYmWS~K!7vk7k#^uNe^*k<<-#YE>z8BW~qr!*>r2OKQBe~V?OQRhzWQMEf2HnHcY z4w^0U*nA~MS&GOQ`W`ICz5T`3IR}Uqrq@@gmH53J)(g)#-KlW4H435^idLT`M;AJM z(A_Txo9xp#O6%A)jCP~%5PLZBPt=VMq#7g$T&fH67FR~Rpwq|vDokwQ27#B@L&S=w zJ2+7krT;Tm%rzKCjEIgDZ$^RrHN#{hF%Y(0a{Kt#YE#Sz61Z?svo~Ebw^HlR85zCq zRh<U0Nrq|`*vDn6awQC$QF+%Roc+Zem=&c=qYi#a=0xB%sg`JhPv`lueDM@t@Gp-k zrlz*pgkaOQpmR^+uQ-o928h%7!(#Ae*f53%qUPL;J$X=4D{?M7qMa)bk|fb4zrRhg zwXs*n3h&gjTFFSKfp<Tu1SK&p|LzZi=Hl5{a{sxDvt-4E<D6f6GREq<z$-jtK=BFB zcA$QIjrhYPY~+?bQalh|4oA5x;i1MTgVnsjw~qYylrS5W;0y|%)!=_jT%IJOtJu%X zHC*tNGA8;omBs(3?1A)3@&;W@DP`I9HX@|H*3k_#{?yE`HpS<RsCq%=u#Q!E*#@6U zFsRSK`8Zi@9zIsVLoKRzd_x$B7q-3Fdfl8`an|cbgmh|$EUtn7@^cZzg|%VMwlJ<t z?#r^mqF+wnEMNK>+h}1_v`&@Pg1vgGDz|`}!5J9a-W{Mk*4(RTB2X`XHrX*Asc^M| zYeBl;StntWb+Aum{!n~vysx>P5@+13U)f-!^aq}PXx<_N0z_x<qH<!Yz6q)AGWoPM z8A;G#Hh-y&7V@FWA-PJUXq|F=LkMDQYGwOMqm)dx6sOH0Zd0$;Y{L2@>-muZ=TAw6 z??9_kXJ)!aNVlFKm}{&btqMaYkgJKu@7a&sy>(rV?T)11cxzN{sm_=@UN|@;HZven zdY3&?dvui<xFKDjcw5)tqgNGkq$9}*Ay4Z9!*j_S@a$WjXT;F<%JPFzgr8H3wqC$J z9<@f%7d>O1&u@!8>E2{*cA`)66qU6dPX~1Q-YwAjkQEu>A|UQBFvtv!9xBde=hANN zdO;|UI1s(5=i9_QW`G2lifFpP5myN^Ia(CJQdna(CDs0n*nygLIx#7zom<wBoLi|p zQOG(Ogi|0624t6qmYk<6V9Bj%hE3JrU_(6Yd$+X4^vk`lUrzN2jYs-nWvw)>FGHo} zOR+nqeKrcoFSNyJKe7fH@yWod)Cav*CKCcR@UTx$CA<%J{k&hsAG5Lc4j>=tp@t_W z;#g2JMCYnord>x|4$rFvr=0}+U}J~L1Uo;|(lXFs(1ty-mxL$OY)v_e?I9(L^XV_D zc6lvu1)ZMSz(5gRQdX|YLA?kSo4s_1tG%Dc1ia!h-Lr?XXA`>j*h%eGswmoM$-kV< z{QI`x2WJ^;8v5_se+z9_fans$1;0@HX=^^Mc{c)5Riqk#WLDx;`z%k7KZeg(1`!vl zPN<+_N~J*~JYeB7^Y=KGSm2Mt5)HZ-*AI)9m1Q;zupVmJUiA-HzcpLAk$-E0;&PEn zKOo_zM*5WUA7=HwOx-7Pmv>*W<d_3G#$wJRzo<=`Yt;xLHce(y>qDWT#f_R(?>3}d zDJp2Pi39XPpHv-<8dF$%aN3{VVZ$#-wQ>^tCZ==birrl=V?8eiQpJ1MBta$;`&X)N zv&pWlS_B-=xudUR37Kg`s9!$XR(PZQPZO#(O?>$7?p=sS>!Ro!na#xl*%FJDSJ)B= zB}WiisOliq#+7yi?js87#UkNvYEf_`anm-uK7Ub~mN+er$~q|t$eAU2u&GfwugEKV zZdZgGn89qB##EGs(|v9Pt68<KMksF#xWCG2u50xI+=ciw<o!(v&YL<Bj5`g947?XA zL~-_6ik{vKZhg6YsKU^cY|5{3swjZ~*+^@rOWfru60zvASCM`_S?B^(5fg^%9p{=c zX2W26DDI@na16uEqj!Nb)x&JX!!qRx%j*fCJY5>`i<nx$-lK(^`<8!)1kjY2r9J>e z`k58%cOFAg9^qq03fZcZ*nP!^je~qm%JLJf@3;>6EDrqVtbrBW00_rE>Gvp!+7R!0 z@ak*8Olg`uSBytI<LNu9tS9Xlrhv}l+kM#mK$9Ku6&v^7tH~Qbl^hGA<*X}}))|7L z9H(RYlXRINL^3FMdy8eZ1`SA~aGv%s-+Pe0s+3I!#v7KTkr3x-=;cAR2cFVwp?gJ| zA_C3XLaCg4(Ga#KG2j`~`BiHnfOgHz{N1s(&`WGZFs06+>iD`x!6#~s0%U&P{=8e4 z1uc@1G-PkP7&7lqK0zroMmq}sGRqqU+Z;hwB;*4@v~F0RZHZhDZ||=G@ZYm4C8!&f zHI5PvW&|rqZr&K!x^SPkENo>T@#S+RcZU&?Nin>XTof`?pH|!C;aAoW)^+}dq(|xr z2F|IUTVv9snfWz#)Z@?t0Iyq>2*E#`TDrnKt&$~wSLd66*w&fQ1fyqi@+ib694_+2 zxp48RReLibyE58TkdzVWElTUcTxqstQXMgc>iFzKnQ{GWIuUhrqE?o@drR<fAgMil z+@314$uMQ{^J)oV=F}ux4SCAl-vqSy!@-_N;1hIjXb3Hq)j`L!T6mZDQ+aO{vszdY zsk<f`{M^i+<=>r{3~A_AFqf4R!gX$uTwO$Ubum~-e-M~HoBF&IGHq64Z<}=UrddA{ zue>QKVYaHKP*s3v<hz^X76+_xH4P;aLxj*D@7mHhl$I>xOf#G7?fFA)Gv+-oU<PF{ zg+C<qu2F&8DHU+^YQLYiyL{`-z|=KfB@#)SapZ8`7Hs-hIVzq6LQ+TO4_a%Kp#o?e z&$Uy$)Z;Z(l?xha`MVm4(c0<KIy9*d?B(_ILoapAN`G=*$l!H8aJKKyPFmfRbm~1) z%7&@kh16e!1&+GU-B+ok-evR(PjV`VPTFil5`t$8^O*2<I)drz57SIBlj>kjq-b_x z4OPZGFeE%t$!!?9=XPK98GzaL$#cO~P}wyia~pUsajwd{miWGtCR>}o$G35MxR}c| zVaXaS*qKtx%^<qFy*7!z=6+4{kM2txL-MO|r^Zohoi#t}3GISkfApC)KCuc>gB9$N zm{+se<h2HMuUA&Xo%(QHRp6x`EFn@NVyTg9{*d+SE_~71KZyFyqnt7a8(}Yz*I&Ei z`Nu@AA<##RJCCQ`=(k>1+&VSUlhvxVA7h#-%S^_s-E90l-`|&&ucYL4!iRr>{Sh^i z3dWDlFsWWk|0&Gw^kQ$$d%|H5M&X)1&OQFX-d(QToDY%P*@a9WNnLR-i^CB@OcTNT ziB2fozH2!?&$mH>0SxsReG;h@Uh0<0ovWsAFXJL91%<7rlUtE1<HUB7?o$V|@6az% zs9y}r;pZ81)5u#uWj1YJZfLyc)<}4$S;Q>@G9@kY*0s6Svu+B0yuTi5DYTC(H#sq; zL@160P2Zw*dz<e?aIrE&(uhT~X@T_TLNm;@UC|FroV1N@(&f3!^lB%JeDh|)^8~}a zg*H3<tD(r1`5QV7TcK3Odn{y@rs1={y*l&EFh!n`fgo>1?siKK<E+4!uAi(KyXn#) zejhJJhE2Ac=an+Hb*&N%B-vaMD_zDDE%K+<nPA12ENCvUu7n);Zn~6eu|q8-7e#WK zmbvpt*%cr@0masI!|04p8&2jI_{#ZI3|JcqewFHnlsMP@RiT}%I})oSK5Qb2F??lU z-v44-RJ&Kd7na^QINUP3Y!%Kks9Of4Qm}qh=qWx|86vdmx2fFMAIg)3_IpcIo!Uh$ zA3}rE+HM;mr_ji)Rbsy~wxsJ5gMQcOjnK3$P0<m3{AJ88lxA;Aa}OBpv6T3WjrXHv z>efP-sd_!X*VFp+=lZJ$^gXely_ZB=+pBk#>s|`-z|Mdn1U6F?ayYtYucy_=LcYW- zOe9s|$z4@}pZt1rf9j-7DeI&l{kn;gJ|6vXmS(8*SotpH&65#NDz&!+*gj@-FDtYJ zqD$hbekP7Ac|eokb9cn`Vf^y`OCuK+Gh~V1YnY>_`pd;KTAxaQn`!u4n+BSE?SZM| z5OxFHHT7u)s=L}#{#Bc=`E8f}`O|aybQGd3Rrxe>F3Q0jBjpTvgv2vmL^zDz>u-L7 zEQDRT>5zyvCi44ck3TDJ4IPcwCPP8W4nlA0NjqG4R^}B8+MU0wID?0(mrmSjqYA)h zGg_Bmw@G20A{GPiV)YgFG4UpY(s`ZXN|Z`9`+lK~_J`ggcD#!SJTKAKB4#4+gva#@ zq8Gbd#5A1gN@2G*$^0CcyCbDNO{eK1?-l2v90r6GYBV8kBU9~*-rWeKnaRw~wHakZ z((e?Zd>)Rt8?xD&>=ZjM9r42)1KaP0Bi*qJ=2EgHras#O!=Y9ypn|N3fM1_atNcB* zRH0eh`fM&C=?73(t%MHa(o4}l@jx4N=w!#eX_x&aayx|$_g7}AI=e9PC>Y`n>Nuv! z>SPQiNp_}?`+3EP^aC~NZGK%+lPE#~z~fbn5z;PV44$5jbRe|3DPttr&4_qjECLQq zEcdYE)g)f+_42S6ZwMZd%Khr@TP&-p+KD1oT4#%vz|oe%!SUb+)4lj&kGsDntd;F5 ztk+CbUnk9sWAbUW_nGURz-qDEW>Og;SD<-DqZ-(mFN5huJ*EQ+f9y*{Dm<JYI|5}e zIdnJJd0gg#rwk<>VtkvKKw4d_#EHqok-_aY3SaCgd;1A-IC7kizkBeI0-ij#Z&i<n z-jdnSLmi!=8s9u?E-F9Q*_(uXMfY3PTFUvtG}UBy=wJe)%5Lx{r#Y1RNZWD{_<iLA z{Th_e;mQ=+psP+NG&wm(P#1`-2x2kz+Gs%M!_n`<mS7&ABjexP46sEVI&l|M^{m|E z`K{$xoqKDCAJQP*S25gCxoT@6k+iXe4%5TqcI!CrdpnmZm6d46uizZ>6Bjs4!RoZ) z1MNp_P}g3=2DOOM%_d9n!p;*uvPfz~k7me6Yuf&<P=Z_1b`zvSwPkIC@y*r0Beyaz z2BZOcstrd}Z#a0ik1Xq4-o0ZQtLgikIv$mJ>3ba0ix7;h0it<<Y#6tfy+U?T9ZHUJ zz0i=rTha4R9}#Ufn|AZ2Oq%F&{^RE?SNWpK{DvvbiZ|n%rk>aytIs<92!&vXN4^j> z(X>z#%YR0Bai{f=;)dve*z^1|*0~IIbmao&LR}S~R#iuQ-#y$M2PL=lyyx9mIfypA zH5LNrE}gc?U@b$q<a!^M6JDj+G%6=Dn@?mu#w{-;OJF!<a`0D8=DFeoNY~6~Ha-3B z><c$HPG7-~CAqU|21ndEICDRL&lwCo3zq6<Vs-UHs4J-u#Fb+BW1PXL4Z(_xh?*m& zd6XWlM<`r1Ft3WFvSwW7HVV4oDCwYSbEE}rhc+ax_SbksYe(a0^<G@{<3B9VJyked z@XI6e?2ZJdCTKE!&710Ygq9}-ke@RXKj46@FQlQz1+|`p7Jgji!$-u38DUn*rYe$Z zE5HO4K9Wuj8SR&h@pV3j+8UF(+sUL4rzCxRMpvH-bEg04mR-~slope1om%Yf`kd>@ zY$8#o&QYNO#7d8$2<H2`lmfhDjRFv=+co908ZI-k9wcs@T~VITV~y6y^2n=pZKhpT z(ZHc~z>Z$vYMF9#h}a>VPd}kLbdJ|#HlSSF4_oK!I$7cmH}Z6wSDWZqav7^Jo6WPK zgAxY}2WZ$9ePBsQ6JB+dr|kPkMebTTC#u~ee&PmD;C&1>3WU*LzCTM^^@43A6@)w^ z(z$i<c<F_dsKzx>MkgN*qsEZ6KY9-@4uykbdDolAw4~&5?#UbEk3UsbaUC22hZQj` zgF0lqL|p3qIaXGgZ)FbU6PI9h3I}gMme6T9%UE}{F`D$bGwOMa35UvM7C(EqBtdDm zF`8LaTTf!sAhHA`xWq0W?v_1*F$hBCQ65?A%>Wvq*-_OE?eL?$LUW1gIhYQswg=UO z8y+1}3)3AuvbD|$+i^Rq*-f5%N4CH}nlGVw1$l?eY0+J>qv13IQ*4+K=Npb;cDZeh zL*gN`VeAK(YC2^S{|@0Td>I%p)z|0j-Fg?Sd;#smGAjO0yy0&qFuskxITRPyznH=d z_zX<+tpBnY@fldy|5Nbjzw(9|nVA6i|8_vpiI`bB8rkF1iCF468VMO0*cci?@$f)7 zINBTOSwXq3MJhl86y307n&xt38rREez7q0M%H_}xIZ8C`OOewJjw0A6C)f>+CL$nF z#Lt(E#1pO>ex4FG3a>aKEXB!|Rx8mK5>n3&yMS*#y=NW2XSroDeSN+E^}hb<{Lsz^ z%i1z_)};PvY(Q=;LZndXo8H`s6$w?M2%aiY7#|Vg`AhSsPeXjfQa>Vvf3C6)J~lCZ zAQG$SPZb~r<ccInphzH7RON<4Wkt#yh0-KEzmx$efPj4<^u~xTOK_ijTr3EwvP6t7 zk2M$%jvvD?=nOSYa(dLPU*^vweC(fK*1x7gga^X0#eQ}$zya@%RSTfkzW`{P@??>r zz%UTSM^lJh3;$5a;sfwpd*xLLLt6Qi7;Qs@ZiLJX;}C9kiRSD=*oOL1VnD$I`9p1W z6(wX1$<dO2>^bdRwxPO)>N#R}IAiNVk*0x|8m<-FB3UZogW?bgV#ARl3YH-92LQn% z^z{UECPjqo75xxsrNk#r&<Dkf6Ab+YMfk&@RM6L|8IDgV2<cIr9Z@Jka#UWZq%1ZM zO0Z!S@{mK95FuhuK8})CR0!B1w2O)YsUIaL1sL|-b)SGdxtKD53Q56Jj#vo1okLpp zC(>y>4f+sJ{8)}!RSpOMv?mvvNBGe<S{^2v-Heh+PEaTX9SH<i4jkL>Mt3h7nKbBt zzK4VnKzJcJyv&9e3EuJ(0)pR`-an2<lx%|D=0kcy$3M`2Qc=L0nNR7HClmN*kR5|! z$p;J`7Q>)Pe0Fv6eBGZoUiQn&TG?O5Lx#Xi4jj1(!R#Qah#{fX`>p~bLby7%T5`DH zNzuiU52prWcaX5?GSs1vFC0mnBIIb`L)k%BGDh<310hd7<6aSW+lp0Tcf3J=pCeWn zb8RPVxZqykd5HxA$Ls>*fB%&H3%BwknyvzCLf9~`+e6DPbOnf$S@osVD>NZ8uuoG4 z^!R4jh|xF%^3i9~Nq`+)rIFOJ2+WrlQA|7!Q9TC<1Uet#eIQ71*zhO0A#y(?)UWZI zpFRD=#EW7{)jyD368}6XsYd-KBxo|Qv>!;vyEZ8Q*`G@vvheX^Uscqm^Ou)bO^<a~ z--R&jrsn%ndkaq_>~!YQ*!r?Cd(GA}qx3M_YT}knxX;(LTJ?!qzOa9!Ly13Lc5v~a z#-v%7qZbri$s%)ybJFAt)u}p0r`2R6Ryr^SIh*U$I+eByvRBh1>2`YXLx-u@wWBdj zR~&E5un(uz=pk+0(m~q5i&-0$GJON7DB5}<+VOgJb9uMUUYpq4RMU}D98debm--+# z$NjVhyu<Is7!$L5ovsDc>QhOdR>sEs4gIaO9(7rphmH+#7uRk(#qGxvv3-2A#OBER z^q6oq4sVMj7MMlR;0ACOlZX=$qo?=Er6~tC+ve2zI0Sh*RsAjI%h@3ujd**^^RCJ^ z#eJKq#LpFWdf}}Wmtji?>NILo#~c)}LYz_VzG)8I?;X&MgN`lwsUn!{S*5#fSrf+W zN|Oc^)?1j*6;D_AGQ6)jM$bUbqT>b>*Qa6!Tu#u28WU^H6QXJw=8NKoz{y9M$qBWG zor9~>-kqDC_ttT}uOt^`9vHJNqtjNn>sq)xpB92S98r@rI1ketq#by^i4d<MZE8<O z>I;sUP_2UN-eqRYVU_2J_DzNG9ND&yQyoZV$sQ^Ft(hv!P^0T?pEG#(dAuKJ*%Bd{ z&FYM8uql<oPkJZg1VJcnuK7-7$vTn7t2a};7Y}TDCSfMj`b#o%y0!AOFm1#I<1&G` zZB5AteZ!2YgC7a8zDdx-P)2g35mgvjr)NuoD%?&mTGN{Ctt>Z72Q9qnz>P#(ZZt;2 zRSug;LC;h0ze~A1qvorG|FEyKasZ%1JI9QZud58d1+=y1)N8cg?eaKCh^ExoYO^0l zt`B(|THm$co{qj&i=Hk1pyklrjq220uOBWQ5I>%%Xg5zga*d<Nk!5=+7s|4JsHIn{ zwcXfOgsaPJO0>-*_XAb0rpZVrKAgl_-+O0Yr8fLQs`tS)ITij~Ip>CAf$sjG$ueHY z>er!?x*S&r6`!uQ%(_Tq=UmmCLH=#D`C3%JLMvZtr-Pwlic8?lK!Z-Ju{OqZ!*pHA zL*k>PWqUhzd(2Ba3SGAvy>*m=I-)ueMWWyhd3<JS3NypSrTY*g=>IqUx_pHQ(_8?H zEM&i62h6QmGBzFfDLNXeNXhseEQ3jGB5NUSz~<TNv6DCR6t6LQeI!eL1`?)?>KRN0 zMM+9x+oaO#!cZ^hnL^oBakb}ge(B*5k8zx;{+=h4cAwO~et!*<&1NvU8{=w~NOiVW zvVM@4G-xS#l-lc3S8nMM=sNP2j%Tg<w0)}tY<kiT8zXa-%9YVz^&<p}t1VZxkqp-P z=$+YTX*K)x<vD_eZOnRBb#sxl72@p7uJm)N<6g^R!hR%WXY#&EKHD#Zz2)!L(A<h7 zs)BzT;?x;?)ZdO{EuHngNAE5U4GKY`XP%OvL!moqJnJ-!rSWc#<qwV`w^KI$dY@Zm z>1%E*9gohfb_%m{cf))XbZ4>1y;)U6ho-G3>v?12e*S)prqVZPc&$y#`e%kxcRT%c z+Dx8nGU&U(3AE&GC2lVx$;^ckHi}G)E>*hcg5n96*^T_Pb<fQBFBFgE){C+e4P|Pd zGU=BJ#wA>L5RXN;udssamdSqTrh^D&nQ4ueoDa;p!NOazedZ9BJb&IORosf?_i%_b zjykwR&62I+O$T|RoRD}IK-oHYhMiai(@)53bq==k_5})&a{GQ~9f>LEUslWG#tqR! zRUI{ybxo!!xB8*Ab*8Bv4izDiT^qJ4(JQNm5xtG4oRpeS5O80O32Lwk#|@3dP+dBx z=qfQaxyqU|to1m~wGvX9Oyl<p9`C(|k*VEpj(1ZG%Tq_F+~tb#ToZoJvaiSIgnJs= z+?lU4ifIT*m{Z*98W~(pYcqq(%8_^Vt7pSBf^G7mSEtrv433ipGL!Yl9!1wz<9uuB zAys#tN#<DD=o>3RZ8`@Q-0rqJJxv4aTEmWSAVoSBvLokN57`H-;IhUqm$PqX3-pXr zBNAvUOHD3BL3N19NJf(L#twHSY*zPI=<=B4Y+TehGR4Fb5!H|!&Fy-F@qyRiyn$y4 z=AFWzLDxpsJl5-yK9a9T&rs)gZu#TJjUKq~BC+o(yORwW5a({0O{05@QKAJlzrDrY z*t|z)aQ=tvkLAB4e~NClM)-6x`sNCbR#0@(_zd*)|KxS{4vzQ$7N&otgZRws3~c|` ztnX5DT>*=|-siYFW!T}YJm<aA+~Pb?LjW<3ItHth3!Mqb$D(GLwSDyOV{to)2Qw3H z0IbGnzw%(6$h>^HkC$AtZ;L-#(Jz0rreDfvgveuK0xtp@a^E;w4>Sez`EC#`a0I#1 zPdLFb6oI>%LfxW0dOtJ)3w-Dxddw_6Ei}hmJtaI{5>>IE8bAId^dXC&$oCV9pw9IW z4x!FLHX8l@CRQco$!7Eq0X#!wd#(}?^J;3qBC(u<7^Tsc`jRp!v1dF!z~6QZfvOu~ zjG==Y654F5X6S2eYrtUBAF&OYZ?K^*bsca|xagk|n@n}*YYfoigAl+A{OQV@xh^#9 z)m&Gq2ZVLMz@2xz^gMlSHi{d-a*P|}gnd5=>wmoOvLXXLQ)mIT_*NKGp|6lp`zx?V zajM3Z6S}Gb6GOBHfEfdSOJ9Z(wD?9Rf;al6LBGIoAV>#@0Azo(IYXP~6tm3u+6O-P z(w(W1`$2*G2Fas3!80X@TKU-rCY7knbk77Y2~_qe=Rz<!{<wtP2m*RvLBubmhhw4D z3x-5p4v9_#pdCO=gpzTog?NZq)B<gje>amg70x*X2ubZ&X9|WBl=I*BMY>P+n(|3U z2m8l&f)OA`0r()mo`J}L_z?gX5Nrsbp&?uWpiaJrp*diE;5hlOs23cnGdR}VfSH)y zSYLAAHFgLMzfUnZPC8wO9B1D(*OM7WOb&3fm=!|Ui`ae+jqZ=SLFw-3asSRstt1Ug zmv1S18{_%DfMy(<+WqgweVGsA6aXAp>_oJHt*H}@+thqs@OqkFiB8mY9?w;OB~p4E z+wg^H()@J>R~nv=H!52qW3!aZntAbSV~!#A&ug%CZat5~>;P}K56fcRkU>j(jkyXM zS2oNjQnG#RZqWDOL)-p(HTG7Z^5Wr7n|c$n`mG93n;t(J=O1;*-5>HbAU*g(WgvkO z#a*HW255~G$Hb=a_jW-idU&jTJYDQxHmlL$xY{6D;cPZ!`G3XPsd)Okp5UOI)xFaR zV13&(Jpa_W;M2GvneVdoyvg|jFMlilsNpYCoZ~Q_6-CJZg<*77`yp!b+bak+@eO#h z$%+IHhsn7&_i$rrq#21t#CIUHuMeb0u?VtAo|h?w-4vq+!xV!9r6N6VK1_4$ujL7~ zzeLnR@SXW=9NP!I8&l)4z)_t^jH8;!m3ph07}vp?c517dv4ZW}IRr*rlay|wHiYUW z9=z(vYl8)(GDs8j1m+GFa65s2kx?4Q2RW!kp2>|PehNhKVNsIk!^A?eg}K5Hjp3qL zUZ|dp3wwg={q;=9MbeZORMMjmy*jS0<2%f;{$$-aH6>%qVEK259s?sPyJKFctSX}F z{y5g)GlV+u^|8{5Hw*zK72mJoiejy&%0#Z!n`qVPp{1D;Q(UHNdm2%P4^jTbMC<L; z04qw5agB^Oy*j$^-t@6WMjsO&%2wrr35&x~7I?Q3vKQsF<34zJ%=EFjv6haHQR*BH z((AZd-Tm?EujT7MR?<{Y9$?NspDbM~UTrjHp3i1Lov*gt$-#aZ!Df{$_;L|s$;X4o zLBxxhn`j%eCc~di{=T}+x4;`VA#OV9R`8=~t4%t-5>y3yP}|Vx0Xh0m=eAWWh~$|H z013x2q97m(7gUvox!xtunsr(^K=>zs_bC%*y^UTO*l6z;MJcSGb5f)#e+FQRMWBDf zO~>*(NJSeCA4;?K*3GH21M(4#AYAN1K`yE0jLyaV8nB;>kmX8VEiLS1)(G|2M3E6< zeR$#j;>St&K7CnzS(So?EW-1%ii5LZW54vWoN--<fCelwM5)4MeJwxg_gsD?(I z&)J2;m8lB)r3&a|YKa<Sl6QxPR9osEvs^dwr5?;K!Ql7MzjZO;2=vh%kekRC3JDNE zHpa-Lk$~}y<`C@`tCUR%rN|dnD_@`_jdx|N=j|_JTat+ttwGe%_c4!I(;F=R9%?$2 z4e7VM`Oc~#E}C<VWI#Fg^g_fT53^%})`S?y?ed%PsoBn8bW0gi>Ghj7vF4~^HA+x& zfz~g9xPT0?+uW`W6Cp<_aIL{i+$Y)WPgmjKe8RyF?B}9TG{!(f+`y649uNf@689SI zJL>Ztw<zg%c^1sh9>G)>4H|Hb3~o8FuQ3iHXs+0bTC-hK<jZY_KbxUOs`F_NAuRk# zUVrfbwxtg!@XhG&$2)M)=Zxy*NXxH>`0Z1{Tp}D`Q#p`nKEvHLh(O0(2m<F*4^;YR zpD{iRJYxbqYx(uSVN*Y-%mi6<QtsD%jUdEm43UPQS6-qTA13n!O)C+&6zmctt0^-D zc@8d@x~Z)xH0~VN?@ck%5;o19gqxrQXCM(=!GcG71Z@y7DIrkV!p57*AjO!t{EAB1 zS^qhvKTRdQmOXYTmE`OMk>17JSBm*0oZ)E^)^M`~bE^XWH2Ib91s0cb-u-gMm9y$B zC-6fAD33W561&)^apVlEfpI(a5RwDTaD@?GAZF`zf4$TRP837umoh!83+Gjy(=%K? zrL4@os1rdJs!|F@#*ZC(?mf-HL;=S-svc@Helk`C;<n^>xhuv3LR<WRI(Ff#5ckKd z4-HigKJHaKbq!nebz83*H5t*^@+j+EX7HMvla9TUg{=J2T`_WC#r`NsdqjJBg!Nxw ztbfqP&@a=uDB@kj(+Ny{x9BXG7EN#J-LNX@eA1VCc~(q4yVpc2@$tZIf|l}{-TlU( zB<6RoOIHY|pY1ZjSga{pfplS@u6xRFT_cD!^W9659Db?B5a8OlI{L=7@C^c_fWm;` z9&QgD)0UdiD{&BaEwthRO-@Mjb_fU~(Ii9Oeh9swcb1W_P+1BqeOaT`EX$`m5E?sx zsH~`NSyI_wTunEjvY<$AAq58L{$$kE`ZoxQg=zr}FCMZlkdCqg%8(ot%vGT%xu=#4 zC28ncIK9$L3`pVEdK#wf0;Y*W#}<+ja6)_Nr3T%3VIj#=<aH>hor|0uGU>__&LW89 z{E1cgD(T~A0y!T^&Vmwy{SZjtWuF8K`bB)bnxJtr9>2jW!f*TJkN82gE$#p^d~v4~ z4aSNP?tquvMIp4Gf>a7@O-m|m0zB-PtwJL4dSfMIZ&5B#sor)CMUTE#*niY>-JsWA zw6QiqmQK#v^732|a#xC<wmtlOcD#EwW0_koCeM->6WwT?zs#Oh6VeXz9lRr%>%@~( zoFv5ynf}z}Cl!p#QQGQbQHUvuv)R>7vSPIA0RbsnQRA37KFCAiP*IbWocug!tCi1R z8giokT)JlcZi{wQm37CBcCyAWAj!5?Lb{yGh>2E{5WSB|FA2j_Cw~ef>sYp_Bz7EQ zHm0_IiT%lCL86dn0S;qQ%Yyy^ti?SCSx$}=<>l$JEt7_$@!_SXJ}<k3yAIf+k=Nz% zKL#izXv<#7pittN`c3uvuCi$DW2RvMl;|0V_8x+Wv!(>8VT8`!(MRVZ!HZii5e*3P zb_cX%!%O33IGfeFDH0j(E#h2#V%`u9y7JDTOa^Az;TjCA(TI9q1|KDbaVVIzcq{~I zPDy>RYQsKPio!KRa{CYkW;sg2#-zFyWmNc6#}AgV8ForcYbDLuHM{F-J)Jz^0`ZNg zb4Q3&l>j2FN_53zlZ%D~zFS7?>kTgx`DWhJaXb7c`e#^!gdSl=MsJY()Xl!MD0-<G z31)wSp!U!wrOHJOq=Ti;>8vjg{5w-a1|(*T=>mLFCD%sYQlCs4iWJl;V-@wz7Gecr z!%NYz@&xLdN8{?KN`s_yqh!qFEDavdf6#6~Y#Hcshj%KX@#YLF9c7OIIoM^c0rrqZ zU>n8uGqSe*b3+EPr4SMs9qD>dCKC!EddO#}S#;>8ep@I!!r6IsvC8jO-#b{N!3T%E zOYFE;yZ0F}BQr9dkMgN~?r~4%Fc49fB1q;lyYQoIPbTuIz^x4P>6H=({qToCNF?8> zu|<`j%mfDWY1^BxT@layB>;*^+BwXSZCu<{JSSq?);_oz%h=>sWqOBDq1V&HLNT|q zDBhkOJ&?$vwSMR&20PQkn8wT&6<<Asa7^q*H95IVjM-s~q*I4CyC);`JZ9#@h(0Y6 z|AI8P+-c!j|8;a29>4!}fqUtRjI9mhkvuOT8iw<xc8O#VPKMZt`DHk=TS@7`aXI`g zigRdf^U;B=sok63tO2vS(@qAggFEHk&;NBgd00cO`x>w2_K8bXLG#2Q1<V$}Qss{H zfpGCvQ*0S>S;yTp4Y$Jdlz~&Ha>3%!zg1`OVF2-z<)w?aig8}+;LLOS=tF1He|K)V zmA#WzG5wamdlIZw6NiANyrub2q*C#*-^6C9v%1`yP4fPoq1H$`4}xE~uo^C31aHDv zOR(w_nGQ$%E%8S!*4A{_lm^d-eu7A^p-4~iNn*3)co`}Z)bt)QR*A1OtnU`NNb)lA zsqY>iJ@Fw*g8=E_ySboazgn6a&+MNs?iRirfx9GMfZLiXzX7c6<|=R|TFcUj=A@P+ z!{<cv^un$<_qX%0`iuPnc6D0$Yq)(L+UoR+)9rrmVv<u}!s&-`9J^$+@1GD5QY|uF z6DPSoj=T<bkFTpigwVR}(=_=2>IWCqwVmybQ3>=(2Q^pHKZhNHh?&rNLf@P6Rn)x0 zw^izUU-TcAC;RSEiDt!71)KLdMlS(GJt~|5<Kt(iTpkYGEhV_d`x~p%$MHwg^&b>g zjND30e;jyN;1&c$SyFNJo?IE*S}vz)!RK#lo-?Ivs;fQfdrwGV7ap*DdJnqZyt=;j z4tJSmu6Iw(Lj3i5$>jBDz#!ymQcI!an3Oy<$yFuPRBn)9TI2><9m@d0TLH-S`3BWk z#`iB_T|SRqo?ry_J%88XfXDmJH{~9mj`A{ozvqiX#_rKQ!S-7+jST5bv{mCeySTtT zKk>thhG=;g8HQnKzH|ClsG~433IkS4Lvfz$5j3WM8r85nvr~A~+sD;(bXD$|azy;3 z?kRv9R6m})kFI`>+CoA$ra&Ac!B2pT1{K=b<R^pDKr^k}-x&<)JmwrGmL0akKN^ih ziYAUhqhfAvpP^|}<~3uYupcvaQd{Pr)6Tx==2!<&i*BD#y>G?1hcJuY=1e>IvmqHu zRqeifjK(eS!=Y_kUisO&vxAmH$i+G23q0bl9wB3eeJsiCi8ebPFvIekt1Bm1_WQmw zGZo!bh!D3=DALJk7myXg;F{g<DyOWA3@^{yvxJB3SSm^!hrylC{gQ3RG9R>r&tS)Q z0yTF<OkC&y@G~ul-iTl3`E|;UKJIsSpYzRu5~858l<vYaFUPODTO}!QiV<USyH1Kv zs38^;$)c9>Xx5dkpJzAy<6ic!aH|Jg+WUA9yuo8yst6ldBt8{)Uj$|;aUVgW%_wck zVm@DQ2M;W1ucP8B8TAw;A-;OnK_a)eJOb}ipkFK^HEqlmV3)_)TOIlChX)EKad=^5 z3H$p#t2;N|j<j&(j`c(m_lcqlOfUlmBc9!ZG45OGimk2}g<OA8`|t*~_1q$X>N;?z zyJYn64=L@Q9(TZjj~*|7LHX`JBMaL_^V!M;NLQj<Kk;^Pb9wR4(8ws`d-6cub|>Gw zltV=S$f(Wi`IeW}S{hWNlI`T+_H_CP9ypay%CU!4Ju`rD(dG#z2uuvN1uwh)!j++6 z_HWHQr>unTRQ|#F_p-SYUKJ$M`FP71q3?mn$aJY%OhbRpUhEic=v1L?y(b;EV=NTq zH&-U6e>KYB7LU){=?)8&_gZS@;M#OgAAHFt>-1ujIhqaLYH>o=WBtdu1$TLwl4~iT z^jM%i;nCB;XL(kG${aW23dhG)^5iv20~ZwDChN9{l?$EA<QnvPbx)ewAGLmUi)DxY za#OQr3)wE^Zx-T)GqqOYBkSEJ$#Tl$o$W~Qp`*J?XJ&B&gHk8%0JcXYrKcHe)pFQj zu}St8&h^*viQ#d{Jtn4N83|p%T-i^?aF8|DJ-!mhHMhmYY+vQYsE0Oe9DZ!nHty_M zA~=8Xi-#hT&r`W``A$;SzuHnC9wh<2h8%)j4e2VK4?iHUP~YiWQnaK_zkJlwz3!J< zMz`2j^N|cM2K~Km&K+zvdRSASw+wOZS8w&E(yOQ2-Hg@@Y11c+a9kDawtqY?1!>23 zb_rgi+-y}&cezC`9&FWdL^z|kAW-g3g7+;~N2N_@u%dZRWweL2YG%9brxo{VHd#(B zq(Eyhe9s^1l#F*9KT<5Nw!wGHKe1u#?%!h^z4b}dNcYHZv9`BS%Wz`3;@GcRKGv@G zPM^>~Ek6HlH&<xW)2<f8+ESi0+M3Z`-EhTr+bA--Vz|ZFnl|TF^#JQ{nSW)@xJ+fY zjB>$anRDkJyKrEo0!3TbKUg*0u2#;R+6)6%J)9)^4BNs69SrWW$p}C(-!LM12XA3R zydu4Kj=0A;F5AY>Hzf^`x^ge9Zk?D#Be?nkGRru)_#cXN%z*z=rIWR{F?2HchFZyO z4UH9zRB0G!ndxa6=_#P-1i!IXN1N{_-?#r|n%P(jeIv5?<U$;b^bG9ZH9bZKHbypj zdMbKGGJ1Nl?{QK#hX30TMSDG4TO-47cvsKT!3c^@R#8}$R>aBDQeV&7`X65uP0bwe zzt4a7i5g$o$ll@m)%Z-b49wr~F(WGr4I?e<zkK~S5AlDSIUC{s;}jjgy@BbsY3<}n zfp1}}=V<C+q=)bPA4{;(elJ4t514FZZTJsR&A`n1U%toxU$tcUSIv@%`9DjR46Ofw zQ{(^dKy_wJCsZFja?tZT@-b}O`iJ1@+^q0`6gE^6VQ69#Tvw+VEeB-Yd~*DOH+vvA zv!xK@4J0<m3Ws7W6G()(;&Q=Lv<7_RWw1BtV$}0FunfD5mv$uxCZ~M*z1a{!1yBYQ zrGjn+-&BRRT|v>S8ZD$W^uU#;pNZe+`c<LMFS(dGe%5?0j7c`m;pC`7mA{*FR9-2T z?S<_TAb<8Y$+q2qS95e>|EDNn|8HMKRo=)LicZ|x(8v{EgZ>-Gr`Lj_Q!sNk`sWgg zP6c0s0iOw<;rph%jg2Ed12fzA67v7dFt+)&{t3H(EFpXiE`AYaHb#0@Ms|Jy0Dy@J zz{W2mC@jnmU}s}zU||y$;KBdjhkU>1w~@7pqbWW!Bg4O!kpB-qgk-i;MnMi8{N}m! zcxfpwNxt+aVd#>1uCk?47iEKf;Ufr&IncQ%OACwMg~Z;@&NoZ=H#uZLyPm$GA2T^M zY4DeC3;;te>zTTnYnuBw%j4QZSm-Z1q2Et-nY>@qoO-}^p}zE!F=mXyxG}{Az-*19 zG<a~V5KL{WB;bf)=3ZiO2=K&~)rlhx^29PDRCg)AV?+l;J7UC?Z0_UxV+@7Q5$1k~ zuM1|!CLf@)Ls5Jz1&McMdn*$`@{M_GnG*7gEfzllAo<PtE9t~i1I3vR_R+LV3CQrr ztCp1Q5$|ZK17>D339VuptJ@Bl%|aG<%`S;?Vy>TjY3;%9?yHv^4yX@Qq|d?ZV+X|8 zP6_Pn{}7KD%}G|p5R1o_A7Hjhzlrf;;0MHHs(H=)`n5fm0Ipqa+6FYSP5=jzEy@!4 z<6JV0u?O#cN)2G;9Llz9*vt~yrv_uz24>P<P61)kTy@I&yF_pv{r6sE5!dh9g3=#M zCLvxBN1ZtHS}BX%QqQ_im&Diok)JcnQ>$1lug!00nk@z_ej2JVUpNvX^8Y;=9US%S Y9bN6e!;cZbz{t!BMM5GhBLemR0K0!5$^ZZW diff --git a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.tex b/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.tex deleted file mode 100644 index 019b51aa96f..00000000000 --- a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.tex +++ /dev/null @@ -1,960 +0,0 @@ -% -% Licensed to the OpenAirInterface (OAI) Software Alliance under one or more -% contributor license agreements. See the NOTICE file distributed with -% this work for additional information regarding copyright ownership. -% The OpenAirInterface Software Alliance licenses this file to You under -% the OAI Public License, Version 1.1 (the "License"); you may not use this file -% except in compliance with the License. -% You may obtain a copy of the License at -% -% http://www.openairinterface.org/?page_id=698 -% -% Unless required by applicable law or agreed to in writing, software -% distributed under the License is distributed on an "AS IS" BASIS, -% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -% See the License for the specific language governing permissions and -% limitations under the License. -%------------------------------------------------------------------------------- -% For more information about the OpenAirInterface (OAI) Software Alliance: -% contact@openairinterface.org -% - -\documentclass{article} - -\usepackage[a4paper, total={6in, 8in}]{geometry} - -\usepackage{amsmath} -\usepackage{amsfonts} -\usepackage{amssymb} -\usepackage{booktabs} -\usepackage{url} -\usepackage{tcolorbox} - -\usepackage{tikz} -\usetikzlibrary{arrows,decorations,shapes,backgrounds,patterns} -\usepackage{pgfplots} -\pgfplotsset{compat=newest} -\definecolor{green}{RGB}{32,127,43} -\usetikzlibrary{calc} - -\usepackage{listings} -\lstdefinestyle{customc}{ - belowcaptionskip=1\baselineskip, - breaklines=true, - frame=L, - xleftmargin=\parindent, - language=C, - showstringspaces=false, - basicstyle=\footnotesize\ttfamily, - keywordstyle=\bfseries\color{green!40!black}, - commentstyle=\itshape\color{purple!40!black}, - identifierstyle=\color{blue}, - stringstyle=\color{orange}, -} -\lstset{escapechar=@,style=customc} - -\title{NR LDPC Decoder} -\author{Sebastian Wagner (TCL)} -\date{\today} - -\def\0{\mathbf{0}} -\def\b{\mathbf{b}} -\def\Bbb{\mathbb{B}} -\def\Bcal{\mathcal{B}} -\def\c{\mathbf{c}} -\def\C{\mathbf{C}} -\def\Cbb{\mathbb{C}} -\def\Ccal{\mathcal{C}} -\def\eqdef{\triangleq} -\def\g{\mathbf{g}} -\def\G{\mathbf{G}} -\def\Gcal{\mathcal{G}} -\def\h{\mathbf{h}} -\def\H{\mathbf{H}} -\def\Hbg{\mathbf{H}_\mathrm{BG}} -\def\Hbgo{\mathbf{H}_\mathrm{BG1}} -\def\Hbgt{\mathbf{H}_\mathrm{BG2}} -\def\I{\mathbf{I}} -\def\Kb{{K_b}} -\def\m{\mathbf{m}} -\def\Mb{{M_b}} -\def\Nb{{N_b}} -\def\Nbb{\mathbb{N}} -\def\n{\mathbf{n}} -\def\nr{{n_{\rm r}}} -\def\nt{{n_{\rm t}}} -\def\s{\mathbf{s}} -\def\SNR{\mathsf{SNR}} -\def\y{\mathbf{y}} -\def\z{\mathbf{z}} -\def\Z{\mathbf{Z}} -\def\Zc{{Z_c}} - - -\def\herm{\mathsf{H}} -\def\trans{\mathsf{T}} -\def\EE{\mathsf{E}} -\newcommand{\sgn}{\operatorname{sgn}} - -\begin{document} - -\maketitle - -\begin{tikzpicture}[remember picture,overlay] - \node[anchor=north west,inner sep=0pt] at (current page.north west) - {\includegraphics[scale=0.5]{logo.png}}; -\end{tikzpicture} - - -\begin{center}Currently Supported:\end{center} -\tcbox[center]{ - \begin{tabular}{lll} - \toprule - \textbf{BG} & \textbf{Lifting Size Z} & \textbf{Code Rate R} \\ - \midrule - 1 & all & 1/3, 2/3, 8/9 \\ - 2 & all & 1/5, 1/3, 2/3 \\ - \bottomrule - \end{tabular} -} - -\paragraph{Version 1.0:} -\begin{itemize} -\item Initial version -\end{itemize} - -\paragraph{Version 2.0:} -\begin{itemize} -\item Enhancements in message passing: - \begin{itemize} - \item LUTs replaced by smaller BG-specific parameters - \item Inefficient load/store replaced by circular memcpy - \end{itemize} -\item Bug fixes: - \begin{itemize} - \item Fixed bug in function \texttt{llr2CnProcBuf} - \item Corrected input LLR dynamic range in BLER simulations - \end{itemize} -\item Results: - \begin{itemize} - \item Size of LUTs reduced significantly (60MB to 200KB) - \item Siginifcantly enhances execution time (factor 3.5) - \item Improved BLER performance (all simulation results have been updated) - \end{itemize} -\end{itemize} - - -\newpage -\tableofcontents - -\newpage -\section{Introduction} -\label{sec:introduction} - -Low Density Parity Check (LDPC) codes have been developed by Gallager in 1963 \cite{gallager1962low}. They are linear error correcting codes that are capacity-achieving for large block length and are completely described by their Parity Check Matrix (PCM) $\H^{M\times N}$. The PCM $\H$ defines $M$ constraints on the codeword $\c$ of length $N$ such that -\begin{equation} - \label{eq:29} - \H\c = \0. -\end{equation} -The number of information bits $B$ that can be encoded with $\H$ is given by $B=N-M$. Hence the code rate $R$ of $\H$ reads -\begin{equation} - \label{eq:37} - R = \frac{B}{N} = 1-\frac{M}{N}. -\end{equation} - - -\subsection{LDPC in NR} -\label{sec:ldpc-nr} - -NR uses quasi-cyclic (QC) Protograph LDPC codes, i.e. a smaller graph, called Base Graph (BG), is defined and utilized to construct the larger PCM. This has the advantage that the large PCM does not have to be stored in memory and allows for a more efficient implementation while maintaining good decoding properties. -Two BGs $\Hbg\in\Nbb^{\Mb\times \Nb}$ are defined in NR: -\begin{enumerate} -\item $\Hbgo\in\Nbb^{46\times 68}$ -\item $\Hbgt\in\Nbb^{42\times 52}$ -\end{enumerate} -where $\Nbb$ is the set of integers. For instance the first 3 rows and 13 columns of BG2 are given by - -\setcounter{MaxMatrixCols}{30} -\begin{equation*} - \label{eq:33} - \Hbgt = - \begin{bmatrix} - 9 & 117 & 204 & 26 & \emptyset & \emptyset & 189 & \emptyset & \emptyset & 205 & 0 & 0 & \emptyset & \emptyset \\ - 127 & \emptyset & \emptyset & 166 & 253 & 125 & 226 & 156 & 224 & 252 & \emptyset & 0 & 0 & \emptyset \\ - 81 & 114 & \emptyset & 44 & 52 & \emptyset & \emptyset & \emptyset & 240 & \emptyset & 1 & \emptyset & 0 & 0 - \end{bmatrix}. -\end{equation*} - -To obtain the PCM $\H$ from the BG $\Hbg$, each element $\Hbg(i,j)$ in the BG is replaced by a lifting matrix of size $\Zc\times \Zc$ according to -\begin{equation} - \label{eq:35} - \Hbg(i,j) = - \begin{cases} - \0 & \textrm{if}~ \Hbg(i,j)=\emptyset \\ - \I_{P_{ij}} & \textrm{otherwise} - \end{cases} -\end{equation} -where $\I_{P_{ij}}$ is the identity matrix circularly shifted to the right by $P_{ij} = \Hbg(i,j)\mod \Zc$. Hence, the resulting PCM $\H$ will be of size $\Mb\Zc\times\Nb\Zc$. - -The lifting size $\Zc$ depends on the number of bits to encode. To limit the complexity, a discrete set $\mathcal{Z}$ of possible values of $\Zc$ has been defined in \cite{3gpp2017_38212} and the optimal value $\Zc$ is calculated according to -\begin{equation} - \label{eq:36} - \Zc = \min_{\Z\in\mathcal{Z}}\left[Z\geq\frac{B}{\Nb}\right]. -\end{equation} - -The base rate of the two BGs is $1/3$ and $1/5$ for BG1 and BG2, respectively. That is, BG1 encodes $K=22\Zc$ bits and BG2 encodes $K=10\Zc$ bits. Note that the first 2 columns of BG 1 and 2 are always punctured, that is after encoding, the first $2\Zc$ bits are discarded and not transmitted. -For instance, consider $B=500$ information bits to encode using BG2, \eqref{eq:36} yields $\Zc=64$ hence $K=640$. Since $K>B$, $K-B=140$ filler bits are appended to the information bits. The PCM $\Hbgt$ is of size $2688\times 3328$ and the $640$ bits $\b$ are encoded according to \eqref{eq:29} at a rate $R \approx 0.192$. To achieve the higher base rate of $0.2$, the first $128$ are punctured, i.e. instead of transmitting all $3328$ bits, only $3200$ are transmitted resulting in the desired rate $R=640/3200=0.2$. - -\subsection{LDPC Decoding} -\label{sec:ldpc-decoding} - -The decoding of codeword $\c$ can be achieved via the classical message passing algorithm. This algorithm can be illustrated best using the Tanner graph of the PCM. The rows of the PCM are called check nodes (CN) since they represent the parity check equations. The parity check equation of each of these check nodes involves various bits in the codeword. Similarly, every column of the PCM corresponds to a bit and each bit is involved in several parity check equations. In the Tanner graph representation, the bits are called bit nodes (BN). Let's go back to the previous example of BG2 and assume $\Zc=2$, hence the first 3 rows and 13 columns of BG2 $\Hbgt$ read -\begin{equation*} - \label{eq:36} - \Hbgt = - \begin{bmatrix} - 1 & 1 & 0 & 0 & \emptyset & \emptyset & 1 & \emptyset & \emptyset & 1 & 0 & 0 & \emptyset & \emptyset \\ - 1 & \emptyset & \emptyset & 0 & 1 & 1 & 0 & 0 & 0 & 0 & \emptyset & 0 & 0 & \emptyset \\ - 1 & 0 & \emptyset & 0 & 0 & \emptyset & \emptyset & \emptyset & 0 & \emptyset & 1 & \emptyset & 0 & 0 - \end{bmatrix}. -\end{equation*} -Replacing the elements according to \eqref{eq:35}, we obtain the first 6 rows and 26 columns of the PCM as -\begin{equation*} - \label{eq:39} - \H = - \begin{bmatrix} - 0 & 1 & 0 & 1 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0\\ - 1 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0\\ - 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 1 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0\\ - 1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0\\ - 0 & 1 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0\\ - 1 & 0 & 0 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 1 - \end{bmatrix}. -\end{equation*} - -The Tanner graph of the first 8 BNs is shown in Figure \ref{fig:tannergraph}. - -\begin{figure}[ht] - \label{fig:tannergraph} - \centering - \def\ww{0.3cm} - \def\hh{0.3cm} - \tikzstyle{cnode}=[fill=white,rectangle,draw=black,thick,inner sep=2pt, minimum height=\hh,minimum width=\ww, rounded corners=1pt,text width=\ww] - \tikzstyle{vnode}=[fill=white,circle,draw=black,thick,inner sep=2pt, minimum height=\hh,minimum width=\ww, rounded corners=1pt,text width=\ww] - \tikzstyle{connector}=[<->,>=latex',semithick] - - \begin{tikzpicture} - \tikzstyle{every node}=[node distance=1.5cm,text centered] - % Check nodes - \node[cnode, label=above:$v_0$] (v0) {}; - \node[cnode, label=above:$v_1$, right of=v0] (v1) {}; - \node[cnode, label=above:$v_2$, right of=v1] (v2) {}; - % Variable nodes - \node[vnode, label=below:$c_3$, below of=v1, node distance=1.5cm] (c3) {}; - \node[vnode, label=below:$c_2$, left of=c3, node distance=1.5cm] (c2) {}; - \node[vnode, label=below:$c_1$, left of=c2, node distance=1.5cm] (c1) {}; - \node[vnode, label=below:$c_0$, left of=c1, node distance=1.5cm] (c0) {}; - \node[vnode, label=below:$c_4$, right of=c3, node distance=1.5cm] (c4) {}; - \node[vnode, label=below:$c_5$, right of=c4, node distance=1.5cm] (c5) {}; - \node[vnode, label=below:$c_6$, right of=c5, node distance=1.5cm] (c6) {}; - - % Draw edges - \draw (c0) edge[connector] (v1); - \draw (c1) edge[connector] (v0); - \draw (c1) edge[connector] (v2); - \draw (c2) edge[connector] (v1); - \draw (c3) edge[connector] (v0); - \draw (c4) edge[connector] (v0); - \draw (c4) edge[connector] (v2); - \draw (c5) edge[connector] (v1); - \draw (c6) edge[connector] (v0); - \draw (c6) edge[connector] (v2); - - \end{tikzpicture} - - \caption{Tanner graph for first 7 bits nodes and 3 check nodes from \eqref{eq:39}.} -\end{figure} - -The message passing algorithm is an iterative algorithm where probabilities of the bits (being either 0 or 1) are exchanged between the BNs and CNs. After sufficient iterations, the probabilities will have either converged to either 0 or 1 and the parity check equations will be satisfied, at this point, the codeword has been decoded correctly. - -\newpage -\section{LDPC Decoder Implementation} -\label{sec:ldpc-implementation} - -The implementation on a general purpose processor (GPP) has to take advantage of potential instruction extension of the processor architecture. We focus on the Intel x86 instruction set architecture (ISA) and its advanced vector extension (AVX). In particular, we utilize AVX2 with its 256-bit single instruction multiple data (SIMD) format. In order to utilize AVX2 to speed up the processing at the CNs and BNs, the corresponding data has to be ordered/aligned in a specific way. The processing flow of the LDPC decoder is depicted in \ref{fig:ldpc_decoder_flow}. - -\begin{figure}[ht] - \label{fig:ldpc_decoder_flow} - \centering - \def\ww{0.3cm} - \def\hh{0.3cm} - \tikzstyle{func}=[,draw=none] - \tikzstyle{connector}=[->,>=latex',semithick] - - \begin{tikzpicture} - \tikzstyle{every node}=[node distance=2.5cm,text centered] - % Check nodes - % First iteration - \node[func] (llr2llrProcBuf) {\texttt{llr2llrProcBuf}}; - \node[func, above of=llr2llrProcBuf] (llr2CnProcBuf) {\texttt{llr2CnProcBuf}}; - \node[func, above right of=llr2CnProcBuf] (cnProc1) {\texttt{cnProc}}; - \node[func, below right of=cnProc1] (cn2bnProcBuf1) {\texttt{cn2bnProcBuf}}; - \node[func, below of=cn2bnProcBuf1] (bnProcPc1) {\texttt{bnProcPc}}; - - % Iterations - \node[func, right of=cnProc1, node distance=7cm] (cnProc) {\texttt{cnProc}}; - \node[func, below right of=cnProc] (cn2bnProcBuf) {\texttt{cn2bnProcBuf}}; - \node[func, below of=cn2bnProcBuf] (bnProcPc) {\texttt{bnProcPc}}; - \node[func, below left of=cnProc] (bn2cnProcBuf) {\texttt{bn2cnProcBuf}}; - \node[func, below of=bn2cnProcBuf] (bnProc) {\texttt{bnProc}}; - - % Post processing - \node[func, below of=bnProcPc] (llrRes2llrOut) {\texttt{llrRes2llrOut}}; - \node[func, below of=llrRes2llrOut, node distance=1cm] (llr2bit) {\texttt{llr2bit}}; - - % Draw edges - \draw (llr2llrProcBuf) edge[connector] (llr2CnProcBuf); - \draw (llr2CnProcBuf) edge[connector] (cnProc1); - \draw (cnProc1) edge[connector] (cn2bnProcBuf1); - \draw (cn2bnProcBuf1) edge[connector] (bnProcPc1); - - \draw (bnProcPc) edge[connector] (bnProc); - \draw (bnProc) edge[connector] (bn2cnProcBuf); - \draw (bn2cnProcBuf) edge[connector] node[above left] {\texttt{cnProcPc}} (cnProc); - \draw (cnProc) edge[connector] (cn2bnProcBuf); - \draw (cn2bnProcBuf) edge[connector] (bnProcPc); - - \draw (bnProcPc1) edge[connector] (bnProc); - - \draw (bnProcPc) edge[connector] node[left] {iterations done} (llrRes2llrOut); - \draw (llrRes2llrOut) edge[connector] (llr2bit); - - % Boxes - \node[inner sep=0pt,above right of=cn2bnProcBuf1, node distance = 2.5cm] (ref) {}; - - \draw[fill=black,opacity=.2, rounded corners] (llr2llrProcBuf.south west) rectangle ($(ref) + (-.5cm,.5cm)$); - \draw[fill=black,opacity=.2, rounded corners] ($(ref) + (.5cm,.5cm)$) rectangle ($(bnProcPc.south east) + (.4cm,0)$); - - \node[func, above of=cnProc1, node distance=.8cm] (iter1) {\textbf{First Iteration}}; - \node[func, above of=cnProc , node distance=.8cm] (iterX) {\textbf{Subsequent Iterations}}; - - \end{tikzpicture} - - \caption{LDPC Decoder processing flow.} -\end{figure} - -The functions involved are described in more detail in Table \ref{tab:sum_func}. - -\begin{table}[ht] - \centering - \begin{tabular}{ll} - \toprule - \textbf{Function} & \textbf{Description} \\ - \midrule - \texttt{llr2llrProcBuf} & Copies input LLRs to LLR processing buffer \\ - \texttt{llr2CnProcBuf} & Copies input LLRs to CN processing buffer \\ - \texttt{cnProc} & Performs CN signal processing \\ - \texttt{cnProcPc} & Performs parity check \\ - \texttt{cn2bnProcBuf} & Copies the CN results to the BN processing buffer \\ - \texttt{bnProcPc} & Performs BN processing for parity check and/or hard-decision \\ - \texttt{bnProc} & Utilizes the results of \texttt{bnProcPc} to compute LLRs for CN processing \\ - \texttt{bn2cnProcBuf} & Copies the BN results to the CN processing buffer \\ - \texttt{llrRes2llrOut} & Copies the results of \texttt{bnProcPc} to output LLRs \\ - \texttt{llr2bit} & Performs hard-decision on the output LLRs \\ - \bottomrule - \end{tabular} - \caption{Summary of the LDPC decoder functions.} - \label{tab:sum_func} -\end{table} - -The input LLRs are assumed to be 8-bit and aligned on 32 bytes. CN processing is carried out in 8-bit whereas BN processing is done in 16 bit. Subsequently, the processing tasks at the CNs and BNs are explained in more detail. - -\newpage -\subsection{Check Node Processing} -\label{sec:check-node-proc} - -Denote $q_{ij}$ the value from BN $j$ to CN $i$ and let $\Bcal_i$ be the set of connected BNs to the $i$th CN. Then, using the min-sum approximation, CN $i$ has to carry out the following operation for each connected BN. -\begin{equation} - \label{eq:40} - r_{ji} = \prod_{j'\in\Bcal_i\setminus j}\sgn q_{ij'}\min_{j'\in\Bcal_i\setminus j} |q_{ij'}| -\end{equation} -where $r_{ji}$ is the value returned to BN $j$ from CN $i$. There are $\Mb = \{46,42\}$ CNs in BG 1 and BG 2, respectively. Each of these CNs is connected to only a small number of BNs. The number of connected BNs to CN $i$ is $|\Bcal_i|$. In BG1 and BG2, $|\Bcal_i|=\{3,4,5,6,7,8,9,10,19\}$ and $|\Bcal_i|=\{3,4,5,6,8,10\}$, respectively. The following tables show the number of CNs $M_{|\Bcal_i|}$ that are connected to the same number of BNs. - -\begin{table}[ht] - \centering - \begin{tabular}{llllllllll} - \toprule - $|\Bcal_i|$ & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 19 \\ - \midrule - $M_{|\Bcal_i|}^\mathrm{BG1}$ & 1 & 5 &18 & 8 & 5 & 2 & 2 & 1 & 4 \\ - $M_{|\Bcal_i|}^\mathrm{BG2}$ & 6 & 20 & 9 & 3 & 0 & 2 & 0 & 2 & 0 \\ - \bottomrule - \end{tabular} - \caption{Ceck node groups for BG1 and BG2.} - \label{tab:checkNodeGroups} -\end{table} - -It can be observed that each CN is at least connected to 3 BNs and there are 9 groups and 5 groups in BG1 and BG2, respectively. Denote the set of CN groups as $\Gcal$ and $M_k$ the number of CNs in group $k\in\Gcal$, e.g. for BG2 $M_4=20\Zc$. Each CN group will be processed separately. The CN processing buffer $p_C^k$ of group $k$ is defined as -\begin{equation} - \label{eq:44} - p_C^k = \{\underbrace{q_{11}q_{21}\dots q_{M_k 1}}_{\text 1. BN},\underbrace{q_{12}q_{22}\dots q_{M_k 2}}_{\text 2. BN},\dots,\underbrace{q_{12}q_{22}\dots q_{M_k k}}_{\text last BN}\} -\end{equation} -Hence, $|p_C^k| = kM_k$, e.g, $\Zc=128$, $|p_C^4| = 4\cdot 20\cdot 128 = 10240$. - -\begin{lstlisting}[frame=single,caption={Example of CN processing for group 3 from \texttt{cnProc}.},label=code_cnproc] % Start your code-block - - const uint8_t lut_idxCnProcG3[3][2] = {{72,144}, {0,144}, {0,72}}; - - // ===================================================================== - // Process group with 3 BNs - - // Number of groups of 32 CNs for parallel processing - M = (lut_numCnInCnGroups[0]*Z)>>5; - // Set the offset to each bit within a group in terms of 32 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 3 - p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[0]]; - p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[0]]; - - // Loop over every BN - for (j=0; j<3; j++) - { - // Set of results pointer to correct BN address - p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); - - // Loop over CNs - for (i=0; i<M; i++) - { - // Abs and sign of 32 CNs (first BN) - ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - sgn = _mm256_sign_epi8(*p_ones, ymm0); - min = _mm256_abs_epi8(ymm0); - - // 32 CNs of second BN - ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; - min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); - sgn = _mm256_sign_epi8(sgn, ymm0); - - // Store result - min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 - *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); - p_cnProcBufResBit++; - } - } - -} -\end{lstlisting} - -Once all results of the check node processing $r_{ji}$ have been calculated, they are copied to the bit node processing buffer. - -\subsection{Bit Node Processing} -\label{sec:bit-node-processing} - -Denote $r_{ji}$ the value from CN $i$ to BN $j$ and let $\Ccal_j$ be the set of connected CNs to the $j$th BN. Each BN $j$ has to carry out the following operation for every connected CN $i\in\Ccal_j$. -\begin{equation} - \label{eq:46} - q_{ij} = \Lambda_j + \sum_{i'\in\Ccal_j\setminus i}r_{ji'} -\end{equation} - -There are $\Nb = \{68,52\}$ BNs in BG 1 and BG 2, respectively. Each of these BNs is connected to only a small number of CNs. The number of connected CNs to BN $j$ is $|\Ccal_j|$. In BG1 and BG2, $|\Ccal_j|=\{1,4,7,8,9,10,11,12,28,30\}$ and $|\Ccal_j|=\{1,5,6,7,8,9,10,12,13,14,16,22,23\}$, respectively. The following tables show the number of BNs $K_{|\Ccal_j|}$ that are connected to the same number of CNs. - -\begin{table}[ht] - \centering - \begin{tabular}{lllllllllllllllllll} - \toprule - $|\Ccal_j|$ & 1&4&5&6&7&8&9&10&11&12&13 & 14 & 15 & 16 & 22 & 23 &28&30 \\ - \midrule - $K_{|\Ccal_j|}^\mathrm{BG1}$ & 42 & 1 & 1 & 2 & 4 & 3 & 1 & 4 & 3 & 4 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 1 \\ - $K_{|\Ccal_j|}^\mathrm{BG2}$ & 38 & 0 & 2 & 1 & 1 & 1 & 2 & 1 & 0 & 1 & 1 & 1 & 0 & 1 & 1 & 1 & 0 & 0\\ - \bottomrule - \end{tabular} - \caption{Bit node groups for BG1 and BG2 for base rates 1/3 and 1/5, respectively.} - \label{tab:bitNodeGroups} -\end{table} - -The BNs that are connected to a single CN do not need to be considered in the BN processing since \eqref{eq:46} yields $q_{ij} = \Lambda_j$. It can be observed that the grouping is less compact, i.e. there are many groups with only a small number of elements. - -Denote the set of BN groups as $\Bcal$ and $K_k$ the number of BNs in group $k\in\Bcal$, e.g. for BG2 $K_5=2\Zc$. Each BN group will be processed separately. The BN processing buffer $p_B^k$ of group $k$ is defined as -\begin{equation} - \label{eq:47} - p_B^k = \{\underbrace{r_{11}r_{21}\dots r_{K_k 1}}_{\text 1. CN},\underbrace{r_{12}r_{22}\dots r_{K_k 2}}_{\text 2. CN},\dots,\underbrace{r_{12}r_{22}\dots r_{K_k k}}_{\text last CN}\} -\end{equation} -Hence, $|p_B^k| = kK_k$, e.g, $\Zc=128$, $|p_B^5| = 5\cdot 2\cdot 128 = 1024$. - -Depending on the code rate, some parity bits are not being transmitted. For instance, for BG2 with code rate $R = 1/3$ the last $20\Zc$ bits are discarded. Therefore, the last 20 columns or the last $20\Zc$ parity check equation are not required for decoding. This means that the BN groups shown in table \ref{tab:bitNodeGroups} are depending on the rate. - -\begin{lstlisting}[frame=single,caption={Example of BN processing for group 3 from \texttt{bnProcPc}.},label=code_bnproc] % Start your code-block - - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[2]*Z)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>4; - - // Set pointers to start of group 3 - p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; - p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; - p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; - - // Loop over BNs - for (i=0,j=0; i<M; i++,j+=2) - { - // First 16 LLRs of first CN - ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf[j]); - ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j+1]); - - // Loop over CNs - for (k=1; k<3; k++) - { - ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[k*cnOffsetInGroup + j]); - ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0); - - ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[k*cnOffsetInGroup + j+1]); - ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); - } - - // Add LLR from receiver input - ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]); - ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0); - - ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j+1]); - ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); - - // Pack results back to epi8 - ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] - // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - - // Next result - p_llrRes++; - } -} - -\end{lstlisting} - -The sum of the LLRs is carried out in 16 bit for accuracy and is then saturated to 8 bit for CN processing. Saturation after each addition results in significant loss of sensitivity for low code rates. - -\subsection{Mapping to the Processing Buffers} -\label{sec:mapp-cn-proc} - -For efficient processing with the AVX instructions, the data is required to be aligned in a certain manner. That is the reason why processing buffers have been introduced. The drawback is that the results of the processing need to copied every time to the processing buffer of the next task. However, the speed up in computation with AVX more than makes up for the time wasted in copying data. The copying is implemented as a circular memcpy because every edge in the BG is a circular shift of a $Z\times Z$ identity matrix. Hence, a circular mempcy consists of two regular memcpys each copying a part of the $Z$ values depending on the circular shift in the BG definition. The circular shifts are stored in \texttt{nrLDPC\_lut.h} in arrays \texttt{circShift\_BGX\_ZX\_CNGX}. In the specification there are only 8 sets of cirular shifts defined. However, the applied circular shift depends on $Z$, i.e. modulo $Z$. To avoid inefficient modulo operations in loops, we store the the circular shift values for every $Z$. Moreover, for convinience the arrays are already arranged depending on the CN group (CNG). - -\newpage -\section{Performance Results} -\label{sec:performance-results} - -In this section, the performance in terms of BLER and decoding latency of the current LDPC decoder implementation is verified. - -\subsection{BLER Performance} -\label{sec:bler-performance} - -In all simulations, we assume AWGN, QPSK modulation and 8-bit input LLRs, i.e. $-127$ until $+127$. The DLSCH coding procedure in 38.212 is used to encode/decode the TB and an error is declared if the TB CRC check failed. Results are averaged over at least $10\,000$ channel realizations. - -The first set of simulations in Figure \ref{fig:bler-bg2-15} compares the current LDPC decoder implementation to the reference implementation developed by Kien. This reference implementation is called \textit{LDPC Ref} and uses the min-sum algorithm with 2 layers and 16 bit for processing. Our current optimized decoder implementation is referred to as \textit{LDPC OAI}. Moreover, reference results provided by Huawei are also shown. - -\begin{figure}[ht] - \centering - \begin{tikzpicture} - \tikzstyle{every pin}=[fill=white,draw=black] - \pgfplotsset{every axis legend/.append style={ - cells={anchor=west}, at={(1.05,1)}, anchor=north west}} - % \pgfplotsset{every axis plot/.append style={smooth}} - \pgfplotsset{every axis/.append style={line width=0.5pt}} - \pgfplotsset{every axis/.append style={mark options=solid, mark size=2.5pt}} - - \begin{semilogyaxis}[title={}, xlabel={$\SNR$ [dB]}, ylabel={BLER}, - grid={both}, xmin=-4, xmax=2, xtick={-4,-3.5,...,2}, ymin=0, - ymax=1,ytickten={-5,-4,-3,-2,-1,0},legend columns=1] - - % HUAWEI merged BG2 2017-06-15 - \addplot[black, solid] plot coordinates { (-3.91839,0.01) (-3.5567,0.0001) }; - - % 5 iterations - % LDPC Ref - \addplot[red, solid, mark=o] plot coordinates {(-1.250000,0.781300) (-1.000000,0.421000) (-0.750000,0.140400) (-0.500000,0.028900) (-0.250000,0.003300) (0.000000,0.000300) (0.250000,0.000000) (0.500000,0.000000)}; - % LDPC OAI - \addplot[blue, solid, mark=square] plot coordinates {(-1.000000,0.693730) (-0.750000,0.370190) (-0.500000,0.137260) (-0.250000,0.038850) (0.000000,0.009740) (0.250000,0.002510) (0.500000,0.000730) (0.750000,0.000180) }; - % Matlab layered min-sum with scaling factor 1 - \addplot[green, solid, mark=triangle] plot coordinates {(-1.750000,0.709000) (-1.500000,0.360600) (-1.250000,0.105500) (-1.000000,0.015700) (-0.750000,0.001300) (-0.500000,0.000100) (-0.250000,0.000000) (0.000000,0.000000) }; - % Matlab layered min-sum with scaling factor 0.8 - %\addplot[green, solid, mark=triangle] plot coordinates {(-2.750000,0.982300) (-2.500000,0.882200) (-2.250000,0.573100) (-2.000000,0.214100) (-1.750000,0.041300) (-1.500000,0.003800) (-1.250000,0.000000) (-1.000000,0.000000) }; - - % 10 iterations - % Kien's 2-layer 16bit code - \addplot[red, solid, mark=o] plot coordinates { (-2.750000,0.915500) (-2.500000,0.576000) (-2.250000,0.165000) (-2.000000,0.017100) (-1.750000,0.000600) (-1.500000,0.000000) (-1.250000,0.000000) (-1.000000,0.000000)}; - % LDPC OAI - \addplot[blue, solid, mark=square] plot coordinates { (-2.750000,0.997200) (-2.500000,0.955000) (-2.250000,0.710900) (-2.000000,0.270400) (-1.750000,0.042400) (-1.500000,0.002200) (-1.250000,0.000000) (-1.000000,0.000000)}; - % Matlab layered min-sum with scaling factor 1 - \addplot[green, solid, mark=triangle] plot coordinates {(-2.750000,0.942900) (-2.500000,0.723200) (-2.250000,0.362300) (-2.000000,0.098400) (-1.750000,0.014500) (-1.500000,0.001100) (-1.250000,0.000000) (-1.000000,0.000000) }; - % Matlab layered min-sum with scaling factor 0.8 - %\addplot[green, solid, mark=triangle] plot coordinates {(-3.750000,0.994300) (-3.500000,0.927200) (-3.250000,0.651100) (-3.000000,0.252000) (-2.750000,0.042500) (-2.500000,0.002700) (-2.250000,0.000000) (-2.000000,0.000000) (-1.750000,0.000000) (-1.500000,0.000000) }; - - - % 20 iterations - % Kien's 2-layer 16bit code - \addplot[red, solid, mark=o] plot coordinates { (-2.750000,0.330300) (-2.500000,0.067800) (-2.250000,0.006000) (-2.000000,0.000100) (-1.750000,0.000000) (-1.500000,0.000000) (-1.250000,0.000000) (-1.000000,0.000000)}; - % LDPC OAI - \addplot[blue, solid, mark=square] plot coordinates {(-2.750000,0.337900) (-2.500000,0.058300) (-2.250000,0.004000) (-2.000000,0.000200) (-1.750000,0.000000) (-1.500000,0.000000) }; - % Matlab layered min-sum with scaling factor 1 - %\addplot[green, solid, mark=triangle] plot coordinates {(-2.750000,0.843200) (-2.500000,0.524600) (-2.250000,0.198100) (-2.000000,0.037300) (-1.750000,0.003200) (-1.500000,0.000000) }; - % Matlab layered min-sum with scaling factor 0.8 - %\addplot[green, solid, mark=triangle] plot coordinates {(-3.750000,0.872300) (-3.500000,0.544600) (-3.250000,0.186400) (-3.000000,0.027500) (-2.750000,0.001900) (-2.500000,0.000000) }; - - - - % Parity check 50 iterations - %\addplot[blue, solid, mark=square] plot coordinates {(-2.750000,0.214600) (-2.500000,0.029200) (-2.250000,0.001500) (-2.000000,0.000100) (-1.750000,0.000000) (-1.500000,0.000000) }; - - - \draw (axis cs:-3.3,0.1) node[fill=white,draw=black] (pint0) {20 iter}; - \draw (axis cs:-2.3,0.01) node[draw,black,thick,ellipse,minimum height=0.3cm] (ell0) {}; \draw[black,thick] (pint0) -- (ell0); - - \draw (axis cs:-1.2,0.0001) node[fill=white,draw=black] (pint1) {10 iter}; - \draw (axis cs:-1.6,0.002) node[draw,black,thick,ellipse,minimum width=0.8cm] (ell1) {}; \draw[black,thick] (pint1) -- (ell1); - - \draw (axis cs:1.3,0.2) node[fill=white,draw=black] (pint2) {5 iter}; - \draw (axis cs:-0.4,0.01) node[draw,black,thick,ellipse,minimum width=2cm] (ell2) {}; \draw[black,thick] (pint2) -- (ell2); - - - \legend{ {Huawei 2017-06-15}\\ - {LDPC Ref}\\ - {LDPC OAI}\\ - {MATLAB NMS SF=1}\\}; - - \end{semilogyaxis} - \end{tikzpicture} - \caption{BLER vs. SNR, BG2, Rate=1/5, \{5,10,20\} Iterations, B=1280.} - \label{fig:bler-bg2-15} -\end{figure} - -From Figure \ref{fig:bler-bg2-15} it can be observed that the reference decoder outperforms the current implementation significantly for low to medium number of iterations. The reason is the implementation of 2 layers in the reference decoder, which results in faster convergence for punctured codes and hence requires less iterations to achieve a given BLER target. Note that there is a large performance loss of about 4 dB at BLER $10^{-2}$ between the Huawei reference and the current optimized decoder implementation with 5 iterations. - -Moreover, there is a gap of about 1.5 dB between the results provided by Huawei and the current decoder with 20 iterations. The reason is the min-sum approximation algorithm used in both the reference decoder and the current implementation. The gap can be closed by using a tighter approximation like the min-sum with normalization or the lambda-min approach. Moreover, the gap closes for higher code rates which can be observed from Figure \ref{fig:bler-bg2-r23}. The gap is only about 0.6 dB for 50 iterations. - -The Matlab results denoted \texttt{MATLAB NMS} are obtained with the function \texttt{nrLDPCDecode} provided by the MATLAB 5G Toolbox R2019b. The following options are provided to the function: \texttt{'Termination','max','Algorithm','Normalized min-sum','ScalingFactor',1}. Furthermore, the 8-bit input LLRs are adapted to fit the dynamic range of \texttt{nrLDPCDecode} which is shown in Listing \ref{ldpc_matlab}. - -\begin{lstlisting}[frame=single,caption={Input adaptation for MATLAB LDPC Decoder},label=ldpc_matlab] -maxLLR = max(abs(softbits)); -rxLLRs = round((softbits/maxLLR)*127); -// adjust range to fit tanh use in decoder code -softbits = rxLLRs/3.4; -\end{lstlisting} - -A scaling factor (SF) of 1 has been chosen to compare the results more easily with the \textit{LDPC OAI} since the resulting check node processing is the same. However, the Matlab normelized min-sum algorithm uses layered processing and floating point operations. Thus, for the same number of iterations, the performance is significantly better than \textit{LDPC OAI}, especially for small a number of iterations. - -\begin{figure}[ht] - \centering - \begin{tikzpicture} - \tikzstyle{every pin}=[fill=white,draw=black] - \pgfplotsset{every axis legend/.append style={ - cells={anchor=west}, at={(1.05,1)}, anchor=north west}} - % \pgfplotsset{every axis plot/.append style={smooth}} - \pgfplotsset{every axis/.append style={line width=0.5pt}} - \pgfplotsset{every axis/.append style={mark options=solid, mark size=2.5pt}} - - \begin{semilogyaxis}[title={}, xlabel={$\SNR$ [dB]}, ylabel={BLER}, - grid={both}, xmin=3, xmax=6.5, xtick={3,3.5,...,6.5}, ymin=0, - ymax=1,ytickten={-5,-4,-3,-2,-1,0},legend columns=1] - - % Kien's 2-layer 16bit code - %\addplot[red, solid] plot coordinates { (-2.750000,0.915500) (-2.500000,0.576000) (-2.250000,0.165000) (-2.000000,0.017100) (-1.750000,0.000600) (-1.500000,0.000000) (-1.250000,0.000000) (-1.000000,0.000000)}; - - % Huawei - \addplot[black, solid] plot coordinates { (3.28392,0.01) (3.73319,0.0001) }; - - % LDPC opt with 16bit BN processing - %\addplot[blue, solid, mark=square] plot coordinates {(4.000000,0.487500) (4.250000,0.163400) (4.500000,0.029800) (4.750000,0.002700) (5.000000,0.000100)}; - \addplot[blue, solid, mark=square] plot coordinates {(5.000000,0.439600) (5.250000,0.185800) (5.500000,0.062100) (5.750000,0.015000) (6.000000,0.003900)}; - - - %\addplot[blue, dashed, mark=triangle] plot coordinates {(4.000000,0.487500) (4.250000,0.163700) (4.500000,0.030000) (4.750000,0.002900) (5.000000,0.000100)}; - - %\addplot[blue, dashed, mark=square] plot coordinates {(3.000000,0.911600) (3.250000,0.614100) (3.500000,0.230100) (3.750000,0.036900) (4.000000,0.001100) (4.250000,0.000000) (4.500000,0.000000)}; - \addplot[blue, dashed, mark=square] plot coordinates {(3.000000,0.900400) (3.250000,0.600000) (3.500000,0.216400) (3.750000,0.036000) (4.000000,0.002600) (4.250000,0.000000) }; - - - \legend{ {Huawei 2017-06-15}\\ - {LDPC OAI 5 iter}\\ - {LDPC OAI 50 iter}\\}; - - \end{semilogyaxis} - \end{tikzpicture} - \caption{BLER vs. SNR, BG2, Rate=2/3, \{5,50\} Iterations, B=1280.} - \label{fig:bler-bg2-r23} -\end{figure} - -In Figure \ref{fig:bler-bg2-15-2} we compare the performance of different algorithms using at most 50 iterations with early stopping if the parity check passes. The Matlab layered believe propagation (LBP) is used with unquantized input LLRs and performs the best since no approximation is done in the processing. Both NMS and offset min-sum (OMS) use a scaling factor and offset, respectively, that has been empirically found to perform best in this simulation setting. Theirs performance is very close to the BLP and OMS is slightly better than NMS. The performance of \textit{LDPC OAI} is more than 1 dB worse mainly because of the looser approximation. Moreover, the NMS algorithm with SF=1 performs worst probably because the SF is not optimized for the input LLRs. From the results in Figure \ref{fig:bler-bg2-15-2} we can conclude that the performance of the \textit{LDPC OAI} can be significantly improved by adopting an offset min-sum approximation improving the performance to within 0.3dB of the Huawei reference curve. - -\begin{figure}[ht] - \centering - \begin{tikzpicture} - \tikzstyle{every pin}=[fill=white,draw=black] - \pgfplotsset{every axis legend/.append style={ - cells={anchor=west}, at={(1.05,1)}, anchor=north west}} - % \pgfplotsset{every axis plot/.append style={smooth}} - \pgfplotsset{every axis/.append style={line width=0.5pt}} - \pgfplotsset{every axis/.append style={mark options=solid, mark size=2.5pt}} - - \begin{semilogyaxis}[title={}, xlabel={$\SNR$ [dB]}, ylabel={BLER}, - grid={both}, xmin=-4, xmax=-1, xtick={-4,-3.5,...,-1}, ymin=0, - ymax=1,ytickten={-5,-4,-3,-2,-1,0},legend columns=1] - - % HUAWEI merged BG2 2017-06-15 - \addplot[black, solid] plot coordinates { (-3.91839,0.01) (-3.5567,0.0001) }; - - % Parity check 50 iterations - \addplot[blue, solid, mark=square] plot coordinates {(-2.750000,0.214600) (-2.500000,0.029200) (-2.250000,0.001500) (-2.000000,0.000100) (-1.750000,0.000000) (-1.500000,0.000000) }; - - % Matlab layered believe propagation - \addplot[red, solid, mark=diamond] plot coordinates {(-4.500000,0.854200) (-4.250000,0.495800) (-4.000000,0.147700) (-3.750000,0.016100) (-3.500000,0.000800) (-3.250000,0.000200) (-3.000000,0.000000) }; - - % Matlab layered min-sum with scaling factor 1 - \addplot[green, dashed, mark=triangle] plot coordinates {(-2.750000,0.830100) (-2.500000,0.497700) (-2.250000,0.165800) (-2.000000,0.024000) (-1.750000,0.001900) (-1.500000,0.000000) }; - % Matlab layered min-sum with scaling factor 0.8 - %\addplot[green, solid, mark=triangle] plot coordinates {(-3.750000,0.734800) (-3.500000,0.353800) (-3.250000,0.084300) (-3.000000,0.008000) (-2.750000,0.000400) }; - \addplot[green, solid, mark=triangle] plot coordinates {(-4.500000,0.964400) (-4.250000,0.748200) (-4.000000,0.333600) (-3.750000,0.057700) (-3.500000,0.004400) (-3.250000,0.000400) }; - - % Matlab layered offset min-sum with offset 0.025 - \addplot[brown, solid, mark=asterisk] plot coordinates {(-4.250000,0.688800) (-4.000000,0.253800) (-3.750000,0.035600) (-3.500000,0.002000) (-3.250000,0.000000) (-3.000000,0.000000) }; - - - - \legend{ {Huawei 2017-06-15}\\ - {LDPC OAI}\\ - {MATLAB LBP}\\ - {MATLAB NMS SF=1}\\ - {MATLAB NMS SF=0.65}\\ - {MATLAB OMS OS=0.025}\\}; - - \end{semilogyaxis} - \end{tikzpicture} - \caption{BLER vs. SNR, BG2, Rate=1/5, max iterations = 50, B=1280.} - \label{fig:bler-bg2-15-2} -\end{figure} - - -Figure \ref{fig:bler-bg1-r89} shows the performance of BG1 with largest block size of $B=8448$ and highest code rate $R=8/9$. From Figure \ref{fig:bler-bg1-r89} it can be observed that the performance gap is only about 0.3 dB if 50 iterations are used. However, for 5 iterations there is still a significant performance loss of about 2.3 dB at BLER $10^{-2}$. - -\begin{figure}[ht] - \centering - \begin{tikzpicture} - \tikzstyle{every pin}=[fill=white,draw=black] - \pgfplotsset{every axis legend/.append style={ - cells={anchor=west}, at={(1.05,1)}, anchor=north west}} - % \pgfplotsset{every axis plot/.append style={smooth}} - \pgfplotsset{every axis/.append style={line width=0.5pt}} - \pgfplotsset{every axis/.append style={mark options=solid, mark size=2.5pt}} - - \begin{semilogyaxis}[title={}, xlabel={$\SNR$ [dB]}, ylabel={BLER}, - grid={both}, xmin=6, xmax=9, xtick={6,6.5,...,9}, ymin=0, - ymax=1,ytickten={-5,-4,-3,-2,-1,0},legend columns=1] - - % Huawei - \addplot[black, solid] plot coordinates { (6.118717,0.01) (6.291449,0.0001) }; - - % LDPC opt 5 iter - %\addplot[blue, solid, mark=square] plot coordinates {(8.500000,0.350000) (8.750000,0.155100) (9.000000,0.062400) (9.250000,0.023000) (9.500000,0.008700) (9.750000,0.003500) (10.000000,0.000900) (10.250000,0.000300) }; - \addplot[blue, solid, mark=square] plot coordinates {(7.500000,0.858900) (7.750000,0.449500) (8.000000,0.129700) (8.250000,0.025500) (8.500000,0.002300) (8.750000,0.000300) (9.000000,0.000000) }; - - % LDPC opt 50 iter - %\addplot[blue, dashed, mark=square] plot coordinates {(6.000000,0.705333) (6.100000,0.353367) (6.200000,0.102100) (6.300000,0.015133) (6.400000,0.000967) (6.500000,0.000000)}; - \addplot[blue, dashed, mark=square] plot coordinates {(6.000000,0.970000) (6.100000,0.830800) (6.200000,0.527300) (6.300000,0.216900) (6.400000,0.045500) (6.500000,0.005600) (6.600000,0.000300) (6.700000,0.000000) (6.800000,0.000000) }; - - \legend{ {Huawei}\\ - {LDPC OAI 5 iter}\\ - {LDPC OAI 50 iter}\\}; - - \end{semilogyaxis} - \end{tikzpicture} - \caption{BLER vs. SNR, BG1, Rate=8/9 \{5,50\} Iterations, B=8448.} - \label{fig:bler-bg1-r89} -\end{figure} - -\newpage -\subsection{Decoding Latency} -\label{sec:decoding-time} - -This section provides results in terms of decoding latency. That is, the time it takes the decoder to to finish decoding for a given number of iterations. To measure the run time of the decoder we use the OAI tool \texttt{time\_meas.h}. The clock frequency is about 2.9 GHZ, decoder is run on a single core and the results are averaged over $10\,000$ blocks. - -The results in Table \ref{tab:lat-bg2-r15} show the impact of the number of iterations on the decoding latency. It can be observed that the latency roughly doubles if the number of iterations are doubled. - -\begin{table}[ht] - \centering - \begin{tabular}{lrrr} - \toprule - \textbf{Function} & \textbf{Time [$\mu s$] (5 it)} & \textbf{Time [$\mu s$] (10 it)} & \textbf{Time [$\mu s$] (20 it)}\\ - \midrule - % \texttt{llr2llrProcBuf} & 1.1 & 1.1 & 1.1 \\ - % \texttt{llr2CnProcBuf} & 12.4 & 12.0 & 12.0 \\ - % \texttt{cnProc} & 11.7 & 22.1 & 43.5 \\ - % \texttt{bnProcPc} & 6.6 & 12.1 & 23.8 \\ - % \texttt{bnProc} & 4.2 & 8.1 & 16.2 \\ - % \texttt{cn2bnProcBuf} & 61.3 & 118.3 & 234.9 \\ - % \texttt{bn2cnProcBuf} & 38.1 & 82.5 & 172.3 \\ - % \texttt{llrRes2llrOut} & 3.5 & 3.4 & 3.4 \\ - % \texttt{llr2bit} & 0.2 & 0.1 & 0.1 \\ - \texttt{llr2llrProcBuf} & 0.5 & 0.5 & 0.5 \\ - \texttt{llr2CnProcBuf} & 5.0 & 4.8 & 4.9 \\ - \texttt{cnProc} & 12.4 & 23.0 & 42.7 \\ - \texttt{bnProcPc} & 8.4 & 14.8 & 27.0 \\ - \texttt{bnProc} & 5.5 & 10.1 & 19.0 \\ - \texttt{cn2bnProcBuf} & 14.9 & 24.4 & 44.0 \\ - \texttt{bn2cnProcBuf} & 10.5 & 17.8 & 31.8 \\ - \texttt{llrRes2llrOut} & 0.3 & 0.3 & 0.3 \\ - \texttt{llr2bit} & 0.2 & 0.2 & 0.2 \\ - \midrule - % \textbf{Total} & \textbf{139.4} & \textbf{260.3} & \textbf{508.4} \\ - \textbf{Total} & \textbf{58.5} & \textbf{97.1} & \textbf{172.6} \\ - \bottomrule - \end{tabular} - \caption{BG2, Z=128, R=1/5, B=1280, LDPC OAI} - \label{tab:lat-bg2-r15} -\end{table} - -Table \ref{tab:lat-bg2-i5} shows the impact of the code rate on the latency for a given block size and 5 iterations. It can be observed that the performance gain from code rate 1/3 to 2/3 is about a factor 2. - -\begin{table}[ht] - \centering - \begin{tabular}{lrrr} - \toprule - \textbf{Function} & \textbf{Time [$\mu s$] (R=1/5)} & \textbf{Time [$\mu s$] (R=1/3)} & \textbf{Time [$\mu s$] (R=2/3)}\\ - \midrule - % \texttt{llr2llrProcBuf} & 3.2 & 2.9 & 2.6 \\ - % \texttt{llr2CnProcBuf} & 36.5 & 25.4 & 14.8 \\ - % \texttt{cnProc} & 33.6 & 25.2 & 13.3 \\ - % \texttt{bnProcPc} & 17.6 & 10.2 & 4.5 \\ - % \texttt{bnProc} & 8.5 & 5.4 & 2.5 \\ - % \texttt{cn2bnProcBuf} & 175.3 & 110.6 & 50.7 \\ - % \texttt{bn2cnProcBuf} & 106.6 & 71.2 & 36.1 \\ - % \texttt{llrRes2llrOut} & 10.2 & 6.3 & 3.3 \\ - % \texttt{llr2bit} & 0.4 & 0.2 & 0.1 \\ - \texttt{llr2llrProcBuf} & 1.5 & 0.9 & 0.5 \\ - \texttt{llr2CnProcBuf} & 6.0 & 4.1 & 2.2 \\ - \texttt{cnProc} & 32.2 & 23.7 & 14.4 \\ - \texttt{bnProcPc} & 21.2 & 12.1 & 5.5 \\ - \texttt{bnProc} & 9.8 & 5.9 & 2.9 \\ - \texttt{cn2bnProcBuf} & 23.3 & 13.9 & 6.8 \\ - \texttt{bn2cnProcBuf} & 14.8 & 9.7 & 5.0 \\ - \texttt{llrRes2llrOut} & 0.6 & 0.4 & 0.3 \\ - \texttt{llr2bit} & 0.7 & 0.4 & 0.2 \\ - \midrule - % \textbf{Total} & \textbf{392.4} & \textbf{258.0} & \textbf{128.2} \\ - \textbf{Total} & \textbf{111.0} & \textbf{71.8} & \textbf{38.5} \\ - \bottomrule - \end{tabular} - \caption{BG2, Z=384, B=3840, LDPC OAI, 5 iterations} - \label{tab:lat-bg2-i5} -\end{table} - -Table \ref{tab:lat-bg1-i5} shows the results for BG1, larges block size and different code rates. The latency difference betwee code rate 1/3 and code rate 2/3 is less than half because upper left corner of the PCM is more dense than the rest of the PCM. - -\begin{table}[ht] - \centering - \begin{tabular}{lrrr} - \toprule - \textbf{Function} & \textbf{Time [$\mu s$] (R=1/3)} & \textbf{Time [$\mu s$] (R=2/3)} & \textbf{Time [$\mu s$] (R=8/9)}\\ - \midrule - % \texttt{llr2llrProcBuf} & 5.5 & 4.9 & 4.6 \\ - % \texttt{llr2CnProcBuf} & 60.6 & 34.1 & 24.4 \\ - % \texttt{cnProc} & 102.0 & 74.1 & 56.0 \\ - % \texttt{bnProcPc} & 26.0 & 11.0 & 6.4 \\ - % \texttt{bnProc} & 15.7 & 7.4 & 4.5 \\ - % \texttt{cn2bnProcBuf} & 291.0 & 140.8 & 83.1 \\ - % \texttt{bn2cnProcBuf} & 193.6 & 100.5 & 63.0 \\ - % \texttt{llrRes2llrOut} & 13.3 & 6.9 & 5.2 \\ - % \texttt{llr2bit} & 0.4 & 0.2 & 0.2 \\ - \texttt{llr2llrProcBuf} & 2.1 & 1.2 & 0.9 \\ - \texttt{llr2CnProcBuf} & 10.6 & 5.4 & 2.9 \\ - \texttt{cnProc} & 89.8 & 66.3 & 50.0 \\ - \texttt{bnProcPc} & 28.1 & 12.4 & 7.1 \\ - \texttt{bnProc} & 17.1 & 8.1 & 4.8 \\ - \texttt{cn2bnProcBuf} & 38.7 & 17.1 & 9.3 \\ - \texttt{bn2cnProcBuf} & 25.6 & 12.7 & 7.2 \\ - \texttt{llrRes2llrOut} & 0.8 & 0.4 & 0.3 \\ - \texttt{llr2bit} & 0.9 & 0.4 & 0.3 \\ - \midrule - % \textbf{Total} & \textbf{708.9} & \textbf{380.6} & \textbf{248.1}\\ - \textbf{Total} & \textbf{214.6} & \textbf{124.6} & \textbf{83.6}\\ - \bottomrule - \end{tabular} - \caption{BG1, Z=384, B=8448, LDPC OAI, 5 iterations} - \label{tab:lat-bg1-i5} -\end{table} - -From the above results it can be observed that the data transfer between CNs and BNs takes up a significant amount of the run time. However, the performance gain due to AVX instructions in both CN and BN processing is significantly larger than the penalty incurred by the data transfers. - -\section{Parity Check and Early Stopping Criteria} -It is often unnecessary to carry out the maximum number of iterations. After each iteration a parity check (PC) \eqref{eq:29} can be computed and if a valid code word is found the decoder can stop. This functionality has been implemented and the additional overhead is reasonable. The PC is carried out in the CN processing buffer and the calculation complexity itself is negligible. However, for the processing it is necessary to move the BN results to the CN buffer which takes time, the overall overhead is at most $10\%$ compared to an algorithm without early stopping criteria with the same number of iterations. The PC has to be activated via the define \texttt{NR\_LDPC\_ENABLE\_PARITY\_CHECK}. - - -\section{Conclusion} -\label{sec:conclusion} - -The results in the previous sections show that the current optimized LDPC implementation full-fills the requirements in terms of decoding latency for low to medium number of iterations at the expense of a loss in BLER performance. To improve BLER performance, it is recommended to implement a layered algorithm and a min-sum algorithm with normalization. Further improvements upon the current implementation are detailed in the next section. - -\newpage -\section{Future Work} -\label{sec:future-work} - -The improvements upon the current LDPC decoder implementation can be divided into two categories: -\begin{enumerate} -\item Improved BLER performance -\item Reduced decoding latency -\end{enumerate} - -\subsection{Improved BLER Performance} -\label{sec:impr-bler-perf} - -The BLER performance can be improved by using a tighter approximation than the min-sum approximation. For instance, the min-sum algorithm can be improved by adding a correction factor in the CN processing . The min-sum approximation in \eqref{eq:40} is modified as -\begin{equation} - \label{eq:50} - r_{ji} = \prod_{j'\in\Bcal_i\setminus j}\sgn q_{ij'}\min_{j'\in\Bcal_i\setminus j} |q_{ij'}| + w(q_{ij'}) -\end{equation} -The correction term $w(q_{ij'})$ is defined as -\begin{equation} - \label{eq:51} - w(q_{ij'}) = - \begin{cases} - c & \textrm{if}~ \\ - -c & \textrm{if}~ \\ - 0 & \textrm{otherwise} - \end{cases} -\end{equation} -where the constant $c$ is of order $0.5$ typically. - -\subsection{Reduced Decoding Latency} -\label{sec:reduc-decod-latency} - -The following improvements will reduce the decoding latency: - -\begin{itemize} -\item Adapt to AVX512 -\item Optimization of CN processing -\item Implement 2/3-layers for faster convergence -\end{itemize} - -\paragraph{AVX512:} -The computations in the CN and BN processing can be further accelerated by using AVX512 instructions. This improvement will speed-up the CN and BN processing by a approximately a factor of 2. - -\paragraph{Optimization of CN Processing:} -It can be investigated if CN processing can be improved by computing two minima regardless of the number of BNs. Susequently, the (absolute) value fed back to the BN is one of those minima. - -\paragraph{Layered processing:} -The LDPC code in NR always punctures the first 2 columns of the base graph. Hence, the decoder inserts LLRs with value 0 at their place and needs to retrieve those bits during the decoding process. Instead of computing all the parity equations and then passing the results to the BN processing, it is beneficial to first compute parity equations where at most one punctured BN is connected to that CN. If two punctured BNs are connected than according to \eqref{eq:40}, the result will be again 0. Thus in a first sub-iteration those parity equation are computed and the results are send to BN processing which calculates the results using only those rows in the PCM. In the second sub-iteration the remaining check equation are used. -The convergence of this layered approach is much fast since the bit can be retrieved more quickly while the decoding complexity remains the same. Therefore, for a fixed number of iterations the layered algorithm will have a significantly better performance. - -\newpage -\bibliographystyle{IEEEtran} -\bibliography{./references} - -\end{document} - -%%% Local Variables: -%%% mode: latex -%%% TeX-master: t -%%% End: diff --git a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/references.bib b/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/references.bib deleted file mode 100644 index 6f446edeb38..00000000000 --- a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/references.bib +++ /dev/null @@ -1,105 +0,0 @@ -% -% Licensed to the OpenAirInterface (OAI) Software Alliance under one or more -% contributor license agreements. See the NOTICE file distributed with -% this work for additional information regarding copyright ownership. -% The OpenAirInterface Software Alliance licenses this file to You under -% the OAI Public License, Version 1.1 (the "License"); you may not use this file -% except in compliance with the License. -% You may obtain a copy of the License at -% -% http://www.openairinterface.org/?page_id=698 -% -% Unless required by applicable law or agreed to in writing, software -% distributed under the License is distributed on an "AS IS" BASIS, -% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -% See the License for the specific language governing permissions and -% limitations under the License. -%------------------------------------------------------------------------------- -% For more information about the OpenAirInterface (OAI) Software Alliance: -% contact@openairinterface.org -% -@online{3gpp5gTimeline, - author = {3GPP}, - title = {{3GPP 5G Timeline}}, - year = 2016, - urldate = {2017-06-14}, - url = {http://www.3gpp.org/images/articleimages/5g_timeline.jpg} -} - -@techreport{3gppTR38913, - author = "{Technical Specification Group Radio Access Network}", - title = "{Study on Scenarios and Requirements for Next Generation Access Technologies}", - institution = "{3GPP TR 38.913 V14.2.0}", - month = mar, - year = 2017, -}; - -@techreport{iturM2038, - author = "{ITU-R}", - title = "{IMT Vision -- Framework and overall objectives of the future development of IMT for 2020 and beyond}", - institution = "{Radiocommunication Sector of ITU}", - month = sep, - year = 2015, -}; - -@techreport{3gpp2014seb, - author = "{Samsung, Nokia Networks}", - title = "{New SID Proposal: Study on Elevation Beamforming/Full-Dimension (FD) MIMO for LTE}", - institution = "3GPP", - month = sep, - year = 2014, -}; - -@techreport{3gpp2015fdm, - author = "{Technical Specification Group Radio Access Network}", - title = "{Study on elevation beamforming / Full-Dimension (FD) Multiple Input Multiple Output (MIMO) for LTE}", - institution = "3GPP TR 36.897 V13.0.0", - month = jun, - year = 2015, -}; - - -@techreport{3gpp2008tsg, - author = "{Technical Specification Group Radio Access Network; -Evolved Universal Terrestrial Radio Access (E-UTRA)}", - title = "{Further advancements for E-UTRA physical layer aspects (Release 9)}", - institution = "{3GPP TR 36.814 V9.0.0}", - month = mar, - year = 2010, -}; - -@techreport{3gpp2011uer, - author = "{Technical Specification Group Radio Access Network; -Evolved Universal Terrestrial Radio Access (E-UTRA)}", - title = "{User Equipment (UE) Radio Transmission and Reception}", - institution = "{3GPP TR 36.101 V10.3.0}", - month = jun, - year = 2011, -}; - -@techreport{3gpp2009_36211, - author = "{3rd Generation Partnership Project}", - title = "{Physical Channels and Modulation (Release 8)}", - institution = "{3GPP TS 36.211 V8.6.0}", - month = mar, - year = 2009, -}; - -@techreport{3gpp2017_38212, - author = "{3rd Generation Partnership Project}", - title = "{Multiplexing and channel coding (Release 15)}", - institution = "{3GPP TS 38.212 V15.0.1}", - month = mar, - year = 2018, -}; - -@article{gallager1962low, - title={Low-density parity-check codes}, - author={Gallager, Robert}, - journal={IRE Transactions on information theory}, - volume={8}, - number={1}, - pages={21--28}, - year={1962}, - publisher={IEEE} -} \ No newline at end of file diff --git a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC_doxyCfg b/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC_doxyCfg deleted file mode 100644 index 3a4137acb49..00000000000 --- a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC_doxyCfg +++ /dev/null @@ -1,2427 +0,0 @@ -# Doxyfile 1.8.11 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv -# for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = "NR LDPC Decoder" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = - -# With the PROJECT_LOGO tag one can specify a logo or an icon that is included -# in the documentation. The maximum height of the logo should not exceed 55 -# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy -# the logo to the output directory. - -PROJECT_LOGO = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = - -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. -# The default value is: NO. - -CREATE_SUBDIRS = NO - -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII -# characters to appear in the names of generated files. If set to NO, non-ASCII -# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode -# U+3044. -# The default value is: NO. - -ALLOW_UNICODE_NAMES = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = YES - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new -# page for each member. If set to NO, the documentation of a member will be part -# of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:\n" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: -# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: -# Fortran. In the later case the parser tries to guess whether the code is fixed -# or free formatted code, this is the default for Fortran type files), VHDL. For -# instance to make doxygen treat .inc files as Fortran files (default is PHP), -# and .f files as C (default is Fortran), use: inc=Fortran f=C. -# -# Note: For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by putting a % sign in front of the word or -# globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# If one adds a struct or class to a group and this option is enabled, then also -# any nested class or struct is added to the same group. By default this option -# is disabled and one has to add nested compounds explicitly via \ingroup. -# The default value is: NO. - -GROUP_NESTED_COMPOUNDS = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO, -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. If set to YES, local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO, only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO, these declarations will be -# included in the documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO, these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES, the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will -# append additional text to a page's title, such as Class Reference. If set to -# YES the compound reference will be hidden. -# The default value is: NO. - -HIDE_COMPOUND_REFERENCE= NO - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo -# list. This list is created by putting \todo commands in the documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test -# list. This list is created by putting \test commands in the documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if <section_label> ... \endif and \cond <section_label> -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES, the -# list will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. See also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. -# The default value is: NO. - -WARN_NO_PARAMDOC = NO - -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. -# The default value is: NO. - -WARN_AS_ERROR = NO - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING -# Note: If this tag is empty the current directory is searched. - -INPUT = ../nrLDPC_defs.h ../nrLDPC_types.h ../nrLDPC_init.h ../nrLDPC_cnProc.h ../nrLDPC_bnProc.h ../nrLDPC_mPass.h ../nrLDPC_decoder.h ../nrLDPC_decoder.c ../nrLDPC_lut.h - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: http://www.gnu.org/software/libiconv) for the list of -# possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by doxygen. -# -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl, -# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js. - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# <filter> <input-file> -# -# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = YES - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = YES - -# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the -# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the -# cost of reduced performance. This can be particularly helpful with template -# rich C++ code for which doxygen's built-in parser lacks the necessary type -# information. -# Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse-libclang=ON option for CMake. -# The default value is: NO. - -CLANG_ASSISTED_PARSING = NO - -# If clang assisted parsing is enabled you can provide the compiler with command -# line options that you would normally use when invoking the compiler. Note that -# the include paths will already be set by doxygen for the files and directories -# specified with INPUT and INCLUDE_PATH. -# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. - -CLANG_OPTIONS = - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = YES - -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefore more robust against future updates. -# Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra style sheet files is of importance (e.g. the last -# style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = NO - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: http://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = NO - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler (hhc.exe). If non-empty, -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = - -# The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the master .chm file (NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated -# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it -# enables the Previous and Next buttons. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- -# folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use <access key> + S -# (what the <access key> is depends on the OS and browser, but it is typically -# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down -# key> to jump into the search results window, the results can be navigated -# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel -# the search. The filter options can be selected when the cursor is inside the -# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys> -# to select a filter and <Enter> or <escape> to activate or cancel the filter -# option. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -SEARCHENGINE = YES - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a web server instead of a web client using Javascript. There -# are two flavors of web server based searching depending on the EXTERNAL_SEARCH -# setting. When disabled, doxygen will generate a PHP script for searching and -# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing -# and searching needs to be provided by external tools. See the section -# "External Indexing and Searching" for details. -# The default value is: NO. -# This tag requires that the tag SEARCHENGINE is set to YES. - -SERVER_BASED_SEARCH = NO - -# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP -# script for searching. Instead the search results are written to an XML file -# which needs to be processed by an external indexer. Doxygen will invoke an -# external search engine pointed to by the SEARCHENGINE_URL option to obtain the -# search results. -# -# Doxygen ships with an example indexer (doxyindexer) and search engine -# (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: http://xapian.org/). -# -# See the section "External Indexing and Searching" for details. -# The default value is: NO. -# This tag requires that the tag SEARCHENGINE is set to YES. - -EXTERNAL_SEARCH = NO - -# The SEARCHENGINE_URL should point to a search engine hosted by a web server -# which will return the search results when EXTERNAL_SEARCH is enabled. -# -# Doxygen ships with an example indexer (doxyindexer) and search engine -# (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: http://xapian.org/). See the section "External Indexing and -# Searching" for details. -# This tag requires that the tag SEARCHENGINE is set to YES. - -SEARCHENGINE_URL = - -# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed -# search data is written to a file for indexing by an external tool. With the -# SEARCHDATA_FILE tag the name of this file can be specified. -# The default file is: searchdata.xml. -# This tag requires that the tag SEARCHENGINE is set to YES. - -SEARCHDATA_FILE = searchdata.xml - -# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the -# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is -# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple -# projects and redirect the results back to the right project. -# This tag requires that the tag SEARCHENGINE is set to YES. - -EXTERNAL_SEARCH_ID = - -# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen -# projects other than the one defined by this configuration file, but that are -# all added to the same external search index. Each project needs to have a -# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of -# to a relative location where the documentation can be found. The format is: -# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... -# This tag requires that the tag SEARCHENGINE is set to YES. - -EXTRA_SEARCH_MAPPINGS = - -#--------------------------------------------------------------------------- -# Configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. -# The default value is: YES. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: latex. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. -# -# Note that when enabling USE_PDFLATEX this option is only used for generating -# bitmaps for formulas in the HTML output, but not in the Makefile that is -# written to the output directory. -# The default file is: latex. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate -# index for LaTeX. -# The default file is: makeindex. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX -# documents. This may be useful for small projects and may help to save some -# trees in general. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used by the -# printer. -# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x -# 14 inches) and executive (7.25 x 10.5 inches). -# The default value is: a4. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -PAPER_TYPE = a4 - -# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names -# that should be included in the LaTeX output. The package can be specified just -# by its name or with the correct syntax as to be used with the LaTeX -# \usepackage command. To get the times font for instance you can specify : -# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times} -# To use the option intlimits with the amsmath package you can specify: -# EXTRA_PACKAGES=[intlimits]{amsmath} -# If left blank no extra packages will be included. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. -# -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty -# string, for the replacement values of the other commands the user is referred -# to HTML_HEADER. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_HEADER = - -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. See -# LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. -# -# Note: Only use a user-defined footer if you know what you are doing! -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_FOOTER = - -# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# LaTeX style sheets that are included after the standard style sheets created -# by doxygen. Using this option one can overrule certain style aspects. Doxygen -# will copy the style sheet files to the output directory. -# Note: The order of the extra style sheet files is of importance (e.g. the last -# style sheet in the list overrules the setting of the previous ones in the -# list). -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_EXTRA_STYLESHEET = - -# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the LATEX_OUTPUT output -# directory. Note that the files will be copied as-is; there are no commands or -# markers available. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_EXTRA_FILES = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is -# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will -# contain links (just like the HTML output) instead of page references. This -# makes the output suitable for online browsing using a PDF viewer. -# The default value is: YES. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate -# the PDF file directly from the LaTeX files. Set this option to YES, to get a -# higher quality PDF documentation. -# The default value is: YES. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode -# command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. This option is also used -# when generating formulas in HTML. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_BATCHMODE = NO - -# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the -# index chapters (such as File Index, Compound Index, etc.) in the output. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_HIDE_INDICES = NO - -# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source -# code with syntax highlighting in the LaTeX output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_SOURCE_CODE = NO - -# The LATEX_BIB_STYLE tag can be used to specify the style to use for the -# bibliography, e.g. plainnat, or ieeetr. See -# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. -# The default value is: plain. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_BIB_STYLE = plain - -# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_TIMESTAMP = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The -# RTF output is optimized for Word 97 and may not look too pretty with other RTF -# readers/editors. -# The default value is: NO. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: rtf. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF -# documents. This may be useful for small projects and may help to save some -# trees in general. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will -# contain hyperlink fields. The RTF file will contain links (just like the HTML -# output) instead of page references. This makes the output suitable for online -# browsing using Word or some other Word compatible readers that support those -# fields. -# -# Note: WordPad (write) and others do not support links. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's config -# file, i.e. a series of assignments. You only have to provide replacements, -# missing definitions are set to their default value. -# -# See also section "Doxygen usage" for information on how to generate the -# default style sheet that doxygen normally uses. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an RTF document. Syntax is -# similar to doxygen's config file. A template extensions file can be generated -# using doxygen -e rtf extensionFile. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_EXTENSIONS_FILE = - -# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code -# with syntax highlighting in the RTF output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_SOURCE_CODE = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for -# classes and files. -# The default value is: NO. - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. A directory man3 will be created inside the directory specified by -# MAN_OUTPUT. -# The default directory is: man. -# This tag requires that the tag GENERATE_MAN is set to YES. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to the generated -# man pages. In case the manual section does not start with a number, the number -# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is -# optional. -# The default value is: .3. -# This tag requires that the tag GENERATE_MAN is set to YES. - -MAN_EXTENSION = .3 - -# The MAN_SUBDIR tag determines the name of the directory created within -# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by -# MAN_EXTENSION with the initial . removed. -# This tag requires that the tag GENERATE_MAN is set to YES. - -MAN_SUBDIR = - -# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it -# will generate one additional man file for each entity documented in the real -# man page(s). These additional files only source the real man page, but without -# them the man command would be unable to find the correct page. -# The default value is: NO. -# This tag requires that the tag GENERATE_MAN is set to YES. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that -# captures the structure of the code including all documentation. -# The default value is: NO. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: xml. -# This tag requires that the tag GENERATE_XML is set to YES. - -XML_OUTPUT = xml - -# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program -# listings (including syntax highlighting and cross-referencing information) to -# the XML output. Note that enabling this will significantly increase the size -# of the XML output. -# The default value is: YES. -# This tag requires that the tag GENERATE_XML is set to YES. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# Configuration options related to the DOCBOOK output -#--------------------------------------------------------------------------- - -# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files -# that can be used to generate PDF. -# The default value is: NO. - -GENERATE_DOCBOOK = NO - -# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in -# front of it. -# The default directory is: docbook. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_OUTPUT = docbook - -# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the -# program listings (including syntax highlighting and cross-referencing -# information) to the DOCBOOK output. Note that enabling this will significantly -# increase the size of the DOCBOOK output. -# The default value is: NO. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_PROGRAMLISTING = NO - -#--------------------------------------------------------------------------- -# Configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an -# AutoGen Definitions (see http://autogen.sf.net) file that captures the -# structure of the code including all documentation. Note that this feature is -# still experimental and incomplete at the moment. -# The default value is: NO. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module -# file that captures the structure of the code including all documentation. -# -# Note that this feature is still experimental and incomplete at the moment. -# The default value is: NO. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary -# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI -# output from the Perl module output. -# The default value is: NO. -# This tag requires that the tag GENERATE_PERLMOD is set to YES. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely -# formatted so it can be parsed by a human reader. This is useful if you want to -# understand what is going on. On the other hand, if this tag is set to NO, the -# size of the Perl module output will be much smaller and Perl will parse it -# just the same. -# The default value is: YES. -# This tag requires that the tag GENERATE_PERLMOD is set to YES. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file are -# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful -# so different doxyrules.make files included by the same Makefile don't -# overwrite each other's variables. -# This tag requires that the tag GENERATE_PERLMOD is set to YES. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all -# C-preprocessor directives found in the sources and include files. -# The default value is: YES. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names -# in the source code. If set to NO, only conditional compilation will be -# performed. Macro expansion can be done in a controlled way by setting -# EXPAND_ONLY_PREDEF to YES. -# The default value is: NO. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then -# the macro expansion is limited to the macros specified with the PREDEFINED and -# EXPAND_AS_DEFINED tags. -# The default value is: NO. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES, the include files in the -# INCLUDE_PATH will be searched if a #include is found. -# The default value is: YES. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by the -# preprocessor. -# This tag requires that the tag SEARCH_INCLUDES is set to YES. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will be -# used. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that are -# defined before the preprocessor is started (similar to the -D option of e.g. -# gcc). The argument of the tag is a list of macros of the form: name or -# name=definition (no spaces). If the definition and the "=" are omitted, "=1" -# is assumed. To prevent a macro definition from being undefined via #undef or -# recursively expanded use the := operator instead of the = operator. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this -# tag can be used to specify a list of macro names that should be expanded. The -# macro definition that is found in the sources will be used. Use the PREDEFINED -# tag if you want to use a different macro definition that overrules the -# definition found in the source code. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will -# remove all references to function-like macros that are alone on a line, have -# an all uppercase name, and do not end with a semicolon. Such function macros -# are typically used for boiler-plate code, and will confuse the parser if not -# removed. -# The default value is: YES. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration options related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES tag can be used to specify one or more tag files. For each tag -# file the location of the external documentation should be added. The format of -# a tag file without this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where loc1 and loc2 can be relative or absolute paths or URLs. See the -# section "Linking to external documentation" for more information about the use -# of tag files. -# Note: Each tag file must have a unique name (where the name does NOT include -# the path). If a tag file is not located in the directory in which doxygen is -# run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create a -# tag file that is based on the input files it reads. See section "Linking to -# external documentation" for more information about the usage of tag files. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES, all external class will be listed in -# the class index. If set to NO, only the inherited external classes will be -# listed. -# The default value is: NO. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will be -# listed. -# The default value is: YES. - -EXTERNAL_GROUPS = YES - -# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in -# the related pages index. If set to NO, only the current project's pages will -# be listed. -# The default value is: YES. - -EXTERNAL_PAGES = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of 'which perl'). -# The default file (with absolute path) is: /usr/bin/perl. - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see: -# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# You can include diagrams made with dia in doxygen documentation. Doxygen will -# then run dia to produce the diagram and insert it in the documentation. The -# DIA_PATH tag allows you to specify the directory where the dia binary resides. -# If left empty dia is assumed to be found in the default search path. - -DIA_PATH = - -# If set to YES the inheritance and collaboration graphs will hide inheritance -# and usage relations if the target is undocumented or is not a class. -# The default value is: YES. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz (see: -# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent -# Bell Labs. The other options in this section have no effect if this option is -# set to NO -# The default value is: YES. - -HAVE_DOT = YES - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed -# to run in parallel. When set to 0 doxygen will base this on the number of -# processors available in the system. You can set it explicitly to a value -# larger than 0 to get control over the balance between CPU load and processing -# speed. -# Minimum value: 0, maximum value: 32, default value: 0. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_NUM_THREADS = 0 - -# When you want a differently looking font in the dot files that doxygen -# generates you can specify the font name using DOT_FONTNAME. You need to make -# sure dot is able to find the font, which can be done by putting it in a -# standard location or by setting the DOTFONTPATH environment variable or by -# setting DOT_FONTPATH to the directory containing the font. -# The default value is: Helvetica. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_FONTNAME = Helvetica - -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of -# dot graphs. -# Minimum value: 4, maximum value: 24, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the default font as specified with -# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set -# the path where dot can find it using this tag. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_FONTPATH = - -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a -# graph for each documented class showing the direct and indirect implementation -# dependencies (inheritance, containment, and class references variables) of the -# class with other documented classes. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -UML_LOOK = NO - -# If the UML_LOOK tag is enabled, the fields and methods are shown inside the -# class node. If there are many fields or methods and many nodes the graph may -# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the -# number of items for each type to make the size more manageable. Set this to 0 -# for no limit. Note that the threshold may be exceeded by 50% before the limit -# is enforced. So when you set the threshold to 10, up to 15 fields may appear, -# but if the number exceeds 15, the total amount of fields shown is limited to -# 10. -# Minimum value: 0, maximum value: 100, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. - -UML_LIMIT_NUM_FIELDS = 10 - -# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and -# collaboration graphs will show the relations between templates and their -# instances. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -TEMPLATE_RELATIONS = NO - -# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to -# YES then doxygen will generate a graph for each documented file showing the -# direct and indirect include dependencies of the file with other documented -# files. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -INCLUDE_GRAPH = YES - -# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are -# set to YES then doxygen will generate a graph for each documented file showing -# the direct and indirect include dependencies of the file with other documented -# files. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH tag is set to YES then doxygen will generate a call -# dependency graph for every global function or class method. -# -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. Disabling a call graph can be -# accomplished by means of the command \hidecallgraph. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller -# dependency graph for every global function or class method. -# -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. Disabling a caller graph can be -# accomplished by means of the command \hidecallergraph. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical -# hierarchy of all classes instead of a textual one. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the -# dependencies a directory has on other directories in a graphical way. The -# dependency relations are determined by the #include relations between the -# files in the directories. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. For an explanation of the image formats see the section -# output formats in the documentation of the dot tool (Graphviz (see: -# http://www.graphviz.org/)). -# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order -# to make the SVG files visible in IE 9+ (other browsers do not have this -# requirement). -# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd, -# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo, -# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo, -# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and -# png:gdiplus:gdiplus. -# The default value is: png. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_IMAGE_FORMAT = png - -# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to -# enable generation of interactive SVG images that allow zooming and panning. -# -# Note that this requires a modern browser other than Internet Explorer. Tested -# and working are Firefox, Chrome, Safari, and Opera. -# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make -# the SVG files visible. Older versions of IE do not have SVG support. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -INTERACTIVE_SVG = NO - -# The DOT_PATH tag can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the \dotfile -# command). -# This tag requires that the tag HAVE_DOT is set to YES. - -DOTFILE_DIRS = - -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the \mscfile -# command). - -MSCFILE_DIRS = - -# The DIAFILE_DIRS tag can be used to specify one or more directories that -# contain dia files that are included in the documentation (see the \diafile -# command). - -DIAFILE_DIRS = - -# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file. If left blank, it is assumed -# PlantUML is not used or called during a preprocessing step. Doxygen will -# generate a warning when it encounters a \startuml command in this case and -# will not generate output for the diagram. - -PLANTUML_JAR_PATH = - -# When using plantuml, the specified paths are searched for files specified by -# the !include statement in a plantuml block. - -PLANTUML_INCLUDE_PATH = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes -# that will be shown in the graph. If the number of nodes in a graph becomes -# larger than this value, doxygen will truncate the graph, which is visualized -# by representing a node as a red box. Note that doxygen if the number of direct -# children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that -# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. -# Minimum value: 0, maximum value: 10000, default value: 50. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs -# generated by dot. A depth value of 3 means that only nodes reachable from the -# root by following a path via at most 3 edges will be shown. Nodes that lay -# further from the root node will be omitted. Note that setting this option to 1 -# or 2 may greatly reduce the computation time needed for large code bases. Also -# note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. -# Minimum value: 0, maximum value: 1000, default value: 0. -# This tag requires that the tag HAVE_DOT is set to YES. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not seem -# to support this out of the box. -# -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) support -# this, this feature is disabled by default. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page -# explaining the meaning of the various boxes and arrows in the dot generated -# graphs. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot -# files that are used to generate the various graphs. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_CLEANUP = YES diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h index 91f552f935c..c21169869cb 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h @@ -30,7 +30,7 @@ #ifndef __NR_LDPC_BNPROC__H__ #define __NR_LDPC_BNPROC__H__ - +#include <immintrin.h> /** \brief Performs first part of BN processing on the BN processing buffer and stores the results in the LLR results buffer. At every BN, the sum of the returned LLRs from the connected CNs and the LLR of the receiver input is computed. diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h index 6d82fe5f11f..f792f993e9c 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h @@ -1,3 +1,4 @@ + /* * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * contributor license agreements. See the NOTICE file distributed with @@ -28,8 +29,8 @@ * \warning */ -#ifndef __NR_LDPC_CNPROC__H__ -#define __NR_LDPC_CNPROC__H__ +#ifndef __NR_LDPC_DECODER_CNPROC__H__ +#define __NR_LDPC_DECODER_CNPROC__H__ /** \brief Performs CN processing for BG2 on the CN processing buffer and stores the results in the CN processing results buffer. @@ -37,6 +38,13 @@ \param p_procBuf Pointer to processing buffers \param Z Lifting size */ + + +#ifdef __AVX512BW__ +#include "nrLDPC_cnProc_avx512.h" + +#else + static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) { const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; @@ -92,14 +100,14 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int for (i=0; i<M; i++) { // Abs and sign of 32 CNs (first BN) - // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - ymm0 = pj0[i]; + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + ymm0 = pj0[i]; sgn = _mm256_sign_epi8(*p_ones, ymm0); min = _mm256_abs_epi8(ymm0); // 32 CNs of second BN - // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; - ymm0 = pj1[i]; + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; + ymm0 = pj1[i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); @@ -107,7 +115,7 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 //*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); //p_cnProcBufResBit++; - p_cnProcBufResBit[i]=_mm256_sign_epi8(min, sgn); + p_cnProcBufResBit[i]=_mm256_sign_epi8(min, sgn); } } } @@ -364,6 +372,15 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int } + +/** + \brief Performs CN processing for BG1 on the CN processing buffer and stores the results in the CN processing results buffer. + \param p_lut Pointer to decoder LUTs + \param Z Lifting size +*/ + + + /** \brief Performs CN processing for BG1 on the CN processing buffer and stores the results in the CN processing results buffer. \param p_lut Pointer to decoder LUTs @@ -431,6 +448,7 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); + // Store result min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); @@ -859,6 +877,7 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int } +#endif /** \brief Performs parity check for BG1 on the CN processing buffer. Stops as soon as error is detected. \param p_lut Pointer to decoder LUTs @@ -942,7 +961,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1009,7 +1029,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1077,7 +1098,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1144,7 +1166,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1211,7 +1234,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1278,7 +1302,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1345,7 +1370,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1412,7 +1438,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1479,7 +1506,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1574,7 +1602,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1641,7 +1670,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1708,7 +1738,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1775,7 +1806,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1842,7 +1874,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1909,7 +1942,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu // If no error pcRes should be 0 // Only use valid CNs - pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); + if (Mrem) + pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem))); // If PC failed we can stop here if (pcResSum > 0) @@ -1922,3 +1956,6 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu } #endif + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc_avx512.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc_avx512.h new file mode 100644 index 00000000000..044f1048e71 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc_avx512.h @@ -0,0 +1,865 @@ + +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*!\file nrLDPC_cnProc_avx512.h + * \brief Defines the functions for check node processing + * \author Sebastian Wagner (TCL Communications) Email: <mailto:sebastian.wagner@tcl.com> + * \date 30-09-2021 + * \version 1.0 + * \note + * \warning + */ + +#ifndef __NR_LDPC_CNPROC__H__ +#define __NR_LDPC_CNPROC__H__ + +#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a) +static inline void nrLDPC_cnProc_BG2_AVX512(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) +{ + const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; + const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; + + __m512i* p_cnProcBuf; + __m512i* p_cnProcBufRes; + + // Number of CNs in Groups + uint32_t M; + uint32_t i; + uint32_t j; + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t bitOffsetInGroup; + + __m512i zmm0, min, sgn, zeros; + zeros = _mm512_setzero_si512(); +// maxLLR = _mm512_set1_epi8((char)127); + __m512i* p_cnProcBufResBit; + + const __m512i* p_ones = (__m512i*) ones512_epi8; + const __m512i* p_maxLLR = (__m512i*) maxLLR512_epi8; + + // LUT with offsets for bits that need to be processed + // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. + // Offsets are in units of bitOffsetInGroup + const uint8_t lut_idxCnProcG3[3][2] = {{72,144}, {0,144}, {0,72}}; + + // ===================================================================== + // Process group with 3 BNs + + if (lut_numCnInCnGroups[0] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[0]*Z + 63)>>6; + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 3 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[0]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[0]]; + + // Loop over every BN + for (j=0; j<3; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + __m512i *pj0 = &p_cnProcBuf[(lut_idxCnProcG3[j][0]/2)]; + __m512i *pj1 = &p_cnProcBuf[(lut_idxCnProcG3[j][1]/2)]; + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + zmm0 = pj0[i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // 32 CNs of second BN + // zmm0 = p_cnProcBuf[(lut_idxCnProcG3[j][1]/2) + i]; + zmm0 = pj1[i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + //p_cnProcBufResBit[i]=_mm512_sign_epi8(min, sgn); + } + } + } + + // ===================================================================== + // Process group with 4 BNs + + // Offset is 20*384/32 = 240 + const uint16_t lut_idxCnProcG4[4][3] = {{240,480,720}, {0,480,720}, {0,240,720}, {0,240,480}}; + + if (lut_numCnInCnGroups[1] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[1]*Z + 63)>>6; + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[1]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 4 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + for (j=0; j<4; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + zmm0 = p_cnProcBuf[(lut_idxCnProcG4[j][0]/2) + i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // Loop over BNs + for (k=1; k<3; k++) + { + zmm0 = p_cnProcBuf[(lut_idxCnProcG4[j][k]/2) + i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + } + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + } + } + } + + // ===================================================================== + // Process group with 5 BNs + + // Offset is 9*384/32 = 108 + const uint16_t lut_idxCnProcG5[5][4] = {{108,216,324,432}, {0,216,324,432}, + {0,108,324,432}, {0,108,216,432}, {0,108,216,324}}; + + if (lut_numCnInCnGroups[2] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[2]*Z + 63)>>6; + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[2]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 5 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[2]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[2]]; + + // Loop over every BN + for (j=0; j<5; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + zmm0 = p_cnProcBuf[(lut_idxCnProcG5[j][0]/2) + i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // Loop over BNs + for (k=1; k<4; k++) + { + zmm0 = p_cnProcBuf[(lut_idxCnProcG5[j][k]/2) + i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + } + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + } + } + } + + // ===================================================================== + // Process group with 6 BNs + + // Offset is 3*384/32 = 36 + const uint16_t lut_idxCnProcG6[6][5] = {{36,72,108,144,180}, {0,72,108,144,180}, + {0,36,108,144,180}, {0,36,72,144,180}, + {0,36,72,108,180}, {0,36,72,108,144}}; + + if (lut_numCnInCnGroups[3] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[3]*Z + 63)>>6; + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[3]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 6 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[3]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[3]]; + + // Loop over every BN + for (j=0; j<6; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + zmm0 = p_cnProcBuf[(lut_idxCnProcG6[j][0]/2) + i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // Loop over BNs + for (k=1; k<5; k++) + { + zmm0 = p_cnProcBuf[(lut_idxCnProcG6[j][k]/2) + i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + } + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + } + } + } + + // ===================================================================== + // Process group with 8 BNs + + // Offset is 2*384/32 = 24 + const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168}, + {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168}, + {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168}, + {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}}; + + if (lut_numCnInCnGroups[4] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[4]*Z + 63)>>6; + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[4]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 8 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[4]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[4]]; + + // Loop over every BN + for (j=0; j<8; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + zmm0 = p_cnProcBuf[(lut_idxCnProcG8[j][0]/2) + i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // Loop over BNs + for (k=1; k<7; k++) + { + zmm0 = p_cnProcBuf[(lut_idxCnProcG8[j][k]/2) + i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + } + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + } + } + } + + // ===================================================================== + // Process group with 10 BNs + + // Offset is 2*384/32 = 24 + const uint8_t lut_idxCnProcG10[10][9] = {{24,48,72,96,120,144,168,192,216}, {0,48,72,96,120,144,168,192,216}, + {0,24,72,96,120,144,168,192,216}, {0,24,48,96,120,144,168,192,216}, + {0,24,48,72,120,144,168,192,216}, {0,24,48,72,96,144,168,192,216}, + {0,24,48,72,96,120,168,192,216}, {0,24,48,72,96,120,144,192,216}, + {0,24,48,72,96,120,144,168,216}, {0,24,48,72,96,120,144,168,192}}; + + if (lut_numCnInCnGroups[5] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[5]*Z + 63)>>6; + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[5]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 10 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[5]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[5]]; + + // Loop over every BN + for (j=0; j<10; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + zmm0 = p_cnProcBuf[(lut_idxCnProcG10[j][0]/2) + i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // Loop over BNs + for (k=1; k<9; k++) + { + zmm0 = p_cnProcBuf[(lut_idxCnProcG10[j][k]/2) + i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + } + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + } + } + } + +} + +static inline void nrLDPC_cnProc_BG1_AVX512(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) +{ + const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; + const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; + + int8_t* cnProcBuf = p_procBuf->cnProcBuf; + int8_t* cnProcBufRes = p_procBuf->cnProcBufRes; + + __m512i* p_cnProcBuf; + __m512i* p_cnProcBufRes; + + // Number of CNs in Groups + uint32_t M; + uint32_t i; + uint32_t j; + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t bitOffsetInGroup; + + __m512i zmm0, min, sgn, zeros; + + zeros = _mm512_setzero_si512(); + // maxLLR = _mm512_set1_epi8((char)127); + __m512i* p_cnProcBufResBit; + + + const __m512i* p_ones = (__m512i*) ones512_epi8; + const __m512i* p_maxLLR = (__m512i*) maxLLR512_epi8; + + + + + // LUT with offsets for bits that need to be processed + // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. + // Offsets are in units of bitOffsetInGroup (1*384/32) + const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}}; + + // ===================================================================== + // Process group with 3 BNs + + if (lut_numCnInCnGroups[0] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[0]*Z + 63)>>6; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 3 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[0]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[0]]; + + // Loop over every BN + for (j=0; j<3; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + zmm0 = p_cnProcBuf[(lut_idxCnProcG3[j][0]/2) + i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // 32 CNs of second BN + zmm0 = p_cnProcBuf[(lut_idxCnProcG3[j][1]/2) + i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + } + } + } + + // ===================================================================== + // Process group with 4 BNs + + // Offset is 5*384/32 = 60 + const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}}; + + if (lut_numCnInCnGroups[1] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[1]*Z + 63)>>6; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 4 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + for (j=0; j<4; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + zmm0 = p_cnProcBuf[(lut_idxCnProcG4[j][0]/2) + i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // Loop over BNs + for (k=1; k<3; k++) + { + zmm0 = p_cnProcBuf[(lut_idxCnProcG4[j][k]/2) + i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + } + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + } + } + } + + // ===================================================================== + // Process group with 5 BNs + + // Offset is 18*384/32 = 216 + const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864}, + {0,216,648,864}, {0,216,432,864}, {0,216,432,648}}; + + if (lut_numCnInCnGroups[2] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[2]*Z + 63)>>6; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 5 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[2]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[2]]; + + // Loop over every BN + for (j=0; j<5; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + zmm0 = p_cnProcBuf[(lut_idxCnProcG5[j][0]/2) + i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // Loop over BNs + for (k=1; k<4; k++) + { + zmm0 = p_cnProcBuf[(lut_idxCnProcG5[j][k]/2) + i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + } + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + } + } + } + + // ===================================================================== + // Process group with 6 BNs + + // Offset is 8*384/32 = 96 + const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480}, + {0,96,288,384,480}, {0,96,192,384,480}, + {0,96,192,288,480}, {0,96,192,288,384}}; + + if (lut_numCnInCnGroups[3] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[3]*Z + 63)>>6; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 6 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[3]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[3]]; + + // Loop over every BN + for (j=0; j<6; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + zmm0 = p_cnProcBuf[(lut_idxCnProcG6[j][0]/2) + i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // Loop over BNs + for (k=1; k<5; k++) + { + zmm0 = p_cnProcBuf[(lut_idxCnProcG6[j][k]/2) + i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + } + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + } + } + } + + // ===================================================================== + // Process group with 7 BNs + + // Offset is 5*384/32 = 60 + const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360}, + {0,60,180,240,300,360}, {0,60,120,240,300,360}, + {0,60,120,180,300,360}, {0,60,120,180,240,360}, + {0,60,120,180,240,300}}; + + if (lut_numCnInCnGroups[4] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[4]*Z + 63)>>6; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 7 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[4]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[4]]; + + // Loop over every BN + for (j=0; j<7; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + zmm0 = p_cnProcBuf[(lut_idxCnProcG7[j][0]/2) + i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // Loop over BNs + for (k=1; k<6; k++) + { + zmm0 = p_cnProcBuf[(lut_idxCnProcG7[j][k]/2) + i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + } + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + } + } + } + + // ===================================================================== + // Process group with 8 BNs + + // Offset is 2*384/32 = 24 + const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168}, + {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168}, + {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168}, + {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}}; + + if (lut_numCnInCnGroups[5] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[5]*Z + 63)>>6; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 8 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[5]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[5]]; + + // Loop over every BN + for (j=0; j<8; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + zmm0 = p_cnProcBuf[(lut_idxCnProcG8[j][0]/2) + i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // Loop over BNs + for (k=1; k<7; k++) + { + zmm0 = p_cnProcBuf[(lut_idxCnProcG8[j][k]/2) + i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + } + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + } + } + } + + // ===================================================================== + // Process group with 9 BNs + + // Offset is 2*384/32 = 24 + const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192}, + {0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192}, + {0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192}, + {0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192}, + {0,24,48,72,96,120,144,168}}; + + if (lut_numCnInCnGroups[6] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[6]*Z + 63)>>6; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 9 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[6]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[6]]; + + // Loop over every BN + for (j=0; j<9; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + zmm0 = p_cnProcBuf[(lut_idxCnProcG9[j][0]/2) + i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // Loop over BNs + for (k=1; k<8; k++) + { + zmm0 = p_cnProcBuf[(lut_idxCnProcG9[j][k]/2) + i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + } + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + } + } + } + + // ===================================================================== + // Process group with 10 BNs + + // Offset is 1*384/32 = 12 + const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108}, + {0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108}, + {0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108}, + {0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108}, + {0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}}; + + if (lut_numCnInCnGroups[7] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[7]*Z + 63)>>6; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 10 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[7]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[7]]; + + // Loop over every BN + for (j=0; j<10; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + zmm0 = p_cnProcBuf[(lut_idxCnProcG10[j][0]/2) + i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // Loop over BNs + for (k=1; k<9; k++) + { + zmm0 = p_cnProcBuf[(lut_idxCnProcG10[j][k]/2) + i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + } + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + } + } + } + + // ===================================================================== + // Process group with 19 BNs + + // Offset is 4*384/32 = 12 + const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, + {0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, + {0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864}, + {0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864}, + {0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864}, + {0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864}, + {0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864}, + {0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864}, + {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864}, + {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}}; + + if (lut_numCnInCnGroups[8] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + M = (lut_numCnInCnGroups[8]*Z + 63)>>6; + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 19 + p_cnProcBuf = (__m512i*) &cnProcBuf [lut_startAddrCnGroups[8]]; + p_cnProcBufRes = (__m512i*) &cnProcBufRes[lut_startAddrCnGroups[8]]; + + // Loop over every BN + for (j=0; j<19; j++) + { + // Set of results pointer to correct BN address + p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + for (i=0; i<M; i++) + { + // Abs and sign of 32 CNs (first BN) + zmm0 = p_cnProcBuf[(lut_idxCnProcG19[j][0]/2) + i]; + sgn = _mm512_xor_si512(*p_ones, zmm0); + min = _mm512_abs_epi8(zmm0); + + // Loop over BNs + for (k=1; k<18; k++) + { + zmm0 = p_cnProcBuf[(lut_idxCnProcG19[j][k]/2) + i]; + min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + sgn = _mm512_xor_si512(sgn, zmm0); + } + + // Store result + min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 + *p_cnProcBufResBit = conditional_negate(min, sgn,zeros); + p_cnProcBufResBit++; + } + } + } + +} +#endif diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c index bf0f401e974..0ab3ea8e6b1 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c @@ -1,3 +1,5 @@ + + /* * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * contributor license agreements. See the NOTICE file distributed with @@ -20,14 +22,8 @@ */ /*!\file nrLDPC_decoder.c - * \brief Defines the LDPC decoder - * \author Sebastian Wagner (TCL Communications) Email: <mailto:sebastian.wagner@tcl.com> - * \date 30-09-2019 - * \version 2.0 - * \note - * \warning - */ - + * \brief Defines thenrLDPC decoder +*/ #include <stdint.h> #include <immintrin.h> @@ -37,6 +33,83 @@ #include "nrLDPC_mPass.h" #include "nrLDPC_cnProc.h" #include "nrLDPC_bnProc.h" +#define UNROLL_CN_PROC 1 +#define UNROLL_BN_PROC 1 +#define UNROLL_BN_PROC_PC 1 +#define UNROLL_BN2CN_PROC 1 +/*---------------------------------------------------------------------- +| cn processing files -->AVX512 +/----------------------------------------------------------------------*/ + +//BG1------------------------------------------------------------------- +#ifdef __AVX512BW__ + +#include "cnProc_avx512/nrLDPC_cnProc_BG1_R13_AVX512.h" +#include "cnProc_avx512/nrLDPC_cnProc_BG1_R23_AVX512.h" +#include "cnProc_avx512/nrLDPC_cnProc_BG1_R89_AVX512.h" +//BG2------------------------------------------------------------------- +#include "cnProc_avx512/nrLDPC_cnProc_BG2_R15_AVX512.h" +#include "cnProc_avx512/nrLDPC_cnProc_BG2_R13_AVX512.h" +#include "cnProc_avx512/nrLDPC_cnProc_BG2_R23_AVX512.h" + +#else + +/*---------------------------------------------------------------------- +| cn Processing files -->AVX2 +/----------------------------------------------------------------------*/ + +//BG1------------------------------------------------------------------ +#include "cnProc/nrLDPC_cnProc_BG1_R13_AVX2.h" +#include "cnProc/nrLDPC_cnProc_BG1_R23_AVX2.h" +#include "cnProc/nrLDPC_cnProc_BG1_R89_AVX2.h" +//BG2 -------------------------------------------------------------------- +#include "cnProc/nrLDPC_cnProc_BG2_R15_AVX2.h" +#include "cnProc/nrLDPC_cnProc_BG2_R13_AVX2.h" +#include "cnProc/nrLDPC_cnProc_BG2_R23_AVX2.h" + +#endif + +/*---------------------------------------------------------------------- +| bn Processing files -->AVX2 +/----------------------------------------------------------------------*/ + +//bnProcPc------------------------------------------------------------- +//BG1------------------------------------------------------------------ +#include "bnProcPc/nrLDPC_bnProcPc_BG1_R13_AVX2.h" +#include "bnProcPc/nrLDPC_bnProcPc_BG1_R23_AVX2.h" +#include "bnProcPc/nrLDPC_bnProcPc_BG1_R89_AVX2.h" +//BG2 -------------------------------------------------------------------- +#include "bnProcPc/nrLDPC_bnProcPc_BG2_R15_AVX2.h" +#include "bnProcPc/nrLDPC_bnProcPc_BG2_R13_AVX2.h" +#include "bnProcPc/nrLDPC_bnProcPc_BG2_R23_AVX2.h" + +//bnProc---------------------------------------------------------------- + +#ifdef __AVX512BW__ +//BG1------------------------------------------------------------------- +#include "bnProc_avx512/nrLDPC_bnProc_BG1_R13_AVX512.h" +#include "bnProc_avx512/nrLDPC_bnProc_BG1_R23_AVX512.h" +#include "bnProc_avx512/nrLDPC_bnProc_BG1_R89_AVX512.h" +//BG2 -------------------------------------------------------------------- +#include "bnProc_avx512/nrLDPC_bnProc_BG2_R15_AVX512.h" +#include "bnProc_avx512/nrLDPC_bnProc_BG2_R13_AVX512.h" +#include "bnProc_avx512/nrLDPC_bnProc_BG2_R23_AVX512.h" + +#else +#include "bnProc/nrLDPC_bnProc_BG1_R13_AVX2.h" +#include "bnProc/nrLDPC_bnProc_BG1_R23_AVX2.h" +#include "bnProc/nrLDPC_bnProc_BG1_R89_AVX2.h" +//BG2 -------------------------------------------------------------------- +#include "bnProc/nrLDPC_bnProc_BG2_R15_AVX2.h" +#include "bnProc/nrLDPC_bnProc_BG2_R13_AVX2.h" +#include "bnProc/nrLDPC_bnProc_BG2_R23_AVX2.h" + +#endif + + + + + #define NR_LDPC_ENABLE_PARITY_CHECK //#define NR_LDPC_PROFILER_DETAIL @@ -66,28 +139,31 @@ int32_t nrLDPC_decod(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_ } /** - \brief Performs LDPC decoding of one code block + \brief PerformsnrLDPC decoding of one code block \param p_llr Input LLRs \param p_out Output vector \param numLLR Number of LLRs \param p_lut Pointer to decoder LUTs - \param p_decParams LDPC decoder parameters - \param p_profiler LDPC profiler statistics + \param p_decParamsnrLDPC decoder parameters + \param p_profilernrLDPC profiler statistics */ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_t numLLR, t_nrLDPC_lut* p_lut, t_nrLDPC_dec_params* p_decParams, t_nrLDPC_time_stats* p_profiler) { uint16_t Z = p_decParams->Z; uint8_t BG = p_decParams->BG; + uint8_t R = p_decParams->R; //Decoding rate: Format 15,13,... for code rates 1/5, 1/3,... */ uint8_t numMaxIter = p_decParams->numMaxIter; e_nrLDPC_outMode outMode = p_decParams->outMode; - - int8_t cnProcBuf[NR_LDPC_SIZE_CN_PROC_BUF] __attribute__ ((aligned(32))) = {0}; - int8_t cnProcBufRes[NR_LDPC_SIZE_CN_PROC_BUF] __attribute__ ((aligned(32))) = {0}; - int8_t bnProcBuf[NR_LDPC_SIZE_BN_PROC_BUF] __attribute__ ((aligned(32))) = {0}; - int8_t bnProcBufRes[NR_LDPC_SIZE_BN_PROC_BUF] __attribute__ ((aligned(32))) = {0}; - int8_t llrRes[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))) = {0}; - int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))) = {0}; - int8_t llrOut[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))) = {0}; + // int8_t* cnProcBuf= cnProcBuf; + // int8_t* cnProcBufRes= cnProcBufRes; + + int8_t cnProcBuf[NR_LDPC_SIZE_CN_PROC_BUF] __attribute__ ((aligned(64))) = {0}; + int8_t cnProcBufRes[NR_LDPC_SIZE_CN_PROC_BUF] __attribute__ ((aligned(64))) = {0}; + int8_t bnProcBuf[NR_LDPC_SIZE_BN_PROC_BUF] __attribute__ ((aligned(64))) = {0}; + int8_t bnProcBufRes[NR_LDPC_SIZE_BN_PROC_BUF] __attribute__ ((aligned(64))) = {0}; + int8_t llrRes[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(64))) = {0}; + int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(64))) = {0}; + int8_t llrOut[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(64))) = {0}; // Minimum number of iterations is 1 // 0 iterations means hard-decision on input LLRs uint32_t i = 1; @@ -123,14 +199,8 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_ #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->llr2CnProcBuf); #endif - if (BG == 1) - { - nrLDPC_llr2CnProcBuf_BG1(p_lut, p_llr, cnProcBuf, Z); - } - else - { - nrLDPC_llr2CnProcBuf_BG2(p_lut, p_llr, cnProcBuf, Z); - } + if (BG == 1) nrLDPC_llr2CnProcBuf_BG1(p_lut, p_llr, cnProcBuf, Z); + else nrLDPC_llr2CnProcBuf_BG2(p_lut, p_llr, cnProcBuf, Z); #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->llr2CnProcBuf); #endif @@ -146,13 +216,79 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_ #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->cnProc); #endif - if (BG == 1) - { + if (BG==1) { +#ifndef UNROLL_CN_PROC nrLDPC_cnProc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z); - } - else - { +#else + switch (R) + { + case 13: + { + #ifdef __AVX512BW__ + nrLDPC_cnProc_BG1_R13_AVX512(cnProcBuf, cnProcBufRes, Z); + #else + nrLDPC_cnProc_BG1_R13_AVX2(cnProcBuf, cnProcBufRes, Z); + #endif + break; + } + + case 23: + { + #ifdef __AVX512BW__ + nrLDPC_cnProc_BG1_R23_AVX512(cnProcBuf,cnProcBufRes, Z); + #else + nrLDPC_cnProc_BG1_R23_AVX2(cnProcBuf, cnProcBufRes, Z); + #endif + break; + } + + case 89: + { + #ifdef __AVX512BW__ + nrLDPC_cnProc_BG1_R89_AVX512(cnProcBuf, cnProcBufRes, Z); + #else + nrLDPC_cnProc_BG1_R89_AVX2(cnProcBuf, cnProcBufRes, Z); + #endif + break; + } + + } +#endif + } else { +#ifndef UNROLL_CN_PROC nrLDPC_cnProc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z); +#else + switch (R) { + case 15: + { + #ifdef __AVX512BW__ + nrLDPC_cnProc_BG2_R15_AVX512(cnProcBuf, cnProcBufRes, Z); + #else + nrLDPC_cnProc_BG2_R15_AVX2(cnProcBuf, cnProcBufRes, Z); + #endif + break; + } + case 13: + { + #ifdef __AVX512BW__ + nrLDPC_cnProc_BG2_R13_AVX512(cnProcBuf, cnProcBufRes, Z); + #else + nrLDPC_cnProc_BG2_R13_AVX2(cnProcBuf, cnProcBufRes, Z); + #endif + break; + } + case 23: + { + #ifdef __AVX512BW__ + nrLDPC_cnProc_BG2_R23_AVX512(cnProcBuf, cnProcBufRes, Z); + #else + nrLDPC_cnProc_BG2_R23_AVX2(cnProcBuf, cnProcBufRes, Z); + #endif + break; + } + + } +#endif } #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->cnProc); @@ -166,14 +302,8 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_ #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->cn2bnProcBuf); #endif - if (BG == 1) - { - nrLDPC_cn2bnProcBuf_BG1(p_lut, cnProcBufRes, bnProcBuf, Z); - } - else - { - nrLDPC_cn2bnProcBuf_BG2(p_lut, cnProcBufRes, bnProcBuf, Z); - } + if (BG == 1) nrLDPC_cn2bnProcBuf_BG1(p_lut, cnProcBufRes, bnProcBuf, Z); + else nrLDPC_cn2bnProcBuf_BG2(p_lut, cnProcBufRes, bnProcBuf, Z); #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->cn2bnProcBuf); #endif @@ -187,7 +317,51 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_ #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->bnProcPc); #endif + + +#ifndef UNROLL_BN_PROC_PC nrLDPC_bnProcPc(p_lut, bnProcBuf, bnProcBufRes, llrProcBuf, llrRes, Z); +#else + if (BG==1) { + switch (R) { + case 13: + { + nrLDPC_bnProcPc_BG1_R13_AVX2(bnProcBuf,bnProcBufRes,llrRes, llrProcBuf, Z); + break; + } + case 23: + { + nrLDPC_bnProcPc_BG1_R23_AVX2(bnProcBuf,bnProcBufRes, llrRes, llrProcBuf, Z); + break; + } + case 89: + { + nrLDPC_bnProcPc_BG1_R89_AVX2(bnProcBuf,bnProcBufRes, llrRes, llrProcBuf, Z); + break; + } + } + } else { + switch (R) { + case 15: + { + nrLDPC_bnProcPc_BG2_R15_AVX2(bnProcBuf,bnProcBufRes, llrRes, llrProcBuf, Z); + break; + } + case 13: + { + nrLDPC_bnProcPc_BG2_R13_AVX2(bnProcBuf,bnProcBufRes,llrRes,llrProcBuf, Z); + break; + } + + case 23: + { + nrLDPC_bnProcPc_BG2_R23_AVX2(bnProcBuf,bnProcBufRes,llrRes, llrProcBuf, Z); + break; + } + } + } +#endif + #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->bnProcPc); #endif @@ -200,7 +374,78 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_ #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->bnProc); #endif - nrLDPC_bnProc(p_lut, bnProcBuf, bnProcBufRes, llrRes, Z); + + if (BG==1) { +#ifndef UNROLL_BN_PROC + nrLDPC_bnProc(p_lut, bnProcBuf, bnProcBufRes, llrRes, Z); +#else + switch (R) { + case 13: + { + #ifdef __AVX512BW__ + nrLDPC_bnProc_BG1_R13_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z); + #else + nrLDPC_bnProc_BG1_R13_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z); + #endif + break; + } + case 23: + { + #ifdef __AVX512BW__ + nrLDPC_bnProc_BG1_R23_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z); + #else + nrLDPC_bnProc_BG1_R23_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z); + #endif + break; + } + case 89: + { + #ifdef __AVX512BW__ + nrLDPC_bnProc_BG1_R89_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z); + #else + nrLDPC_bnProc_BG1_R89_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z); + #endif + break; + } + } +#endif + } else { +#ifndef UNROLL_BN2CN_PROC + nrLDPC_bn2cnProcBuf_BG2(p_lut, bnProcBufRes, cnProcBuf, Z); +#else + switch (R) { + case 15: + { + #ifdef __AVX512BW__ + nrLDPC_bnProc_BG2_R15_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z); + #else + nrLDPC_bnProc_BG2_R15_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z); + #endif + break; + } + case 13: + { + #ifdef __AVX512BW__ + nrLDPC_bnProc_BG2_R13_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z); + #else + nrLDPC_bnProc_BG2_R13_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z); + #endif + break; + } + + case 23: + { + #ifdef __AVX512BW__ + nrLDPC_bnProc_BG2_R23_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z); + #else + nrLDPC_bnProc_BG2_R23_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z); + #endif + break; + } + } +#endif + } + #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->bnProc); #endif @@ -214,14 +459,8 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_ #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->bn2cnProcBuf); #endif - if (BG == 1) - { - nrLDPC_bn2cnProcBuf_BG1(p_lut, bnProcBufRes, cnProcBuf, Z); - } - else - { - nrLDPC_bn2cnProcBuf_BG2(p_lut, bnProcBufRes, cnProcBuf, Z); - } + if (BG == 1) nrLDPC_bn2cnProcBuf_BG1(p_lut, bnProcBufRes, cnProcBuf, Z); + else nrLDPC_bn2cnProcBuf_BG2(p_lut, bnProcBufRes, cnProcBuf, Z); #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->bn2cnProcBuf); #endif @@ -236,8 +475,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_ // First iteration finished - while ( (i < numMaxIter) && (pcRes != 0) ) - { + while ( (i < numMaxIter) && (pcRes != 0) ) { // Increase iteration counter i++; @@ -245,13 +483,74 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_ #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->cnProc); #endif - if (BG == 1) - { - nrLDPC_cnProc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z); - } - else - { - nrLDPC_cnProc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z); + if (BG==1) { +#ifndef UNROLL_CN_PROC + nrLDPC_cnProc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z); +#else + switch (R) { + case 13: + { + #ifdef __AVX512BW__ + nrLDPC_cnProc_BG1_R13_AVX512(cnProcBuf, cnProcBufRes, Z); + #else + nrLDPC_cnProc_BG1_R13_AVX2(cnProcBuf, cnProcBufRes, Z); + #endif + break; + } + case 23: + { + #ifdef __AVX512BW__ + nrLDPC_cnProc_BG1_R23_AVX512(cnProcBuf, cnProcBufRes, Z); + #else + nrLDPC_cnProc_BG1_R23_AVX2(cnProcBuf, cnProcBufRes, Z); + #endif + break; + } + case 89: + { + #ifdef __AVX512BW__ + nrLDPC_cnProc_BG1_R89_AVX512(cnProcBuf, cnProcBufRes, Z); + #else + nrLDPC_cnProc_BG1_R89_AVX2(cnProcBuf, cnProcBufRes, Z); + #endif + break; + } + } +#endif + } else { +#ifndef UNROLL_CN_PROC + nrLDPC_cnProc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z); +#else + switch (R) { + case 15: + { + #ifdef __AVX512BW__ + nrLDPC_cnProc_BG2_R15_AVX512(cnProcBuf,cnProcBufRes, Z); + #else + nrLDPC_cnProc_BG2_R15_AVX2(cnProcBuf, cnProcBufRes, Z); + #endif + break; + } + case 13: + { + #ifdef __AVX512BW__ + nrLDPC_cnProc_BG2_R13_AVX512(cnProcBuf, cnProcBufRes, Z); + #else + nrLDPC_cnProc_BG2_R13_AVX2(cnProcBuf, cnProcBufRes, Z); + #endif + break; + } + case 23: + { + #ifdef __AVX512BW__ + nrLDPC_cnProc_BG2_R23_AVX512(cnProcBuf, cnProcBufRes, Z); + #else + nrLDPC_cnProc_BG2_R23_AVX2(cnProcBuf, cnProcBufRes, Z); + #endif + break; + } + } +#endif } #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->cnProc); @@ -265,14 +564,8 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_ #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->cn2bnProcBuf); #endif - if (BG == 1) - { - nrLDPC_cn2bnProcBuf_BG1(p_lut, cnProcBufRes, bnProcBuf, Z); - } - else - { - nrLDPC_cn2bnProcBuf_BG2(p_lut, cnProcBufRes, bnProcBuf, Z); - } + if (BG == 1) nrLDPC_cn2bnProcBuf_BG1(p_lut, cnProcBufRes, bnProcBuf, Z); + else nrLDPC_cn2bnProcBuf_BG2(p_lut, cnProcBufRes, bnProcBuf, Z); #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->cn2bnProcBuf); #endif @@ -285,7 +578,49 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_ #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->bnProcPc); #endif + +#ifndef UNROLL_BN_PROC_PC nrLDPC_bnProcPc(p_lut, bnProcBuf, bnProcBufRes, llrProcBuf, llrRes, Z); +#else + if (BG==1) { + switch (R) { + case 13: + { + nrLDPC_bnProcPc_BG1_R13_AVX2(bnProcBuf,bnProcBufRes,llrRes, llrProcBuf, Z); + break; + } + case 23: + { + nrLDPC_bnProcPc_BG1_R23_AVX2(bnProcBuf,bnProcBufRes, llrRes, llrProcBuf, Z); + break; + } + case 89: + { + nrLDPC_bnProcPc_BG1_R89_AVX2(bnProcBuf,bnProcBufRes, llrRes, llrProcBuf, Z); + break; + } + } + } else { + switch (R) + { + case 15: + { + nrLDPC_bnProcPc_BG2_R15_AVX2(bnProcBuf,bnProcBufRes,llrRes, llrProcBuf, Z); + break; + } + case 13: + { + nrLDPC_bnProcPc_BG2_R13_AVX2(bnProcBuf,bnProcBufRes,llrRes, llrProcBuf, Z); + break; + } + case 23: + { + nrLDPC_bnProcPc_BG2_R23_AVX2(bnProcBuf,bnProcBufRes,llrRes, llrProcBuf, Z); + break; + } + } + } +#endif #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->bnProcPc); #endif @@ -297,7 +632,75 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_ #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->bnProc); #endif +#ifndef UNROLL_BN_PROC nrLDPC_bnProc(p_lut, bnProcBuf, bnProcBufRes, llrRes, Z); +#else + if (BG==1) { + switch (R) { + case 13: + { + #ifdef __AVX512BW__ + nrLDPC_bnProc_BG1_R13_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z); + #else + nrLDPC_bnProc_BG1_R13_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z); + #endif + break; + } + case 23: + { + #ifdef __AVX512BW__ + nrLDPC_bnProc_BG1_R23_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z); + #else + nrLDPC_bnProc_BG1_R23_AVX2(bnProcBuf,bnProcBufRes,llrRes, Z); + #endif + break; + } + case 89: + { + #ifdef __AVX512BW__ + nrLDPC_bnProc_BG1_R89_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z); + #else + nrLDPC_bnProc_BG1_R89_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z); + #endif + break; + } + } + } else { + switch (R) + { + case 15: + { + #ifdef __AVX512BW__ + nrLDPC_bnProc_BG2_R15_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z); + #else + nrLDPC_bnProc_BG2_R15_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z); + #endif + break; + } + case 13: + { + #ifdef __AVX512BW__ + nrLDPC_bnProc_BG2_R13_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z); + #else + nrLDPC_bnProc_BG2_R13_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z); + #endif + break; + } + case 23: + { + #ifdef __AVX512BW__ + nrLDPC_bnProc_BG2_R23_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z); + #else + nrLDPC_bnProc_BG2_R23_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z); + #endif + break; + } + } + } +#endif + + + #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->bnProc); #endif @@ -310,14 +713,8 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_ #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->bn2cnProcBuf); #endif - if (BG == 1) - { - nrLDPC_bn2cnProcBuf_BG1(p_lut, bnProcBufRes, cnProcBuf, Z); - } - else - { - nrLDPC_bn2cnProcBuf_BG2(p_lut, bnProcBufRes, cnProcBuf, Z); - } + if (BG == 1) nrLDPC_bn2cnProcBuf_BG1(p_lut, bnProcBufRes, cnProcBuf, Z); + else nrLDPC_bn2cnProcBuf_BG2(p_lut, bnProcBufRes, cnProcBuf, Z); #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->bn2cnProcBuf); #endif @@ -326,60 +723,44 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_ nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, cnProcBuf); #endif - // Parity Check + // Parity Check #ifdef NR_LDPC_ENABLE_PARITY_CHECK #ifdef NR_LDPC_PROFILER_DETAIL - start_meas(&p_profiler->cnProcPc); + start_meas(&p_profiler->cnProcPc); #endif - if (BG == 1) - { - pcRes = nrLDPC_cnProcPc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z); - } - else - { - pcRes = nrLDPC_cnProcPc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z); - } + if (BG == 1) pcRes = nrLDPC_cnProcPc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z); + else pcRes = nrLDPC_cnProcPc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z); #ifdef NR_LDPC_PROFILER_DETAIL - stop_meas(&p_profiler->cnProcPc); -#endif + stop_meas(&p_profiler->cnProcPc); #endif - } - - // If maximum number of iterations reached an PC still fails increase number of iterations - // Thus, i > numMaxIter indicates that PC has failed - -#ifdef NR_LDPC_ENABLE_PARITY_CHECK - if (pcRes != 0) - { - i++; - } #endif + } // end while + // Last iteration + if (pcRes != 0) i++; // Assign results from processing buffer to output #ifdef NR_LDPC_PROFILER_DETAIL - start_meas(&p_profiler->llrRes2llrOut); + start_meas(&p_profiler->llrRes2llrOut); #endif - nrLDPC_llrRes2llrOut(p_lut, p_llrOut, llrRes, Z, BG); + nrLDPC_llrRes2llrOut(p_lut, p_llrOut, llrRes, Z, BG); #ifdef NR_LDPC_PROFILER_DETAIL - stop_meas(&p_profiler->llrRes2llrOut); + stop_meas(&p_profiler->llrRes2llrOut); #endif // Hard-decision #ifdef NR_LDPC_PROFILER_DETAIL - start_meas(&p_profiler->llr2bit); + start_meas(&p_profiler->llr2bit); #endif - if (outMode == nrLDPC_outMode_BIT) - { - nrLDPC_llr2bitPacked(p_out, p_llrOut, numLLR); - } - else if (outMode == nrLDPC_outMode_BITINT8) - { - nrLDPC_llr2bit(p_out, p_llrOut, numLLR); - } - + if (outMode == nrLDPC_outMode_BIT) nrLDPC_llr2bitPacked(p_out, p_llrOut, numLLR); + else //if (outMode == nrLDPC_outMode_BITINT8) + nrLDPC_llr2bit(p_out, p_llrOut, numLLR); #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->llr2bit); #endif return i; } + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h new file mode 100644 index 00000000000..5678a7b3b7c --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h @@ -0,0 +1,83 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*!\file nrLDPC_init_mem.h + * \brief Defines the function to initialize the LDPC decoder and sets correct LUTs. + * \author Sebastian Wagner (TCL Communications) Email: <mailto:sebastian.wagner@tcl.com> + * \date 07-12-2018 + * \version 1.0 + * \note + * \warning + */ + +#ifndef __NR_LDPC_INIT_MEM__H__ +#define __NR_LDPC_INIT_MEM__H__ + +#include <stdlib.h> +#include "nrLDPC_types.h" + +/** + \brief Allocates 32 byte aligned memory and initializes to zero + \param size Input size in bytes + \return Pointer to memory +*/ +static inline void* malloc32_clear(size_t size) +{ + void* ptr = (void*) memalign(64, size+64); + memset(ptr, 0, size); + return ptr; +} + +/** + \brief Allocates and initializes the internal decoder processing buffers + \param p_decParams Pointer to decoder parameters + \param p_lut Pointer to decoder LUTs + \return Number of LLR values +*/ +static inline t_nrLDPC_procBuf* nrLDPC_init_mem(void) +{ + t_nrLDPC_procBuf* p_procBuf = (t_nrLDPC_procBuf*) malloc32_clear(sizeof(t_nrLDPC_procBuf)); + + if (p_procBuf) + { + p_procBuf->cnProcBuf = (int8_t*) malloc32_clear(NR_LDPC_SIZE_CN_PROC_BUF*sizeof(int8_t)); + p_procBuf->cnProcBufRes = (int8_t*) malloc32_clear(NR_LDPC_SIZE_CN_PROC_BUF*sizeof(int8_t)); + p_procBuf->bnProcBuf = (int8_t*) malloc32_clear(NR_LDPC_SIZE_BN_PROC_BUF*sizeof(int8_t)); + p_procBuf->bnProcBufRes = (int8_t*) malloc32_clear(NR_LDPC_SIZE_BN_PROC_BUF*sizeof(int8_t)); + p_procBuf->llrRes = (int8_t*) malloc32_clear(NR_LDPC_MAX_NUM_LLR *sizeof(int8_t)); + p_procBuf->llrProcBuf = (int8_t*) malloc32_clear(NR_LDPC_MAX_NUM_LLR *sizeof(int8_t)); + } + + return(p_procBuf); +} + +static inline void nrLDPC_free_mem(t_nrLDPC_procBuf* p_procBuf) +{ + free(p_procBuf->cnProcBuf); + free(p_procBuf->cnProcBufRes); + free(p_procBuf->bnProcBuf); + free(p_procBuf->bnProcBufRes); + free(p_procBuf->llrRes); + free(p_procBuf->llrProcBuf); + + free(p_procBuf); +} +#endif diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h index 7f514d5cfa6..ecbcac638d1 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h @@ -21,21 +21,16 @@ /*!\file nrLDPC_mPass.h * \brief Defines the functions for message passing - * \author Sebastian Wagner (TCL Communications) Email: <mailto:sebastian.wagner@tcl.com> - * \date 30-09-2019 - * \version 2.0 - * \note - * \warning - */ - + * +*/ #ifndef __NR_LDPC_MPASS__H__ #define __NR_LDPC_MPASS__H__ #include <string.h> #include "nrLDPCdecoder_defs.h" - +//#include <omp.h> /** - \brief Circular memcpy + \brief Circular memcpy1 |<- rem->|<- circular shift ->| (src) str2 = |--------xxxxxxxxxxxxxxxxxxxxx| \_______________ @@ -46,6 +41,7 @@ \param Z Lifting size \param cshift Circular shift */ + static inline void *nrLDPC_inv_circ_memcpy(int8_t *str1, const int8_t *str2, uint16_t Z, uint16_t cshift) { uint16_t rem = Z - cshift; @@ -169,6 +165,8 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, in bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX; + + for (j=0; j<3; j++) { p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[0] + j*bitOffsetInGroup]; @@ -200,8 +198,10 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, in // ===================================================================== // CN group with 5 BNs + bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX; + for (j=0; j<5; j++) { p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[2] + j*bitOffsetInGroup]; @@ -234,8 +234,10 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, in // ===================================================================== // CN group with 7 BNs + bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX; + for (j=0; j<7; j++) { p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[4] + j*bitOffsetInGroup]; @@ -253,6 +255,7 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, in bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX; + for (j=0; j<8; j++) { p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[5] + j*bitOffsetInGroup]; @@ -302,6 +305,7 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, in // ===================================================================== // CN group with 19 BNs + bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX; for (j=0; j<19; j++) @@ -1007,18 +1011,18 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu // CN group with 4 BNs bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX; - + for (j=0; j<3; j++) { p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[1] + j*bitOffsetInGroup]; + for (i=0; i<lut_numCnInCnGroups[1]; i++) { idxBn = lut_startAddrBnProcBuf_CNG4[j][i] + lut_bnPosBnProcBuf_CNG4[j][i]*Z; nrLDPC_circ_memcpy(p_cnProcBuf, &bnProcBufRes[idxBn], Z, lut_circShift_CNG4[j][i]); p_cnProcBuf += Z; - } + } } - // ===================================================================== // CN group with 5 BNs @@ -1027,6 +1031,7 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu for (j=0; j<4; j++) { p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[2] + j*bitOffsetInGroup]; + for (i=0; i<lut_numCnInCnGroups[2]; i++) { idxBn = lut_startAddrBnProcBuf_CNG5[j][i] + lut_bnPosBnProcBuf_CNG5[j][i]*Z; @@ -1039,10 +1044,11 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu // CN group with 6 BNs bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX; - + for (j=0; j<5; j++) { p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[3] + j*bitOffsetInGroup]; + for (i=0; i<lut_numCnInCnGroups[3]; i++) { idxBn = lut_startAddrBnProcBuf_CNG6[j][i] + lut_bnPosBnProcBuf_CNG6[j][i]*Z; @@ -1055,11 +1061,12 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu // CN group with 7 BNs bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX; - + for (j=0; j<6; j++) { p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[4] + j*bitOffsetInGroup]; + for (i=0; i<lut_numCnInCnGroups[4]; i++) { idxBn = lut_startAddrBnProcBuf_CNG7[j][i] + lut_bnPosBnProcBuf_CNG7[j][i]*Z; @@ -1092,6 +1099,7 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu for (j=0; j<8; j++) { p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[6] + j*bitOffsetInGroup]; + for (i=0; i<lut_numCnInCnGroups[6]; i++) { idxBn = lut_startAddrBnProcBuf_CNG9[j][i] + lut_bnPosBnProcBuf_CNG9[j][i]*Z; @@ -1104,10 +1112,11 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu // CN group with 10 BNs bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX; - + for (j=0; j<9; j++) { p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[7] + j*bitOffsetInGroup]; + for (i=0; i<lut_numCnInCnGroups[7]; i++) { idxBn = lut_startAddrBnProcBuf_CNG10[j][i] + lut_bnPosBnProcBuf_CNG10[j][i]*Z; @@ -1120,10 +1129,11 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBu // CN group with 19 BNs bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX; - + for (j=0; j<19; j++) { p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[8] + j*bitOffsetInGroup]; + for (i=0; i<lut_numCnInCnGroups[8]; i++) { idxBn = lut_startAddrBnProcBuf_CNG19[j][i] + lut_bnPosBnProcBuf_CNG19[j][i]*Z; @@ -1172,3 +1182,7 @@ static inline void nrLDPC_llrRes2llrOut(t_nrLDPC_lut* p_lut, int8_t* llrOut, int } #endif + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt new file mode 100644 index 00000000000..669ab17aa7d --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt @@ -0,0 +1,19 @@ +add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/generator_bnProc ldpc/generator_bnProc) +add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/generator_bnProc_avx512 ldpc/generator_bnProc_avx512) +add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/generator_cnProc ldpc/generator_cnProc) +add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/generator_cnProc_avx512 ldpc/generator_cnProc_avx512) + +# custom target to build all generators +add_custom_target(ldpc_generators) +add_dependencies(ldpc_generators + bnProc_gen_avx2 + bnProc_gen_avx512 + cnProc_gen_avx2 + cnProc_gen_avx512) + +add_library(ldpc_gen_HEADERS INTERFACE) +target_link_libraries(ldpc_gen_HEADERS INTERFACE + bnProc_gen_avx2_HEADERS + bnProc_gen_avx512_HEADERS + cnProc_gen_avx2_HEADERS + cnProc_gen_avx512_HEADERS) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/CMakeLists.txt new file mode 100644 index 00000000000..baf2f19d97c --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/CMakeLists.txt @@ -0,0 +1,36 @@ +add_executable(bnProc_gen_avx2 + bnProc_gen_BG1_avx2.c + bnProc_gen_BG2_avx2.c + bnProcPc_gen_BG1_avx2.c + bnProcPc_gen_BG2_avx2.c + main.c) +target_compile_options(bnProc_gen_avx2 PRIVATE -W -Wall -mavx2) + +#set(bnProc_headers +# bnProc/nrLDPC_bnProc_BG1_R13_AVX2.h +# bnProc/nrLDPC_bnProc_BG1_R23_AVX2.h +# bnProc/nrLDPC_bnProc_BG1_R89_AVX2.h +# bnProc/rLDPC_bnProc_BG2_R13_AVX2.h +# bnProc/rLDPC_bnProc_BG2_R15_AVX2.h +# bnProc/rLDPC_bnProc_BG2_R23_AVX2.h) +# +#set(bnProcPc_headers +# bnProcPc/rLDPC_bnProcPc_BG1_R13_AVX2.h +# bnProcPc/rLDPC_bnProcPc_BG1_R23_AVX2.h +# bnProcPc/rLDPC_bnProcPc_BG1_R89_AVX2.h +# bnProcPc/rLDPC_bnProcPc_BG2_R13_AVX2.h +# bnProcPc/rLDPC_bnProcPc_BG2_R15_AVX2.h +# bnProcPc/rLDPC_bnProcPc_BG2_R23_AVX2.h) + +add_custom_command(TARGET bnProc_gen_avx2 POST_BUILD + #OUTPUT ${bnProc_headers} ${bnProcPc_headers} + COMMAND ${CMAKE_COMMAND} -E make_directory bnProc + COMMAND ${CMAKE_COMMAND} -E make_directory bnProcPc + COMMAND bnProc_gen_avx2 . + DEPENDS bnProc_gen_avx2 + COMMENT "Generating LDPC bnProc header files for AVX2" +) + +add_library(bnProc_gen_avx2_HEADERS INTERFACE) +target_include_directories(bnProc_gen_avx2_HEADERS INTERFACE ${CMAKE_CURRENT_BINARY_DIR}) +add_dependencies(bnProc_gen_avx2_HEADERS bnProc_gen_avx2) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c new file mode 100644 index 00000000000..f51f607b885 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c @@ -0,0 +1,1789 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "../../nrLDPCdecoder_defs.h" +#include "../../nrLDPC_types.h" + + +void nrLDPC_bnProcPc_BG1_generator_AVX2(const char *dir, int R) +{ + const char *ratestr[3]={"13","23","89"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + + // system("mkdir -p ../ldpc_gen_files"); + + char fname[FILENAME_MAX+1]; + snprintf(fname, sizeof(fname), "%s/bnProcPc/nrLDPC_bnProcPc_BG1_R%s_AVX2.h", dir, ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) { + printf("Cannot create file %s\n", fname); + abort(); + } + +// fprintf(fd,"#include <stdint.h>\n"); +// fprintf(fd,"#include <immintrin.h>\n"); + + fprintf(fd,"static inline void nrLDPC_bnProcPc_BG1_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]); + const uint8_t* lut_numBnInBnGroups; + const uint32_t* lut_startAddrBnGroups; + const uint16_t* lut_startAddrBnGroupsLlr; + if (R==0) { + + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R13; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R13; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R13; + + } + else if (R==1){ + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R23; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R23; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R23; + } + else if (R==2) { + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R89; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R89; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R89; + } + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + // Number of BNs in Groups +// uint32_t M; + //uint32_t M32rem; + //uint32_t i,j; + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t cnOffsetInGroup; + uint8_t idxBnGroup = 0; + + fprintf(fd," __m256i ymm0, ymm1, ymmRes0, ymmRes1; \n"); + + + fprintf(fd," __m128i* p_bnProcBuf; \n"); + fprintf(fd," __m128i* p_llrProcBuf;\n"); + fprintf(fd," __m256i* p_llrRes; \n"); + // fprintf(fd," __m256i* p_bnProcBufRes; \n"); +// fprintf(fd," __m256i* p_llrProcBuf256; \n"); + fprintf(fd," uint32_t M ;\n"); + + + fprintf(fd, "// Process group with 1 CNs \n"); + +/* + // Process group with 1 CNs + + // if (lut_numBnInBnGroups[0] > 0) + // { + // If elements in group move to next address + // idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[0] ); + + // Set the offset to each CN within a group in terms of 16 Byte + // cnOffsetInGroup = (lut_numBnInBnGroups[0]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // fprintf(fd," p_llrProcBuf256 = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + + fprintf(fd," p_bnProcBufRes[i] = p_llrProcBuf256[i];\n"); + + // First 16 LLRs of first CN + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymm0, ymm1);\n"); + + + // Second 16 LLRs of first CN + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1 ]);\n"); + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j + 1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymm0, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + + fprintf(fd,"}\n"); + //} +*/ + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 2 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[1] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[1] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n"); + + // Loop over CNs + for (k=1; k<2; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 3 CNs + + +fprintf(fd, "// Process group with 3 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[2] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[2] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<3; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 4 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[3] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[3] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<4; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 5 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[4] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[4] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<5; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 6 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[5] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[5] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<6; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 7 CNs + +fprintf(fd, "// Process group with 7 CNs \n"); + + // Process group with 7 CNs + + if (lut_numBnInBnGroups[6] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[6] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<7; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 8 CNs + +fprintf(fd, "// Process group with 8 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[7] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[7] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<8; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); + + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 9 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[8] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[8] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<9; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 10 CNs + +fprintf(fd, "// Process group with 10 CNs \n"); + + // Process group with 10 CNs + + if (lut_numBnInBnGroups[9] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[9] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<10; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + +fprintf(fd, "// Process group with 11 CNs \n"); + + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[10] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[10] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<11; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 12 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[11] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[11] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<12; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 13 CNs + + +fprintf(fd, "// Process group with 13 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[12] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[12] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<13; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 14 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[13] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[13] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<14; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 15 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[14] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[14] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<15; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 16 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[15] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[15] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<16; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 17 CNs + +fprintf(fd, "// Process group with 17 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[16] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[16] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<17; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 18 CNs + +fprintf(fd, "// Process group with 18 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[17] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[17] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<18; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 19 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[18] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[18] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<19; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 20 CNs + +fprintf(fd, "// Process group with 20 CNs \n"); + + // Process group with 20 CNs + + if (lut_numBnInBnGroups[19] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[19] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<20; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + + + // ===================================================================== + +fprintf(fd, "// Process group with 21 CNs \n"); + + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[20] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[20] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<21; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 22 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[21] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[21] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<22; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 13 CNs + + +fprintf(fd, "// Process group with <23 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[22] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[22] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<23; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 24 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[23] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[23] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<24; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 25 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[24] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[24] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<25; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 26 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[25] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[25] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<26; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 17 CNs + +fprintf(fd, "// Process group with 27 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[26] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[26] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<27; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 18 CNs + +fprintf(fd, "// Process group with 28 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[27] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[27] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<28; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 29 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[28] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[28] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<29; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 20 CNs + +fprintf(fd, "// Process group with 30 CNs \n"); + + // Process group with 20 CNs + + if (lut_numBnInBnGroups[29] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[29] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<30; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + fprintf(fd,"}\n"); + fclose(fd); +}//end of the function nrLDPC_bnProcPc_BG1 + + + + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.c new file mode 100644 index 00000000000..c2c96280e9a --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.c @@ -0,0 +1,1789 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdio.h> +#include <stdint.h> +#include <immintrin.h> +#include "../../nrLDPCdecoder_defs.h" +#include "../../nrLDPC_types.h" + + +void nrLDPC_bnProcPc_BG2_generator_AVX2(const char *dir, int R) +{ + const char *ratestr[3]={"15","13","23"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + + // system("mkdir -p ../ldpc_gen_files"); + + char fname[FILENAME_MAX+1]; + snprintf(fname, sizeof(fname), "%s/bnProcPc/nrLDPC_bnProcPc_BG2_R%s_AVX2.h", dir, ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) { + printf("Cannot create file %s\n", fname); + abort(); + } + +// fprintf(fd,"#include <stdint.h>\n"); + //fprintf(fd,"#include <immintrin.h>\n"); + + fprintf(fd,"static inline void nrLDPC_bnProcPc_BG2_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]); + const uint8_t* lut_numBnInBnGroups; + const uint32_t* lut_startAddrBnGroups; + const uint16_t* lut_startAddrBnGroupsLlr; + if (R==0) { + + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R15; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R15; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R15; + + } + else if (R==1){ + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R13; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R13; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R13; + } + else if (R==2) { + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R23; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R23; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R23; + } + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + + + + + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t cnOffsetInGroup; + uint8_t idxBnGroup = 0; + + fprintf(fd," __m256i ymm0, ymm1, ymmRes0, ymmRes1; \n"); + + + fprintf(fd," __m128i* p_bnProcBuf; \n"); + fprintf(fd," __m128i* p_llrProcBuf;\n"); + fprintf(fd," __m256i* p_llrRes; \n"); + // fprintf(fd," __m256i* p_bnProcBufRes; \n"); + // fprintf(fd," __m256i* p_llrProcBuf256; \n"); + fprintf(fd," uint32_t M ;\n"); + + + fprintf(fd, "// Process group with 1 CNs \n"); +/* + + // Process group with 1 CNs + + // if (lut_numBnInBnGroups[0] > 0) + // { + // If elements in group move to next address + // idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[0] ); + + // Set the offset to each CN within a group in terms of 16 Byte + // cnOffsetInGroup = (lut_numBnInBnGroups[0]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrProcBuf256 = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + + fprintf(fd," p_bnProcBufRes[i] = p_llrProcBuf256[i];\n"); + + // First 16 LLRs of first CN + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymm0, ymm1);\n"); + + + // Second 16 LLRs of first CN + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1 ]);\n"); + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j + 1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymm0, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + + fprintf(fd,"}\n"); + //} + */ // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 2 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[1] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[1] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n"); + + // Loop over CNs + for (k=1; k<2; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 3 CNs + + +fprintf(fd, "// Process group with 3 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[2] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[2] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<3; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 4 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[3] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[3] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<4; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 5 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[4] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[4] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<5; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 6 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[5] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[5] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<6; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 7 CNs + +fprintf(fd, "// Process group with 7 CNs \n"); + + // Process group with 7 CNs + + if (lut_numBnInBnGroups[6] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[6] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<7; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 8 CNs + +fprintf(fd, "// Process group with 8 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[7] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[7] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<8; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); + + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 9 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[8] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[8] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<9; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 10 CNs + +fprintf(fd, "// Process group with 10 CNs \n"); + + // Process group with 10 CNs + + if (lut_numBnInBnGroups[9] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[9] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<10; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + +fprintf(fd, "// Process group with 11 CNs \n"); + + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[10] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[10] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<11; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 12 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[11] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[11] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<12; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 13 CNs + + +fprintf(fd, "// Process group with 13 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[12] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[12] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<13; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 14 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[13] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[13] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<14; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 15 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[14] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[14] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<15; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 16 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[15] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[15] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<16; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 17 CNs + +fprintf(fd, "// Process group with 17 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[16] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[16] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<17; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 18 CNs + +fprintf(fd, "// Process group with 18 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[17] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[17] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<18; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 19 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[18] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[18] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<19; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 20 CNs + +fprintf(fd, "// Process group with 20 CNs \n"); + + // Process group with 20 CNs + + if (lut_numBnInBnGroups[19] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[19] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<20; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + + + // ===================================================================== + +fprintf(fd, "// Process group with 21 CNs \n"); + + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[20] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[20] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<21; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 22 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[21] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[21] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<22; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 13 CNs + + +fprintf(fd, "// Process group with <23 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[22] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[22] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<23; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 24 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[23] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[23] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<24; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 25 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[24] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[24] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<25; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 26 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[25] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[25] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<26; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 17 CNs + +fprintf(fd, "// Process group with 27 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[26] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[26] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<27; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 18 CNs + +fprintf(fd, "// Process group with 28 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[27] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[27] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<28; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 29 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[28] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[28] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<29; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 20 CNs + +fprintf(fd, "// Process group with 30 CNs \n"); + + // Process group with 20 CNs + + if (lut_numBnInBnGroups[29] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[29] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>4; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," ymmRes0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," ymmRes1 = _mm256_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<30; k++) + { + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n"); + + fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n"); + + // Pack results back to epi8 + fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); + // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] + // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + fprintf(fd,"}\n"); + fclose(fd); +}//end of the function nrLDPC_bnProcPc_BG2 + + + + + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.c new file mode 100644 index 00000000000..972a5720ca4 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.c @@ -0,0 +1,1112 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <immintrin.h> +#include "../../nrLDPCdecoder_defs.h" +#include "../../nrLDPC_types.h" + + +void nrLDPC_bnProc_BG1_generator_AVX2(const char *dir, int R) +{ + const char *ratestr[3]={"13","23","89"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + + // system("mkdir -p ../ldpc_gen_files"); + + char fname[FILENAME_MAX+1]; + snprintf(fname, sizeof(fname), "%s/bnProc/nrLDPC_bnProc_BG1_R%s_AVX2.h", dir, ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) { + printf("Cannot create file %s\n", fname); + abort(); + } + + //fprintf(fd,"#include <stdint.h>\n"); + //fprintf(fd,"#include <immintrin.h>\n"); + + + fprintf(fd,"static inline void nrLDPC_bnProc_BG1_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {\n", ratestr[R]); + + const uint8_t* lut_numBnInBnGroups; + const uint32_t* lut_startAddrBnGroups; + const uint16_t* lut_startAddrBnGroupsLlr; + if (R==0) { + + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R13; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R13; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R13; + + } + else if (R==1){ + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R23; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R23; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R23; + } + else if (R==2) { + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R89; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R89; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R89; + } + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + + + //uint32_t M; + //uint32_t M32rem; + // uint32_t i; + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t cnOffsetInGroup; + uint8_t idxBnGroup = 0; + fprintf(fd," uint32_t M, i; \n"); + + + +// ===================================================================== + // Process group with 1 CN + // Already done in bnProcBufPc + + // ===================================================================== + +fprintf(fd, "// Process group with 2 CNs \n"); + + if (lut_numBnInBnGroups[1] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs or parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[1] ); + + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<2; k++) + { + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + + + + } + + // ===================================================================== + + +fprintf(fd, "// Process group with 3 CNs \n"); + + + + if (lut_numBnInBnGroups[2] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[2] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + //fprintf(fd," ((__m256i*) bnProcBuf) = ((__m256i*) &bnProcBuf) [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + + + for (k=0; k<3; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 4 CNs \n"); + + + + if (lut_numBnInBnGroups[3] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[3] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + + + for (k=0; k<4; k++) + { + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",((lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup),(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), ((lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup)); + + fprintf(fd,"}\n"); + } + } + + + // ===================================================================== + + + fprintf(fd, "// Process group with 5 CNs \n"); + + + + if (lut_numBnInBnGroups[4] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[4] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<5; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 6 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[5] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[5] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<6; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 7 CNs \n"); + + // Process group with 7 CNs + + if (lut_numBnInBnGroups[6] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[6] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<7; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 8 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[7] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[7] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<8; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + +fprintf(fd, "// Process group with 9 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[8] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[8] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<9; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + +fprintf(fd, "// Process group with 10 CNs \n"); + + // Process group with 10 CNs + + if (lut_numBnInBnGroups[9] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[9] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<10; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + +fprintf(fd, "// Process group with 11 CNs \n"); + + if (lut_numBnInBnGroups[10] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[10] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<11; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + // ===================================================================== + + + +fprintf(fd, "// Process group with 12 CNs \n"); + + + if (lut_numBnInBnGroups[11] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[11] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<12; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + + +fprintf(fd, "// Process group with 13 CNs \n"); + + + + if (lut_numBnInBnGroups[12] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[12] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<13; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 14 CNs \n"); + + + + if (lut_numBnInBnGroups[13] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[13] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<14; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 15 CNs \n"); + + + + if (lut_numBnInBnGroups[14] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[14] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<15; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 16 CNs \n"); + + + + if (lut_numBnInBnGroups[15] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[15] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<16; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + // Process group with 17 CNs + +fprintf(fd, "// Process group with 17 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[16] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[16] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<17; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 18 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[17] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[17] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<18; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + +fprintf(fd, "// Process group with 19 CNs \n"); + + + + if (lut_numBnInBnGroups[18] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[18] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<19; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 20 CNs \n"); + + + + if (lut_numBnInBnGroups[19] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[19] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<20; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + + + // ===================================================================== + +fprintf(fd, "// Process group with 21 CNs \n"); + + + + + + if (lut_numBnInBnGroups[20] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[20] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<21; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + // ===================================================================== + + + +fprintf(fd, "// Process group with 22 CNs \n"); + + + if (lut_numBnInBnGroups[21] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[21] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<22; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + + +fprintf(fd, "// Process group with <23 CNs \n"); + + + + if (lut_numBnInBnGroups[22] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[22] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<23; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 24 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[23] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[23] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<24; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 25 CNs \n"); + + + + if (lut_numBnInBnGroups[24] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[24] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<25; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 26 CNs \n"); + + + + if (lut_numBnInBnGroups[25] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[25] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<26; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 27 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[26] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[26] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<27; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 28 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[27] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[27] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<28; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + +fprintf(fd, "// Process group with 29 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[28] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[28] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<29; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + +fprintf(fd, "// Process group with 30 CNs \n"); + + // Process group with 20 CNs + + if (lut_numBnInBnGroups[29] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[29] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<30; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + fprintf(fd,"}\n"); + fclose(fd); +}//end of the function nrLDPC_bnProc_BG1 + + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.c new file mode 100644 index 00000000000..c23fd0b5a75 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.c @@ -0,0 +1,1108 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "../../nrLDPCdecoder_defs.h" +#include "../../nrLDPC_types.h" + + + +void nrLDPC_bnProc_BG2_generator_AVX2(const char *dir, int R) +{ + const char *ratestr[3]={"15","13","23"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + + // system("mkdir -p ../ldpc_gen_files"); + + char fname[FILENAME_MAX+1]; + snprintf(fname, sizeof(fname), "%s/bnProc/nrLDPC_bnProc_BG2_R%s_AVX2.h", dir, ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) { + printf("Cannot create file %s\n", fname); + abort(); + } + + + + fprintf(fd,"static inline void nrLDPC_bnProc_BG2_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {\n",ratestr[R]); + const uint8_t* lut_numBnInBnGroups; + const uint32_t* lut_startAddrBnGroups; + const uint16_t* lut_startAddrBnGroupsLlr; + if (R==0) { + + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R15; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R15; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R15; + + } + else if (R==1){ + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R13; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R13; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R13; + } + else if (R==2) { + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R23; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R23; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R23; + } + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + + + //uint32_t M; + //uint32_t M32rem; + // uint32_t i; + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t cnOffsetInGroup; + uint8_t idxBnGroup = 0; + + + + fprintf(fd," uint32_t M, i; \n"); + + + +// ===================================================================== + // Process group with 1 CN + // Already done in bnProcBufPc + + // ===================================================================== + +fprintf(fd, "// Process group with 2 CNs \n"); + + if (lut_numBnInBnGroups[1] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs or parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[1] ); + + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<2; k++) + { + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + + + + } + + // ===================================================================== + + +fprintf(fd, "// Process group with 3 CNs \n"); + + + + if (lut_numBnInBnGroups[2] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[2] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + //fprintf(fd," ((__m256i*) bnProcBuf) = ((__m256i*) &bnProcBuf) [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + + + for (k=0; k<3; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 4 CNs \n"); + + + + if (lut_numBnInBnGroups[3] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[3] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + + + for (k=0; k<4; k++) + { + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",((lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup),(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), ((lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup)); + + fprintf(fd,"}\n"); + } + } + + + // ===================================================================== + + + fprintf(fd, "// Process group with 5 CNs \n"); + + + + if (lut_numBnInBnGroups[4] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[4] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<5; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 6 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[5] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[5] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<6; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 7 CNs \n"); + + // Process group with 7 CNs + + if (lut_numBnInBnGroups[6] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[6] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<7; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 8 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[7] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[7] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<8; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + +fprintf(fd, "// Process group with 9 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[8] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[8] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<9; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + +fprintf(fd, "// Process group with 10 CNs \n"); + + // Process group with 10 CNs + + if (lut_numBnInBnGroups[9] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[9] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<10; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + +fprintf(fd, "// Process group with 11 CNs \n"); + + if (lut_numBnInBnGroups[10] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[10] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<11; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + // ===================================================================== + + + +fprintf(fd, "// Process group with 12 CNs \n"); + + + if (lut_numBnInBnGroups[11] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[11] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<12; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + + +fprintf(fd, "// Process group with 13 CNs \n"); + + + + if (lut_numBnInBnGroups[12] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[12] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<13; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 14 CNs \n"); + + + + if (lut_numBnInBnGroups[13] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[13] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<14; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 15 CNs \n"); + + + + if (lut_numBnInBnGroups[14] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[14] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<15; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 16 CNs \n"); + + + + if (lut_numBnInBnGroups[15] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[15] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<16; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + // Process group with 17 CNs + +fprintf(fd, "// Process group with 17 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[16] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[16] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<17; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 18 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[17] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[17] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<18; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + +fprintf(fd, "// Process group with 19 CNs \n"); + + + + if (lut_numBnInBnGroups[18] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[18] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<19; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + +fprintf(fd, "// Process group with 20 CNs \n"); + + + + if (lut_numBnInBnGroups[19] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[19] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<20; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + + + // ===================================================================== + +fprintf(fd, "// Process group with 21 CNs \n"); + + + + + + if (lut_numBnInBnGroups[20] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[20] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<21; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + // ===================================================================== + + + +fprintf(fd, "// Process group with 22 CNs \n"); + + + if (lut_numBnInBnGroups[21] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[21] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<22; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + + +fprintf(fd, "// Process group with <23 CNs \n"); + + + + if (lut_numBnInBnGroups[22] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[22] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<23; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 24 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[23] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[23] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<24; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 25 CNs \n"); + + + + if (lut_numBnInBnGroups[24] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[24] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<25; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 26 CNs \n"); + + + + if (lut_numBnInBnGroups[25] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[25] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<26; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 27 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[26] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[26] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<27; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 28 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[27] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[27] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<28; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + +fprintf(fd, "// Process group with 29 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[28] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[28] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<29; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + +fprintf(fd, "// Process group with 30 CNs \n"); + + // Process group with 20 CNs + + if (lut_numBnInBnGroups[29] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[29] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<30; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m256i*)bnProcBufRes)[%d + i ] = _mm256_subs_epi8(((__m256i*)llrRes)[%d + i ], ((__m256i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>5), (lut_startAddrBnGroups[idxBnGroup]>>5)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + fprintf(fd,"}\n"); + fclose(fd); +}//end of the function nrLDPC_bnProc_BG2 + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/main.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/main.c new file mode 100644 index 00000000000..9e5f9e2bb88 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/main.c @@ -0,0 +1,55 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdio.h> +#include <stdint.h> +#define NB_R 3 +void nrLDPC_bnProc_BG1_generator_AVX2(const char*, int); +void nrLDPC_bnProc_BG2_generator_AVX2(const char*, int); +void nrLDPC_bnProcPc_BG1_generator_AVX2(const char*, int); +void nrLDPC_bnProcPc_BG2_generator_AVX2(const char*, int); + +const char *__asan_default_options() +{ + /* don't do leak checking in nr_ulsim, creates problems in the CI */ + return "detect_leaks=0"; +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) { + fprintf(stderr, "usage: %s <output-dir>\n", argv[0]); + return 1; + } + const char *dir = argv[1]; + + int R[NB_R]={0,1,2}; + for(int i=0; i<NB_R;i++){ + nrLDPC_bnProc_BG1_generator_AVX2(dir, R[i]); + nrLDPC_bnProc_BG2_generator_AVX2(dir, R[i]); + + nrLDPC_bnProcPc_BG1_generator_AVX2(dir, R[i]); + nrLDPC_bnProcPc_BG2_generator_AVX2(dir, R[i]); + } + + return(0); +} + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/CMakeLists.txt new file mode 100644 index 00000000000..f0b3d49b1e6 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/CMakeLists.txt @@ -0,0 +1,36 @@ +add_executable(bnProc_gen_avx512 + bnProc_gen_BG1_avx512.c + bnProc_gen_BG2_avx512.c + bnProcPc_gen_BG1_avx512.c + bnProcPc_gen_BG2_avx512.c + main.c) +target_compile_options(bnProc_gen_avx512 PRIVATE -W -Wall -mavx2) + +#set(bnProc_avx512_headers +# bnProc_avx512/rLDPC_bnProc_BG1_R13_AVX512.h +# bnProc_avx512/rLDPC_bnProc_BG1_R23_AVX512.h +# bnProc_avx512/rLDPC_bnProc_BG1_R89_AVX512.h +# bnProc_avx512/rLDPC_bnProc_BG2_R13_AVX512.h +# bnProc_avx512/rLDPC_bnProc_BG2_R15_AVX512.h +# bnProc_avx512/rLDPC_bnProc_BG2_R23_AVX512.h) +# +#set(bnProcPc_avx512_headers +# bnProcPc_avx512/rLDPC_bnProcPc_BG1_R13_AVX512.h +# bnProcPc_avx512/rLDPC_bnProcPc_BG1_R23_AVX512.h +# bnProcPc_avx512/rLDPC_bnProcPc_BG1_R89_AVX512.h +# bnProcPc_avx512/rLDPC_bnProcPc_BG2_R13_AVX512.h +# bnProcPc_avx512/rLDPC_bnProcPc_BG2_R15_AVX512.h +# bnProcPc_avx512/rLDPC_bnProcPc_BG2_R23_AVX512.h) + +add_custom_command(TARGET bnProc_gen_avx512 POST_BUILD + #OUTPUT ${bnProc_avx512_headers} ${bnProcPc_avx512_headers} + COMMAND ${CMAKE_COMMAND} -E make_directory bnProc_avx512 + COMMAND ${CMAKE_COMMAND} -E make_directory bnProcPc_avx512 + COMMAND bnProc_gen_avx512 . + DEPENDS bnProc_gen_avx512 + COMMENT "Generating LDPC bnProc header files for AVX512" +) + +add_library(bnProc_gen_avx512_HEADERS INTERFACE) +target_include_directories(bnProc_gen_avx512_HEADERS INTERFACE ${CMAKE_CURRENT_BINARY_DIR}) +add_dependencies(bnProc_gen_avx512_HEADERS bnProc_gen_avx512) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c new file mode 100644 index 00000000000..2bbca1591f7 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c @@ -0,0 +1,1790 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <immintrin.h> +#include "../../nrLDPCdecoder_defs.h" +#include "../../nrLDPC_types.h" + + +void nrLDPC_bnProcPc_BG1_generator_AVX512(const char *dir, int R) +{ + const char *ratestr[3]={"13","23","89"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + + + + char fname[FILENAME_MAX+1]; + snprintf(fname, sizeof(fname), "%s/bnProcPc_avx512/nrLDPC_bnProcPc_BG1_R%s_AVX512.h", dir, ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) { + printf("Cannot create file %s\n", fname); + abort(); + } + + + + fprintf(fd,"static inline void nrLDPC_bnProcPc_BG1_R%s_AVX512(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]); + const uint8_t* lut_numBnInBnGroups; + const uint32_t* lut_startAddrBnGroups; + const uint16_t* lut_startAddrBnGroupsLlr; + if (R==0) { + + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R13; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R13; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R13; + + } + else if (R==1){ + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R23; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R23; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R23; + } + else if (R==2) { + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R89; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R89; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R89; + } + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + // Number of BNs in Groups +// uint32_t M; + //uint32_t M32rem; + //uint32_t i,j; + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t cnOffsetInGroup; + uint8_t idxBnGroup = 0; + + fprintf(fd," __m512i zmm0, zmm1, zmmRes0, zmmRes1; \n"); + + + fprintf(fd," __m256i* p_bnProcBuf; \n"); + fprintf(fd," __m256i* p_llrProcBuf;\n"); + fprintf(fd," __m512i* p_llrRes; \n"); + fprintf(fd," uint32_t M ;\n"); + + +fprintf(fd, "// Process group with 1 CNs \n"); + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[0] > 0) + { + // If elements in group move to next address + // idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[0] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[0]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n"); + + // Loop over CNs + for (k=1; k<1; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 2 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[1] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[1] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n"); + + // Loop over CNs + for (k=1; k<2; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 3 CNs + + +fprintf(fd, "// Process group with 3 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[2] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[2] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<3; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 4 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[3] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[3] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<4; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 5 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[4] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[4] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<5; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 6 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[5] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[5] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<6; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 7 CNs + +fprintf(fd, "// Process group with 7 CNs \n"); + + // Process group with 7 CNs + + if (lut_numBnInBnGroups[6] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[6] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<7; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + //fprintf(fd," (__m512i*) &llrRes[%d + i] = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>6 ); + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 8 CNs + +fprintf(fd, "// Process group with 8 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[7] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[7] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<8; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + //fprintf(fd," (__m512i*) &llrRes[%d + i] = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>6 ); + + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 9 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[8] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[8] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<9; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + //fprintf(fd," (__m512i*) &llrRes[%d + i] = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>6 ); + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 10 CNs + +fprintf(fd, "// Process group with 10 CNs \n"); + + // Process group with 10 CNs + + if (lut_numBnInBnGroups[9] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[9] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<10; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + +fprintf(fd, "// Process group with 11 CNs \n"); + + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[10] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[10] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<11; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 12 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[11] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[11] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<12; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 13 CNs + + +fprintf(fd, "// Process group with 13 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[12] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[12] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<13; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 14 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[13] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[13] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<14; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 15 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[14] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[14] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<15; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 16 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[15] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[15] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<16; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 17 CNs + +fprintf(fd, "// Process group with 17 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[16] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[16] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<17; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 18 CNs + +fprintf(fd, "// Process group with 18 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[17] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[17] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<18; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 19 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[18] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[18] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<19; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 20 CNs + +fprintf(fd, "// Process group with 20 CNs \n"); + + // Process group with 20 CNs + + if (lut_numBnInBnGroups[19] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[19] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<20; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + + + // ===================================================================== + +fprintf(fd, "// Process group with 21 CNs \n"); + + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[20] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[20] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<21; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 22 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[21] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[21] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<22; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 13 CNs + + +fprintf(fd, "// Process group with <23 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[22] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[22] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<23; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 24 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[23] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[23] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<24; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 25 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[24] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[24] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<25; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 26 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[25] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[25] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<26; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 17 CNs + +fprintf(fd, "// Process group with 27 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[26] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[26] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<27; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 18 CNs + +fprintf(fd, "// Process group with 28 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[27] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[27] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<28; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 29 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[28] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[28] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<29; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 20 CNs + +fprintf(fd, "// Process group with 30 CNs \n"); + + // Process group with 20 CNs + + if (lut_numBnInBnGroups[29] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[29] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<30; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + fprintf(fd,"}\n"); + fclose(fd); +}//end of the function nrLDPC_bnProcPc_BG1 + + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG2_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG2_avx512.c new file mode 100644 index 00000000000..418fe1f36f8 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG2_avx512.c @@ -0,0 +1,1793 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <immintrin.h> +#include "../../nrLDPCdecoder_defs.h" +#include "../../nrLDPC_types.h" + + +void nrLDPC_bnProcPc_BG2_generator_AVX512(const char *dir, int R) +{ + const char *ratestr[3]={"15","13","23"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + + // system("mkdir -p ../ldpc_gen_files"); + + char fname[FILENAME_MAX+1]; + snprintf(fname, sizeof(fname), "%s/bnProcPc_avx512/nrLDPC_bnProcPc_BG2_R%s_AVX512.h", dir, ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) { + printf("Cannot create file %s\n", fname); + abort(); + } + +// fprintf(fd,"#include <stdint.h>\n"); + //fprintf(fd,"#include <immintrin.h>\n"); + + fprintf(fd,"static inline void nrLDPC_bnProcPc_BG2_R%s_AVX512(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]); + const uint8_t* lut_numBnInBnGroups; + const uint32_t* lut_startAddrBnGroups; + const uint16_t* lut_startAddrBnGroupsLlr; + if (R==0) { + + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R15; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R15; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R15; + + } + else if (R==1){ + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R13; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R13; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R13; + } + else if (R==2) { + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R23; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R23; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R23; + } + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + + + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t cnOffsetInGroup; + uint8_t idxBnGroup = 0; + + fprintf(fd," __m512i zmm0,zmm1,zmmRes0,zmmRes1; \n"); + + + fprintf(fd," __m256i* p_bnProcBuf; \n"); + fprintf(fd," __m256i* p_llrProcBuf;\n"); + fprintf(fd," __m512i* p_llrRes; \n"); + fprintf(fd," uint32_t M ;\n"); + + +fprintf(fd, "// Process group with 1 CNs \n"); + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[0] > 0) + { + // If elements in group move to next address + // idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[0] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[0]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + + // Loop over CNs + /*for (k=1; k<1; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } +*/ + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[j+1]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 2 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[1] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[1] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n"); + + // Loop over CNs + for (k=1; k<2; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 3 CNs + + +fprintf(fd, "// Process group with 3 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[2] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[2] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<3; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 4 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[3] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[3] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<4; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 5 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[4] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[4] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<5; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 6 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[5] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[5] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<6; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 7 CNs + +fprintf(fd, "// Process group with 7 CNs \n"); + + // Process group with 7 CNs + + if (lut_numBnInBnGroups[6] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[6] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<7; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + //fprintf(fd," (__m512i*) &llrRes[%d + i] = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 8 CNs + +fprintf(fd, "// Process group with 8 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[7] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[7] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<8; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + //fprintf(fd," (__m512i*) &llrRes[%d + i] = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); + + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 9 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[8] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[8] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<9; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + //fprintf(fd," (__m512i*) &llrRes[%d + i] = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 10 CNs + +fprintf(fd, "// Process group with 10 CNs \n"); + + // Process group with 10 CNs + + if (lut_numBnInBnGroups[9] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[9] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<10; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + +fprintf(fd, "// Process group with 11 CNs \n"); + + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[10] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[10] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<11; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 12 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[11] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[11] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<12; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 13 CNs + + +fprintf(fd, "// Process group with 13 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[12] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[12] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<13; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 14 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[13] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[13] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<14; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 15 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[14] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[14] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<15; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 16 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[15] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[15] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<16; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 17 CNs + +fprintf(fd, "// Process group with 17 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[16] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[16] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<17; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 18 CNs + +fprintf(fd, "// Process group with 18 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[17] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[17] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<18; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 19 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[18] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[18] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<19; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 20 CNs + +fprintf(fd, "// Process group with 20 CNs \n"); + + // Process group with 20 CNs + + if (lut_numBnInBnGroups[19] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[19] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<20; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + + + // ===================================================================== + +fprintf(fd, "// Process group with 21 CNs \n"); + + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[20] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[20] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<21; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 22 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[21] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[21] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<22; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 13 CNs + + +fprintf(fd, "// Process group with <23 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[22] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[22] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<23; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 24 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[23] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[23] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<24; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 25 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[24] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[24] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<25; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 26 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[25] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[25] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<26; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 17 CNs + +fprintf(fd, "// Process group with 27 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[26] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[26] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<27; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 18 CNs + +fprintf(fd, "// Process group with 28 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[27] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[27] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<28; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 29 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[28] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[28] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<29; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 20 CNs + +fprintf(fd, "// Process group with 30 CNs \n"); + + // Process group with 20 CNs + + if (lut_numBnInBnGroups[29] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[29] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<30; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + fprintf(fd,"}\n"); + fclose(fd); +}//end of the function nrLDPC_bnProcPc_BG2 + + + + + + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG1_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG1_avx512.c new file mode 100644 index 00000000000..2c049842208 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG1_avx512.c @@ -0,0 +1,1112 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdlib.h> +#include <stdio.h> +#include <stdint.h> +#include <immintrin.h> +#include "../../nrLDPCdecoder_defs.h" +#include "../../nrLDPC_types.h" + + +void nrLDPC_bnProc_BG1_generator_AVX512(const char *dir, int R) +{ + const char *ratestr[3]={"13","23","89"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + + // system("mkdir -p ../ldpc_gen_files"); + + char fname[FILENAME_MAX+1]; + snprintf(fname, sizeof(fname), "%s/bnProc_avx512/nrLDPC_bnProc_BG1_R%s_AVX512.h", dir, ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) { + printf("Cannot create file %s\n", fname); + abort(); + } + + //fprintf(fd,"#include <stdint.h>\n"); + //fprintf(fd,"#include <immintrin.h>\n"); + + + fprintf(fd,"static inline void nrLDPC_bnProc_BG1_R%s_AVX512(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {\n", ratestr[R]); + + const uint8_t* lut_numBnInBnGroups; + const uint32_t* lut_startAddrBnGroups; + const uint16_t* lut_startAddrBnGroupsLlr; + if (R==0) { + + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R13; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R13; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R13; + + } + else if (R==1){ + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R23; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R23; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R23; + } + else if (R==2) { + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R89; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R89; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R89; + } + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + + + //uint32_t M; + //uint32_t M32rem; + // uint32_t i; + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t cnOffsetInGroup; + uint8_t idxBnGroup = 0; + fprintf(fd," uint32_t M, i; \n"); + + + +// ===================================================================== + // Process group with 1 CN + // Already done in bnProcBufPc + + // ===================================================================== + +fprintf(fd, "// Process group with 2 CNs \n"); + + if (lut_numBnInBnGroups[1] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs or parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[1] ); + + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<2; k++) + { + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + + + + } + + // ===================================================================== + + +fprintf(fd, "// Process group with 3 CNs \n"); + + + + if (lut_numBnInBnGroups[2] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[2] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + //fprintf(fd," ((__m512i*) bnProcBuf) = ((__m512i*) &bnProcBuf) [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + + + for (k=0; k<3; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 4 CNs \n"); + + + + if (lut_numBnInBnGroups[3] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[3] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + + + for (k=0; k<4; k++) + { + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",((lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup),(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), ((lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup)); + + fprintf(fd,"}\n"); + } + } + + + // ===================================================================== + + + fprintf(fd, "// Process group with 5 CNs \n"); + + + + if (lut_numBnInBnGroups[4] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[4] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<5; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 6 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[5] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[5] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<6; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 7 CNs \n"); + + // Process group with 7 CNs + + if (lut_numBnInBnGroups[6] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[6] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<7; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 8 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[7] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[7] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<8; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + +fprintf(fd, "// Process group with 9 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[8] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[8] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<9; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + +fprintf(fd, "// Process group with 10 CNs \n"); + + // Process group with 10 CNs + + if (lut_numBnInBnGroups[9] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[9] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<10; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + +fprintf(fd, "// Process group with 11 CNs \n"); + + if (lut_numBnInBnGroups[10] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[10] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<11; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + // ===================================================================== + + + +fprintf(fd, "// Process group with 12 CNs \n"); + + + if (lut_numBnInBnGroups[11] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[11] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<12; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + + +fprintf(fd, "// Process group with 13 CNs \n"); + + + + if (lut_numBnInBnGroups[12] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[12] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<13; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 14 CNs \n"); + + + + if (lut_numBnInBnGroups[13] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[13] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<14; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 15 CNs \n"); + + + + if (lut_numBnInBnGroups[14] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[14] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<15; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 16 CNs \n"); + + + + if (lut_numBnInBnGroups[15] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[15] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<16; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + // Process group with 17 CNs + +fprintf(fd, "// Process group with 17 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[16] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[16] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<17; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 18 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[17] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[17] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<18; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + +fprintf(fd, "// Process group with 19 CNs \n"); + + + + if (lut_numBnInBnGroups[18] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[18] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<19; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 20 CNs \n"); + + + + if (lut_numBnInBnGroups[19] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[19] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<20; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + + + // ===================================================================== + +fprintf(fd, "// Process group with 21 CNs \n"); + + + + + + if (lut_numBnInBnGroups[20] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[20] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<21; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + // ===================================================================== + + + +fprintf(fd, "// Process group with 22 CNs \n"); + + + if (lut_numBnInBnGroups[21] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[21] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<22; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + + +fprintf(fd, "// Process group with <23 CNs \n"); + + + + if (lut_numBnInBnGroups[22] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[22] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<23; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 24 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[23] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[23] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<24; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 25 CNs \n"); + + + + if (lut_numBnInBnGroups[24] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[24] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<25; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 26 CNs \n"); + + + + if (lut_numBnInBnGroups[25] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[25] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<26; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 27 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[26] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[26] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<27; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 28 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[27] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[27] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<28; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + +fprintf(fd, "// Process group with 29 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[28] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[28] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<29; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + +fprintf(fd, "// Process group with 30 CNs \n"); + + // Process group with 20 CNs + + if (lut_numBnInBnGroups[29] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[29] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<30; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + fprintf(fd,"}\n"); + fclose(fd); +}//end of the function nrLDPC_bnProc_BG1 + + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG2_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG2_avx512.c new file mode 100644 index 00000000000..bcd1179b126 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG2_avx512.c @@ -0,0 +1,1108 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <immintrin.h> +#include "../../nrLDPCdecoder_defs.h" +#include "../../nrLDPC_types.h" + + +void nrLDPC_bnProc_BG2_generator_AVX512(const char *dir, int R) +{ + const char *ratestr[3]={"15","13","23"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + + // system("mkdir -p ../ldpc_gen_files"); + + char fname[FILENAME_MAX+1]; + snprintf(fname, sizeof(fname), "%s/bnProc_avx512/nrLDPC_bnProc_BG2_R%s_AVX512.h", dir, ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) { + printf("Cannot create file %s\n", fname); + abort(); + } + + fprintf(fd,"#include <stdint.h>\n"); + fprintf(fd,"#include <immintrin.h>\n"); + + fprintf(fd,"void nrLDPC_bnProc_BG2_R%s_AVX512(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {\n",ratestr[R]); + const uint8_t* lut_numBnInBnGroups; + const uint32_t* lut_startAddrBnGroups; + const uint16_t* lut_startAddrBnGroupsLlr; + if (R==0) { + + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R15; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R15; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R15; + + } + else if (R==1){ + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R13; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R13; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R13; + } + else if (R==2) { + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R23; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R23; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R23; + } + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + + + + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t cnOffsetInGroup; + uint8_t idxBnGroup = 0; + fprintf(fd," uint32_t M, i; \n"); + + + +// ===================================================================== + // Process group with 1 CN + // Already done in bnProcBufPc + + // ===================================================================== + +fprintf(fd, "// Process group with 2 CNs \n"); + + if (lut_numBnInBnGroups[1] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs or parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[1] ); + + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<2; k++) + { + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + + + + } + + // ===================================================================== + + +fprintf(fd, "// Process group with 3 CNs \n"); + + + + if (lut_numBnInBnGroups[2] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[2] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + //fprintf(fd," ((__m512i*) bnProcBuf) = ((__m512i*) &bnProcBuf) [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + + + for (k=0; k<3; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 4 CNs \n"); + + + + if (lut_numBnInBnGroups[3] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[3] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + + + for (k=0; k<4; k++) + { + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",((lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup),(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), ((lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup)); + + fprintf(fd,"}\n"); + } + } + + + // ===================================================================== + + + fprintf(fd, "// Process group with 5 CNs \n"); + + + + if (lut_numBnInBnGroups[4] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[4] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<5; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 6 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[5] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[5] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<6; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 7 CNs \n"); + + // Process group with 7 CNs + + if (lut_numBnInBnGroups[6] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[6] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<7; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 8 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[7] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[7] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<8; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + +fprintf(fd, "// Process group with 9 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[8] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[8] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<9; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + +fprintf(fd, "// Process group with 10 CNs \n"); + + // Process group with 10 CNs + + if (lut_numBnInBnGroups[9] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[9] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<10; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + +fprintf(fd, "// Process group with 11 CNs \n"); + + if (lut_numBnInBnGroups[10] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[10] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<11; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + // ===================================================================== + + + +fprintf(fd, "// Process group with 12 CNs \n"); + + + if (lut_numBnInBnGroups[11] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[11] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<12; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + + +fprintf(fd, "// Process group with 13 CNs \n"); + + + + if (lut_numBnInBnGroups[12] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[12] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<13; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 14 CNs \n"); + + + + if (lut_numBnInBnGroups[13] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[13] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<14; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 15 CNs \n"); + + + + if (lut_numBnInBnGroups[14] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[14] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<15; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 16 CNs \n"); + + + + if (lut_numBnInBnGroups[15] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[15] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<16; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + // Process group with 17 CNs + +fprintf(fd, "// Process group with 17 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[16] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[16] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<17; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 18 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[17] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[17] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<18; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + +fprintf(fd, "// Process group with 19 CNs \n"); + + + + if (lut_numBnInBnGroups[18] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[18] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<19; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 20 CNs \n"); + + + + if (lut_numBnInBnGroups[19] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[19] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<20; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + + + // ===================================================================== + +fprintf(fd, "// Process group with 21 CNs \n"); + + + + + + if (lut_numBnInBnGroups[20] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[20] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<21; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + // ===================================================================== + + + +fprintf(fd, "// Process group with 22 CNs \n"); + + + if (lut_numBnInBnGroups[21] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[21] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<22; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + + + +fprintf(fd, "// Process group with <23 CNs \n"); + + + + if (lut_numBnInBnGroups[22] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[22] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<23; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 24 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[23] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[23] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<24; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 25 CNs \n"); + + + + if (lut_numBnInBnGroups[24] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[24] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<25; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + + fprintf(fd,"}\n"); + + } + } + + + + // ===================================================================== + + +fprintf(fd, "// Process group with 26 CNs \n"); + + + + if (lut_numBnInBnGroups[25] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[25] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<26; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 27 CNs \n"); + + // Process group with 17 CNs + + if (lut_numBnInBnGroups[26] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[26] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<27; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + + +fprintf(fd, "// Process group with 28 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[27] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[27] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<28; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + // ===================================================================== + +fprintf(fd, "// Process group with 29 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[28] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[28] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<29; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + + // ===================================================================== + +fprintf(fd, "// Process group with 30 CNs \n"); + + // Process group with 20 CNs + + if (lut_numBnInBnGroups[29] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[29] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>6; + + // Set pointers to start of group 2 + + // Loop over CNs + for (k=0; k<30; k++) + { + + + // Loop over BNs + fprintf(fd," for (i=0;i<M;i++) {\n"); + fprintf(fd," ((__m512i*)bnProcBufRes)[%d + i ] = _mm512_subs_epi8(((__m512i*)llrRes)[%d + i ], ((__m512i*) bnProcBuf)[%d + i]);\n",(lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup,(lut_startAddrBnGroupsLlr[idxBnGroup]>>6), (lut_startAddrBnGroups[idxBnGroup]>>6)+ k*cnOffsetInGroup); + + fprintf(fd,"}\n"); + + } + } + + fprintf(fd,"}\n"); + fclose(fd); +}//end of the function nrLDPC_bnProc_BG1 + + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/main.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/main.c new file mode 100644 index 00000000000..8db03d8f51a --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/main.c @@ -0,0 +1,56 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#define NB_R 3 +void nrLDPC_bnProc_BG1_generator_AVX512(const char *, int); +void nrLDPC_bnProc_BG2_generator_AVX512(const char *, int); +void nrLDPC_bnProcPc_BG1_generator_AVX512(const char *, int); +void nrLDPC_bnProcPc_BG2_generator_AVX512(const char *, int); + +const char *__asan_default_options() +{ + /* don't do leak checking in nr_ulsim, creates problems in the CI */ + return "detect_leaks=0"; +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) { + fprintf(stderr, "usage: %s <output-dir>\n", argv[0]); + return 1; + } + const char *dir = argv[1]; + + int R[NB_R]={0,1,2}; + for(int i=0; i<NB_R;i++){ + nrLDPC_bnProc_BG1_generator_AVX512(dir, R[i]); + nrLDPC_bnProc_BG2_generator_AVX512(dir, R[i]); + + nrLDPC_bnProcPc_BG1_generator_AVX512(dir, R[i]); + nrLDPC_bnProcPc_BG2_generator_AVX512(dir, R[i]); + } + + return(0); +} + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/CMakeLists.txt new file mode 100644 index 00000000000..d78dfc4436c --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/CMakeLists.txt @@ -0,0 +1,25 @@ +add_executable(cnProc_gen_avx2 + cnProc_gen_BG1_avx2.c + cnProc_gen_BG2_avx2.c + main.c) +target_compile_options(cnProc_gen_avx2 PRIVATE -W -Wall -mavx2) + +#set(cnProc_headers +# cnProc/rLDPC_cnProc_BG1_R13_AVX2.h +# cnProc/rLDPC_cnProc_BG1_R23_AVX2.h +# cnProc/rLDPC_cnProc_BG1_R89_AVX2.h +# cnProc/rLDPC_cnProc_BG2_R13_AVX2.h +# cnProc/rLDPC_cnProc_BG2_R15_AVX2.h +# cnProc/rLDPC_cnProc_BG2_R23_AVX2.h) + +add_custom_command(TARGET cnProc_gen_avx2 POST_BUILD + #OUTPUT ${cnProc_headers} + COMMAND ${CMAKE_COMMAND} -E make_directory cnProc + COMMAND cnProc_gen_avx2 . + DEPENDS cnProc_gen_avx2 + COMMENT "Generating LDPC cnProc header files for AVX2" +) + +add_library(cnProc_gen_avx2_HEADERS INTERFACE) +target_include_directories(cnProc_gen_avx2_HEADERS INTERFACE ${CMAKE_CURRENT_BINARY_DIR}) +add_dependencies(cnProc_gen_avx2_HEADERS cnProc_gen_avx2) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG1_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG1_avx2.c new file mode 100644 index 00000000000..f998f138593 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG1_avx2.c @@ -0,0 +1,693 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdlib.h> +#include <stdio.h> +#include <stdint.h> +#include "../../nrLDPCdecoder_defs.h" + +void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R) +{ + const char *ratestr[3]={"13","23","89"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + + // system("mkdir -p ../ldpc_gen_files"); + + char fname[FILENAME_MAX+1]; + snprintf(fname, sizeof(fname), "%s/cnProc/nrLDPC_cnProc_BG1_R%s_AVX2.h", dir, ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) { + printf("Cannot create file %s\n", fname); + abort(); + } + + fprintf(fd,"#include <stdint.h>\n"); + fprintf(fd,"#include <immintrin.h>\n"); + + + fprintf(fd,"static inline void nrLDPC_cnProc_BG1_R%s_AVX2(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {\n",ratestr[R]); + + const uint8_t* lut_numCnInCnGroups; + const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1; + + if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13; + else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23; + else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89; + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + + + + //__m256i* p_cnProcBuf; + //__m256i* p_cnProcBufRes; + + // Number of CNs in Groups + //uint32_t M; + uint32_t j; + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t bitOffsetInGroup; + + //__m256i ymm0, min, sgn; + //__m256i* p_cnProcBufResBit; + + // const __m256i* p_ones = (__m256i*) ones256_epi8; + // const __m256i* p_maxLLR = (__m256i*) maxLLR256_epi8; + + // LUT with offsets for bits that need to be processed + // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. + // Offsets are in units of bitOffsetInGroup (1*384/32) + // const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}}; + + // ===================================================================== + // Process group with 3 BNs + fprintf(fd,"//Process group with 3 BNs\n"); + // LUT with offsets for bits that need to be processed + // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. + // Offsets are in units of bitOffsetInGroup (1*384/32) + const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}}; + + fprintf(fd," __m256i ymm0, min, sgn,ones,maxLLR;\n"); + fprintf(fd," ones = _mm256_set1_epi8((char)1);\n"); + fprintf(fd," maxLLR = _mm256_set1_epi8((char)127);\n"); + + fprintf(fd," uint32_t M;\n"); + + if (lut_numCnInCnGroups[0] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[0] ); + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 3 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[0]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[0]]; + + // Loop over every BN + + for (j=0; j<3; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + // 32 CNs of second BN + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][1]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[0]>>5)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + // ===================================================================== + // Process group with 4 BNs + fprintf(fd,"//Process group with 4 BNs\n"); + // Offset is 5*384/32 = 60 + const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}}; + + if (lut_numCnInCnGroups[1] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[1] ); + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 4 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + + for (j=0; j<4; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>5)+lut_idxCnProcG4[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + + // Loop over BNs + for (k=1; k<3; k++) + { + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>5)+lut_idxCnProcG4[j][k]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + } + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[1]>>5)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + // ===================================================================== + // Process group with 5 BNs + fprintf(fd,"//Process group with 5 BNs\n"); + // Offset is 18*384/32 = 216 + const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864}, + {0,216,648,864}, {0,216,432,864}, {0,216,432,648}}; + + + if (lut_numCnInCnGroups[2] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[2] ); + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 4 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + + for (j=0; j<5; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>5)+lut_idxCnProcG5[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + + // Loop over BNs + for (k=1; k<4; k++) + { + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>5)+lut_idxCnProcG5[j][k]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + } + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[2]>>5)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + // ===================================================================== + // Process group with 6 BNs + fprintf(fd,"//Process group with 6 BNs\n"); + // Offset is 8*384/32 = 96 + const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480}, + {0,96,288,384,480}, {0,96,192,384,480}, + {0,96,192,288,480}, {0,96,192,288,384}}; + + + if (lut_numCnInCnGroups[3] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd, "M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[3] ); + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 4 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + + for (j=0; j<6; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>5)+lut_idxCnProcG6[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + + // Loop over BNs + for (k=1; k<5; k++) + { + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>5)+lut_idxCnProcG6[j][k]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + } + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[3]>>5)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + // ===================================================================== + // Process group with 7 BNs + fprintf(fd,"//Process group with 7 BNs\n"); + // Offset is 5*384/32 = 60 + const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360}, + {0,60,180,240,300,360}, {0,60,120,240,300,360}, + {0,60,120,180,300,360}, {0,60,120,180,240,360}, + {0,60,120,180,240,300}}; + + + + if (lut_numCnInCnGroups[4] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd, "M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[4] ); + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 4 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + + for (j=0; j<7; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>5)+lut_idxCnProcG7[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + + // Loop over BNs + for (k=1; k<6; k++) + { + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>5)+lut_idxCnProcG7[j][k]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + } + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[4]>>5)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + // ===================================================================== + // Process group with 8 BNs + fprintf(fd,"//Process group with 8 BNs\n"); + // Offset is 2*384/32 = 24 + const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168}, + {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168}, + {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168}, + {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}}; + + + + + if (lut_numCnInCnGroups[5] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd, "M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[5] ); + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 4 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + + for (j=0; j<8; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>5)+lut_idxCnProcG8[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + + // Loop over BNs + for (k=1; k<7; k++) + { + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>5)+lut_idxCnProcG8[j][k]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + } + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[5]>>5)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + // ===================================================================== + // Process group with 9 BNs + fprintf(fd,"//Process group with 9 BNs\n"); + // Offset is 2*384/32 = 24 + const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192}, + {0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192}, + {0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192}, + {0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192}, + {0,24,48,72,96,120,144,168}}; + + + + + + if (lut_numCnInCnGroups[6] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd, "M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[6] ); + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 9 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + + for (j=0; j<9; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>5)+lut_idxCnProcG9[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + + // Loop over BNs + for (k=1; k<8; k++) + { + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>5)+lut_idxCnProcG9[j][k]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + } + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[6]>>5)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + // ===================================================================== + // Process group with 10 BNs + fprintf(fd,"//Process group with 10 BNs\n"); + // Offset is 1*384/32 = 12 + const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108}, + {0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108}, + {0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108}, + {0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108}, + {0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}}; + + + + + + if (lut_numCnInCnGroups[7] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd, " M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[7] ); + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 10 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + + for (j=0; j<10; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>5)+lut_idxCnProcG10[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + + // Loop over BNs + for (k=1; k<9; k++) + { + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>5)+lut_idxCnProcG10[j][k]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + } + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[7]>>5)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + // ===================================================================== + // Process group with 19 BNs + fprintf(fd,"//Process group with 19 BNs\n"); + // Offset is 4*384/32 = 12 + const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, + {0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, + {0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864}, + {0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864}, + {0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864}, + {0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864}, + {0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864}, + {0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864}, + {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864}, + {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}}; + + + if (lut_numCnInCnGroups[8] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd, " M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[8] ); + + // Set the offset to each bit within a group in terms of 32 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>5; + + + // Set pointers to start of group 19 + //p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[1]]; + //p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[1]]; + + // Loop over every BN + + for (j=0; j<19; j++) + { + // Set of results pointer to correct BN address + //p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); + + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>5)+lut_idxCnProcG19[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + + // Loop over BNs + for (k=1; k<18; k++) + { + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>5)+lut_idxCnProcG19[j][k]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + } + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[8]>>5)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + fprintf(fd,"}\n"); + fclose(fd); +}//end of the function nrLDPC_cnProc_BG1 + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG2_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG2_avx2.c new file mode 100644 index 00000000000..9a5ff84c868 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG2_avx2.c @@ -0,0 +1,436 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include "../../nrLDPCdecoder_defs.h" +#include "../../nrLDPC_types.h" +#include "../../nrLDPC_bnProc.h" + + +void nrLDPC_cnProc_BG2_generator_AVX2(const char* dir, int R) +{ + const char *ratestr[3]={"15","13","23"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + +// system("mkdir -p ldpc_gen_files/avx2"); + + char fname[FILENAME_MAX+1]; + snprintf(fname, sizeof(fname), "%s/cnProc/nrLDPC_cnProc_BG2_R%s_AVX2.h", dir, ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) { + printf("Cannot create file %s\n", fname); + abort(); + } + + fprintf(fd,"#include <stdint.h>\n"); + fprintf(fd,"#include <immintrin.h>\n"); + fprintf(fd,"static inline void nrLDPC_cnProc_BG2_R%s_AVX2(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {\n",ratestr[R]); + + const uint8_t* lut_numCnInCnGroups; + const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG2; + + if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R15; + else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R13; + else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R23; + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + + + // Number of CNs in Groups + //uint32_t M; + uint32_t j; + uint32_t k; + // Offset to each bit within a group in terms of 32 byte + uint32_t bitOffsetInGroup; + + // Offsets are in units of bitOffsetInGroup (1*384/32) + // const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}}; + + // ===================================================================== + // Process group with 3 BNs + fprintf(fd,"//Process group with 3 BNs\n"); + // LUT with offsets for bits that need to be processed + // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. + // Offsets are in units of bitOffsetInGroup + const uint8_t lut_idxCnProcG3[3][2] = {{72,144}, {0,144}, {0,72}}; + + + fprintf(fd," __m256i ymm0, min, sgn,ones,maxLLR;\n"); + fprintf(fd," ones = _mm256_set1_epi8((char)1);\n"); + fprintf(fd," maxLLR = _mm256_set1_epi8((char)127);\n"); + fprintf(fd," uint32_t M;\n"); + + + if (lut_numCnInCnGroups[0] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[0] ); + + // Set the offset to each bit within a group in terms of 32 byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX)>>5; + + // Loop over every BN + + for (j=0; j<3; j++) + { + + fprintf(fd," for (int i=0;i<M;i+=2) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + // 32 CNs of second BN + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][1]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[0]>>5)+(j*bitOffsetInGroup)); + + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][0]+1); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + fprintf(fd," }\n"); + } + } + + // ===================================================================== + // Process group with 4 BNs + fprintf(fd,"//Process group with 4 BNs\n"); + + // Offset is 20*384/32 = 240 + const uint16_t lut_idxCnProcG4[4][3] = {{240,480,720}, {0,480,720}, {0,240,720}, {0,240,480}}; + + if (lut_numCnInCnGroups[1] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[1] ); + + // Set the offset to each bit within a group in terms of 32 byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[1]*NR_LDPC_ZMAX)>>5; + + // Loop over every BN + + for (j=0; j<4; j++) + { + + // Loop over CNs + + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>5)+lut_idxCnProcG4[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + + // Loop over BNs + for (k=1; k<3; k++) + { + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>5)+lut_idxCnProcG4[j][k]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + } + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[1]>>5)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + // ===================================================================== + // Process group with 5 BNs + fprintf(fd,"//Process group with 5 BNs\n"); + + // Offset is 9*384/32 = 108 + const uint16_t lut_idxCnProcG5[5][4] = {{108,216,324,432}, {0,216,324,432}, + {0,108,324,432}, {0,108,216,432}, {0,108,216,324}}; + + + + if (lut_numCnInCnGroups[2] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[2] ); + // Set the offset to each bit within a group in terms of 32 byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[2]*NR_LDPC_ZMAX)>>5; + + // Loop over every BN + + for (j=0; j<5; j++) + { + + + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>5)+lut_idxCnProcG5[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + + // Loop over BNs + for (k=1; k<4; k++) + { + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>5)+lut_idxCnProcG5[j][k]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + } + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[2]>>5)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + // ===================================================================== + // Process group with 6 BNs + fprintf(fd,"//Process group with 6 BNs\n"); + // Offset is 3*384/32 = 36 + const uint16_t lut_idxCnProcG6[6][5] = {{36,72,108,144,180}, {0,72,108,144,180}, + {0,36,108,144,180}, {0,36,72,144,180}, + {0,36,72,108,180}, {0,36,72,108,144}}; + + + if (lut_numCnInCnGroups[3] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd, "M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[3] ); + + // Set the offset to each bit within a group in terms of 32 byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[3]*NR_LDPC_ZMAX)>>5; + + // Loop over every BN + + for (j=0; j<6; j++) + { + + + // Loop over CNs + + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>5)+lut_idxCnProcG6[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + + // Loop over BNs + for (k=1; k<5; k++) + { + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>5)+lut_idxCnProcG6[j][k]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + } + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[3]>>5)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + + // ===================================================================== + // Process group with 8 BNs + fprintf(fd,"//Process group with 8 BNs\n"); + // Offset is 2*384/32 = 24 + const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168}, + {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168}, + {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168}, + {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}}; + + + + + + + if (lut_numCnInCnGroups[4] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd, "M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[4] ); + + // Set the offset to each bit within a group in terms of 32 byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[4]*NR_LDPC_ZMAX)>>5; + + // Loop over every BN + + for (j=0; j<8; j++) + { + + // Loop over CNs + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>5)+lut_idxCnProcG8[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + // Loop over BNs + for (k=1; k<7; k++) + { + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>5)+lut_idxCnProcG8[j][k]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + + } + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[4]>>5)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + // ===================================================================== + // Process group with 10 BNs + fprintf(fd,"//Process group with 10 BNs\n"); + + const uint8_t lut_idxCnProcG10[10][9] = {{24,48,72,96,120,144,168,192,216}, {0,48,72,96,120,144,168,192,216}, + {0,24,72,96,120,144,168,192,216}, {0,24,48,96,120,144,168,192,216}, + {0,24,48,72,120,144,168,192,216}, {0,24,48,72,96,144,168,192,216}, + {0,24,48,72,96,120,168,192,216}, {0,24,48,72,96,120,144,192,216}, + {0,24,48,72,96,120,144,168,216}, {0,24,48,72,96,120,144,168,192}}; + + + + + + if (lut_numCnInCnGroups[5] > 0) + { + // Number of groups of 32 CNs for parallel processing + // Ceil for values not divisible by 32 + fprintf(fd, "M = (%d*Z + 31)>>5;\n",lut_numCnInCnGroups[5] ); + + // Set the offset to each bit within a group in terms of 32 byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[5]*NR_LDPC_ZMAX)>>5; + + // Loop over every BN + + for (j=0; j<10; j++) + { + + // Loop over CNs + + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 32 CNs (first BN) + // ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>5)+lut_idxCnProcG10[j][0]); + // sgn = _mm256_sign_epi8(ones, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n"); + // min = _mm256_abs_epi8(ymm0); + fprintf(fd," min = _mm256_abs_epi8(ymm0);\n"); + + + // Loop over BNs + for (k=1; k<9; k++) + { + fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>5)+lut_idxCnProcG10[j][k]); + + // min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); + fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n"); + + // sgn = _mm256_sign_epi8(sgn, ymm0); + fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n"); + } + + // Store result + // min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[5]>>5)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + fprintf(fd,"}\n"); + fclose(fd); +}//end of the function nrLDPC_cnProc_BG2 + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/main.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/main.c new file mode 100644 index 00000000000..9d81417749b --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/main.c @@ -0,0 +1,50 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdio.h> +#include <stdint.h> +#define NB_R 3 +void nrLDPC_cnProc_BG1_generator_AVX2(const char*, int); +void nrLDPC_cnProc_BG2_generator_AVX2(const char*, int); + +const char *__asan_default_options() +{ + /* don't do leak checking in nr_ulsim, creates problems in the CI */ + return "detect_leaks=0"; +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) { + fprintf(stderr, "usage: %s <output-dir>\n", argv[0]); + return 1; + } + const char *dir = argv[1]; + + int R[NB_R]={0,1,2}; + for(int i=0; i<NB_R;i++) { + nrLDPC_cnProc_BG1_generator_AVX2(dir, R[i]); + nrLDPC_cnProc_BG2_generator_AVX2(dir, R[i]); + } + + return(0); +} + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/CMakeLists.txt b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/CMakeLists.txt new file mode 100644 index 00000000000..7ca988f1ca2 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/CMakeLists.txt @@ -0,0 +1,25 @@ +add_executable(cnProc_gen_avx512 + cnProc_gen_BG1_avx512.c + cnProc_gen_BG2_avx512.c + main.c) +target_compile_options(cnProc_gen_avx512 PRIVATE -W -Wall -mavx2) + +#set(cnProc_avx512_headers +# cnProc_avx512/nrLDPC_cnProc_BG1_R13_AVX512.h +# cnProc_avx512/nrLDPC_cnProc_BG1_R23_AVX512.h +# cnProc_avx512/nrLDPC_cnProc_BG1_R89_AVX512.h +# cnProc_avx512/nrLDPC_cnProc_BG2_R13_AVX512.h +# cnProc_avx512/nrLDPC_cnProc_BG2_R15_AVX512.h +# cnProc_avx512/nrLDPC_cnProc_BG2_R23_AVX512.h) + +add_custom_command(TARGET cnProc_gen_avx512 POST_BUILD + #OUTPUT ${cnProc_avx512_headers} + COMMAND ${CMAKE_COMMAND} -E make_directory cnProc_avx512 + COMMAND cnProc_gen_avx512 . + DEPENDS cnProc_gen_avx512 + COMMENT "Generating LDPC cnProc header files for AVX512" +) + +add_library(cnProc_gen_avx512_HEADERS INTERFACE) +target_include_directories(cnProc_gen_avx512_HEADERS INTERFACE ${CMAKE_CURRENT_BINARY_DIR}) +add_dependencies(cnProc_gen_avx512_HEADERS cnProc_gen_avx512) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.c new file mode 100644 index 00000000000..b007ac0e0bf --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.c @@ -0,0 +1,597 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include "../../nrLDPCdecoder_defs.h" + +void nrLDPC_cnProc_BG1_generator_AVX512(const char *dir, int R) +{ + const char *ratestr[3]={"13","23","89"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + + // system("mkdir -p ../ldpc_gen_files"); + + char fname[FILENAME_MAX+1]; + snprintf(fname, sizeof(fname), "%s/cnProc_avx512/nrLDPC_cnProc_BG1_R%s_AVX512.h", dir, ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) { + printf("Cannot create file %s\n", fname); + abort(); + } + + // fprintf(fd,"#include <stdint.h>\n"); +// fprintf(fd,"#include <immintrin.h>\n"); + + + fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n"); + + + fprintf(fd,"static inline void nrLDPC_cnProc_BG1_R%s_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {\n",ratestr[R]); + + const uint8_t* lut_numCnInCnGroups; + const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1; + + if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13; + else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23; + else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89; + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + + + + uint32_t j; + uint32_t k; + // Offset to each bit within a group in terms of 64 Byte + uint32_t bitOffsetInGroup; + + + fprintf(fd," uint32_t M, i;\n"); + fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR, ones;\n"); + + fprintf(fd," zeros = _mm512_setzero_si512();\n"); + fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n"); + fprintf(fd," ones = _mm512_set1_epi8((char)1);\n"); + + + + // ===================================================================== + // Process group with 3 BNs + fprintf(fd,"//Process group with 3 BNs\n"); + // LUT with offsets for bits that need to be processed + // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. + // Offsets are in units of bitOffsetInGroup (1*384/32)12 + // Offsets are in units of bitOffsetInGroup (1*384/32)12 + + const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}}; + + if (lut_numCnInCnGroups[0] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + //M = (lut_numCnInCnGroups[0]*Z + 63)>>6; + + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[0] ); + + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6; + + // Loop over every BN + + for (j=0; j<3; j++) + { + + fprintf(fd," for (i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // for (k=1; k<2; k++) + //{ + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][1]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(*p_ones, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + // } + + // Store result + // min = _mm512_min_epu8(min, *maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + + } + + // ===================================================================== + // Process group with 4 BNs + fprintf(fd,"//Process group with 4 BNs\n"); + // Offset is 5*384/32 = 30 + const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}}; + + if (lut_numCnInCnGroups[1] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + //M = (lut_numCnInCnGroups[1]*Z + 63)>>6; + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[1] ); + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6; + + // Loop over every BN + for (j=0; j<4; j++) + { + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + fprintf(fd," for (i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // Loop over BNs + for (k=1; k<3; k++) + { + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][k]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(*p_ones, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + } + + // Store result + // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[1]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + // ===================================================================== + // Process group with 5 BNs + fprintf(fd,"//Process group with 5 BNs\n"); + // Offset is 18*384/32 = 216 + const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864}, + {0,216,648,864}, {0,216,432,864}, {0,216,432,648}}; + + + if (lut_numCnInCnGroups[2] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + //M = (lut_numCnInCnGroups[2]*Z + 63)>>6; + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[2] ); + + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6; + + // Loop over every BN + + for (j=0; j<5; j++) + { + + fprintf(fd," for (i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // Loop over BNs + for (k=1; k<4; k++) + { + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][k]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(*p_ones, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + } + + // Store result + // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[2]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + // ===================================================================== + // Process group with 6 BNs + fprintf(fd,"//Process group with 6 BNs\n"); + // Offset is 8*384/32 = 48 + const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480}, + {0,96,288,384,480}, {0,96,192,384,480}, + {0,96,192,288,480}, {0,96,192,288,384}}; + + + if (lut_numCnInCnGroups[3] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + //M = (lut_numCnInCnGroups[3]*Z + 63)>>6; + + fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[3] ); + + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6; + + // Loop over every BN + + for (j=0; j<6; j++) + { + + fprintf(fd," for (i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // Loop over BNs + for (k=1; k<5; k++) + { + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][k]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(*p_ones, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + } + + // Store result + // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[3]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + // ===================================================================== + // Process group with 7 BNs + fprintf(fd,"//Process group with 7 BNs\n"); + // Offset is 5*384/32 = 30 + const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360}, + {0,60,180,240,300,360}, {0,60,120,240,300,360}, + {0,60,120,180,300,360}, {0,60,120,180,240,360}, + {0,60,120,180,240,300}}; + + + if (lut_numCnInCnGroups[4] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + // M = (lut_numCnInCnGroups[4]*Z + 63)>>6; + fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[4] ); + + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6; + + // Loop over every BN + + for (j=0; j<7; j++) + { + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + fprintf(fd," for (i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0= ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG7[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // Loop over BNs + for (k=1; k<6; k++) + { + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG7[j][k]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(*p_ones, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + } + + // Store result + // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[4]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + // ===================================================================== + // Process group with 8 BNs + fprintf(fd,"//Process group with 8 BNs\n"); + // Offset is 2*384/32 = 24 + const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168}, + {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168}, + {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168}, + {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}}; + + + if (lut_numCnInCnGroups[5] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + // M = (lut_numCnInCnGroups[5]*Z + 63)>>6; + fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[5] ); + + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6; + + // Loop over every BN + + for (j=0; j<8; j++) + { + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + fprintf(fd," for (i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG8[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // Loop over BNs + for (k=1; k<7; k++) + { + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG8[j][k]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(*p_ones, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + } + + // Store result + // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[5]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + // ===================================================================== + // Process group with 9 BNs + + fprintf(fd,"//Process group with 9 BNs\n"); + // Offset is 2*384/32 = 12 + const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192}, + {0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192}, + {0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192}, + {0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192}, + {0,24,48,72,96,120,144,168}}; + + + if (lut_numCnInCnGroups[6] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + // M = (lut_numCnInCnGroups[5]*Z + 63)>>6; + fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[6] ); + + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6; + + // Loop over every BN + + for (j=0; j<9; j++) + { + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + fprintf(fd," for (i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>6)+lut_idxCnProcG9[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // Loop over BNs + for (k=1; k<8; k++) + { + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>6)+lut_idxCnProcG9[j][k]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(*p_ones, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + } + + // Store result + // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[6]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + + + + + // ===================================================================== + // Process group with 10 BNs + fprintf(fd,"//Process group with 10 BNs\n"); + // Offset is 1*384/32 = 6 + const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108}, + {0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108}, + {0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108}, + {0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108}, + {0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}}; + + if (lut_numCnInCnGroups[7] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + //M = (lut_numCnInCnGroups[7]*Z + 63)>>6; + fprintf(fd, " M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[7] ); + + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6; + + + // Loop over every BN + + for (j=0; j<10; j++) + { + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + fprintf(fd," for (i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>6)+lut_idxCnProcG10[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // Loop over BNs + for (k=1; k<9; k++) + { + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>6)+lut_idxCnProcG10[j][k]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(*p_ones, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + } + + // Store result + // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min,sgn,zeros);\n",(lut_startAddrCnGroups[7]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + // ===================================================================== + // Process group with 19 BNs + fprintf(fd,"//Process group with 19 BNs\n"); + // Offset is 4*384/32 = 24 + const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, + {0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, + {0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864}, + {0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864}, + {0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864}, + {0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864}, + {0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864}, + {0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864}, + {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864}, + {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}}; + + + if (lut_numCnInCnGroups[8] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + // M = (lut_numCnInCnGroups[8]*Z + 63)>>6; + fprintf(fd, " M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[8] ); + + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6; + + // Loop over every BN + + for (j=0; j<19; j++) + { + // Loop over CNs + // for (i=0; i<M; i++,iprime++) + // { + fprintf(fd," for (i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>6)+lut_idxCnProcG19[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // Loop over BNs + for (k=1; k<18; k++) + { + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>6)+lut_idxCnProcG19[j][k]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(*p_ones, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + } + + // Store result + // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[8]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + fprintf(fd,"}\n"); + fclose(fd); +}//end of the function nrLDPC_cnProc_BG1 + + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG2_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG2_avx512.c new file mode 100644 index 00000000000..8a9e592f6f7 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG2_avx512.c @@ -0,0 +1,414 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdlib.h> +#include <stdio.h> +#include <stdint.h> +#include "../../nrLDPCdecoder_defs.h" + +void nrLDPC_cnProc_BG2_generator_AVX512(const char *dir, int R) +{ + const char *ratestr[3]={"15","13","23"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + + // system("mkdir -p ../ldpc_gen_files"); + + char fname[FILENAME_MAX+1]; + snprintf(fname, sizeof(fname), "%s/cnProc_avx512/nrLDPC_cnProc_BG2_R%s_AVX512.h", dir, ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) { + printf("Cannot create file %s\n", fname); + abort(); + } + + //fprintf(fd,"#include <stdint.h>\n"); +// fprintf(fd,"#include <immintrin.h>\n"); + + + fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n"); + + + + fprintf(fd,"static inline void nrLDPC_cnProc_BG2_R%s_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {\n",ratestr[R]); + const uint8_t* lut_numCnInCnGroups; + const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG2; + + if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R15; + else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R13; + else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R23; + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + + + // Number of CNs in Groups + //uint32_t M; + uint32_t j; + uint32_t k; + // Offset to each bit within a group in terms of 64 Byte + uint32_t bitOffsetInGroup; + + fprintf(fd," uint32_t M;\n"); + fprintf(fd," __m512i zmm0, min, sgn,zeros,ones,maxLLR;\n"); + fprintf(fd," zeros = _mm512_setzero_si512();\n"); + fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n"); + fprintf(fd," ones = _mm512_set1_epi8((char)1);\n"); + // ===================================================================== + // Process group with 3 BNs + fprintf(fd,"//Process group with 3 BNs\n"); + // LUT with offsets for bits that need to be processed + // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. + // Offsets are in units of bitOffsetInGroup + const uint8_t lut_idxCnProcG3[3][2] = {{72,144}, {0,144}, {0,72}}; + + + if (lut_numCnInCnGroups[0] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[0] ); + + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX)>>6; + + + // Loop over every BN + + for (j=0; j<3; j++) + { + + + + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // for (k=1; k<2; k++) + //{ + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][1]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(*p_ones, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + // } + + // Store result + // min = _mm512_min_epu8(min, *maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + + } + + + // ===================================================================== + // Process group with 4 BNs + fprintf(fd,"//Process group with 4 BNs\n"); + // Offset is 20*384/32 = 240 + const uint16_t lut_idxCnProcG4[4][3] = {{240,480,720}, {0,480,720}, {0,240,720}, {0,240,480}}; + + + if (lut_numCnInCnGroups[1] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[1] ); + + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[1]*NR_LDPC_ZMAX)>>6; + + // Loop over every BN + for (j=0; j<4; j++) + { + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // Loop over BNs + for (k=1; k<3; k++) + { + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][k]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(sgn, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + } + + // Store result + // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn); + // p_cnProcBufResBit++; + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[1]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + // ===================================================================== + // Process group with 5 BNs + fprintf(fd,"//Process group with 5 BNs\n"); + // Offset is 9*384/32 = 108 + const uint16_t lut_idxCnProcG5[5][4] = {{108,216,324,432}, {0,216,324,432}, + {0,108,324,432}, {0,108,216,432}, {0,108,216,324}}; + + + + + if (lut_numCnInCnGroups[2] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[2] ); + + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[2]*NR_LDPC_ZMAX)>>6; + + // Loop over every BN + + for (j=0; j<5; j++) + { + + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // Loop over BNs + for (k=1; k<4; k++) + { + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][k]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(sgn, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + } + + // Store result + // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[2]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + // ===================================================================== + // Process group with 6 BNs + fprintf(fd,"//Process group with 6 BNs\n"); + // Offset is 3*384/32 = 36 + const uint16_t lut_idxCnProcG6[6][5] = {{36,72,108,144,180}, {0,72,108,144,180}, + {0,36,108,144,180}, {0,36,72,144,180}, + {0,36,72,108,180}, {0,36,72,108,144}}; + + + + + if (lut_numCnInCnGroups[3] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[3] ); + + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[3]*NR_LDPC_ZMAX)>>6; + + // Loop over every BN + + for (j=0; j<6; j++) + { + + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // Loop over BNs + for (k=1; k<5; k++) + { + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][k]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(sgn, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + } + + // Store result + // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[3]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + + // ===================================================================== + // Process group with 8 BNs + fprintf(fd,"//Process group with 8 BNs\n"); + // Offset is 2*384/32 = 24 + const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168}, + {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168}, + {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168}, + {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}}; + + + + + if (lut_numCnInCnGroups[4] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[4] ); + + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[4]*NR_LDPC_ZMAX)>>6; + + // Loop over every BN + + for (j=0; j<8; j++) + { + + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG8[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // Loop over BNs + for (k=1; k<7; k++) + { + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG8[j][k]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(sgn, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + } + + // Store result + // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[4]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + // ===================================================================== + // Process group with 10 BNs + fprintf(fd,"//Process group with 10 BNs\n"); + + const uint8_t lut_idxCnProcG10[10][9] = {{24,48,72,96,120,144,168,192,216}, {0,48,72,96,120,144,168,192,216}, + {0,24,72,96,120,144,168,192,216}, {0,24,48,96,120,144,168,192,216}, + {0,24,48,72,120,144,168,192,216}, {0,24,48,72,96,144,168,192,216}, + {0,24,48,72,96,120,168,192,216}, {0,24,48,72,96,120,144,192,216}, + {0,24,48,72,96,120,144,168,216}, {0,24,48,72,96,120,144,168,192}}; + + + + + if (lut_numCnInCnGroups[5] > 0) + { + // Number of groups of 64 CNs for parallel processing + // Ceil for values not divisible by 64 + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[5] ); + + // Set the offset to each bit within a group in terms of 64 Byte + bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[5]*NR_LDPC_ZMAX)>>6; + + // Loop over every BN + + for (j=0; j<10; j++) + { + + fprintf(fd," for (int i=0;i<M;i++) {\n"); + // Abs and sign of 64 CNs (first BN) + // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG10[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + + + // Loop over BNs + for (k=1; k<9; k++) + { + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG10[j][k]/2); + + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(sgn, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + } + + // Store result + // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 + fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); + + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min,sgn,zeros);\n",(lut_startAddrCnGroups[5]>>6)+(j*bitOffsetInGroup)); + fprintf(fd," }\n"); + } + } + + + fprintf(fd,"}\n"); + fclose(fd); +}//end of the function nrLDPC_cnProc_BG2 + + + + + + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/main.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/main.c new file mode 100644 index 00000000000..04a6527c694 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/main.c @@ -0,0 +1,50 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include <stdio.h> +#include <stdint.h> +#define NB_R 3 +void nrLDPC_cnProc_BG1_generator_AVX512(const char *, int); +void nrLDPC_cnProc_BG2_generator_AVX512(const char *, int); + +const char *__asan_default_options() +{ + /* don't do leak checking in nr_ulsim, creates problems in the CI */ + return "detect_leaks=0"; +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) { + fprintf(stderr, "usage: %s <output-dir>\n", argv[0]); + return 1; + } + const char *dir = argv[1]; + + int R[NB_R]={0,1,2}; + for(int i=0; i<NB_R;i++){ + nrLDPC_cnProc_BG1_generator_AVX512(dir, R[i]); + nrLDPC_cnProc_BG2_generator_AVX512(dir, R[i]); + } + + return(0); +} + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/run_ldpc_generators.sh b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/run_ldpc_generators.sh new file mode 100755 index 00000000000..091034b9787 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/run_ldpc_generators.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +echo "to build the LDPC decoder headers: go to the build directory, and type" +echo "make/ninja ldpc_generators" +echo +echo "assuming your build directory is ran_build/build, I trigger building for" +echo "you now. The generated headers will be in ran_build/build/ldpc/generator_*/" +echo + +cd $OPENAIR_HOME/cmake_targets/ran_build/build +make ldpc_generators || ninja ldpc_generators diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h index b7b15b5d334..fb52c5b4284 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h @@ -30,8 +30,9 @@ #ifndef __NR_LDPC_TYPES__H__ #define __NR_LDPC_TYPES__H__ - +#ifndef CODEGEN #include "time_meas.h" +#endif #include "nrLDPCdecoder_defs.h" // ============================================================================== // TYPES @@ -77,6 +78,7 @@ typedef struct nrLDPC_dec_params { /** Structure containing LDPC decoder processing time statistics. */ +#ifndef CODEGEN typedef struct nrLDPC_time_stats { time_stats_t llr2llrProcBuf; /**< Statistics for function llr2llrProcBuf */ time_stats_t llr2CnProcBuf; /**< Statistics for function llr2CnProcBuf */ @@ -90,7 +92,7 @@ typedef struct nrLDPC_time_stats { time_stats_t llr2bit; /**< Statistics for function llr2bit */ time_stats_t total; /**< Statistics for total processing time */ } t_nrLDPC_time_stats; - +#endif /** Structure containing the processing buffers */ diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h index c35f93e0fe7..083fe39bff7 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h @@ -198,4 +198,14 @@ static const int8_t zeros256_epi8[32] __attribute__ ((aligned(32))) = {0,0,0,0,0 /** Vector of 32 '127' in int8 for application with AVX2 */ static const int8_t maxLLR256_epi8[32] __attribute__ ((aligned(32))) = {127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127}; +/** Vector of 64 '1' in int8 for application with AVX512 */ +static const int8_t ones512_epi8[64] __attribute__ ((aligned(64))) = {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,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}; +/** Vector of 64 '0' in int8 for application with AVX512 */ +static const int8_t zeros512_epi8[64] __attribute__ ((aligned(64))) = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +/** Vector of 64 '127' in int8 for application with AVX512 */ +static const int8_t maxLLR512_epi8[64] __attribute__ ((aligned(64))) = {127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127}; + + + + #endif diff --git a/openair1/PHY/CODING/nr_rate_matching.c b/openair1/PHY/CODING/nr_rate_matching.c index 782bb390243..06dfcaa4a94 100644 --- a/openair1/PHY/CODING/nr_rate_matching.c +++ b/openair1/PHY/CODING/nr_rate_matching.c @@ -387,8 +387,7 @@ void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f) } -int nr_rate_matching_ldpc(uint8_t Ilbrm, - uint32_t Tbslbrm, +int nr_rate_matching_ldpc(uint32_t Tbslbrm, uint8_t BG, uint16_t Z, uint8_t *w, @@ -409,7 +408,7 @@ int nr_rate_matching_ldpc(uint8_t Ilbrm, //Bit selection N = (BG==1)?(66*Z):(50*Z); - if (Ilbrm == 0) + if (Tbslbrm == 0) Ncb = N; else { Nref = 3*Tbslbrm/(2*C); //R_LBRM = 2/3 @@ -419,11 +418,11 @@ int nr_rate_matching_ldpc(uint8_t Ilbrm, ind = (index_k0[BG-1][rvidx]*Ncb/N)*Z; #ifdef RM_DEBUG - printf("nr_rate_matching_ldpc: E %d, F %d, Foffset %d, k0 %d, Ncb %d, rvidx %d, Ilbrm %d\n", E, F, Foffset,ind, Ncb, rvidx, Ilbrm); + printf("nr_rate_matching_ldpc: E %d, F %d, Foffset %d, k0 %d, Ncb %d, rvidx %d, Tbslbrm %d\n", E, F, Foffset,ind, Ncb, rvidx, Tbslbrm); #endif if (Foffset > E) { - LOG_E(PHY,"nr_rate_matching: invalid parameters (Foffset %d > E %d) F %d, k0 %d, Ncb %d, rvidx %d, Ilbrm %d\n",Foffset,E,F, ind, Ncb, rvidx, Ilbrm); + LOG_E(PHY,"nr_rate_matching: invalid parameters (Foffset %d > E %d) F %d, k0 %d, Ncb %d, rvidx %d, Tbslbrm %d\n",Foffset,E,F, ind, Ncb, rvidx, Tbslbrm); return -1; } if (Foffset > Ncb) { @@ -471,8 +470,7 @@ int nr_rate_matching_ldpc(uint8_t Ilbrm, return 0; } -int nr_rate_matching_ldpc_rx(uint8_t Ilbrm, - uint32_t Tbslbrm, +int nr_rate_matching_ldpc_rx(uint32_t Tbslbrm, uint8_t BG, uint16_t Z, int16_t *w, @@ -498,7 +496,7 @@ int nr_rate_matching_ldpc_rx(uint8_t Ilbrm, //Bit selection N = (BG==1)?(66*Z):(50*Z); - if (Ilbrm == 0) + if (Tbslbrm == 0) Ncb = N; else { Nref = (3*Tbslbrm/(2*C)); //R_LBRM = 2/3 @@ -516,7 +514,7 @@ int nr_rate_matching_ldpc_rx(uint8_t Ilbrm, } #ifdef RM_DEBUG - printf("nr_rate_matching_ldpc_rx: Clear %d, E %d, k0 %d, Ncb %d, rvidx %d, Ilbrm %d\n", clear, E, ind, Ncb, rvidx, Ilbrm); + printf("nr_rate_matching_ldpc_rx: Clear %d, E %d, k0 %d, Ncb %d, rvidx %d, Tbslbrm %d\n", clear, E, ind, Ncb, rvidx, Tbslbrm); #endif if (clear==1) memset(w,0,Ncb*sizeof(int16_t)); diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 680d3684efe..b6427f5cf09 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -136,7 +136,7 @@ int init_codebook_gNB(PHY_VARS_gNB *gNB) { } } - int max_mimo_layers =(CSI_RS_antenna_ports<NR_MAX_NB_LAYERS) ? CSI_RS_antenna_ports : NR_MAX_NB_LAYERS; + int max_mimo_layers = (CSI_RS_antenna_ports<NR_MAX_NB_LAYERS) ? CSI_RS_antenna_ports : NR_MAX_NB_LAYERS; gNB->nr_mimo_precoding_matrix = (int32_t ***)malloc16(max_mimo_layers* sizeof(int32_t **)); int32_t ***mat = gNB->nr_mimo_precoding_matrix; @@ -236,7 +236,7 @@ int init_codebook_gNB(PHY_VARS_gNB *gNB) { if((llb != ll) || (mmb != mm) || ((N1 == 1) && (N2 == 1))){ pmiq += 1; mat[1][pmiq] = (int32_t *)malloc16((2*N1*N2)*(2)*sizeof(int32_t)); - LOG_I(PHY, "layer 2 Codebook pmiq = %d\n",pmiq); + LOG_D(PHY, "layer 2 Codebook pmiq = %d\n",pmiq); for(int j_col=0; j_col<2; j_col++) { if (j_col==0) { llc = llb; @@ -320,7 +320,7 @@ int init_codebook_gNB(PHY_VARS_gNB *gNB) { if((llb != ll) || (mmb != mm)){ pmiq += 1; mat[2][pmiq] = (int32_t *)malloc16((2*N1*N2)*(3)*sizeof(int32_t)); - LOG_I(PHY, "layer 3 Codebook pmiq = %d\n",pmiq); + LOG_D(PHY, "layer 3 Codebook pmiq = %d\n",pmiq); for(int j_col=0; j_col<3; j_col++) { if (j_col==0) { llc = llb; @@ -411,7 +411,7 @@ int init_codebook_gNB(PHY_VARS_gNB *gNB) { if((llb != ll) || (mmb != mm)){ pmiq += 1; mat[3][pmiq] = (int32_t *)malloc16((2*N1*N2)*4*sizeof(int32_t)); - LOG_I(PHY, "layer 4 pmiq = %d\n",pmiq); + LOG_D(PHY, "layer 4 pmiq = %d\n",pmiq); for(int j_col=0; j_col<4; j_col++) { if (j_col==0) { llc = llb; @@ -544,8 +544,8 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, gNB->nr_gold_pdsch_dmrs = (uint32_t ****)malloc16(fp->slots_per_frame*sizeof(uint32_t ***)); uint32_t ****pdsch_dmrs = gNB->nr_gold_pdsch_dmrs; - // ceil(((NB_RB*6(k)*2(QPSK)/32) // 3 RE *2(QPSK) - int pdsch_dmrs_init_length = ((fp->N_RB_DL*12)>>5)+1; + // ceil(((NB_RB*12(k)*2(QPSK)/32) // 3 RE *2(QPSK) + const int pdsch_dmrs_init_length = ((fp->N_RB_DL*24)>>5)+1; for (int slot=0; slot<fp->slots_per_frame; slot++) { pdsch_dmrs[slot] = (uint32_t ***)malloc16(fp->symbols_per_slot*sizeof(uint32_t **)); AssertFatal(pdsch_dmrs[slot]!=NULL, "NR init: pdsch_dmrs for slot %d - malloc failed\n", slot); @@ -593,26 +593,23 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, nr_gold_pusch(gNB, nscid, gNB->pusch_gold_init[nscid]); } - //CSI RS init - gNB->nr_gold_csi_rs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **)); - uint32_t ***csi_rs = gNB->nr_gold_csi_rs; - AssertFatal(csi_rs!=NULL, "NR init: csi reference signal malloc failed\n"); - + // CSI RS init // ceil((NB_RB*8(max allocation per RB)*2(QPSK))/32) int csi_dmrs_init_length = ((fp->N_RB_DL<<4)>>5)+1; - + gNB->nr_csi_info = (nr_csi_info_t *)malloc16_clear(sizeof(nr_csi_info_t)); + gNB->nr_csi_info->nr_gold_csi_rs = (uint32_t ***)malloc16(fp->slots_per_frame * sizeof(uint32_t **)); + AssertFatal(gNB->nr_csi_info->nr_gold_csi_rs != NULL, "NR init: csi reference signal malloc failed\n"); for (int slot=0; slot<fp->slots_per_frame; slot++) { - csi_rs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *)); - AssertFatal(csi_rs[slot]!=NULL, "NR init: csi reference signal for slot %d - malloc failed\n", slot); - + gNB->nr_csi_info->nr_gold_csi_rs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot * sizeof(uint32_t *)); + AssertFatal(gNB->nr_csi_info->nr_gold_csi_rs[slot] != NULL, "NR init: csi reference signal for slot %d - malloc failed\n", slot); for (int symb=0; symb<fp->symbols_per_slot; symb++) { - csi_rs[slot][symb] = (uint32_t *)malloc16(csi_dmrs_init_length*sizeof(uint32_t)); - AssertFatal(csi_rs[slot][symb]!=NULL, "NR init: csi reference signal for slot %d symbol %d - malloc failed\n", slot, symb); + gNB->nr_csi_info->nr_gold_csi_rs[slot][symb] = (uint32_t *)malloc16(csi_dmrs_init_length * sizeof(uint32_t)); + AssertFatal(gNB->nr_csi_info->nr_gold_csi_rs[slot][symb] != NULL, "NR init: csi reference signal for slot %d symbol %d - malloc failed\n", slot, symb); } } - gNB->csi_gold_init = cfg->cell_config.phy_cell_id.value; - nr_init_csi_rs(gNB, cfg->cell_config.phy_cell_id.value); + gNB->nr_csi_info->csi_gold_init = cfg->cell_config.phy_cell_id.value; + nr_init_csi_rs(&gNB->frame_parms, gNB->nr_csi_info->nr_gold_csi_rs, cfg->cell_config.phy_cell_id.value); //PRS init gNB->nr_gold_prs = (uint32_t ****)malloc16(gNB->prs_vars.NumPRSResources*sizeof(uint32_t ***)); @@ -637,21 +634,6 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, for (int id=0; id<NUMBER_OF_NR_SRS_MAX; id++) { gNB->nr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); - gNB->nr_srs_info[id]->sc_list = (uint16_t *) malloc16_clear(6*fp->N_RB_UL*sizeof(uint16_t)); - gNB->nr_srs_info[id]->srs_generated_signal = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - gNB->nr_srs_info[id]->noise_power = (uint32_t*)malloc16_clear(sizeof(uint32_t)); - gNB->nr_srs_info[id]->srs_received_signal = (int32_t **)malloc16(Prx*sizeof(int32_t*)); - gNB->nr_srs_info[id]->srs_ls_estimated_channel = (int32_t **)malloc16(Prx*sizeof(int32_t*)); - gNB->nr_srs_info[id]->srs_estimated_channel_freq = (int32_t **)malloc16(Prx*sizeof(int32_t*)); - gNB->nr_srs_info[id]->srs_estimated_channel_time = (int32_t **)malloc16(Prx*sizeof(int32_t*)); - gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted = (int32_t **)malloc16(Prx*sizeof(int32_t*)); - for (i=0;i<Prx;i++){ - gNB->nr_srs_info[id]->srs_received_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - gNB->nr_srs_info[id]->srs_ls_estimated_channel[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - gNB->nr_srs_info[id]->srs_estimated_channel_freq[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - gNB->nr_srs_info[id]->srs_estimated_channel_time[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - } } generate_ul_reference_signal_sequences(SHRT_MAX); @@ -694,14 +676,18 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, int N_RB_UL = cfg->carrier_config.ul_grid_size[cfg->ssb_config.scs_common.value].value; int n_buf = Prx*max_ul_mimo_layers; + int nb_re_pusch = N_RB_UL * NR_NB_SC_PER_RB; +#ifdef __AVX2__ + int nb_re_pusch2 = nb_re_pusch + (nb_re_pusch&7); +#else + int nb_re_pusch2 = nb_re_pusch; +#endif + for (int ULSCH_id=0; ULSCH_id<gNB->number_of_nr_ulsch_max; ULSCH_id++) { pusch_vars[ULSCH_id] = (NR_gNB_PUSCH *)malloc16_clear( sizeof(NR_gNB_PUSCH) ); pusch_vars[ULSCH_id]->rxdataF_ext = (int32_t **)malloc16(Prx*sizeof(int32_t *) ); - pusch_vars[ULSCH_id]->rxdataF_ext2 = (int32_t **)malloc16(Prx*sizeof(int32_t *) ); pusch_vars[ULSCH_id]->ul_ch_estimates = (int32_t **)malloc16(n_buf*sizeof(int32_t *) ); pusch_vars[ULSCH_id]->ul_ch_estimates_ext = (int32_t **)malloc16(n_buf*sizeof(int32_t *) ); - pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates = (int32_t **)malloc16(n_buf*sizeof(int32_t *) ); - pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext = (int32_t **)malloc16(n_buf*sizeof(int32_t *) ); pusch_vars[ULSCH_id]->ptrs_phase_per_slot = (int32_t **)malloc16(n_buf*sizeof(int32_t *) ); pusch_vars[ULSCH_id]->ul_ch_estimates_time = (int32_t **)malloc16(n_buf*sizeof(int32_t *) ); pusch_vars[ULSCH_id]->rxdataF_comp = (int32_t **)malloc16(n_buf*sizeof(int32_t *) ); @@ -709,25 +695,33 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, pusch_vars[ULSCH_id]->ul_ch_magb0 = (int32_t **)malloc16(n_buf*sizeof(int32_t *) ); pusch_vars[ULSCH_id]->ul_ch_mag = (int32_t **)malloc16(n_buf*sizeof(int32_t *) ); pusch_vars[ULSCH_id]->ul_ch_magb = (int32_t **)malloc16(n_buf*sizeof(int32_t *) ); - pusch_vars[ULSCH_id]->rho = (int32_t **)malloc16_clear(n_buf*sizeof(int32_t*) ); + pusch_vars[ULSCH_id]->rho = (int32_t ***)malloc16(Prx*sizeof(int32_t **) ); + pusch_vars[ULSCH_id]->llr_layers = (int16_t **)malloc16(max_ul_mimo_layers*sizeof(int32_t *) ); for (i=0; i<Prx; i++) { - pusch_vars[ULSCH_id]->rxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot ); - pusch_vars[ULSCH_id]->rxdataF_ext2[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot ); + pusch_vars[ULSCH_id]->rxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot ); + pusch_vars[ULSCH_id]->rho[i] = (int32_t **)malloc16_clear(NR_MAX_NB_LAYERS*NR_MAX_NB_LAYERS*sizeof(int32_t*)); + + for (int j=0; j< max_ul_mimo_layers; j++) { + for (int k=0; k<max_ul_mimo_layers; k++) { + pusch_vars[ULSCH_id]->rho[i][j*max_ul_mimo_layers+k]=(int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot ); + } + } } for (i=0; i<n_buf; i++) { - pusch_vars[ULSCH_id]->ul_ch_estimates[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot ); - pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot ); - pusch_vars[ULSCH_id]->ul_ch_estimates_time[i] = (int32_t *)malloc16_clear( 2*sizeof(int32_t)*fp->ofdm_symbol_size ); - pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot ); // max intensity in freq is 1 sc every 2 RBs - pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot ); + pusch_vars[ULSCH_id]->ul_ch_estimates[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*fp->symbols_per_slot ); + pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot ); + pusch_vars[ULSCH_id]->ul_ch_estimates_time[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size ); pusch_vars[ULSCH_id]->ptrs_phase_per_slot[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->symbols_per_slot); // symbols per slot - pusch_vars[ULSCH_id]->rxdataF_comp[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot ); - pusch_vars[ULSCH_id]->ul_ch_mag0[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 ); - pusch_vars[ULSCH_id]->ul_ch_magb0[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 ); - pusch_vars[ULSCH_id]->ul_ch_mag[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 ); - pusch_vars[ULSCH_id]->ul_ch_magb[i] = (int32_t *)malloc16_clear( fp->symbols_per_slot*sizeof(int32_t)*N_RB_UL*12 ); - pusch_vars[ULSCH_id]->rho[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*(fp->N_RB_UL*12*7*2) ); + pusch_vars[ULSCH_id]->rxdataF_comp[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot ); + pusch_vars[ULSCH_id]->ul_ch_mag0[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot ); + pusch_vars[ULSCH_id]->ul_ch_magb0[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot ); + pusch_vars[ULSCH_id]->ul_ch_mag[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot ); + pusch_vars[ULSCH_id]->ul_ch_magb[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*nb_re_pusch2*fp->symbols_per_slot ); + } + + for (i=0; i< max_ul_mimo_layers; i++) { + pusch_vars[ULSCH_id]->llr_layers[i] = (int16_t *)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); // [hna] 6144 is LTE and (8*((3*8*6144)+12)) is not clear } pusch_vars[ULSCH_id]->llr = (int16_t *)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); // [hna] 6144 is LTE and (8*((3*8*6144)+12)) is not clear pusch_vars[ULSCH_id]->ul_valid_re_per_slot = (int16_t *)malloc16_clear( sizeof(int16_t)*fp->symbols_per_slot); @@ -787,30 +781,16 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) } free_and_zero(pusch_dmrs); - uint32_t ***csi_rs = gNB->nr_gold_csi_rs; + uint32_t ***nr_gold_csi_rs = gNB->nr_csi_info->nr_gold_csi_rs; for (int slot = 0; slot < fp->slots_per_frame; slot++) { for (int symb = 0; symb < fp->symbols_per_slot; symb++) - free_and_zero(csi_rs[slot][symb]); - free_and_zero(csi_rs[slot]); + free_and_zero(nr_gold_csi_rs[slot][symb]); + free_and_zero(nr_gold_csi_rs[slot]); } - free_and_zero(csi_rs); + free_and_zero(nr_gold_csi_rs); + free_and_zero(gNB->nr_csi_info); for (int id = 0; id < NUMBER_OF_NR_SRS_MAX; id++) { - for (int i = 0; i < Prx; i++) { - free_and_zero(gNB->nr_srs_info[id]->srs_received_signal[i]); - free_and_zero(gNB->nr_srs_info[id]->srs_ls_estimated_channel[i]); - free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_freq[i]); - free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time[i]); - free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i]); - } - free_and_zero(gNB->nr_srs_info[id]->sc_list); - free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal); - free_and_zero(gNB->nr_srs_info[id]->noise_power); - free_and_zero(gNB->nr_srs_info[id]->srs_received_signal); - free_and_zero(gNB->nr_srs_info[id]->srs_ls_estimated_channel); - free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_freq); - free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time); - free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted); free_and_zero(gNB->nr_srs_info[id]); } @@ -844,30 +824,31 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) NR_gNB_PUSCH** pusch_vars = gNB->pusch_vars; for (int ULSCH_id=0; ULSCH_id<gNB->number_of_nr_ulsch_max; ULSCH_id++) { + for (int i=0; i< max_ul_mimo_layers; i++) + free_and_zero(pusch_vars[ULSCH_id]->llr_layers[i]); for (int i = 0; i < Prx; i++) { free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext[i]); - free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2[i]); + for (int j=0; j< max_ul_mimo_layers; j++) { + for (int k=0; k<max_ul_mimo_layers; k++) + free_and_zero(pusch_vars[ULSCH_id]->rho[i][j*max_ul_mimo_layers+k]); + } + free_and_zero(pusch_vars[ULSCH_id]->rho[i]); } for (int i = 0; i < n_buf; i++) { free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates[i]); free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i]); free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time[i]); - free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates[i]); - free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext[i]); free_and_zero(pusch_vars[ULSCH_id]->ptrs_phase_per_slot[i]); free_and_zero(pusch_vars[ULSCH_id]->rxdataF_comp[i]); free_and_zero(pusch_vars[ULSCH_id]->ul_ch_mag0[i]); free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb0[i]); free_and_zero(pusch_vars[ULSCH_id]->ul_ch_mag[i]); free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb[i]); - free_and_zero(pusch_vars[ULSCH_id]->rho[i]); } + free_and_zero(pusch_vars[ULSCH_id]->llr_layers); free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext); - free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2); free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates); free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_ext); - free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates); - free_and_zero(pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext); free_and_zero(pusch_vars[ULSCH_id]->ptrs_phase_per_slot); free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time); free_and_zero(pusch_vars[ULSCH_id]->ul_valid_re_per_slot); @@ -931,7 +912,12 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB, //gNB_config->subframe_config.dl_cyclic_prefix_type.value = (fp->Ncp == NORMAL) ? NFAPI_CP_NORMAL : NFAPI_CP_EXTENDED; gNB->mac_enabled = 1; - if (mu==1) { + if (mu==0) { + fp->dl_CarrierFreq = 2600000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value); + fp->ul_CarrierFreq = 2600000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000); + fp->nr_band = 38; + // fp->threequarter_fs= 0; + } else if (mu==1) { fp->dl_CarrierFreq = 3600000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value); fp->ul_CarrierFreq = 3600000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000); fp->nr_band = 78; @@ -1053,9 +1039,9 @@ void init_nr_transport(PHY_VARS_gNB *gNB) { for (int i=0; i<gNB->number_of_nr_ulsch_max; i++) { - LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH %d/%d\n",i,gNB->number_of_nr_ulsch_max); + LOG_I(PHY,"Allocating Transport Channel Buffers for ULSCH %d/%d\n",i,gNB->number_of_nr_ulsch_max); - gNB->ulsch[i] = new_gNB_ulsch(MAX_LDPC_ITERATIONS, fp->N_RB_UL); + gNB->ulsch[i] = new_gNB_ulsch(gNB->max_ldpc_iterations, fp->N_RB_UL); if (!gNB->ulsch[i]) { LOG_E(PHY,"Can't get gNB ulsch structures\n"); diff --git a/openair1/PHY/INIT/nr_init_ru.c b/openair1/PHY/INIT/nr_init_ru.c index 07f1d3b9e3c..75d78738fc6 100644 --- a/openair1/PHY/INIT/nr_init_ru.c +++ b/openair1/PHY/INIT/nr_init_ru.c @@ -41,7 +41,7 @@ int nr_phy_init_RU(RU_t *ru) { int p; int re; - LOG_I(PHY,"Initializing RU signal buffers (if_south %s) nb_tx %d\n",ru_if_types[ru->if_south],ru->nb_tx); + LOG_I(PHY,"Initializing RU signal buffers (if_south %s) nb_tx %d, nb_rx %d\n",ru_if_types[ru->if_south],ru->nb_tx, ru->nb_rx); nfapi_nr_config_request_scf_t *cfg; ru->nb_log_antennas=0; @@ -60,7 +60,7 @@ int nr_phy_init_RU(RU_t *ru) { for (i=0; i<ru->nb_tx; i++) { // Allocate 10 subframes of I/Q TX signal data (time) if not - ru->common.txdata[i] = (int32_t*)malloc16_clear( ru->sf_extension + (fp->samples_per_frame*sizeof(int32_t) )); + ru->common.txdata[i] = (int32_t*)malloc16_clear((ru->sf_extension + fp->samples_per_frame)*sizeof(int32_t)); LOG_I(PHY,"[INIT] common.txdata[%d] = %p (%lu bytes,sf_extension %d)\n",i,ru->common.txdata[i], (ru->sf_extension + fp->samples_per_frame)*sizeof(int32_t),ru->sf_extension); ru->common.txdata[i] = &ru->common.txdata[i][ru->sf_extension]; @@ -124,9 +124,10 @@ int nr_phy_init_RU(RU_t *ru) { ru->num_gNB,NUMBER_OF_gNB_MAX); LOG_I(PHY,"[INIT] %s() ru->num_gNB:%d \n", __FUNCTION__, ru->num_gNB); - if (ru->do_precoding == 1) { + + if (ru->do_precoding == 1) { int beam_count = 0; - if (ru->nb_tx>1) {//Enable beamforming when nb_tx > 1 + if (ru->nb_tx>1) { //Enable beamforming when nb_tx > 1 for (p=0;p<ru->nb_log_antennas;p++) { //if ((fp->L_ssb >> (63-p)) & 0x01)//64 bit-map with the MSB @2â¶Â³ corresponds to SSB ssb_index 0 @@ -149,7 +150,7 @@ int nr_phy_init_RU(RU_t *ru) { } // for j //} } // for p - } //for i + } // for i } ru->common.beam_id = (uint8_t**)malloc16_clear(ru->nb_tx*sizeof(uint8_t*)); @@ -205,12 +206,11 @@ void nr_phy_free_RU(RU_t *ru) free_and_zero(ru->prach_rxsigF[j][i]); free_and_zero(ru->prach_rxsigF[j]); } - if (ru->do_precoding == 1) { for (i = 0; i < ru->num_gNB; i++) { for (p = 0; p < ru->nb_log_antennas; p++) { - for (j=0; j<ru->nb_tx; j++) free_and_zero(ru->beam_weights[i][p][j]); - free_and_zero(ru->beam_weights[i][p]); + for (j=0; j<ru->nb_tx; j++) free_and_zero(ru->beam_weights[i][p][j]); + free_and_zero(ru->beam_weights[i][p]); } } for(i=0; i< ru->nb_tx; ++i) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 05375c46ced..73cdaf0faeb 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -34,19 +34,6 @@ #include "PHY/NR_REFSIG/nr_refsig.h" #include "PHY/MODULATION/nr_modulation.h" -#if 0 -void phy_config_harq_ue(module_id_t Mod_id, - int CC_id, - uint8_t gNB_id, - uint16_t max_harq_tx) { - int num_of_threads,num_of_code_words; - PHY_VARS_NR_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; - - for (num_of_threads=0; num_of_threads<RX_NB_TH_MAX; num_of_threads++) - for (num_of_code_words=0; num_of_code_words<NR_MAX_NB_CODEWORDS; num_of_code_words++) - phy_vars_ue->ulsch[num_of_threads][gNB_id][num_of_code_words]->Mlimit = max_harq_tx; -} -#endif extern uint16_t beta_cqi[16]; @@ -76,7 +63,6 @@ void phy_init_nr_ue_PDSCH(NR_UE_PDSCH *const pdsch, pdsch->dl_ch_magr0 = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) ); pdsch->ptrs_phase_per_slot = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); pdsch->ptrs_re_per_slot = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); - pdsch->dl_ch_ptrs_estimates_ext = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); // the allocated memory size is fixed: AssertFatal( fp->nb_antennas_rx <= 4, "nb_antennas_rx > 4" );//Extend the max number of UE Rx antennas to 4 @@ -86,7 +72,6 @@ void phy_init_nr_ue_PDSCH(NR_UE_PDSCH *const pdsch, pdsch->rxdataF_uespec_pilots[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * fp->N_RB_DL*12); pdsch->ptrs_phase_per_slot[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * 14 ); pdsch->ptrs_re_per_slot[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * 14); - pdsch->dl_ch_ptrs_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * num); pdsch->rho[i] = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*NR_MAX_NB_LAYERS*sizeof(int32_t *) ); for (int j=0; j<NR_MAX_NB_LAYERS; j++) { @@ -126,7 +111,6 @@ void phy_term_nr_ue__PDSCH(NR_UE_PDSCH* pdsch, const NR_DL_FRAME_PARMS *const fp free_and_zero(pdsch->rxdataF_uespec_pilots[i]); free_and_zero(pdsch->ptrs_phase_per_slot[i]); free_and_zero(pdsch->ptrs_re_per_slot[i]); - free_and_zero(pdsch->dl_ch_ptrs_estimates_ext[i]); free_and_zero(pdsch->rho[i]); } free_and_zero(pdsch->pmi_ext); @@ -149,7 +133,6 @@ void phy_term_nr_ue__PDSCH(NR_UE_PDSCH* pdsch, const NR_DL_FRAME_PARMS *const fp free_and_zero(pdsch->dl_ch_magr0); free_and_zero(pdsch->ptrs_phase_per_slot); free_and_zero(pdsch->ptrs_re_per_slot); - free_and_zero(pdsch->dl_ch_ptrs_estimates_ext); } int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) @@ -160,8 +143,11 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) NR_UE_PBCH **const pbch_vars = ue->pbch_vars; NR_UE_PRS **const prs_vars = ue->prs_vars; NR_UE_PRACH **const prach_vars = ue->prach_vars; + NR_UE_CSI_IM **const csiim_vars = ue->csiim_vars; + NR_UE_CSI_RS **const csirs_vars = ue->csirs_vars; NR_UE_SRS **const srs_vars = ue->srs_vars; - int i,slot,symb, gNB_id, th_id; + + int i, slot, symb, gNB_id, th_id; LOG_I(PHY, "Initializing UE vars for gNB TXant %u, UE RXant %u\n", fp->nb_antennas_tx, fp->nb_antennas_rx); @@ -389,26 +375,33 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) prach_vars[gNB_id] = (NR_UE_PRACH *)malloc16_clear(sizeof(NR_UE_PRACH)); pbch_vars[gNB_id] = (NR_UE_PBCH *)malloc16_clear(sizeof(NR_UE_PBCH)); + csiim_vars[gNB_id] = (NR_UE_CSI_IM *)malloc16_clear(sizeof(NR_UE_CSI_IM)); + csirs_vars[gNB_id] = (NR_UE_CSI_RS *)malloc16_clear(sizeof(NR_UE_CSI_RS)); srs_vars[gNB_id] = (NR_UE_SRS *)malloc16_clear(sizeof(NR_UE_SRS)); + csiim_vars[gNB_id]->active = false; + csirs_vars[gNB_id]->active = false; srs_vars[gNB_id]->active = false; - ue->nr_srs_info = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); - ue->nr_srs_info->sc_list = (uint16_t *) malloc16_clear(6*fp->N_RB_UL*sizeof(uint16_t)); - ue->nr_srs_info->srs_generated_signal = (int32_t *) malloc16_clear( (2*(fp->samples_per_frame)+2048)*sizeof(int32_t) ); - ue->nr_srs_info->noise_power = (uint32_t*)malloc16_clear(sizeof(uint32_t)); - ue->nr_srs_info->srs_received_signal = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); - ue->nr_srs_info->srs_ls_estimated_channel = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); - ue->nr_srs_info->srs_estimated_channel_freq = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); - ue->nr_srs_info->srs_estimated_channel_time = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); - ue->nr_srs_info->srs_estimated_channel_time_shifted = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); - for (i=0; i<fp->nb_antennas_rx; i++) { - ue->nr_srs_info->srs_received_signal[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - ue->nr_srs_info->srs_ls_estimated_channel[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - ue->nr_srs_info->srs_estimated_channel_freq[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - ue->nr_srs_info->srs_estimated_channel_time[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - ue->nr_srs_info->srs_estimated_channel_time_shifted[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); + + // ceil((NB_RB*8(max allocation per RB)*2(QPSK))/32) + int csi_dmrs_init_length = ((fp->N_RB_DL<<4)>>5)+1; + ue->nr_csi_info = (nr_csi_info_t *)malloc16_clear(sizeof(nr_csi_info_t)); + ue->nr_csi_info->nr_gold_csi_rs = (uint32_t ***)malloc16(fp->slots_per_frame * sizeof(uint32_t **)); + AssertFatal(ue->nr_csi_info->nr_gold_csi_rs != NULL, "NR init: csi reference signal malloc failed\n"); + for (int slot=0; slot<fp->slots_per_frame; slot++) { + ue->nr_csi_info->nr_gold_csi_rs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot * sizeof(uint32_t *)); + AssertFatal(ue->nr_csi_info->nr_gold_csi_rs[slot] != NULL, "NR init: csi reference signal for slot %d - malloc failed\n", slot); + for (int symb=0; symb<fp->symbols_per_slot; symb++) { + ue->nr_csi_info->nr_gold_csi_rs[slot][symb] = (uint32_t *)malloc16(csi_dmrs_init_length * sizeof(uint32_t)); + AssertFatal(ue->nr_csi_info->nr_gold_csi_rs[slot][symb] != NULL, "NR init: csi reference signal for slot %d symbol %d - malloc failed\n", slot, symb); + } + } + ue->nr_csi_info->csi_rs_generated_signal = (int32_t **)malloc16(NR_MAX_NB_PORTS * sizeof(int32_t *) ); + for (i=0; i<NR_MAX_NB_PORTS; i++) { + ue->nr_csi_info->csi_rs_generated_signal[i] = (int32_t *) malloc16_clear(fp->samples_per_frame_wCP * sizeof(int32_t)); } + ue->nr_srs_info = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); // RACH prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); @@ -502,31 +495,30 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) free_and_zero(ue->pdsch_vars[th_id][gNB_id]); } } - + for (int gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) { for (int th_id = 0; th_id < RX_NB_TH_MAX; th_id++) { - free_and_zero(ue->pdcch_vars[th_id][gNB_id]); } - for (int i = 0; i < fp->nb_antennas_rx; i++) { - free_and_zero(ue->nr_srs_info->srs_received_signal[i]); - free_and_zero(ue->nr_srs_info->srs_ls_estimated_channel[i]); - free_and_zero(ue->nr_srs_info->srs_estimated_channel_freq[i]); - free_and_zero(ue->nr_srs_info->srs_estimated_channel_time[i]); - free_and_zero(ue->nr_srs_info->srs_estimated_channel_time_shifted[i]); + for (int i=0; i<NR_MAX_NB_PORTS; i++) { + free_and_zero(ue->nr_csi_info->csi_rs_generated_signal[i]); } - free_and_zero(ue->nr_srs_info->sc_list); - free_and_zero(ue->nr_srs_info->srs_generated_signal); - free_and_zero(ue->nr_srs_info->noise_power); - free_and_zero(ue->nr_srs_info->srs_received_signal); - free_and_zero(ue->nr_srs_info->srs_ls_estimated_channel); - free_and_zero(ue->nr_srs_info->srs_estimated_channel_freq); - free_and_zero(ue->nr_srs_info->srs_estimated_channel_time); - free_and_zero(ue->nr_srs_info->srs_estimated_channel_time_shifted); + free_and_zero(ue->nr_csi_info->csi_rs_generated_signal); + for (int slot=0; slot<fp->slots_per_frame; slot++) { + for (int symb=0; symb<fp->symbols_per_slot; symb++) { + free_and_zero(ue->nr_csi_info->nr_gold_csi_rs[slot][symb]); + } + free_and_zero(ue->nr_csi_info->nr_gold_csi_rs[slot]); + } + free_and_zero(ue->nr_csi_info->nr_gold_csi_rs); + free_and_zero(ue->nr_csi_info); + free_and_zero(ue->nr_srs_info); + free_and_zero(ue->csiim_vars[gNB_id]); + free_and_zero(ue->csirs_vars[gNB_id]); free_and_zero(ue->srs_vars[gNB_id]); free_and_zero(ue->pbch_vars[gNB_id]); @@ -547,7 +539,7 @@ void term_nr_ue_transport(PHY_VARS_NR_UE *ue) for (int k = 0; k < RX_NB_TH_MAX; k++) { free_nr_ue_dlsch(&ue->dlsch[k][i][j], N_RB_DL); if (j==0) - free_nr_ue_ulsch(&ue->ulsch[k][i], N_RB_DL); + free_nr_ue_ulsch(&ue->ulsch[k][i], N_RB_DL, &ue->frame_parms); } } @@ -565,17 +557,17 @@ void init_nr_ue_transport(PHY_VARS_NR_UE *ue) { for (int i = 0; i < NUMBER_OF_CONNECTED_gNB_MAX; i++) { for (int j=0; j<num_codeword; j++) { for (int k=0; k<RX_NB_TH_MAX; k++) { - AssertFatal((ue->dlsch[k][i][j] = new_nr_ue_dlsch(1,NR_MAX_DLSCH_HARQ_PROCESSES,NSOFT,MAX_LDPC_ITERATIONS,ue->frame_parms.N_RB_DL))!=NULL,"Can't get ue dlsch structures\n"); + AssertFatal((ue->dlsch[k][i][j] = new_nr_ue_dlsch(1,NR_MAX_DLSCH_HARQ_PROCESSES,NSOFT,ue->max_ldpc_iterations,ue->frame_parms.N_RB_DL))!=NULL,"Can't get ue dlsch structures\n"); LOG_D(PHY,"dlsch[%d][%d][%d] => %p\n",k,i,j,ue->dlsch[k][i][j]); if (j==0) { - AssertFatal((ue->ulsch[k][i] = new_nr_ue_ulsch(ue->frame_parms.N_RB_UL, NR_MAX_ULSCH_HARQ_PROCESSES))!=NULL,"Can't get ue ulsch structures\n"); + AssertFatal((ue->ulsch[k][i] = new_nr_ue_ulsch(ue->frame_parms.N_RB_UL, NR_MAX_ULSCH_HARQ_PROCESSES,&ue->frame_parms))!=NULL,"Can't get ue ulsch structures\n"); LOG_D(PHY,"ulsch[%d][%d] => %p\n",k,i,ue->ulsch[k][i]); } } } - ue->dlsch_SI[i] = new_nr_ue_dlsch(1,1,NSOFT,MAX_LDPC_ITERATIONS,ue->frame_parms.N_RB_DL); - ue->dlsch_ra[i] = new_nr_ue_dlsch(1,1,NSOFT,MAX_LDPC_ITERATIONS,ue->frame_parms.N_RB_DL); + ue->dlsch_SI[i] = new_nr_ue_dlsch(1,1,NSOFT,ue->max_ldpc_iterations,ue->frame_parms.N_RB_DL); + ue->dlsch_ra[i] = new_nr_ue_dlsch(1,1,NSOFT,ue->max_ldpc_iterations,ue->frame_parms.N_RB_DL); ue->transmission_mode[i] = ue->frame_parms.nb_antenna_ports_gNB==1 ? 1 : 2; } diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c index c867292942f..9327fe9fe89 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c @@ -41,10 +41,10 @@ extern int16_t *ul_ref_sigs_rx[30][2][34]; int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms, L1_rxtx_proc_t *proc, - LTE_eNB_ULSCH_t * ulsch, - int32_t **ul_ch_estimates, - int32_t **ul_ch_estimates_time, - int32_t **rxdataF_ext, + LTE_eNB_ULSCH_t * ulsch, + int32_t **ul_ch_estimates, + int32_t **ul_ch_estimates_time, + int32_t **rxdataF_ext, module_id_t UE_id, unsigned char l, unsigned char Ns) { @@ -88,7 +88,7 @@ int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms, } uint16_t N_rb_alloc = ulsch->harq_processes[harq_pid]->nb_rb; - int32_t tmp_estimates[N_rb_alloc*12] __attribute__((aligned(16))); + int32_t tmp_estimates[N_rb_alloc*12] __attribute__((aligned(32))); Msc_RS = N_rb_alloc*12; cyclic_shift = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + ulsch->harq_processes[harq_pid]->n_DMRS2 + @@ -334,14 +334,14 @@ int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms, current_phase2 = cmin(abs(current_phase2),127); // msg("sym: %d, current_phase1: %d, ru: %d + j%d, current_phase2: %d, ru: %d + j%d\n",k,current_phase1,ru1[2*current_phase1],ru1[2*current_phase1+1],current_phase2,ru2[2*current_phase2],ru2[2*current_phase2+1]); // rotate channel estimates by estimated phase - rotate_cpx_vector((int16_t *) ul_ch1, - &ru1[2*current_phase1], - (int16_t *) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k], + rotate_cpx_vector((c16_t *) ul_ch1, + (c16_t *)&ru1[2*current_phase1], + (c16_t *) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k], Msc_RS, 15); - rotate_cpx_vector((int16_t *) ul_ch2, - &ru2[2*current_phase2], - (int16_t *) &tmp_estimates[0], + rotate_cpx_vector((c16_t *) ul_ch2, + (c16_t *)&ru2[2*current_phase2], + (c16_t *) tmp_estimates, Msc_RS, 15); // Combine the two rotated estimates @@ -657,14 +657,14 @@ int32_t lte_ul_channel_estimation_RRU(LTE_DL_FRAME_PARMS *frame_parms, current_phase2 = cmin(abs(current_phase2),127); // msg("sym: %d, current_phase1: %d, ru: %d + j%d, current_phase2: %d, ru: %d + j%d\n",k,current_phase1,ru1[2*current_phase1],ru1[2*current_phase1+1],current_phase2,ru2[2*current_phase2],ru2[2*current_phase2+1]); // rotate channel estimates by estimated phase - rotate_cpx_vector((int16_t *) ul_ch1, - &ru1[2*current_phase1], - (int16_t *) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k], + rotate_cpx_vector((c16_t *) ul_ch1, + (c16_t *) &ru1[2*current_phase1], + (c16_t *) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k], Msc_RS, 15); - rotate_cpx_vector((int16_t *) ul_ch2, - &ru2[2*current_phase2], - (int16_t *) &tmp_estimates[0], + rotate_cpx_vector((c16_t *) ul_ch2, + (c16_t *) &ru2[2*current_phase2], + (c16_t *) &tmp_estimates[0], Msc_RS, 15); // Combine the two rotated estimates diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 1bbe9eb39a2..dc73a56568e 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -1997,7 +1997,7 @@ int get_narrowband_index(int N_RB_UL,int rb) { void fill_ulsch(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame,int subframe) { uint8_t harq_pid; //uint8_t UE_id; - boolean_t new_ulsch = (find_ulsch(ulsch_pdu->ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST)==-1) ? TRUE : FALSE; + const bool new_ulsch = find_ulsch(ulsch_pdu->ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST) == -1; //AssertFatal((UE_id=find_ulsch(ulsch_pdu->ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0, // "No existing/free UE ULSCH for rnti %x\n",ulsch_pdu->ulsch_pdu_rel8.rnti); LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id]; @@ -2063,7 +2063,7 @@ void fill_ulsch(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_ulsch_pdu *ulsch_pdu if ((ulsch->harq_processes[harq_pid]->status == SCH_IDLE) || (ulsch->harq_processes[harq_pid]->ndi != ulsch_pdu->ulsch_pdu_rel8.new_data_indication) || - (new_ulsch == TRUE)) { + (new_ulsch == true)) { ulsch->harq_processes[harq_pid]->status = ACTIVE; ulsch->harq_processes[harq_pid]->TBS = ulsch_pdu->ulsch_pdu_rel8.size<<3; ulsch->harq_processes[harq_pid]->Msc_initial = 12*ulsch_pdu->ulsch_pdu_rel8.number_of_resource_blocks; diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools_common.c b/openair1/PHY/LTE_TRANSPORT/dci_tools_common.c index 64e74ebfbf8..0addfdf14c7 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools_common.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools_common.c @@ -532,9 +532,12 @@ uint32_t conv_1C_RIV(int32_t rballoc,uint32_t N_RB_DL) { } +// FIXME: this function is compting PRB outside the range, so I FORCED in the range +// I can't understand the 3GPP spec, see below note uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) { int offset; + int ret=-1; switch (N_RB_DL) { @@ -545,16 +548,16 @@ uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) { switch (vrb) { case 0: // even: 0->0, 1->2, odd: 0->3, 1->5 case 1: - return ((3*odd_slot) + 2*(vrb&3))%6; + ret= ((3*odd_slot) + 2*(vrb&3))%6; break; case 2: // even: 2->3, 3->5, odd: 2->0, 3->2 case 3: - return ((3*odd_slot) + 2*(vrb&3) + 5)%6; + ret= ((3*odd_slot) + 2*(vrb&3) + 5)%6; break; case 4: // even: 4->1, odd: 4->4 - return ((3*odd_slot) + 1)%6; + ret= ((3*odd_slot) + 1)%6; case 5: // even: 5->4, odd: 5->1 - return ((3*odd_slot) + 4)%6; + ret= ((3*odd_slot) + 4)%6; break; } break; @@ -562,88 +565,90 @@ uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) { case 15: if (vrb<12) { if ((vrb&3) < 2) // even: 0->0, 1->4, 4->1, 5->5, 8->2, 9->6 odd: 0->7, 1->11 - return(((7*odd_slot) + 4*(vrb&3) + (vrb>>2))%14) + 14*(vrb/14); + ret= (((7*odd_slot) + 4*(vrb&3) + (vrb>>2))%14) + 14*(vrb/14); else if (vrb < 12) // even: 2->7, 3->11, 6->8, 7->12, 10->9, 11->13 - return (((7*odd_slot) + 4*(vrb&3) + (vrb>>2) +13 )%14) + 14*(vrb/14); + ret= (((7*odd_slot) + 4*(vrb&3) + (vrb>>2) +13 )%14) + 14*(vrb/14); } if (vrb==12) - return (3+(7*odd_slot)) % 14; + ret= (3+(7*odd_slot)) % 14; if (vrb==13) - return (10+(7*odd_slot)) % 14; - return 14; + ret= (10+(7*odd_slot)) % 14; + ret= 14; break; + // Formula in TS 36.211, chap 6.2.3.2 + // Fix me: returns a PRB number > 24 when vrb is 24 case 25: - return (((12*odd_slot) + 6*(vrb&3) + (vrb>>2))%24) + 24*(vrb/24); + ret= (((12*odd_slot) + 6*(vrb&3) + (vrb>>2))%24) + 24*(vrb/24); break; case 50: // P=3 if (Ngap==0) { // Nrow=12,Nnull=2,NVRBDL=46,Ngap1= 27 if (vrb>=23) - offset=4; + offset=4; else - offset=0; + offset=0; if (vrb<44) { - if ((vrb&3)>=2) - return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2) + 45)%46; - else - return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2))%46; + if ((vrb&3)>=2) + ret= offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2) + 45)%46; + else + ret= offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2))%46; } if (vrb==44) // even: 44->11, odd: 45->34 - return offset+((23*odd_slot) + 22-12+1); + ret= offset+((23*odd_slot) + 22-12+1); if (vrb==45) // even: 45->10, odd: 45->33 - return offset+((23*odd_slot) + 22+12); + ret= offset+((23*odd_slot) + 22+12); if (vrb==46) - return offset+46+((23*odd_slot) + 23-12+1) % 46; + ret= offset+46+((23*odd_slot) + 23-12+1) % 46; if (vrb==47) - return offset+46+((23*odd_slot) + 23+12) % 46; + ret= offset+46+((23*odd_slot) + 23+12) % 46; if (vrb==48) - return offset+46+((23*odd_slot) + 23-12+1) % 46; + ret= offset+46+((23*odd_slot) + 23-12+1) % 46; if (vrb==49) - return offset+46+((23*odd_slot) + 23+12) % 46; + ret= offset+46+((23*odd_slot) + 23+12) % 46; } else { // Nrow=6,Nnull=6,NVRBDL=18,Ngap1= 27 if (vrb>=9) - offset=18; + offset=18; else - offset=0; + offset=0; if (vrb<12) { - if ((vrb&3)>=2) - return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2) + 17)%18; - else - return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2))%18; + if ((vrb&3)>=2) + ret= offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2) + 17)%18; + else + ret= offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2))%18; } else { - return offset+((9*odd_slot) + 12*(vrb&1)+(vrb>>1) )%18 + 18*(vrb/18); + ret= offset+((9*odd_slot) + 12*(vrb&1)+(vrb>>1) )%18 + 18*(vrb/18); } } break; case 75: // Ngap1 = 32, NVRBRL=64, P=4, Nrow= 16, Nnull=0 if (Ngap ==0) { - return ((32*odd_slot) + 16*(vrb&3) + (vrb>>2))%64 + (vrb/64); + ret= ((32*odd_slot) + 16*(vrb&3) + (vrb>>2))%64 + (vrb/64); } else { // Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0 - return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32); + ret= ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32); } break; case 100: // Ngap1 = 48, NVRBDL=96, Nrow=24, Nnull=0 if (Ngap ==0) { - return ((48*odd_slot) + 24*(vrb&3) + (vrb>>2))%96 + (vrb/96); + ret= ((48*odd_slot) + 24*(vrb&3) + (vrb>>2))%96 + (vrb/96); } else { // Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0 - return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32); + ret= ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32); } break; default: LOG_E(PHY,"Unknown N_RB_DL %d\n",N_RB_DL); - return 0; + ret= 0; } - return 0; + return ret%N_RB_DL; } @@ -677,7 +682,7 @@ void generate_RIV_tables(void) // printf("RIV %d (%d) : first_rb %d NBRB %d\n",RIV,localRIV2alloc_LUT25[RIV],RBstart,Lcrbs); localRIV2alloc_LUT6[RIV] = alloc0; - distRIV2alloc_even_LUT6[RIV] = allocdist0_0_even; + distRIV2alloc_even_LUT6[RIV] = allocdist0_0_even; distRIV2alloc_odd_LUT6[RIV] = allocdist0_0_odd; RIV2nb_rb_LUT6[RIV] = Lcrbs; RIV2first_rb_LUT6[RIV] = RBstart; @@ -693,15 +698,14 @@ void generate_RIV_tables(void) nVRB = Lcrbs-1+RBstart; //printf("RBstart %d, len %d --> ",RBstart,Lcrbs); alloc0 |= (1<<nVRB); - allocdist0_0_even |= (1<<get_prb(25,0,nVRB,0)); - allocdist0_0_odd |= (1<<get_prb(25,1,nVRB,0)); + allocdist0_0_even |= 1U << get_prb(25, 0, nVRB, 0); + allocdist0_0_odd |= 1U << get_prb(25, 1, nVRB, 0); //printf("alloc 0 %x, allocdist0_even %x, allocdist0_odd %x\n",alloc0,allocdist0_0_even,allocdist0_0_odd); RIV=computeRIV(25,RBstart,Lcrbs); if (RIV>RIV_max25) - RIV_max25 = RIV;; - + RIV_max25 = RIV; localRIV2alloc_LUT25[RIV] = alloc0; distRIV2alloc_even_LUT25[RIV] = allocdist0_0_even; @@ -730,37 +734,37 @@ void generate_RIV_tables(void) if (nVRB<32) - alloc0 |= (1<<nVRB); + alloc0 |= 1U << nVRB; else - alloc1 |= (1<<(nVRB-32)); + alloc1 |= 1U << (nVRB - 32); // Distributed Gap1, even slot nVRB_even_dist = get_prb(50,0,nVRB,0); if (nVRB_even_dist<32) - allocdist0_0_even |= (1<<nVRB_even_dist); + allocdist0_0_even |= 1U << nVRB_even_dist; else - allocdist1_0_even |= (1<<(nVRB_even_dist-32)); + allocdist1_0_even |= 1U << (nVRB_even_dist - 32); // Distributed Gap1, odd slot nVRB_odd_dist = get_prb(50,1,nVRB,0); if (nVRB_odd_dist<32) - allocdist0_0_odd |= (1<<nVRB_odd_dist); + allocdist0_0_odd |= (1U <<nVRB_odd_dist); else - allocdist1_0_odd |= (1<<(nVRB_odd_dist-32)); + allocdist1_0_odd |= (1U <<(nVRB_odd_dist-32)); // Distributed Gap2, even slot nVRB_even_dist = get_prb(50,0,nVRB,1); if (nVRB_even_dist<32) - allocdist0_1_even |= (1<<nVRB_even_dist); + allocdist0_1_even |= 1U << nVRB_even_dist; else - allocdist1_1_even |= (1<<(nVRB_even_dist-32)); + allocdist1_1_even |= 1U << (nVRB_even_dist - 32); // Distributed Gap2, odd slot nVRB_odd_dist = get_prb(50,1,nVRB,1); if (nVRB_odd_dist<32) - allocdist0_1_odd |= (1<<nVRB_odd_dist); + allocdist0_1_odd |= 1U << nVRB_odd_dist; else - allocdist1_1_odd |= (1<<(nVRB_odd_dist-32)); + allocdist1_1_odd |= 1U << (nVRB_odd_dist - 32); RIV=computeRIV(50,RBstart,Lcrbs); @@ -811,13 +815,13 @@ void generate_RIV_tables(void) nVRB = Lcrbs-1+RBstart; if (nVRB<32) - alloc0 |= (1<<nVRB); + alloc0 |= 1U << nVRB; else if (nVRB<64) - alloc1 |= (1<<(nVRB-32)); + alloc1 |= 1U << (nVRB - 32); else if (nVRB<96) - alloc2 |= (1<<(nVRB-64)); + alloc2 |= 1U << (nVRB - 64); else - alloc3 |= (1<<(nVRB-96)); + alloc3 |= 1U << (nVRB - 96); // Distributed Gap1, even slot nVRB_even_dist = get_prb(100,0,nVRB,0); @@ -825,15 +829,14 @@ void generate_RIV_tables(void) // if ((RBstart==0) && (Lcrbs<=8)) // printf("nVRB %d => nVRB_even_dist %d\n",nVRB,nVRB_even_dist); - if (nVRB_even_dist<32) - allocdist0_0_even |= (1<<nVRB_even_dist); + allocdist0_0_even |= 1U << nVRB_even_dist; else if (nVRB_even_dist<64) - allocdist1_0_even |= (1<<(nVRB_even_dist-32)); + allocdist1_0_even |= 1U << (nVRB_even_dist - 32); else if (nVRB_even_dist<96) - allocdist2_0_even |= (1<<(nVRB_even_dist-64)); + allocdist2_0_even |= 1U << (nVRB_even_dist - 64); else - allocdist3_0_even |= (1<<(nVRB_even_dist-96)); + allocdist3_0_even |= 1U << (nVRB_even_dist - 96); /* if ((RBstart==0) && (Lcrbs<=8)) printf("rballoc =>(%08x.%08x.%08x.%08x)\n", allocdist0_0_even, @@ -845,38 +848,37 @@ void generate_RIV_tables(void) // Distributed Gap1, odd slot nVRB_odd_dist = get_prb(100,1,nVRB,0); if (nVRB_odd_dist<32) - allocdist0_0_odd |= (1<<nVRB_odd_dist); + allocdist0_0_odd |= 1U << nVRB_odd_dist; else if (nVRB_odd_dist<64) - allocdist1_0_odd |= (1<<(nVRB_odd_dist-32)); + allocdist1_0_odd |= 1U << (nVRB_odd_dist - 32); else if (nVRB_odd_dist<96) - allocdist2_0_odd |= (1<<(nVRB_odd_dist-64)); + allocdist2_0_odd |= 1U << (nVRB_odd_dist - 64); else - allocdist3_0_odd |= (1<<(nVRB_odd_dist-96)); + allocdist3_0_odd |= 1U << (nVRB_odd_dist - 96); // Distributed Gap2, even slot nVRB_even_dist = get_prb(100,0,nVRB,1); if (nVRB_even_dist<32) - allocdist0_1_even |= (1<<nVRB_even_dist); + allocdist0_1_even |= 1U << nVRB_even_dist; else if (nVRB_even_dist<64) - allocdist1_1_even |= (1<<(nVRB_even_dist-32)); + allocdist1_1_even |= 1U << (nVRB_even_dist - 32); else if (nVRB_even_dist<96) - allocdist2_1_even |= (1<<(nVRB_even_dist-64)); + allocdist2_1_even |= 1U << (nVRB_even_dist - 64); else - allocdist3_1_even |= (1<<(nVRB_even_dist-96)); + allocdist3_1_even |= 1U << (nVRB_even_dist - 96); // Distributed Gap2, odd slot nVRB_odd_dist = get_prb(100,1,nVRB,1); if (nVRB_odd_dist<32) - allocdist0_1_odd |= (1<<nVRB_odd_dist); + allocdist0_1_odd |= 1U << nVRB_odd_dist; else if (nVRB_odd_dist<64) - allocdist1_1_odd |= (1<<(nVRB_odd_dist-32)); + allocdist1_1_odd |= 1U << (nVRB_odd_dist - 32); else if (nVRB_odd_dist<96) - allocdist2_1_odd |= (1<<(nVRB_odd_dist-64)); + allocdist2_1_odd |= 1U << (nVRB_odd_dist - 64); else - allocdist3_1_odd |= (1<<(nVRB_odd_dist-96)); - + allocdist3_1_odd |= 1U << (nVRB_odd_dist - 96); RIV=computeRIV(100,RBstart,Lcrbs); diff --git a/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h b/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h index 3574ba67405..d90216c3e6a 100644 --- a/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h +++ b/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h @@ -509,7 +509,7 @@ typedef struct { /// Position of first CCE of the dci int firstCCE; /// flag to indicate that this is a RA response - boolean_t ra_flag; + bool ra_flag; /// rnti rnti_t rnti; /// Format diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index 3ccbd8ca35a..13109d8f5a1 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c @@ -288,7 +288,7 @@ static void TPencode(void * arg) { LTE_DL_eNB_HARQ_t *hadlsch=rdata->dlsch->harq_processes[harq_pid]; if ( rdata-> round == 0) { - uint8_t tmp[96+12+3+3*6144]; + uint8_t tmp[96+12+3+3*6144] __attribute__((aligned(32))); memset(tmp,LTE_NULL, TURBO_SIMD_SOFTBITS); start_meas(rdata->te_stats); encoder(rdata->input, diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c index 088e2c0a5e2..b5e5b490a35 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c @@ -64,6 +64,12 @@ extern uint16_t beta_cqi[16]; extern uint16_t beta_ri[16]; extern uint16_t beta_ack[16]; +static int errorRB(int rb, char * table, int line) { + LOG_E(PHY,"Received %d rb, impossble in table %s, at line %d\n", rb, table, line); + return 0; +} + +#define rbAllocCheck(RBalL, TabLe) (RBalL) > sizeof(TabLe)/sizeof(*TabLe) ? errorRB(RBalL, #TabLe, __LINE__) : TabLe[RBalL] void extract_dci1A_info(uint8_t N_RB_DL, frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted) { uint8_t harq_pid=0; @@ -974,28 +980,28 @@ int check_dci_format1_1a_coherency(DCI_format_t dci_format, { switch (N_RB_DL) { case 6: - NPRB = RIV2nb_rb_LUT6[rballoc];//NPRB; + NPRB = rbAllocCheck(rballoc, RIV2nb_rb_LUT6); if(rah) RIV_max = RIV_max6; else RIV_max = 0x3F; break; case 25: - NPRB = RIV2nb_rb_LUT25[rballoc];//NPRB; + NPRB = rbAllocCheck(rballoc,RIV2nb_rb_LUT25); if(rah) RIV_max = RIV_max25; else RIV_max = 0x1FFF; break; case 50: - NPRB = RIV2nb_rb_LUT50[rballoc];//NPRB; + NPRB = rbAllocCheck(rballoc,RIV2nb_rb_LUT50); if(rah) RIV_max = RIV_max50; else RIV_max = 0x1FFFF; break; case 100: - NPRB = RIV2nb_rb_LUT100[rballoc];//NPRB; + NPRB = rbAllocCheck(rballoc,RIV2nb_rb_LUT100); if(rah) RIV_max = RIV_max100; else @@ -1034,9 +1040,14 @@ int check_dci_format1_1a_coherency(DCI_format_t dci_format, // this is an eNB issue // retransmisison but old and new TBS are different !!! // work around, consider it as a new transmission - LOG_E(PHY,"Format1A Retransmission but TBS are different: consider it as new transmission !!! \n"); + LOG_E(PHY, + "Format1A Retransmission but TBS are different: consider it as new transmission !!!, round %d, mcs 1 %d, NPRB %d \n", + pdlsch0_harq->round, + mcs1, + NPRB); pdlsch0_harq->round = 0; //return(0); // ?? to cross check + return(0); // ?? to cross check } } diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c index 0b665737a7b..8f5e33d6e00 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c @@ -41,7 +41,7 @@ #include <stdlib.h> #include <string.h> #include <linux/version.h> -#if RHEL_RELEASE_CODE >= 1796 +#if defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403 #include <lapacke/lapacke_utils.h> #include <lapacke/lapacke.h> #else diff --git a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c index 7d063e326ef..83c74389cf2 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c @@ -14,7 +14,7 @@ data storage. */ #include <cblas.h> #include <string.h> #include <linux/version.h> -#if RHEL_RELEASE_CODE >= 1796 +#if defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403 #include <lapacke/lapacke_utils.h> #include <lapacke/lapacke.h> #else diff --git a/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h b/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h index f5b8c6b64a0..36da4ccab0e 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h +++ b/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h @@ -1272,14 +1272,6 @@ uint32_t get_TBS_DL(uint8_t mcs, uint16_t nb_rb); @return Transport block size */ uint32_t get_TBS_UL(uint8_t mcs, uint16_t nb_rb); -/* \brief Return bit-map of resource allocation for a given DCI rballoc (RIV format) and vrb type - @param N_RB_DL number of PRB on DL - @param indicator for even/odd slot - @param vrb vrb index - @param Ngap Gap indicator -*/ -uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap); - /* \brief Return prb for a given vrb index @param vrb_type VRB type (0=localized,1=distributed) @param rb_alloc_dci rballoc field from DCI diff --git a/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h b/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h index b4ae44f6eab..5f8763414ef 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h +++ b/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h @@ -90,7 +90,7 @@ typedef struct { /// Redundancy-version of the current sub-frame uint8_t rvidx; /// Turbo-code outputs (36-212 V8.6 2009-03, p.12 - uint8_t d[MAX_NUM_ULSCH_SEGMENTS][(96+3+(3*6144))]; + uint8_t *d[MAX_NUM_ULSCH_SEGMENTS]; /// Sub-block interleaver outputs (36-212 V8.6 2009-03, p.16-17) uint8_t w[MAX_NUM_ULSCH_SEGMENTS][3*6144]; /// Number of code segments (for definition see 36-212 V8.6 2009-03, p.9) diff --git a/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c index ae3ebbce9dc..c04ec160aa1 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c @@ -71,6 +71,7 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) { for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) { if (ulsch->harq_processes[i]->c[r]) { free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768); + free16(ulsch->harq_processes[i]->d[r],0); ulsch->harq_processes[i]->c[r] = NULL; } } @@ -86,7 +87,7 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) { LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) { LTE_UE_ULSCH_t *ulsch; - unsigned char exit_flag = 0,i,j,r; + unsigned char exit_flag = 0; unsigned char bw_scaling =1; switch (N_RB_UL) { @@ -113,7 +114,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) { memset(ulsch,0,sizeof(LTE_UE_ULSCH_t)); ulsch->Mlimit = 4; - for (i=0; i<8; i++) { + for (int i=0; i<8; i++) { ulsch->harq_processes[i] = (LTE_UL_UE_HARQ_t *)malloc16(sizeof(LTE_UL_UE_HARQ_t)); // printf("ulsch->harq_processes[%d] %p\n",i,ulsch->harq_processes[i]); @@ -129,15 +130,11 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) { } if (abstraction_flag==0) { - for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) { - ulsch->harq_processes[i]->c[r] = (unsigned char *)malloc16(((r==0)?8:0) + 3+768); // account for filler in first segment and CRCs for multiple segment case - - if (ulsch->harq_processes[i]->c[r]) - memset(ulsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+768); - else { - LOG_E(PHY,"Can't get c\n"); - exit_flag=2; - } + for (int r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) { + ulsch->harq_processes[i]->c[r] = malloc16_clear(((r==0)?8:0) + 3+768); // account for filler in first segment and CRCs for multiple segment case + AssertFatal(ulsch->harq_processes[i]->c[r], ""); + ulsch->harq_processes[i]->d[r] = malloc16_clear(96+3+(3*6144)); + AssertFatal(ulsch->harq_processes[i]->d[r], ""); } } @@ -148,15 +145,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) { exit_flag=3; } } - - if ((abstraction_flag == 0) && (exit_flag==0)) { - for (i=0; i<8; i++) - for (j=0; j<96; j++) - for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) - ulsch->harq_processes[i]->d[r][j] = LTE_NULL; - - return(ulsch); - } else if (abstraction_flag==1) + if (!exit_flag) return(ulsch); } @@ -191,7 +180,7 @@ uint32_t ulsch_encoding(uint8_t *a, uint32_t Qprime_ACK=0,Qprime_CQI=0,Qprime_RI=0,len_ACK=0,len_RI=0; // uint32_t E; uint8_t ack_parity; - uint32_t i,q,j,iprime,j2; + uint32_t q,j,iprime,j2; uint16_t o_RCC; uint8_t o_flip[8]; uint32_t wACK_idx; @@ -327,6 +316,8 @@ uint32_t ulsch_encoding(uint8_t *a, #endif // offset=0; start_meas(te_stats); + for (int z=0; z<96; z++) + ulsch->harq_processes[harq_pid]->d[r][z] = LTE_NULL; encoder(ulsch->harq_processes[harq_pid]->c[r], Kr>>3, &ulsch->harq_processes[harq_pid]->d[r][96], @@ -539,8 +530,6 @@ uint32_t ulsch_encoding(uint8_t *a, ulsch->q); } - i=0; - // Do RI coding if (ulsch->O_RI == 1) { switch (Q_m) { @@ -691,7 +680,7 @@ uint32_t ulsch_encoding(uint8_t *a, j=0; - for (i=0; i<Qprime_RI; i++) { + for (int i=0; i<Qprime_RI; i++) { r = Rmux_prime - 1 - (i>>2); for (q=0; q<Q_m; q++) { @@ -725,7 +714,7 @@ uint32_t ulsch_encoding(uint8_t *a, } */ - for (i=0; i<Qprime_CQI; i++) { + for (int i=0; i<Qprime_CQI; i++) { while (y[Q_m*j] != LTE_NULL) j++; for (q=0; q<Q_m; q++) { @@ -788,7 +777,7 @@ uint32_t ulsch_encoding(uint8_t *a, j=0; - for (i=0; i<Qprime_ACK; i++) { + for (int i=0; i<Qprime_ACK; i++) { r = Rmux_prime - 1 - (i>>2); for (q=0; q<Q_m; q++) { @@ -808,7 +797,7 @@ uint32_t ulsch_encoding(uint8_t *a, switch (Q_m) { case 2: - for (i=0; i<Cmux; i++) + for (int i=0; i<Cmux; i++) for (r=0; r<Rmux_prime; r++) { yptr=&y[((r*Cmux)+i)<<1]; ulsch->h[j++] = *yptr++; @@ -818,7 +807,7 @@ uint32_t ulsch_encoding(uint8_t *a, break; case 4: - for (i=0; i<Cmux; i++) + for (int i=0; i<Cmux; i++) for (r=0; r<Rmux_prime; r++) { yptr = &y[((r*Cmux)+i)<<2]; ulsch->h[j++] = *yptr++; @@ -830,7 +819,7 @@ uint32_t ulsch_encoding(uint8_t *a, break; case 6: - for (i=0; i<Cmux; i++) + for (int i=0; i<Cmux; i++) for (r=0; r<Rmux_prime; r++) { yptr = &y[((r*Cmux)+i)*6]; ulsch->h[j++] = *yptr++; diff --git a/openair1/PHY/MODULATION/nr_modulation.c b/openair1/PHY/MODULATION/nr_modulation.c index b1a108f2475..1b5c4f4af0a 100644 --- a/openair1/PHY/MODULATION/nr_modulation.c +++ b/openair1/PHY/MODULATION/nr_modulation.c @@ -226,10 +226,11 @@ void nr_modulation(uint32_t *in, i *= 24; bit_cnt = i * 8; while (bit_cnt < length) { - x = *((uint32_t*)(in_bytes+i)); - x1 = x&4095; + uint32_t xx; + memcpy(&xx, in_bytes+i, sizeof(xx)); + x1 = xx & 4095; out64[j++] = nr_64qam_mod_table[x1]; - x1 = (x>>12)&4095; + x1 = (xx >> 12) & 4095; out64[j++] = nr_64qam_mod_table[x1]; i += 3; bit_cnt += 24; @@ -618,20 +619,20 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) { double f0 = f[ll]; double Ncpm1 = Ncp0; - int16_t *symbol_rotation = fp->symbol_rotation[ll]; + c16_t *symbol_rotation = fp->symbol_rotation[ll]; double tl = 0; double poff = 2 * M_PI * ((Ncp0 * Tc)) * f0; double exp_re = cos(poff); double exp_im = sin(-poff); - symbol_rotation[0] = (int16_t)floor(exp_re * 32767); - symbol_rotation[1] = (int16_t)floor(exp_im * 32767); + symbol_rotation[0].r = (int16_t)floor(exp_re * 32767); + symbol_rotation[0].i = (int16_t)floor(exp_im * 32767); LOG_I(PHY, "Doing symbol rotation calculation for gNB TX/RX, f0 %f Hz, Nsymb %d\n", f0, nsymb); LOG_I(PHY, "Symbol rotation %d/%d => (%d,%d)\n", 0, nsymb, - symbol_rotation[0], - symbol_rotation[1]); + symbol_rotation[0].r, + symbol_rotation[0].i); for (int l = 1; l < nsymb; l++) { @@ -646,15 +647,15 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) { poff = 2 * M_PI * (tl + (Ncp * Tc)) * f0; exp_re = cos(poff); exp_im = sin(-poff); - symbol_rotation[l<<1] = (int16_t)floor(exp_re * 32767); - symbol_rotation[1 + (l<<1)] = (int16_t)floor(exp_im * 32767); + symbol_rotation[l].r = (int16_t)floor(exp_re * 32767); + symbol_rotation[l].i = (int16_t)floor(exp_im * 32767); LOG_I(PHY, "Symbol rotation %d/%d => tl %f (%d,%d) (%f)\n", l, nsymb, tl, - symbol_rotation[l<<1], - symbol_rotation[1 + (l<<1)], + symbol_rotation[l].r, + symbol_rotation[l].i, (poff / 2 / M_PI) - floor(poff / 2 / M_PI)); Ncpm1 = Ncp; @@ -665,17 +666,18 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) { void init_timeshift_rotation(NR_DL_FRAME_PARMS *fp) { + const int sample_offset = fp->nb_prefix_samples / fp->ofdm_offset_divisor; for (int i = 0; i < fp->ofdm_symbol_size; i++) { - double poff = -i * 2.0 * M_PI * 144.0 / 2048.0 / fp->ofdm_offset_divisor; + double poff = -i * 2.0 * M_PI * sample_offset / fp->ofdm_symbol_size; double exp_re = cos(poff); double exp_im = sin(-poff); - fp->timeshift_symbol_rotation[i*2] = (int16_t)round(exp_re * 32767); - fp->timeshift_symbol_rotation[i*2+1] = (int16_t)round(exp_im * 32767); + fp->timeshift_symbol_rotation[i].r = (int16_t)round(exp_re * 32767); + fp->timeshift_symbol_rotation[i].i = (int16_t)round(exp_im * 32767); if (i < 10) LOG_I(PHY,"Timeshift symbol rotation %d => (%d,%d) %f\n",i, - fp->timeshift_symbol_rotation[i*2], - fp->timeshift_symbol_rotation[i*2+1], + fp->timeshift_symbol_rotation[i].r, + fp->timeshift_symbol_rotation[i].i, poff); } } diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c index a2e565b61eb..4eaabe39b96 100644 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -46,18 +46,18 @@ void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRA PHY_ofdm_mod(txdataF, // input - txdata, // output - frame_parms->ofdm_symbol_size, + txdata, // output + frame_parms->ofdm_symbol_size, - 1, // number of symbols - frame_parms->nb_prefix_samples0, // number of prefix samples - CYCLIC_PREFIX); + 1, // number of symbols + frame_parms->nb_prefix_samples0, // number of prefix samples + CYCLIC_PREFIX); PHY_ofdm_mod(txdataF+frame_parms->ofdm_symbol_size, // input - txdata+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0, // output - frame_parms->ofdm_symbol_size, - nsymb-1, - frame_parms->nb_prefix_samples, // number of prefix samples - CYCLIC_PREFIX); + txdata+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0, // output + frame_parms->ofdm_symbol_size, + nsymb-1, + frame_parms->nb_prefix_samples, // number of prefix samples + CYCLIC_PREFIX); @@ -345,14 +345,14 @@ void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t ne } void apply_nr_rotation(NR_DL_FRAME_PARMS *fp, - int16_t* trxdata, - int slot, - int first_symbol, - int nsymb, - int length) { + int16_t* trxdata, + int slot, + int first_symbol, + int nsymb, + int length) { int symb_offset = (slot%fp->slots_per_subframe)*fp->symbols_per_slot; - int16_t *symbol_rotation = fp->symbol_rotation[0]; + c16_t *symbol_rotation = fp->symbol_rotation[0]; for (int sidx=0;sidx<nsymb;sidx++) { @@ -361,14 +361,14 @@ void apply_nr_rotation(NR_DL_FRAME_PARMS *fp, slot, sidx + first_symbol + symb_offset, length, - symbol_rotation[2 * (sidx + first_symbol + symb_offset)], - symbol_rotation[1 + 2 * (sidx + first_symbol + symb_offset)]); + symbol_rotation[sidx + first_symbol + symb_offset].r, + symbol_rotation[sidx + first_symbol + symb_offset].i); - rotate_cpx_vector(trxdata + (sidx * length * 2), - &symbol_rotation[2 * (sidx + first_symbol + symb_offset)], - trxdata + (sidx * length * 2), + rotate_cpx_vector(((c16_t*) trxdata) + sidx * length, + symbol_rotation + sidx + first_symbol + symb_offset, + ((c16_t*) trxdata) + sidx * length, length, 15); } } - + diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index 232ddffd269..548db21878e 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -34,53 +34,6 @@ #define LOG_I(A,B...) printf(A) #endif*/ -dft_size_idx_t get_dft_size_idx(uint16_t ofdm_symbol_size) -{ - switch (ofdm_symbol_size) { - case 128: - return DFT_128; - - case 256: - return DFT_256; - - case 384: - return DFT_384; - - case 512: - return DFT_512; - - case 768: - return DFT_768; - - case 1024: - return DFT_1024; - - case 1536: - return DFT_1536; - - case 2048: - return DFT_2048; - - case 3072: - return DFT_3072; - - case 4096: - return DFT_4096; - - case 6144: - return DFT_6144; - - case 8192: - return DFT_8192; - - default: - printf("unsupported ofdm symbol size \n"); - assert(0); - } - - return DFT_SIZE_IDXTABLESIZE; -} - int nr_slot_fep(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, unsigned char symbol, @@ -102,7 +55,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, nb_prefix_samples0 = frame_parms->nb_prefix_samples; } - dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size); + dft_size_idx_t dftsize = get_dft(frame_parms->ofdm_symbol_size); // This is for misalignment issues int32_t tmp_dft_in[8192] __attribute__ ((aligned (32))); @@ -145,25 +98,25 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, stop_meas(&ue->rx_dft_stats); int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot; - int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[0])[symbol+symb_offset]; - ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1]; + c16_t rot2 = frame_parms->symbol_rotation[0][symbol+symb_offset]; + rot2.i=-rot2.i; #ifdef DEBUG_FEP // if (ue->frame <100) printf("slot_fep: slot %d, symbol %d rx_offset %u, rotation symbol %d %d.%d\n", Ns,symbol, rx_offset, - symbol+symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]); + symbol+symb_offset,rot2.r,rot2.i); #endif - rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - (int16_t*)&rot2, - (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + &rot2, + (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], frame_parms->ofdm_symbol_size, 15); - int16_t *shift_rot = frame_parms->timeshift_symbol_rotation; + c16_t *shift_rot = frame_parms->timeshift_symbol_rotation; multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - shift_rot, + (int16_t *)shift_rot, (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], 1, frame_parms->ofdm_symbol_size, @@ -201,7 +154,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue, } unsigned int frame_length_samples = frame_parms->samples_per_frame; - dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size); + dft_size_idx_t dftsize = get_dft(frame_parms->ofdm_symbol_size); // This is for misalignment issues int32_t tmp_dft_in[8192] __attribute__ ((aligned (32))); @@ -261,18 +214,18 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue, stop_meas(&ue->rx_dft_stats); int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot; - int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[0])[symbol + symb_offset]; - ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1]; + c16_t rot2 = frame_parms->symbol_rotation[0][symbol + symb_offset]; + rot2.i=-rot2.i; #ifdef DEBUG_FEP // if (ue->frame <100) printf("slot_fep: slot %d, symbol %d rx_offset %u, rotation symbol %d %d.%d\n", Ns,symbol, rx_offset, - symbol+symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]); + symbol+symb_offset,rot2.r,rot2.i); #endif - rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - (int16_t*)&rot2, - (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + &rot2, + (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], frame_parms->ofdm_symbol_size, 15); } @@ -295,7 +248,7 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms, unsigned int nb_prefix_samples = frame_parms->nb_prefix_samples; unsigned int nb_prefix_samples0 = frame_parms->nb_prefix_samples0; - dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size); + dft_size_idx_t dftsize = get_dft(frame_parms->ofdm_symbol_size); // This is for misalignment issues int32_t tmp_dft_in[8192] __attribute__ ((aligned (32))); @@ -357,19 +310,19 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms, for (int symbol=first_symbol;symbol<nsymb;symbol++) { - uint32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[1])[symbol + symb_offset]; - ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1]; - LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",slot,symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]); - rotate_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - (int16_t*)&rot2, - (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], + c16_t rot2 = frame_parms->symbol_rotation[1][symbol + symb_offset]; + rot2.i=-rot2.i; + LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",slot,symb_offset,rot2.r,rot2.i); + rotate_cpx_vector((c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], + &rot2, + (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], length, 15); - int16_t *shift_rot = frame_parms->timeshift_symbol_rotation; + c16_t *shift_rot = frame_parms->timeshift_symbol_rotation; multadd_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - shift_rot, + (int16_t *)shift_rot, (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], 1, length, diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c index fb56322e544..c527c3fc9df 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c +++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c @@ -67,6 +67,49 @@ int nr_est_timing_advance_pusch(PHY_VARS_gNB* gNB, int UE_id) return max_pos - sync_pos; } +int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms, + const int32_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]) { + int timing_advance = 0; + int max_val = 0; + + for (int i = 0; i < frame_parms->ofdm_symbol_size; i++) { + int temp = 0; + for (int aa = 0; aa < frame_parms->nb_antennas_rx; aa++) { + int Re = ((c16_t*)srs_estimated_channel_time[aa])[i].r; + int Im = ((c16_t*)srs_estimated_channel_time[aa])[i].i; + temp += (Re*Re/2) + (Im*Im/2); + } + if (temp > max_val) { + timing_advance = i; + max_val = temp; + } + } + + if (timing_advance > frame_parms->ofdm_symbol_size/2) { + timing_advance = timing_advance - frame_parms->ofdm_symbol_size; + } + + // Scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size + const uint16_t bw_scaling = frame_parms->ofdm_symbol_size >> 7; + + // do some integer rounding to improve TA accuracy + int sync_pos_rounded; + if (timing_advance > 0) { + sync_pos_rounded = timing_advance + (bw_scaling >> 1) - 1; + } else { + sync_pos_rounded = timing_advance - (bw_scaling >> 1) + 1; + } + + int timing_advance_update = sync_pos_rounded / bw_scaling; + + // put timing advance command in 0..63 range + timing_advance_update += 31; + + if (timing_advance_update < 0) timing_advance_update = 0; + if (timing_advance_update > 63) timing_advance_update = 63; + + return timing_advance_update; +} void dump_nr_I0_stats(FILE *fd,PHY_VARS_gNB *gNB) { @@ -108,9 +151,9 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb NR_gNB_COMMON *common_vars = &gNB->common_vars; PHY_MEASUREMENTS_gNB *measurements = &gNB->measurements; int rb, nb_symb[275]={0}; - + memset(measurements->n0_subband_power, 0, sizeof(measurements->n0_subband_power)); - + for (int s=first_symb;s<(first_symb+num_symb);s++) { for (rb=0; rb<frame_parms->N_RB_UL; rb++) { if (s==first_symb /*&& ((gNB->rb_mask_ul[s][rb>>5]&(1<<(rb&31))) == 0)*/) { @@ -119,13 +162,13 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb measurements->n0_subband_power[aarx][rb]=0; } int offset0 = (slot&3)*(frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size) + (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size; - if ((gNB->rb_mask_ul[s][rb>>5]&(1<<(rb&31))) == 0) { // check that rb was not used in this subframe + if ((gNB->rb_mask_ul[s][rb >> 5] & (1U << (rb & 31))) == 0) { // check that rb was not used in this subframe nb_symb[rb]++; for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { int offset = offset0 + (s*frame_parms->ofdm_symbol_size); int32_t *ul_ch = &common_vars->rxdataF[aarx][offset]; int len = 12; - if (((frame_parms->N_RB_UL&1) == 1) && + if (((frame_parms->N_RB_UL&1) == 1) && (rb==(frame_parms->N_RB_UL>>1))) { len=6; } diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index 4a6f8ef9af1..e5c1ca37d82 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -86,12 +86,13 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, int pilot[3280] __attribute__((aligned(16))); unsigned char aarx; - unsigned short k; + unsigned short k0; unsigned int pilot_cnt,re_cnt; int16_t ch[2],ch_r[2],ch_l[2],*pil,*rxF,*ul_ch; int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh; int ch_offset,symbol_offset ; int32_t **ul_ch_estimates_time = gNB->pusch_vars[ul_id]->ul_ch_estimates_time; + int chest_freq = gNB->chest_freq; __m128i *ul_ch_128; #ifdef DEBUG_CH @@ -112,18 +113,18 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, symbol_offset = gNB->frame_parms.ofdm_symbol_size*symbol; - k = bwp_start_subcarrier; + k0 = bwp_start_subcarrier; int re_offset; uint16_t nb_rb_pusch = pusch_pdu->rb_size; - LOG_D(PHY, "In %s: ch_offset %d, soffset %d, symbol_offset %d OFDM size %d, Ns = %d, k = %d symbol %d\n", + LOG_D(PHY, "In %s: ch_offset %d, soffset %d, symbol_offset %d, OFDM size %d, Ns = %d, k0 = %d, symbol %d\n", __FUNCTION__, ch_offset, soffset, symbol_offset, gNB->frame_parms.ofdm_symbol_size, Ns, - k, + k0, symbol); switch (nushift) { @@ -146,7 +147,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, fr = filt8_r1; fmm = filt8_mm1; fml = filt8_ml1; - fmr = filt8_m1; + fmr = filt8_mm1; fdcl = filt8_dcl1; fdcr = filt8_dcr1; fdclh = filt8_dcl1_h; @@ -169,10 +170,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, gNB->pusch_gold_init[pusch_pdu->scid] = pusch_pdu->ul_dmrs_scrambling_id; nr_gold_pusch(gNB, pusch_pdu->scid, pusch_pdu->ul_dmrs_scrambling_id); } - - // transform precoding = 1 means disabled - if (pusch_pdu->transform_precoding == 1) { - nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch, + if (pusch_pdu->transform_precoding == transformPrecoder_disabled) { + nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], (1000+p), 0, nb_rb_pusch, (pusch_pdu->bwp_start + pusch_pdu->rb_start)*NR_NB_SC_PER_RB, pusch_pdu->dmrs_config_type); } else { // if transform precoding or SC-FDMA is enabled in Uplink @@ -208,214 +207,81 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, } #endif - for (aarx=0; aarx<gNB->frame_parms.nb_antennas_rx; aarx++) { + uint8_t b_shift = pusch_pdu->nrOfLayers == 1; - re_offset = k; /* Initializing the Resource element offset for each Rx antenna */ + for (aarx=0; aarx<gNB->frame_parms.nb_antennas_rx; aarx++) { pil = (int16_t *)&pilot[0]; - rxF = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+k+nushift)]; + rxF = (int16_t *)&rxdataF[aarx][(soffset + symbol_offset + k0 + nushift)]; ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset]; - re_offset = k; + re_offset = k0; memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size)); #ifdef DEBUG_PUSCH LOG_I(PHY, "In %s symbol_offset %d, nushift %d\n", __FUNCTION__, symbol_offset, nushift); LOG_I(PHY, "In %s ch est pilot addr %p, N_RB_UL %d\n", __FUNCTION__, &pilot[0], gNB->frame_parms.N_RB_UL); - LOG_I(PHY, "In %s bwp_start_subcarrier %d, k %d, first_carrier %d, nb_rb_pusch %d\n", __FUNCTION__, bwp_start_subcarrier, k, gNB->frame_parms.first_carrier_offset, nb_rb_pusch); + LOG_I(PHY, "In %s bwp_start_subcarrier %d, k0 %d, first_carrier %d, nb_rb_pusch %d\n", __FUNCTION__, bwp_start_subcarrier, k0, gNB->frame_parms.first_carrier_offset, nb_rb_pusch); LOG_I(PHY, "In %s rxF addr %p p %d\n", __FUNCTION__, rxF, p); LOG_I(PHY, "In %s ul_ch addr %p nushift %d\n", __FUNCTION__, ul_ch, nushift); #endif - //if ((gNB->frame_parms.N_RB_UL&1)==0) { - if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1 && gNB->prb_interpolation == 0){ + if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1 && chest_freq == 0){ LOG_D(PHY,"PUSCH estimation DMRS type 1, Freq-domain interpolation"); - // Treat first 2 pilots specially (left edge) - ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_PUSCH - LOG_I(PHY, "In %s ch 0 %d\n", __FUNCTION__, ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])); - LOG_I(PHY, "In %s pilot 0 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n", - __FUNCTION__, - rxF[0], - rxF[1], - dBc(rxF[0],rxF[1]), - ch[0], - ch[1], - dBc(ch[0],ch[1]), - pil[0], - pil[1]); - LOG_I(PHY, "In %s data 0 : rxF - > (%d,%d) (%d)\n", __FUNCTION__, rxF[2], rxF[3], dBc(rxF[2],rxF[3])); -#endif + // For configuration type 1: k = 4*n + 2*k' + delta, + // where k' is 0 or 1, and delta is in Table 6.4.1.1.3-1 from TS 38.211 - multadd_real_vector_complex_scalar(fl, - ch, - ul_ch, - 8); - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+nushift+re_offset)]; - //for (int i= 0; i<8; i++) - //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i)); + pilot_cnt = 0; + int delta = nr_pusch_dmrs_delta(pusch_dmrs_type1, p); - ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + for (int n = 0; n < 3*nb_rb_pusch; n++) { -#ifdef DEBUG_PUSCH - LOG_I(PHY, "In %s pilot 1 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n", - __FUNCTION__, - rxF[0], - rxF[1], - dBc(rxF[0],rxF[1]), - ch[0], - ch[1], - dBc(ch[0],ch[1]), - pil[0], - pil[1]); - LOG_I(PHY, "In %s data 1 : rxF - > (%d,%d) (%d)\n", - __FUNCTION__, - rxF[2], - rxF[3], - dBc(rxF[2],rxF[3])); -#endif - - multadd_real_vector_complex_scalar(fml, - ch, - ul_ch, - 8); - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+nushift+re_offset)]; - //printf("ul_ch addr %p\n",ul_ch); - - ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + // LS estimation + ch[0] = 0; + ch[1] = 0; + for (int k_line = 0; k_line <= 1; k_line++) { + re_offset = (k0 + (n << 2) + (k_line << 1) + delta) % gNB->frame_parms.ofdm_symbol_size; + rxF = (int16_t *) &rxdataF[aarx][(soffset + symbol_offset + re_offset)]; + ch[0] += (int16_t) (((int32_t) pil[0] * rxF[0] - (int32_t) pil[1] * rxF[1]) >> (15+b_shift)); + ch[1] += (int16_t) (((int32_t) pil[0] * rxF[1] + (int32_t) pil[1] * rxF[0]) >> (15+b_shift)); + pil += 2; + } + // Channel interpolation + for (int k_line = 0; k_line <= 1; k_line++) { #ifdef DEBUG_PUSCH - LOG_I(PHY, "In %s pilot 2 : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n", - __FUNCTION__, - rxF[0], - rxF[1], - dBc(rxF[0],rxF[1]), - ch[0], - ch[1], - dBc(ch[0],ch[1]), - pil[0], - pil[1]); - LOG_I(PHY, "In %s data 2 : rxF - > (%d,%d) (%d)\n", - __FUNCTION__, - rxF[2], - rxF[3], - dBc(rxF[2],rxF[3])); + re_offset = (k0 + (n << 2) + (k_line << 1)) % gNB->frame_parms.ofdm_symbol_size; + rxF = (int16_t *) &rxdataF[aarx][(soffset + symbol_offset + re_offset)]; + printf("pilot %4u: pil -> (%6d,%6d), rxF -> (%4d,%4d), ch -> (%4d,%4d)\n", + pilot_cnt, pil[0], pil[1], rxF[0], rxF[1], ch[0], ch[1]); + //printf("data %4u: rxF -> (%4d,%4d) (%2d)\n",pilot_cnt, rxF[2], rxF[3], dBc(rxF[2], rxF[3])); #endif - - multadd_real_vector_complex_scalar(fmm, - ch, - ul_ch, - 8); - - //for (int i= 0; i<16; i++) - //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i)); - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+nushift+re_offset)]; - ul_ch+=8; - - for (pilot_cnt=3; pilot_cnt<(6*nb_rb_pusch-3); pilot_cnt += 2) { - - ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); - - #ifdef DEBUG_PUSCH - printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]); - printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt,rxF[2],rxF[3],dBc(rxF[2],rxF[3])); - #endif - multadd_real_vector_complex_scalar(fml, - ch, - ul_ch, - 8); - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(soffset+symbol_offset+nushift+re_offset)]; - //printf("ul_ch addr %p\n",ul_ch); - - ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); - - #ifdef DEBUG_PUSCH - printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]); - printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt+1,rxF[2],rxF[3],dBc(rxF[2],rxF[3])); - #endif - multadd_real_vector_complex_scalar(fmm, - ch, - ul_ch, - 8); - - //for (int i= 0; i<16; i++) - //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i)); - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol_offset+nushift+re_offset)]; - ul_ch+=8; + if (pilot_cnt == 0) { + multadd_real_vector_complex_scalar(fl, ch, ul_ch, 8); + } else if (pilot_cnt == 1) { + multadd_real_vector_complex_scalar(fml, ch, ul_ch, 8); + } else if (pilot_cnt == (6*nb_rb_pusch-2)) { + multadd_real_vector_complex_scalar(fmr, ch, ul_ch, 8); + ul_ch+=8; + } else if (pilot_cnt == (6*nb_rb_pusch-1)) { + multadd_real_vector_complex_scalar(fr, ch, ul_ch, 8); + } else if (pilot_cnt%2 == 0) { + multadd_real_vector_complex_scalar(fmm, ch, ul_ch, 8); + ul_ch+=8; + } else { + multadd_real_vector_complex_scalar(fm, ch, ul_ch, 8); + } + pilot_cnt++; + } } - - // Treat first 2 pilots specially (right edge) - ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_PUSCH - printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]); - printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt,rxF[2],rxF[3],dBc(rxF[2],rxF[3])); -#endif - multadd_real_vector_complex_scalar(fm, - ch, - ul_ch, - 8); - - //for (int i= 0; i<8; i++) - //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i)); - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol_offset+nushift+re_offset)]; - - ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_PUSCH - printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])); - printf("pilot %u : rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]); - printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt+1,rxF[2],rxF[3],dBc(rxF[2],rxF[3])); -#endif - multadd_real_vector_complex_scalar(fmr, - ch, - ul_ch, - 8); - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol_offset+nushift+re_offset)]; - ul_ch+=8; - - ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); -#ifdef DEBUG_PUSCH - printf("pilot %u: rxF - > (%d,%d) (%d) ch -> (%d,%d) (%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],dBc(rxF[0],rxF[1]),ch[0],ch[1],dBc(ch[0],ch[1]),pil[0],pil[1]); - printf("data %u : rxF - > (%d,%d) (%d)\n",pilot_cnt+2,rxF[2],rxF[3],dBc(rxF[2],rxF[3])); -#endif - multadd_real_vector_complex_scalar(fr, - ch, - ul_ch, - 8); - // check if PRB crosses DC and improve estimates around DC if ((bwp_start_subcarrier < gNB->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pusch*12 >= gNB->frame_parms.ofdm_symbol_size)) { ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset]; uint16_t idxDC = 2*(gNB->frame_parms.ofdm_symbol_size - bwp_start_subcarrier); uint16_t idxPil = idxDC/2; - re_offset = k; + re_offset = k0; pil = (int16_t *)&pilot[0]; pil += (idxPil-2); ul_ch += (idxDC-4); @@ -428,10 +294,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, // for proper allignment of SIMD vectors if((gNB->frame_parms.N_RB_UL&1)==0) { - multadd_real_vector_complex_scalar(fdcl, - ch, - ul_ch-4, - 8); + multadd_real_vector_complex_scalar(fdcl, ch, ul_ch-4, 8); pil += 4; re_offset = (re_offset+4) % gNB->frame_parms.ofdm_symbol_size; @@ -439,16 +302,11 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); - multadd_real_vector_complex_scalar(fdcr, - ch, - ul_ch-4, - 8); - } - else { - multadd_real_vector_complex_scalar(fdclh, - ch, - ul_ch, - 8); + multadd_real_vector_complex_scalar(fdcr, ch, ul_ch-4, 8); + + } else { + + multadd_real_vector_complex_scalar(fdclh, ch, ul_ch, 8); pil += 4; re_offset = (re_offset+4) % gNB->frame_parms.ofdm_symbol_size; @@ -456,23 +314,22 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); - multadd_real_vector_complex_scalar(fdcrh, - ch, - ul_ch, - 8); + multadd_real_vector_complex_scalar(fdcrh, ch, ul_ch, 8); } } + #ifdef DEBUG_PUSCH ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset]; for(uint16_t idxP=0; idxP<ceil((float)nb_rb_pusch*12/8); idxP++) { + printf("(%3d)\t",idxP); for(uint8_t idxI=0; idxI<16; idxI += 2) { printf("%d\t%d\t",ul_ch[idxP*16+idxI],ul_ch[idxP*16+idxI+1]); } - printf("%d\n",idxP); + printf("\n"); } #endif } - else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2 && gNB->prb_interpolation == 0) { //pusch_dmrs_type2 |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d| + else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2 && chest_freq == 0) { //pusch_dmrs_type2 |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d| LOG_D(PHY,"PUSCH estimation DMRS type 2, Freq-domain interpolation"); // Treat first DMRS specially (left edge) @@ -808,6 +665,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ch[0] = ch_0 / 4; ch[1] = ch_1 / 4; +#if NO_INTERP + for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch; + ul_ch+=24; +#else multadd_real_vector_complex_scalar(filt8_avlip0, ch, ul_ch, @@ -825,6 +686,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ul_ch, 8); ul_ch -= 24; +#endif for (pilot_cnt=4; pilot_cnt<4*(nb_rb_pusch-1); pilot_cnt += 4) { @@ -859,6 +721,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ch[0] = ch_0 / 4; ch[1] = ch_1 / 4; +#if NO_INTERP + for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch; + ul_ch+=24; +#else ul_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384 ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384 @@ -880,6 +746,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ul_ch, 8); ul_ch -= 16; +#endif } // Last PRB ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; @@ -913,6 +780,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ch[0] = ch_0 / 4; ch[1] = ch_1 / 4; +#if NO_INTERP + for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch; + ul_ch+=24; +#else ul_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384 ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384 @@ -927,6 +798,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ch, ul_ch, 8); +#endif } #ifdef DEBUG_PUSCH ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset]; @@ -982,7 +854,6 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, uint32_t nb_re_pusch) { //#define DEBUG_UL_PTRS 1 - int16_t *phase_per_symbol = NULL; int32_t *ptrs_re_symbol = NULL; int8_t ret = 0; @@ -999,20 +870,20 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, uint8_t *ptrsReOffset = &rel15_ul->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset; /* loop over antennas */ for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - phase_per_symbol = (int16_t*)gNB->pusch_vars[ulsch_id]->ptrs_phase_per_slot[aarx]; + c16_t *phase_per_symbol = (c16_t*)gNB->pusch_vars[ulsch_id]->ptrs_phase_per_slot[aarx]; ptrs_re_symbol = &gNB->pusch_vars[ulsch_id]->ptrs_re_per_slot; *ptrs_re_symbol = 0; - phase_per_symbol[(2*symbol)+1] = 0; // Imag + phase_per_symbol[symbol].i = 0; /* set DMRS estimates to 0 angle with magnitude 1 */ if(is_dmrs_symbol(symbol,*dmrsSymbPos)) { /* set DMRS real estimation to 32767 */ - phase_per_symbol[2*symbol]=(int16_t)((1<<15)-1); // 32767 + phase_per_symbol[symbol].r=INT16_MAX; // 32767 #ifdef DEBUG_UL_PTRS - printf("[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d\n", symbol, phase_per_symbol[2*symbol],phase_per_symbol[(2*symbol)+1]); + printf("[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d\n", symbol, phase_per_symbol[symbol].r,phase_per_symbol[symbol].i); #endif } else {// real ptrs value is set to 0 - phase_per_symbol[2*symbol] = 0; // Real + phase_per_symbol[symbol].r = 0; } if(symbol == *startSymbIndex) { @@ -1033,12 +904,11 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, /*------------------------------------------------------------------------------------------------------- */ nr_ptrs_cpe_estimation(*K_ptrs,*ptrsReOffset,*dmrsConfigType,*nb_rb, rel15_ul->rnti, - (int16_t *)&gNB->pusch_vars[ulsch_id]->ul_ch_ptrs_estimates_ext[aarx][symbol*nb_re_pusch], nr_tti_rx, symbol,frame_parms->ofdm_symbol_size, (int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(symbol * nb_re_pusch)], gNB->nr_gold_pusch_dmrs[rel15_ul->scid][nr_tti_rx][symbol], - &phase_per_symbol[2* symbol], + (int16_t*)&phase_per_symbol[symbol], ptrs_re_symbol); } /* For last OFDM symbol at each antenna perform interpolation and compensation for the slot*/ @@ -1048,7 +918,7 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, /*------------------------------------------------------------------------------------------------------- */ /* If L-PTRS is > 0 then we need interpolation */ if(*L_ptrs > 0) { - ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, phase_per_symbol, *startSymbIndex, *nbSymb); + ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, (int16_t*)phase_per_symbol, *startSymbIndex, *nbSymb); if(ret != 0) { LOG_W(PHY,"[PTRS] Compensation is skipped due to error in PTRS slot processing !!\n"); } @@ -1067,11 +937,11 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, /* Skip rotation if the slot processing is wrong */ if((!is_dmrs_symbol(i,*dmrsSymbPos)) && (ret == 0)) { #ifdef DEBUG_UL_PTRS - printf("[PHY][UL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[2* i],phase_per_symbol[(2* i) +1]); + printf("[PHY][UL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[i].r,phase_per_symbol[i].i); #endif - rotate_cpx_vector((int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(i * rel15_ul->rb_size * NR_NB_SC_PER_RB)], - &phase_per_symbol[2* i], - (int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(i * rel15_ul->rb_size * NR_NB_SC_PER_RB)], + rotate_cpx_vector((c16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(i * rel15_ul->rb_size * NR_NB_SC_PER_RB)], + &phase_per_symbol[i], + (c16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(i * rel15_ul->rb_size * NR_NB_SC_PER_RB)], ((*nb_rb) * NR_NB_SC_PER_RB), 15); }// if not DMRS Symbol }// symbol loop @@ -1079,9 +949,9 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, }//Antenna loop } -uint32_t calc_power(uint16_t *x, uint32_t size) { - uint64_t sum_x = 0; - uint64_t sum_x2 = 0; +uint32_t calc_power(const int16_t *x, const uint32_t size) { + int64_t sum_x = 0; + int64_t sum_x2 = 0; for(int k = 0; k<size; k++) { sum_x = sum_x + x[k]; sum_x2 = sum_x2 + x[k]*x[k]; @@ -1089,28 +959,34 @@ uint32_t calc_power(uint16_t *x, uint32_t size) { return sum_x2/size - (sum_x/size)*(sum_x/size); } -int nr_srs_channel_estimation(PHY_VARS_gNB *gNB, - int frame, - int slot, - nfapi_nr_srs_pdu_t *srs_pdu, - nr_srs_info_t *nr_srs_info, - int32_t *srs_generated_signal, - int32_t **srs_received_signal, - int32_t **srs_estimated_channel_freq, - int32_t **srs_estimated_channel_time, - int32_t **srs_estimated_channel_time_shifted, - uint32_t *noise_power) { +int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB, + const int frame, + const int slot, + const nfapi_nr_srs_pdu_t *srs_pdu, + const nr_srs_info_t *nr_srs_info, + const int32_t *srs_generated_signal, + int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)], + int32_t srs_ls_estimated_channel[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)], + int32_t srs_estimated_channel_freq[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)], + int32_t srs_estimated_channel_time[][gNB->frame_parms.ofdm_symbol_size], + int32_t srs_estimated_channel_time_shifted[][gNB->frame_parms.ofdm_symbol_size], + uint32_t *signal_power, + uint32_t *noise_power_per_rb, + uint32_t *noise_power, + int8_t *snr_per_rb, + int8_t *snr) { if(nr_srs_info->sc_list_length == 0) { LOG_E(NR_PHY, "(%d.%d) nr_srs_info was not generated yet!\n", frame, slot); return -1; } - NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; - int32_t **srs_ls_estimated_channel = nr_srs_info->srs_ls_estimated_channel; + const NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; - uint16_t noise_real[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length]; - uint16_t noise_imag[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length]; + int16_t ch_real[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length]; + int16_t ch_imag[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length]; + int16_t noise_real[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length]; + int16_t noise_imag[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length]; int16_t ls_estimated[2]; @@ -1123,11 +999,11 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB, for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) { - int16_t generated_real = srs_generated_signal[nr_srs_info->sc_list[sc_idx]] & 0xFFFF; - int16_t generated_imag = (srs_generated_signal[nr_srs_info->sc_list[sc_idx]] >> 16) & 0xFFFF; + int16_t generated_real = ((c16_t*)srs_generated_signal)[nr_srs_info->sc_list[sc_idx]].r; + int16_t generated_imag = ((c16_t*)srs_generated_signal)[nr_srs_info->sc_list[sc_idx]].i; - int16_t received_real = srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]] & 0xFFFF; - int16_t received_imag = (srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]] >> 16) & 0xFFFF; + int16_t received_real = ((c16_t*)srs_received_signal[ant])[nr_srs_info->sc_list[sc_idx]].r; + int16_t received_imag = ((c16_t*)srs_received_signal[ant])[nr_srs_info->sc_list[sc_idx]].i; // We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and generated_imag. // So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16 bits. @@ -1198,8 +1074,10 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB, // Compute noise for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) { - noise_real[ant*nr_srs_info->sc_list_length + sc_idx] = abs((int16_t)((srs_ls_estimated_channel[ant][nr_srs_info->sc_list[sc_idx]]-srs_estimated_channel_freq[ant][nr_srs_info->sc_list[sc_idx]]) & 0xFFFF)); - noise_imag[ant*nr_srs_info->sc_list_length + sc_idx] = abs((int16_t)(((srs_ls_estimated_channel[ant][nr_srs_info->sc_list[sc_idx]]-srs_estimated_channel_freq[ant][nr_srs_info->sc_list[sc_idx]]) >> 16) & 0xFFFF)); + ch_real[ant*nr_srs_info->sc_list_length + sc_idx] = ((c16_t*)srs_estimated_channel_freq[ant])[nr_srs_info->sc_list[sc_idx]].r; + ch_imag[ant*nr_srs_info->sc_list_length + sc_idx] = ((c16_t*)srs_estimated_channel_freq[ant])[nr_srs_info->sc_list[sc_idx]].i; + noise_real[ant*nr_srs_info->sc_list_length + sc_idx] = abs(((c16_t*)srs_ls_estimated_channel[ant])[nr_srs_info->sc_list[sc_idx]].r - ch_real[ant*nr_srs_info->sc_list_length + sc_idx]); + noise_imag[ant*nr_srs_info->sc_list_length + sc_idx] = abs(((c16_t*)srs_ls_estimated_channel[ant])[nr_srs_info->sc_list[sc_idx]].i - ch_imag[ant*nr_srs_info->sc_list_length + sc_idx]); } // Convert to time domain @@ -1216,11 +1094,74 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB, (gNB->frame_parms.ofdm_symbol_size>>1)*sizeof(int32_t)); } + // Compute signal power + *signal_power = calc_power(ch_real,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length) + + calc_power(ch_imag,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length); + +#ifdef SRS_DEBUG + LOG_I(NR_PHY,"signal_power = %u\n", *signal_power); +#endif + + if (*signal_power == 0) { + LOG_W(NR_PHY, "Received SRS signal power is 0\n"); + return -1; + } + + // Compute noise power + + const uint8_t signal_power_bits = log2_approx(*signal_power); + const uint8_t factor_bits = signal_power_bits < 32 ? 32 - signal_power_bits : 0; // 32 due to input of dB_fixed(uint32_t x) + const int32_t factor_dB = dB_fixed(1<<factor_bits); + + const uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*12; + const uint8_t srs_symbols_per_rb = srs_pdu->comb_size == 0 ? 6 : 3; + const uint8_t n_noise_est = frame_parms->nb_antennas_rx * srs_symbols_per_rb; + uint8_t count_estimates = 0; + uint64_t sum_re = 0; + uint64_t sum_re2 = 0; + uint64_t sum_im = 0; + uint64_t sum_im2 = 0; + + for (int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) { + + int subcarrier0 = nr_srs_info->sc_list[sc_idx]-subcarrier_offset; + if(subcarrier0 < 0) { + subcarrier0 = subcarrier0 + frame_parms->ofdm_symbol_size; + } + int rb = subcarrier0/NR_NB_SC_PER_RB; + + for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) { + + sum_re = sum_re + noise_real[ant*nr_srs_info->sc_list_length+sc_idx]; + sum_re2 = sum_re2 + noise_real[ant*nr_srs_info->sc_list_length+sc_idx]*noise_real[ant*nr_srs_info->sc_list_length+sc_idx]; + sum_im = sum_im + noise_imag[ant*nr_srs_info->sc_list_length+sc_idx]; + sum_im2 = sum_im2 + noise_imag[ant*nr_srs_info->sc_list_length+sc_idx]*noise_imag[ant*nr_srs_info->sc_list_length+sc_idx]; + + count_estimates++; + if (count_estimates == n_noise_est) { + noise_power_per_rb[rb] = max(sum_re2 / n_noise_est - (sum_re / n_noise_est) * (sum_re / n_noise_est) + + sum_im2 / n_noise_est - (sum_im / n_noise_est) * (sum_im / n_noise_est), 1); + snr_per_rb[rb] = dB_fixed((int32_t)((*signal_power<<factor_bits)/noise_power_per_rb[rb])) - factor_dB; + count_estimates = 0; + sum_re = 0; + sum_re2 = 0; + sum_im = 0; + sum_im2 = 0; + +#ifdef SRS_DEBUG + LOG_I(NR_PHY,"noise_power_per_rb[%i] = %i, snr_per_rb[%i] = %i dB\n", rb, noise_power_per_rb[rb], rb, snr_per_rb[rb]); +#endif + + } + } + } + *noise_power = calc_power(noise_real,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length) + calc_power(noise_imag,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length); + *snr = dB_fixed((int32_t)((*signal_power<<factor_bits)/(*noise_power))) - factor_dB; + #ifdef SRS_DEBUG - uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*12; uint8_t R = srs_pdu->comb_size == 0 ? 2 : 4; for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) { for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) { @@ -1248,7 +1189,7 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB, } } - LOG_I(NR_PHY,"noise_power = %u\n", *noise_power); + LOG_I(NR_PHY,"noise_power = %u, SNR = %i dB\n", *noise_power, *snr); #endif return 0; diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h index a01106adb54..b0ed3662eac 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h @@ -55,6 +55,9 @@ void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id); +int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms, + const int32_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]); + void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, NR_DL_FRAME_PARMS *frame_parms, nfapi_nr_pusch_pdu_t *rel15_ul, @@ -63,15 +66,20 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, unsigned char symbol, uint32_t nb_re_pusch); -int nr_srs_channel_estimation(PHY_VARS_gNB *gNB, - int frame, - int slot, - nfapi_nr_srs_pdu_t *srs_pdu, - nr_srs_info_t *nr_srs_info, - int32_t *srs_generated_signal, - int32_t **srs_received_signal, - int32_t **srs_estimated_channel_freq, - int32_t **srs_estimated_channel_time, - int32_t **srs_estimated_channel_time_shifted, - uint32_t *noise_power); +int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB, + const int frame, + const int slot, + const nfapi_nr_srs_pdu_t *srs_pdu, + const nr_srs_info_t *nr_srs_info, + const int32_t *srs_generated_signal, + int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)], + int32_t srs_ls_estimated_channel[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)], + int32_t srs_estimated_channel_freq[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)], + int32_t srs_estimated_channel_time[][gNB->frame_parms.ofdm_symbol_size], + int32_t srs_estimated_channel_time_shifted[][gNB->frame_parms.ofdm_symbol_size], + uint32_t *signal_power, + uint32_t *noise_power_per_rb, + uint32_t *noise_power, + int8_t *snr_per_rb, + int8_t *snr); #endif diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.c b/openair1/PHY/NR_REFSIG/dmrs_nr.c index 2e270318f82..1fd502a93e1 100644 --- a/openair1/PHY/NR_REFSIG/dmrs_nr.c +++ b/openair1/PHY/NR_REFSIG/dmrs_nr.c @@ -295,74 +295,6 @@ uint16_t get_dmrs_freq_idx_ul(uint16_t n, uint8_t k_prime, uint8_t delta, uint8_ #define CHECK_DMRS_PBCH_SEQUENCE -void generate_dmrs_pbch(uint32_t dmrs_pbch_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE], uint16_t Nid_cell) -{ - uint32_t cinit; - int i_ssb; - int n_hf; - int _i_ssb; - -#ifdef CHECK_DMRS_PBCH_SEQUENCE - - uint32_t dmrs_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE]; - uint32_t *dmrs_sequence = calloc(CELL_DMRS_LENGTH, sizeof(uint32_t)); - if (dmrs_sequence == NULL) { - msg("Fatal error: memory allocation problem \n"); - assert(0); - } - else - { - printf("Check of demodulation reference signal of pbch sequence \n"); - } - -#endif - - /* for each slot number */ - for (i_ssb = 0; i_ssb<DMRS_PBCH_I_SSB; i_ssb++) { - - /* for each ofdm position */ - for (n_hf=0; n_hf<DMRS_PBCH_N_HF; n_hf++) { - - _i_ssb = i_ssb + 4*n_hf; - - cinit = (((_i_ssb + 1)*((Nid_cell>>4) + 1))<<11) + ((_i_ssb + 1)<<6) + (Nid_cell%4); - - pseudo_random_sequence_optimised(DMRS_BITMAP_SIZE, &(dmrs_pbch_bitmap[i_ssb][n_hf][0]), cinit); - -#ifdef CHECK_DMRS_PBCH_SEQUENCE - - /* it allows checking generated with standard generation code */ - pseudo_random_sequence(DMRS_BITMAP_SIZE*sizeof(uint32_t), dmrs_sequence, cinit); - - int j = 0; - int k = 0; - - /* format for getting bitmap from uint32_t */ - for (int i=0; i<DMRS_BITMAP_SIZE; i++) { - dmrs_bitmap[i_ssb][n_hf][i] = 0; - /* convert to bitmap */ - for (; j < k + 32; j++) { - dmrs_bitmap[i_ssb][n_hf][i] |= (dmrs_sequence[j]<<j); - } - k = j; - } - - for (int i=0; i<DMRS_BITMAP_SIZE; i++) { - if (dmrs_pbch_bitmap[i_ssb][n_hf][i] != dmrs_bitmap[i_ssb][n_hf][i]) { - printf("Error in gold sequence computation for ns %d l %d and index %i : 0x%x 0x%x \n", i_ssb, n_hf, i, dmrs_pbch_bitmap[i_ssb][n_hf][i], dmrs_bitmap[i_ssb][n_hf][i]); - assert(0); - } - } - -#endif - - } - } - -#ifdef CHECK_DMRS_PBCH_SEQUENCE - free(dmrs_sequence); -#endif -} /* return the position of next dmrs symbol in a slot */ int8_t get_next_dmrs_symbol_in_slot(uint16_t ul_dmrs_symb_pos, uint8_t counter, uint8_t end_symbol) { @@ -406,3 +338,81 @@ int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t count } return symbIdx; } + +/* perform averaging of channel estimates and store result in first symbol buffer */ +void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms, + int **ch_est, + uint8_t num_symbols, + uint8_t start_symbol, + uint16_t dmrs_bitmap, + uint16_t num_rbs) +{ + __m128i *ul_ch128_0; + __m128i *ul_ch128_1; + int16_t *ul_ch16_0; + int total_symbols = start_symbol + num_symbols; + int num_dmrs_symb = get_dmrs_symbols_in_slot(dmrs_bitmap, total_symbols); + int first_dmrs_symb = get_next_dmrs_symbol_in_slot(dmrs_bitmap, start_symbol, total_symbols); + AssertFatal(first_dmrs_symb > -1, "No DMRS symbol present in this slot\n"); + for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) { + for (int symb = first_dmrs_symb+1; symb < total_symbols; symb++) { + ul_ch128_0 = (__m128i *)&ch_est[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size]; + if ((dmrs_bitmap >> symb) & 0x01) { + ul_ch128_1 = (__m128i *)&ch_est[aarx][symb*frame_parms->ofdm_symbol_size]; + for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) { + ul_ch128_0[0] = _mm_adds_epi16(ul_ch128_0[0], ul_ch128_1[0]); + ul_ch128_0[1] = _mm_adds_epi16(ul_ch128_0[1], ul_ch128_1[1]); + ul_ch128_0[2] = _mm_adds_epi16(ul_ch128_0[2], ul_ch128_1[2]); + ul_ch128_0 += 3; + ul_ch128_1 += 3; + } + } + } + ul_ch128_0 = (__m128i *)&ch_est[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size]; + if (num_dmrs_symb == 2) { + for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) { + ul_ch128_0[0] = _mm_srai_epi16(ul_ch128_0[0], 1); + ul_ch128_0[1] = _mm_srai_epi16(ul_ch128_0[1], 1); + ul_ch128_0[2] = _mm_srai_epi16(ul_ch128_0[2], 1); + ul_ch128_0 += 3; + } + } else if (num_dmrs_symb == 4) { + for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) { + ul_ch128_0[0] = _mm_srai_epi16(ul_ch128_0[0], 2); + ul_ch128_0[1] = _mm_srai_epi16(ul_ch128_0[1], 2); + ul_ch128_0[2] = _mm_srai_epi16(ul_ch128_0[2], 2); + ul_ch128_0 += 3; + } + } else if (num_dmrs_symb == 3) { + ul_ch16_0 = (int16_t *)&ch_est[aarx][first_dmrs_symb*frame_parms->ofdm_symbol_size]; + for (int rbIdx = 0; rbIdx < num_rbs; rbIdx++) { + ul_ch16_0[0] /= 3; + ul_ch16_0[1] /= 3; + ul_ch16_0[2] /= 3; + ul_ch16_0[3] /= 3; + ul_ch16_0[4] /= 3; + ul_ch16_0[5] /= 3; + ul_ch16_0[6] /= 3; + ul_ch16_0[7] /= 3; + ul_ch16_0[8] /= 3; + ul_ch16_0[9] /= 3; + ul_ch16_0[10] /= 3; + ul_ch16_0[11] /= 3; + ul_ch16_0[12] /= 3; + ul_ch16_0[13] /= 3; + ul_ch16_0[14] /= 3; + ul_ch16_0[15] /= 3; + ul_ch16_0[16] /= 3; + ul_ch16_0[17] /= 3; + ul_ch16_0[18] /= 3; + ul_ch16_0[19] /= 3; + ul_ch16_0[20] /= 3; + ul_ch16_0[21] /= 3; + ul_ch16_0[22] /= 3; + ul_ch16_0[23] /= 3; + ul_ch16_0 += 24; + } + } else AssertFatal((num_dmrs_symb < 5) && (num_dmrs_symb > 0), "Illegal number of DMRS symbols in the slot\n"); + } +} + diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.h b/openair1/PHY/NR_REFSIG/dmrs_nr.h index b9e9ca6f0dc..1297a0cc2ff 100644 --- a/openair1/PHY/NR_REFSIG/dmrs_nr.h +++ b/openair1/PHY/NR_REFSIG/dmrs_nr.h @@ -53,7 +53,6 @@ int pseudo_random_sequence(int M_PN, uint32_t *c, uint32_t cinit); void lte_gold_new(LTE_DL_FRAME_PARMS *frame_parms, uint32_t lte_gold_table[20][2][14], uint16_t Nid_cell); -void generate_dmrs_pbch(uint32_t dmrs_pbch_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE], uint16_t Nid_cell); uint16_t get_dmrs_freq_idx_ul(uint16_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type); uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k, @@ -66,6 +65,12 @@ void nr_gen_ref_conj_symbols(uint32_t *in, uint32_t length, int16_t *output, uin int8_t get_next_dmrs_symbol_in_slot(uint16_t ul_dmrs_symb_pos, uint8_t counter, uint8_t end_symbol); uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t nb_symb); int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t counter); +void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms, + int **ch_est, + uint8_t num_symbols, + uint8_t start_symbol, + uint16_t dmrs_bitmap, + uint16_t num_rbs); static inline uint8_t is_dmrs_symbol(uint8_t l, uint16_t dmrsSymbMask ) { return ((dmrsSymbMask >> l) & 0x1); } #undef EXTERN diff --git a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c index 920b78eac2b..4f089562f6c 100644 --- a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c +++ b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c @@ -39,9 +39,11 @@ #include "nr_refsig.h" #include "PHY/defs_gNB.h" -/*Table 7.4.1.1.2-1/2 from 38.211 */ +// Table 6.4.1.1.3-1/2 from TS 38.211 +int delta1[8] = {0, 0, 1, 1, 0, 0, 1, 1}; int wf1[8][2] = {{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1}}; int wt1[8][2] = {{1,1},{1,1},{1,1},{1,1},{1,-1},{1,-1},{1,-1},{1,-1}}; +int delta2[12] = {0, 0, 2, 2, 4, 4, 0, 0, 2, 2, 4, 4}; int wf2[12][2] = {{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1},{1,1},{1,-1}}; int wt2[12][2] = {{1,1},{1,1},{1,1},{1,1},{1,1},{1,1},{1,-1},{1,-1},{1,-1},{1,-1},{1,-1},{1,-1}}; @@ -49,6 +51,13 @@ int wt2[12][2] = {{1,1},{1,1},{1,1},{1,1},{1,1},{1,1},{1,-1},{1,-1},{1,-1},{1,-1 short nr_rx_mod_table[14] = {0,0,23170,-23170,-23170,23170,23170,-23170,23170,23170,-23170,-23170,-23170,23170}; short nr_rx_nmod_table[14] = {0,0,-23170,23170,23170,-23170,-23170,23170,-23170,-23170,23170,23170,23170,-23170}; +int nr_pusch_dmrs_delta(uint8_t dmrs_config_type, unsigned short p) { + if (dmrs_config_type == pusch_dmrs_type1) { + return delta1[p]; + } else { + return delta2[p]; + } +} int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB, unsigned int Ns, diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index 1073982909f..46bb03487a0 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -45,7 +45,6 @@ void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB) for (uint8_t n=0; n<NR_PBCH_DMRS_LENGTH_DWORD; n++) { gNB->nr_gold_pbch_dmrs[n_hf][l][n] = lte_gold_generic(&x1, &x2, reset); - //printf("%d \n",gNB->nr_gold_pbch_dmrs[n_hf][l][n]); reset = 0; } @@ -126,31 +125,6 @@ void nr_gold_pusch(PHY_VARS_gNB* gNB, int nscid, uint32_t nid) { } -void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid) -{ - NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; - uint32_t ***csi_rs = gNB->nr_gold_csi_rs; - uint32_t x1, x2; - uint8_t reset; - int csi_dmrs_init_length = ((fp->N_RB_DL<<4)>>5)+1; - - for (uint8_t slot=0; slot<fp->slots_per_frame; slot++) { - for (uint8_t symb=0; symb<fp->symbols_per_slot; symb++) { - - reset = 1; - x2 = ((1<<10) * (fp->symbols_per_slot*slot+symb+1) * ((Nid<<1)+1) + (Nid)); - - for (uint32_t n=0; n<csi_dmrs_init_length; n++) { - csi_rs[slot][symb][n] = lte_gold_generic(&x1, &x2, reset); - reset = 0; - } - } - } - -} - - - void nr_init_prs(PHY_VARS_gNB* gNB) { unsigned int x1, x2; @@ -184,4 +158,3 @@ void nr_init_prs(PHY_VARS_gNB* gNB) } } } - diff --git a/openair1/PHY/NR_REFSIG/nr_refsig.h b/openair1/PHY/NR_REFSIG/nr_refsig.h index 24be0021766..fd89f122ce9 100644 --- a/openair1/PHY/NR_REFSIG/nr_refsig.h +++ b/openair1/PHY/NR_REFSIG/nr_refsig.h @@ -45,10 +45,12 @@ void nr_init_prs(PHY_VARS_gNB* gNB); */ void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid); void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint8_t nscid, uint32_t Nid); -void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid); +void nr_init_csi_rs(const NR_DL_FRAME_PARMS *fp, uint32_t ***csi_rs, uint32_t Nid); void nr_gold_pusch(PHY_VARS_gNB* gNB, int nscid, uint32_t nid); +int nr_pusch_dmrs_delta(uint8_t dmrs_config_type, unsigned short p); + int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB, unsigned int Ns, unsigned int *nr_gold_pusch, diff --git a/openair1/PHY/NR_REFSIG/pss_nr.h b/openair1/PHY/NR_REFSIG/pss_nr.h index c65ca3799d6..b78a89b12c8 100644 --- a/openair1/PHY/NR_REFSIG/pss_nr.h +++ b/openair1/PHY/NR_REFSIG/pss_nr.h @@ -120,8 +120,6 @@ EXTERN time_stats_t generic_time[TIME_LAST]; /************** FUNCTION ******************************************/ -idft_size_idx_t get_idft(int ofdm_symbol_size); -dft_size_idx_t get_dft(int ofdm_symbol_size); void init_context_synchro_nr(NR_DL_FRAME_PARMS *frame_parms_ue); void free_context_synchro_nr(void); void init_context_pss_nr(NR_DL_FRAME_PARMS *frame_parms_ue); diff --git a/openair1/PHY/NR_REFSIG/ptrs_nr.c b/openair1/PHY/NR_REFSIG/ptrs_nr.c index 68134eb02dd..5df4a25656f 100644 --- a/openair1/PHY/NR_REFSIG/ptrs_nr.c +++ b/openair1/PHY/NR_REFSIG/ptrs_nr.c @@ -230,7 +230,6 @@ int8_t get_next_estimate_in_slot(uint16_t ptrsSymbPos,uint16_t dmrsSymbPos, ui * dmrsConfigType: DMRS configuration type * nb_rb : No. of resource blocks * rnti : RNTI - * ptrs_ch_p : pointer to ptrs channel structure * Ns : * symbol : OFDM symbol * ofdm_symbol_size: OFDM Symbol Size @@ -249,7 +248,6 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs, uint8_t dmrsConfigType, uint16_t nb_rb, uint16_t rnti, - int16_t *ptrs_ch_p, unsigned char Ns, unsigned char symbol, uint16_t ofdm_symbol_size, @@ -269,6 +267,7 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs, } uint16_t sc_per_symbol = (nb_rb + K_ptrs - 1)/K_ptrs; c16_t ptrs_p[(1 + sc_per_symbol/4)*4]; + c16_t ptrs_ch_p[(1 + sc_per_symbol/4)*4]; c16_t dmrs_comp_p[(1 + sc_per_symbol/4)*4]; double abs = 0.0; double real = 0.0; @@ -306,13 +305,13 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs, *ptrs_sc = re_cnt; /*Multiple compensated data with conj of PTRS */ - mult_cpx_vector((int16_t*)dmrs_comp_p, (int16_t*)ptrs_p, ptrs_ch_p,(1 + sc_per_symbol/4)*4,15); // 2^15 shifted + mult_cpx_vector((int16_t*)dmrs_comp_p, (int16_t*)ptrs_p, (int16_t*)ptrs_ch_p, (1 + sc_per_symbol/4)*4, 15); // 2^15 shifted /* loop over all ptrs sub carriers in a symbol */ /* sum the error vector */ for(int i = 0;i < sc_per_symbol; i++) { - real+= ptrs_ch_p[(2*i)]; - imag+= ptrs_ch_p[(2*i)+1]; + real += ptrs_ch_p[i].r; + imag += ptrs_ch_p[i].i; } #ifdef DEBUG_PTRS alpha = atan(imag/real); diff --git a/openair1/PHY/NR_REFSIG/ptrs_nr.h b/openair1/PHY/NR_REFSIG/ptrs_nr.h index 41acde0d064..f46c5c7aeec 100644 --- a/openair1/PHY/NR_REFSIG/ptrs_nr.h +++ b/openair1/PHY/NR_REFSIG/ptrs_nr.h @@ -96,7 +96,6 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs, uint8_t dmrsConfigType, uint16_t nb_rb, uint16_t rnti, - int16_t *ptrs_ch_p, unsigned char Ns, unsigned char symbol, uint16_t ofdm_symbol_size, diff --git a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h index 3033ee488e1..9667105be94 100644 --- a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h +++ b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h @@ -68,6 +68,7 @@ void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue, uint16_t N_n_scid, uint8_t n_scid); +void nr_init_csi_rs(const NR_DL_FRAME_PARMS *fp, uint32_t ***csi_rs, uint32_t Nid); void init_nr_gold_prs(PHY_VARS_NR_UE* ue); #endif diff --git a/openair1/PHY/NR_REFSIG/ss_pbch_nr.h b/openair1/PHY/NR_REFSIG/ss_pbch_nr.h index 44f8549258c..5572604e555 100644 --- a/openair1/PHY/NR_REFSIG/ss_pbch_nr.h +++ b/openair1/PHY/NR_REFSIG/ss_pbch_nr.h @@ -80,8 +80,6 @@ /* see TS 38211 7.4.1.4 Demodulation reference signals for PBCH */ #define DMRS_PBCH_I_SSB (8) /* maximum index value for SSB/PBCH which can have alength of L=4 or L=8 */ #define DMRS_PBCH_N_HF (2) /* half frame indication - 0 for first part of frame and 1 for second part of frame */ -#define DMRS_ALIGNMENT_32_BIT (20) /* it is just for ensuring a 32 bits alignment for storing dmrs pbch into a 32 bits map */ -#define DMRS_BITMAP_SIZE ((DMRS_PBCH_NUMBER-DMRS_ALIGNMENT_32_BIT)/32) /* size is divided by 32 (to get bitmap on uint32) DMRS_PBCH_NUMBER should be a multiple of 32 */ #endif /* SS_PBCH_NR_H */ diff --git a/openair1/PHY/NR_TRANSPORT/dlsch_pdu_rel15.time_alloc_list_flag b/openair1/PHY/NR_TRANSPORT/dlsch_pdu_rel15.time_alloc_list_flag new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openair1/PHY/NR_TRANSPORT/dlsch_pdu_rel15.time_allocation_type b/openair1/PHY/NR_TRANSPORT/dlsch_pdu_rel15.time_allocation_type new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c b/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c index 694617c4441..0a1619f3e06 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c @@ -27,20 +27,61 @@ //#define NR_CSIRS_DEBUG -void nr_generate_csi_rs(PHY_VARS_gNB *gNB, - int16_t amp, - nfapi_nr_dl_tti_csi_rs_pdu_rel15_t csi_params, - int slot){ - - NR_DL_FRAME_PARMS frame_parms=gNB->frame_parms; - int32_t **txdataF = gNB->common_vars.txdataF; - int txdataF_offset = slot*frame_parms.samples_per_slot_wCP; - uint32_t **gold_csi_rs = gNB->nr_gold_csi_rs[slot]; +void nr_init_csi_rs(const NR_DL_FRAME_PARMS *fp, uint32_t ***csi_rs, uint32_t Nid) { + uint32_t x1, x2; + uint8_t reset; + int csi_dmrs_init_length = ((fp->N_RB_DL<<4)>>5)+1; + for (uint8_t slot=0; slot<fp->slots_per_frame; slot++) { + for (uint8_t symb=0; symb<fp->symbols_per_slot; symb++) { + reset = 1; + x2 = ((1<<10) * (fp->symbols_per_slot*slot+symb+1) * ((Nid<<1)+1) + (Nid)); + for (uint32_t n=0; n<csi_dmrs_init_length; n++) { + csi_rs[slot][symb][n] = lte_gold_generic(&x1, &x2, reset); + reset = 0; + } + } + } +} + +void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms, + int32_t **dataF, + const int16_t amp, + nr_csi_info_t *nr_csi_info, + const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params, + const int slot, + uint8_t *N_cdm_groups, + uint8_t *CDM_group_size, + uint8_t *k_prime, + uint8_t *l_prime, + uint8_t *N_ports, + uint8_t *j_cdm, + uint8_t *k_overline, + uint8_t *l_overline) { + +#ifdef NR_CSIRS_DEBUG + LOG_I(NR_PHY, "csi_params->subcarrier_spacing = %i\n", csi_params->subcarrier_spacing); + LOG_I(NR_PHY, "csi_params->cyclic_prefix = %i\n", csi_params->cyclic_prefix); + LOG_I(NR_PHY, "csi_params->start_rb = %i\n", csi_params->start_rb); + LOG_I(NR_PHY, "csi_params->nr_of_rbs = %i\n", csi_params->nr_of_rbs); + LOG_I(NR_PHY, "csi_params->csi_type = %i (0:TRS, 1:CSI-RS NZP, 2:CSI-RS ZP)\n", csi_params->csi_type); + LOG_I(NR_PHY, "csi_params->row = %i\n", csi_params->row); + LOG_I(NR_PHY, "csi_params->freq_domain = %i\n", csi_params->freq_domain); + LOG_I(NR_PHY, "csi_params->symb_l0 = %i\n", csi_params->symb_l0); + LOG_I(NR_PHY, "csi_params->symb_l1 = %i\n", csi_params->symb_l1); + LOG_I(NR_PHY, "csi_params->cdm_type = %i\n", csi_params->cdm_type); + LOG_I(NR_PHY, "csi_params->freq_density = %i (0: dot5 (even RB), 1: dot5 (odd RB), 2: one, 3: three)\n", csi_params->freq_density); + LOG_I(NR_PHY, "csi_params->scramb_id = %i\n", csi_params->scramb_id); + LOG_I(NR_PHY, "csi_params->power_control_offset = %i\n", csi_params->power_control_offset); + LOG_I(NR_PHY, "csi_params->power_control_offset_ss = %i\n", csi_params->power_control_offset_ss); +#endif + + int dataF_offset = slot*frame_parms->samples_per_slot_wCP; + uint32_t **nr_gold_csi_rs = nr_csi_info->nr_gold_csi_rs[slot]; //*8(max allocation per RB)*2(QPSK)) - int csi_rs_length = frame_parms.N_RB_DL<<4; - int16_t mod_csi[frame_parms.symbols_per_slot][csi_rs_length>>1] __attribute__((aligned(16)));; - uint16_t b = csi_params.freq_domain; - uint16_t n, csi_bw, csi_start, p, k, l, mprime, na, kpn, csi_length; + int csi_rs_length = frame_parms->N_RB_DL<<4; + int16_t mod_csi[frame_parms->symbols_per_slot][csi_rs_length>>1] __attribute__((aligned(16))); + uint16_t b = csi_params->freq_domain; + uint16_t n, p, k, l, mprime, na, kpn; uint8_t size, ports, kprime, lprime, i, gs; uint8_t j[16], k_n[6], koverline[16], loverline[16]; int found = 0; @@ -48,16 +89,17 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, uint8_t fi = 0; double rho, alpha; uint32_t beta = amp; + nr_csi_info->csi_rs_generated_signal_bits = log2_approx(amp); AssertFatal(b!=0, "Invalid CSI frequency domain mapping: no bit selected in bitmap\n"); // if the scrambling id is not the one previously used to initialize we need to re-initialize the rs - if (csi_params.scramb_id != gNB->csi_gold_init) { - gNB->csi_gold_init = csi_params.scramb_id; - nr_init_csi_rs(gNB, csi_params.scramb_id); + if (csi_params->scramb_id != nr_csi_info->csi_gold_init) { + nr_csi_info->csi_gold_init = csi_params->scramb_id; + nr_init_csi_rs(frame_parms, nr_csi_info->nr_gold_csi_rs, csi_params->scramb_id); } - switch (csi_params.row) { + switch (csi_params->row) { // implementation of table 7.4.1.5.3-1 of 38.211 // lprime and kprime are the max value of l' and k' case 1: @@ -75,7 +117,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (i=0; i<size; i++) { j[i] = 0; - loverline[i] = csi_params.symb_l0; + loverline[i] = csi_params->symb_l0; koverline[i] = k_n[0] + (i<<2); } break; @@ -95,7 +137,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (i=0; i<size; i++) { j[i] = 0; - loverline[i] = csi_params.symb_l0; + loverline[i] = csi_params->symb_l0; koverline[i] = k_n[0]; } break; @@ -115,7 +157,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (i=0; i<size; i++) { j[i] = 0; - loverline[i] = csi_params.symb_l0; + loverline[i] = csi_params->symb_l0; koverline[i] = k_n[0]; } break; @@ -135,7 +177,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (i=0; i<size; i++) { j[i] = i; - loverline[i] = csi_params.symb_l0; + loverline[i] = csi_params->symb_l0; koverline[i] = k_n[0] + (i<<1); } break; @@ -155,7 +197,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (i=0; i<size; i++) { j[i] = i; - loverline[i] = csi_params.symb_l0 + i; + loverline[i] = csi_params->symb_l0 + i; koverline[i] = k_n[0]; } break; @@ -174,7 +216,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (i=0; i<size; i++) { j[i] = i; - loverline[i] = csi_params.symb_l0; + loverline[i] = csi_params->symb_l0; koverline[i] = k_n[i]; } break; @@ -193,7 +235,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (i=0; i<size; i++) { j[i] = i; - loverline[i] = csi_params.symb_l0 + (i>>1); + loverline[i] = csi_params->symb_l0 + (i>>1); koverline[i] = k_n[i%2]; } break; @@ -212,7 +254,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (i=0; i<size; i++) { j[i] = i; - loverline[i] = csi_params.symb_l0; + loverline[i] = csi_params->symb_l0; koverline[i] = k_n[i]; } break; @@ -231,7 +273,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (i=0; i<size; i++) { j[i] = i; - loverline[i] = csi_params.symb_l0; + loverline[i] = csi_params->symb_l0; koverline[i] = k_n[i]; } break; @@ -250,7 +292,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (i=0; i<size; i++) { j[i] = i; - loverline[i] = csi_params.symb_l0; + loverline[i] = csi_params->symb_l0; koverline[i] = k_n[i]; } break; @@ -269,7 +311,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (i=0; i<size; i++) { j[i] = i; - loverline[i] = csi_params.symb_l0 + (i>>2); + loverline[i] = csi_params->symb_l0 + (i>>2); koverline[i] = k_n[i%4]; } break; @@ -288,7 +330,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (i=0; i<size; i++) { j[i] = i; - loverline[i] = csi_params.symb_l0; + loverline[i] = csi_params->symb_l0; koverline[i] = k_n[i]; } break; @@ -308,9 +350,9 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, for (i=0; i<size; i++) { j[i] = i; if (i<6) - loverline[i] = csi_params.symb_l0 + i/3; + loverline[i] = csi_params->symb_l0 + i/3; else - loverline[i] = csi_params.symb_l1 + i/9; + loverline[i] = csi_params->symb_l1 + i/9; koverline[i] = k_n[i%3]; } break; @@ -330,9 +372,9 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, for (i=0; i<size; i++) { j[i] = i; if (i<3) - loverline[i] = csi_params.symb_l0; + loverline[i] = csi_params->symb_l0; else - loverline[i] = csi_params.symb_l1; + loverline[i] = csi_params->symb_l1; koverline[i] = k_n[i%3]; } break; @@ -351,7 +393,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (i=0; i<size; i++) { j[i] = i; - loverline[i] = csi_params.symb_l0; + loverline[i] = csi_params->symb_l0; koverline[i] = k_n[i]; } break; @@ -371,9 +413,9 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, for (i=0; i<size; i++) { j[i] = i; if (i<8) - loverline[i] = csi_params.symb_l0 + (i>>2); + loverline[i] = csi_params->symb_l0 + (i>>2); else - loverline[i] = csi_params.symb_l1 + (i/12); + loverline[i] = csi_params->symb_l1 + (i/12); koverline[i] = k_n[i%4]; } break; @@ -393,9 +435,9 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, for (i=0; i<size; i++) { j[i] = i; if (i<4) - loverline[i] = csi_params.symb_l0; + loverline[i] = csi_params->symb_l0; else - loverline[i] = csi_params.symb_l1; + loverline[i] = csi_params->symb_l1; koverline[i] = k_n[i%4]; } break; @@ -414,17 +456,17 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (i=0; i<size; i++) { j[i] = i; - loverline[i] = csi_params.symb_l0; + loverline[i] = csi_params->symb_l0; koverline[i] = k_n[i]; } break; default: - AssertFatal(0==1, "Row %d is not valid for CSI Table 7.4.1.5.3-1\n", csi_params.row); + AssertFatal(0==1, "Row %d is not valid for CSI Table 7.4.1.5.3-1\n", csi_params->row); } #ifdef NR_CSIRS_DEBUG - printf(" row %d, n. of ports %d\n k' ",csi_params.row,ports); + printf(" row %d, n. of ports %d\n k' ",csi_params->row,ports); for (kp=0; kp<=kprime; kp++) printf("%d, ",kp); printf("l' "); @@ -441,7 +483,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, // setting the frequency density from its index - switch (csi_params.freq_density) { + switch (csi_params->freq_density) { case 0: rho = 0.5; @@ -473,7 +515,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, #endif // CDM group size from CDM type index - switch (csi_params.cdm_type) { + switch (csi_params->cdm_type) { case 0: gs = 1; @@ -495,39 +537,31 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, AssertFatal(0==1, "Invalid cdm type index for CSI\n"); } - // according to 38.214 5.2.2.3.1 last paragraph - if (csi_params.start_rb<csi_params.bwp_start) - csi_start = csi_params.bwp_start; - else - csi_start = csi_params.start_rb; - if (csi_params.nr_of_rbs > (csi_params.bwp_start+csi_params.bwp_size-csi_start)) - csi_bw = csi_params.bwp_start+csi_params.bwp_size-csi_start; - else - csi_bw = csi_params.nr_of_rbs; - + uint16_t csi_length; if (rho < 1) { - if (csi_params.freq_density == 0) - csi_length = (((csi_bw + csi_start)>>1)<<kprime)<<1; - else - csi_length = ((((csi_bw + csi_start)>>1)<<kprime)+1)<<1; + if (csi_params->freq_density == 0) { + csi_length = (((csi_params->start_rb + csi_params->nr_of_rbs)>>1)<<kprime)<<1; + } else { + csi_length = ((((csi_params->start_rb + csi_params->nr_of_rbs)>>1)<<kprime)+1)<<1; + } + } else { + csi_length = (((uint16_t) rho*(csi_params->start_rb + csi_params->nr_of_rbs))<<kprime)<<1; } - else - csi_length = (((uint16_t) rho*(csi_bw + csi_start))<<kprime)<<1; #ifdef NR_CSIRS_DEBUG - printf(" start rb %d, n. rbs %d, csi length %d\n",csi_start,csi_bw,csi_length); + printf(" start rb %d, nr of rbs %d, csi length %d\n", csi_params->start_rb, csi_params->nr_of_rbs, csi_length); #endif // TRS - if (csi_params.csi_type == 0) { + if (csi_params->csi_type == 0) { // ??? } // NZP CSI RS - if (csi_params.csi_type == 1) { + if (csi_params->csi_type == 1) { // assuming amp is the amplitude of SSB channels - switch (csi_params.power_control_offset_ss) { + switch (csi_params->power_control_offset_ss) { case 0: beta = (amp*ONE_OVER_SQRT2_Q15)>>15; break; @@ -545,30 +579,30 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, } for (lp=0; lp<=lprime; lp++){ - symb = csi_params.symb_l0; - nr_modulation(gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]); - if ((csi_params.row == 5) || (csi_params.row == 7) || (csi_params.row == 11) || (csi_params.row == 13) || (csi_params.row == 16)) - nr_modulation(gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]); - if ((csi_params.row == 14) || (csi_params.row == 13) || (csi_params.row == 16) || (csi_params.row == 17)) { - symb = csi_params.symb_l1; - nr_modulation(gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]); - if ((csi_params.row == 13) || (csi_params.row == 16)) - nr_modulation(gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]); + symb = csi_params->symb_l0; + nr_modulation(nr_gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]); + if ((csi_params->row == 5) || (csi_params->row == 7) || (csi_params->row == 11) || (csi_params->row == 13) || (csi_params->row == 16)) + nr_modulation(nr_gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]); + if ((csi_params->row == 14) || (csi_params->row == 13) || (csi_params->row == 16) || (csi_params->row == 17)) { + symb = csi_params->symb_l1; + nr_modulation(nr_gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]); + if ((csi_params->row == 13) || (csi_params->row == 16)) + nr_modulation(nr_gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]); } } } - uint16_t start_sc = frame_parms.first_carrier_offset; + uint16_t start_sc = frame_parms->first_carrier_offset; // resource mapping according to 38.211 7.4.1.5.3 - for (n=csi_start; n<(csi_start+csi_bw); n++) { - if ( (csi_params.freq_density > 1) || (csi_params.freq_density == (n%2))) { // for freq density 0.5 checks if even or odd RB + for (n=csi_params->start_rb; n<(csi_params->start_rb+csi_params->nr_of_rbs); n++) { + if ( (csi_params->freq_density > 1) || (csi_params->freq_density == (n%2))) { // for freq density 0.5 checks if even or odd RB for (int ji=0; ji<size; ji++) { // loop over CDM groups for (int s=0 ; s<gs; s++) { // loop over each CDM group size p = s+j[ji]*gs; // port index for (kp=0; kp<=kprime; kp++) { // loop over frequency resource elements within a group - k = (start_sc+(n*NR_NB_SC_PER_RB)+koverline[ji]+kp)%(frame_parms.ofdm_symbol_size); // frequency index of current resource element - // wf according to tables 7.4.5.3-2 to 7.4.5.3-5 + k = (start_sc+(n*NR_NB_SC_PER_RB)+koverline[ji]+kp)%(frame_parms->ofdm_symbol_size); // frequency index of current resource element + // wf according to tables 7.4.5.3-2 to 7.4.5.3-5 if (kp == 0) wf = 1; else @@ -591,24 +625,46 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, else wt = -1; } + // ZP CSI RS - if (csi_params.csi_type == 2) { - ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+(2*txdataF_offset)] = 0; - ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+1+(2*txdataF_offset)] = 0; + if (csi_params->csi_type == 2) { + ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+(2*dataF_offset)] = 0; + ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)] = 0; } else { - ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+(2*txdataF_offset)] = (beta*wt*wf*mod_csi[l][mprime<<1]) >> 15; - ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+1+(2*txdataF_offset)] = (beta*wt*wf*mod_csi[l][(mprime<<1) + 1]) >> 15; + ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+(2*dataF_offset)] = (beta*wt*wf*mod_csi[l][mprime<<1]) >> 15; + ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)] = (beta*wt*wf*mod_csi[l][(mprime<<1) + 1]) >> 15; } #ifdef NR_CSIRS_DEBUG - printf("l,k (%d %d) seq. index %d \t port %d \t (%d,%d)\n",l,k,mprime,p+3000, - ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+(2*txdataF_offset)], - ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1)+1+(2*txdataF_offset)]); + printf("l,k (%d,%d) seq. index %d \t port %d \t (%d,%d)\n",l,k,mprime,p+3000, + ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+(2*dataF_offset)], + ((int16_t*)dataF[p])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1+(2*dataF_offset)]); #endif } } - } + } } } - } + } + if (N_cdm_groups) *N_cdm_groups = size; + if (CDM_group_size) *CDM_group_size = gs; + if (k_prime) *k_prime = kprime; + if (l_prime) *l_prime = lprime; + if (N_ports) *N_ports = ports; + if (j_cdm) memcpy(j_cdm,j,16*sizeof(uint8_t)); + if (k_overline) memcpy(k_overline,koverline,16*sizeof(uint8_t)); + if (l_overline) memcpy(l_overline,loverline,16*sizeof(uint8_t)); + +#ifdef NR_CSIRS_DEBUG + if (N_ports) LOG_I(NR_PHY, "nr_csi_info->N_ports = %d\n", *N_ports); + if (N_cdm_groups) LOG_I(NR_PHY, "nr_csi_info->N_cdm_groups = %d\n", *N_cdm_groups); + if (CDM_group_size) LOG_I(NR_PHY, "nr_csi_info->CDM_group_size = %d\n", *CDM_group_size); + if (k_prime) LOG_I(NR_PHY, "nr_csi_info->kprime = %d\n", *k_prime); + if (l_prime) LOG_I(NR_PHY, "nr_csi_info->lprime = %d\n", *l_prime); + if (N_cdm_groups) { + for(int ji=0; ji<*N_cdm_groups; ji++) { + LOG_I(NR_PHY, "(CDM group %d) j = %d, koverline = %d, loverline = %d\n", ji, j[ji], koverline[ji], loverline[ji]); + } + } +#endif } diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c index ffbe850fdd1..dc1ed47e0ff 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c @@ -73,7 +73,6 @@ void nr_generate_dci(PHY_VARS_gNB *gNB, NR_DL_FRAME_PARMS *frame_parms, int slot) { - int16_t mod_dmrs[NR_MAX_CSET_DURATION][NR_MAX_PDCCH_DMRS_LENGTH>>1] __attribute__((aligned(16))); // 3 for the max coreset duration uint16_t cset_start_sc; uint8_t cset_start_symb, cset_nsymb; int k,l,k_prime,dci_idx, dmrs_idx; @@ -82,13 +81,14 @@ void nr_generate_dci(PHY_VARS_gNB *gNB, int rb_offset; int n_rb; - // compute rb_offset and n_prb based on frequency allocation nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL]; - nr_fill_cce_list(cce_list,0,pdcch_pdu_rel15); + nr_fill_cce_list(cce_list, pdcch_pdu_rel15); get_coreset_rballoc(pdcch_pdu_rel15->FreqDomainResource,&n_rb,&rb_offset); cset_start_sc = frame_parms->first_carrier_offset + (pdcch_pdu_rel15->BWPStart + rb_offset) * NR_NB_SC_PER_RB; + int16_t mod_dmrs[pdcch_pdu_rel15->StartSymbolIndex+pdcch_pdu_rel15->DurationSymbols][(n_rb+rb_offset)*6] __attribute__((aligned(16))); // 3 for the max coreset duration + for (int d=0;d<pdcch_pdu_rel15->numDlDci;d++) { /*The coreset is initialised * in frequency: the first subcarrier is obtained by adding the first CRB overlapping the SSB and the rb_offset for coreset 0 @@ -111,22 +111,23 @@ void nr_generate_dci(PHY_VARS_gNB *gNB, // DMRS length is per OFDM symbol uint32_t dmrs_length = n_rb*6; //2(QPSK)*3(per RB)*6(REG per CCE) uint32_t encoded_length = dci_pdu->AggregationLevel*108; //2(QPSK)*9(per RB)*6(REG per CCE) - LOG_D(PHY, "DL_DCI : rb_offset %d, nb_rb %d, DMRS length per symbol %d\t DCI encoded length %d (precoder_granularity %d,reg_mapping %d),Scrambling_Id %d,ScramblingRNTI %x,PayloadSizeBits %d\n", - rb_offset, n_rb,dmrs_length, encoded_length,pdcch_pdu_rel15->precoderGranularity,pdcch_pdu_rel15->CceRegMappingType, - dci_pdu->ScramblingId,dci_pdu->ScramblingRNTI,dci_pdu->PayloadSizeBits); + if (dci_pdu->RNTI != 0xFFFF) + LOG_D(PHY, "DL_DCI : rb_offset %d, nb_rb %d, DMRS length per symbol %d\t DCI encoded length %d (precoder_granularity %d, reg_mapping %d), Scrambling_Id %d, ScramblingRNTI %x, PayloadSizeBits %d\n", + rb_offset, n_rb,dmrs_length, encoded_length,pdcch_pdu_rel15->precoderGranularity,pdcch_pdu_rel15->CceRegMappingType, + dci_pdu->ScramblingId,dci_pdu->ScramblingRNTI,dci_pdu->PayloadSizeBits); dmrs_length += rb_offset*6; // To accommodate more DMRS symbols in case of rb offset /// DMRS QPSK modulation for (int symb=cset_start_symb; symb<cset_start_symb + pdcch_pdu_rel15->DurationSymbols; symb++) { - + nr_modulation(gold_pdcch_dmrs[symb], dmrs_length, DMRS_MOD_ORDER, mod_dmrs[symb]); //Qm = 2 as DMRS is QPSK modulated #ifdef DEBUG_PDCCH_DMRS - if(dci_pdu->RNTI!=0xFFFF) { - for (int i=0; i<dmrs_length>>1; i++) - printf("symb %d i %d %p gold seq 0x%08x mod_dmrs %d %d\n", symb, i, - &gold_pdcch_dmrs[symb][i>>5],gold_pdcch_dmrs[symb][i>>5], mod_dmrs[symb][i<<1], mod_dmrs[symb][(i<<1)+1] ); - } + if(dci_pdu->RNTI!=0xFFFF) { + for (int i=0; i<dmrs_length>>1; i++) + printf("symb %d i %d %p gold seq 0x%08x mod_dmrs %d %d\n", symb, i, + &gold_pdcch_dmrs[symb][i>>5],gold_pdcch_dmrs[symb][i>>5], mod_dmrs[symb][i<<1], mod_dmrs[symb][(i<<1)+1]); + } #endif } @@ -178,8 +179,10 @@ void nr_generate_dci(PHY_VARS_gNB *gNB, // Get cce_list indices by reg_idx in ascending order int reg_list_index = 0; + int N_regs = n_rb*pdcch_pdu_rel15->DurationSymbols; // nb of REGs per coreset + int N_cces = N_regs / NR_NB_REG_PER_CCE; // nb of cces in coreset int reg_list_order[NR_MAX_PDCCH_AGG_LEVEL] = {}; - for (int p = 0; p < NR_MAX_PDCCH_AGG_LEVEL; p++) { + for (int p = 0; p < N_cces; p++) { for(int p2 = 0; p2 < dci_pdu->AggregationLevel; p2++) { if(cce_list[d][p2].reg_list[0].reg_idx == p * NR_NB_REG_PER_CCE) { reg_list_order[reg_list_index] = p2; @@ -191,24 +194,25 @@ void nr_generate_dci(PHY_VARS_gNB *gNB, /*Mapping the encoded DCI along with the DMRS */ for(int symbol_idx = 0; symbol_idx < pdcch_pdu_rel15->DurationSymbols; symbol_idx++) { - for (int cce_count = 0; cce_count < dci_pdu->AggregationLevel; cce_count+=pdcch_pdu_rel15->DurationSymbols) { + for (int cce_count = 0; cce_count < dci_pdu->AggregationLevel; cce_count++) { int8_t cce_idx = reg_list_order[cce_count]; - for (int reg_in_cce_idx = 0; reg_in_cce_idx < NR_NB_REG_PER_CCE; reg_in_cce_idx++) { + for (int reg_in_cce_idx = 0; reg_in_cce_idx < NR_NB_REG_PER_CCE; reg_in_cce_idx+=pdcch_pdu_rel15->DurationSymbols) { k = cset_start_sc + cce_list[d][cce_idx].reg_list[reg_in_cce_idx].start_sc_idx; - + LOG_D(PHY,"CCE %d REG %d k %d\n",cce_idx,reg_in_cce_idx+symbol_idx,k); if (k >= frame_parms->ofdm_symbol_size) k -= frame_parms->ofdm_symbol_size; l = cset_start_symb + symbol_idx; // dmrs index depends on reference point for k according to 38.211 7.4.1.3.2 + int eff_reg_idx = cce_list[d][cce_idx].reg_list[reg_in_cce_idx].reg_idx/pdcch_pdu_rel15->DurationSymbols; if (pdcch_pdu_rel15->CoreSetType == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG) - dmrs_idx = (cce_list[d][cce_idx].reg_list[reg_in_cce_idx].reg_idx) * 3; + dmrs_idx = eff_reg_idx * 3; else - dmrs_idx = (cce_list[d][cce_idx].reg_list[reg_in_cce_idx].reg_idx + rb_offset) * 3; + dmrs_idx = (eff_reg_idx + rb_offset) * 3; k_prime = 0; @@ -262,7 +266,6 @@ void nr_generate_dci_top(processingData_L1tx_t *msgTx, int16_t amp, NR_DL_FRAME_PARMS *frame_parms) { - for (int i=0; i<msgTx->num_ul_pdcch; i++) nr_generate_dci(msgTx->gNB,&msgTx->ul_pdcch_pdu[i].pdcch_pdu.pdcch_pdu_rel15,txdataF,amp,frame_parms,slot); for (int i=0; i<msgTx->num_dl_pdcch; i++) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.h b/openair1/PHY/NR_TRANSPORT/nr_dci.h index 490a8b52868..0bf6932bb50 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dci.h @@ -55,6 +55,6 @@ void nr_fill_ul_dci(PHY_VARS_gNB *gNB, int slot, nfapi_nr_ul_dci_request_pdus_t *pdcch_pdu); -void nr_fill_cce_list(nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL], uint8_t m,nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15); +void nr_fill_cce_list(nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL], nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15); #endif //__PHY_NR_TRANSPORT_DCI__H diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c index 8d5eb4a6607..e9d3010ce7c 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c @@ -37,89 +37,8 @@ #include "nr_dlsch.h" -/* - Original version to keep code for Y that needs to be moved to MAC - -void nr_fill_cce_list(PHY_VARS_gNB *gNB, uint16_t n_shift, uint8_t m) { - - nr_cce_t* cce; - nr_reg_t* reg; - nfapi_nr_dl_config_pdcch_pdu_rel15_t* pdcch_pdu = gNB->pdcch_pdu.pdcch; - - uint8_t L = dci_alloc->L; - uint8_t bsize = pdcch_params->reg_bundle_size; - uint8_t R = pdcch_params->interleaver_size; - uint16_t N_reg = pdcch_params->n_rb * pdcch_params->n_symb; - uint16_t Y, N_cce, M_s_max, n_CI=0, tmp, C=0; - uint16_t n_RNTI = (pdcch_params->search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? pdcch_params->rnti:0; - uint32_t A[3]={39827,39829,39839}; - - if (pdcch_params->config_type == NFAPI_NR_CSET_CONFIG_MIB_SIB1) - AssertFatal(L>=4, "Invalid aggregation level for SIB1 configured PDCCH %d\n", L); - - N_cce = N_reg / NR_NB_REG_PER_CCE; - //Max number of candidates per aggregation level -- SIB1 configured search space only - M_s_max = (L==4)?4:(L==8)?2:1; - - if (pdcch_params->search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_COMMON) - Y = 0; - else { //NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC - Y = (A[0]*n_RNTI)%65537; // Candidate 0, antenna port 0 - } - - if (pdcch_params->cr_mapping_type == NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED) { - uint16_t assertFatalCond = (N_reg%(bsize*R)); - AssertFatal(assertFatalCond == 0,"CCE to REG interleaving: Invalid configuration leading to non integer C (N_reg %us, bsize %d R %d)\n",N_reg, bsize, R); - C = N_reg/(bsize*R); - } - - tmp = L * (( Y + (m*N_cce)/(L*M_s_max) + n_CI ) % CEILIDIV(N_cce,L)); - - LOG_D(PHY, "CCE list generation for candidate %d: bundle size %d ilv size %d tmp %d\n", m, bsize, R, tmp); - for (uint8_t cce_idx=0; cce_idx<L; cce_idx++) { - cce = &dci_alloc->cce_list[cce_idx]; - cce->cce_idx = tmp + cce_idx; - LOG_D(PHY, "cce_idx %d\n", cce->cce_idx); - - if (pdcch_params->cr_mapping_type == NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED) { - LOG_D(PHY, "Interleaved CCE to REG mapping\n"); - uint8_t j = cce->cce_idx, j_prime; - uint8_t r,c,idx; - - for (uint8_t bundle_idx=0; bundle_idx<NR_NB_REG_PER_CCE/bsize; bundle_idx++) { - j_prime = 6*j/bsize + bundle_idx; - r = j_prime%R; - c = (j_prime-r)/R; - idx = (r*C + c + n_shift)%(N_reg/bsize); - LOG_D(PHY, "bundle idx = %d \n j = %d \t j_prime = %d \t r = %d \t c = %d\n", idx, j , j_prime, r, c); - - for (uint8_t reg_idx=0; reg_idx<bsize; reg_idx++) { - reg = &cce->reg_list[reg_idx]; - reg->reg_idx = bsize*idx + reg_idx; - reg->start_sc_idx = (reg->reg_idx/pdcch_params->n_symb) * NR_NB_SC_PER_RB; - reg->symb_idx = reg->reg_idx % pdcch_params->n_symb; - LOG_D(PHY, "reg %d symbol %d start subcarrier %d\n", reg->reg_idx, reg->symb_idx, reg->start_sc_idx); - } - } - } - else { // NFAPI_NR_CCE_REG_MAPPING_NON_INTERLEAVED - LOG_D(PHY, "Non interleaved CCE to REG mapping\n"); - for (uint8_t reg_idx=0; reg_idx<NR_NB_REG_PER_CCE; reg_idx++) { - reg = &cce->reg_list[reg_idx]; - reg->reg_idx = cce->cce_idx*NR_NB_REG_PER_CCE + reg_idx; - reg->start_sc_idx = (reg->reg_idx/pdcch_params->n_symb) * NR_NB_SC_PER_RB; - reg->symb_idx = reg->reg_idx % pdcch_params->n_symb; - LOG_D(PHY, "reg %d symbol %d start subcarrier %d\n", reg->reg_idx, reg->symb_idx, reg->start_sc_idx); - } - - } - } -} - -*/ - -void nr_fill_cce_list(nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL], uint8_t m, nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15) { +void nr_fill_cce_list(nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL], nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15) { nr_cce_t* cce; nr_reg_t* reg; @@ -128,71 +47,51 @@ void nr_fill_cce_list(nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL] int R = pdcch_pdu_rel15->InterleaverSize; int n_shift = pdcch_pdu_rel15->ShiftIndex; - //Max number of candidates per aggregation level -- SIB1 configured search space only - int n_rb,rb_offset; get_coreset_rballoc(pdcch_pdu_rel15->FreqDomainResource,&n_rb,&rb_offset); - - int N_reg = n_rb; - int C=-1; - - AssertFatal(N_reg > 0,"N_reg cannot be 0\n"); - for (int d=0;d<pdcch_pdu_rel15->numDlDci;d++) { + int L = pdcch_pdu_rel15->dci_pdu[d].AggregationLevel; + int dur = pdcch_pdu_rel15->DurationSymbols; + int N_regs = n_rb*dur; // nb of REGs per coreset + AssertFatal(N_regs > 0,"N_reg cannot be 0\n"); if (pdcch_pdu_rel15->CoreSetType == NFAPI_NR_CSET_CONFIG_MIB_SIB1) AssertFatal(L>=4, "Invalid aggregation level for SIB1 configured PDCCH %d\n", L); - + + int C = 0; + if (pdcch_pdu_rel15->CceRegMappingType == NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED) { - uint16_t assertFatalCond = (N_reg%(bsize*R)); - AssertFatal(assertFatalCond == 0,"CCE to REG interleaving: Invalid configuration leading to non integer C (N_reg %us, bsize %d R %d)\n",N_reg, bsize, R); - C = N_reg/(bsize*R); + uint16_t assertFatalCond = (N_regs%(bsize*R)); + AssertFatal(assertFatalCond == 0,"CCE to REG interleaving: Invalid configuration leading to non integer C (N_reg %us, bsize %d R %d)\n",N_regs, bsize, R); + C = N_regs/(bsize*R); } - - if (pdcch_pdu_rel15->dci_pdu[d].RNTI != 0xFFFF) LOG_D(PHY, "CCE list generation for candidate %d: bundle size %d ilv size %d CceIndex %d\n", m, bsize, R, pdcch_pdu_rel15->dci_pdu[d].CceIndex); + + if (pdcch_pdu_rel15->dci_pdu[d].RNTI != 0xFFFF) + LOG_D(PHY, "CCE list generation for candidate %d: bundle size %d ilv size %d CceIndex %d\n", d, bsize, R, pdcch_pdu_rel15->dci_pdu[d].CceIndex); + for (uint8_t cce_idx=0; cce_idx<L; cce_idx++) { cce = &cce_list[d][cce_idx]; cce->cce_idx = pdcch_pdu_rel15->dci_pdu[d].CceIndex + cce_idx; LOG_D(PHY, "cce_idx %d\n", cce->cce_idx); - - if (pdcch_pdu_rel15->CceRegMappingType == NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED) { - LOG_D(PHY, "Interleaved CCE to REG mapping\n"); - uint8_t j = cce->cce_idx, j_prime; - uint8_t r,c,idx; - - for (uint8_t bundle_idx=0; bundle_idx<NR_NB_REG_PER_CCE/bsize; bundle_idx++) { - j_prime = 6*j/bsize + bundle_idx; - r = j_prime%R; - c = (j_prime-r)/R; - idx = (r*C + c + n_shift)%(N_reg/bsize); - LOG_D(PHY, "bundle idx = %d \n j = %d \t j_prime = %d \t r = %d \t c = %d\n", idx, j , j_prime, r, c); - - for (uint8_t reg_idx=0; reg_idx<bsize; reg_idx++) { - reg = &cce->reg_list[reg_idx]; - reg->reg_idx = bsize*idx + reg_idx; - reg->start_sc_idx = reg->reg_idx * NR_NB_SC_PER_RB; - reg->symb_idx = 0; - LOG_D(PHY, "reg %d symbol %d start subcarrier %d\n", reg->reg_idx, reg->symb_idx, reg->start_sc_idx); - } - } - } - else { // NFAPI_NR_CCE_REG_MAPPING_NON_INTERLEAVED - LOG_D(PHY, "Non interleaved CCE to REG mapping\n"); - for (uint8_t reg_idx=0; reg_idx<NR_NB_REG_PER_CCE; reg_idx++) { + + uint8_t j = cce->cce_idx; + for (int k=6*j/bsize; k<(6*j/bsize+6/bsize); k++) { // loop over REG bundles + + int f = cce_to_reg_interleaving(R, k, n_shift, C, bsize, N_regs); + + for (uint8_t reg_idx=0; reg_idx<bsize; reg_idx++) { reg = &cce->reg_list[reg_idx]; - reg->reg_idx = cce->cce_idx*NR_NB_REG_PER_CCE + reg_idx; - reg->start_sc_idx = reg->reg_idx * NR_NB_SC_PER_RB; - reg->symb_idx = 0; + reg->reg_idx = bsize*f + reg_idx; + reg->start_sc_idx = (reg->reg_idx/dur) * NR_NB_SC_PER_RB; + reg->symb_idx = reg_idx%dur; LOG_D(PHY, "reg %d symbol %d start subcarrier %d\n", reg->reg_idx, reg->symb_idx, reg->start_sc_idx); } - } - } } } diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index d975c1d38bf..30dbc39185c 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -38,6 +38,7 @@ #include "PHY/NR_REFSIG/ptrs_nr.h" #include "common/utils/LOG/vcd_signal_dumper.h" #include "common/utils/nr/nr_common.h" +#include "executables/softmodem-common.h" //#define DEBUG_DLSCH //#define DEBUG_DLSCH_MAPPING @@ -122,7 +123,6 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, rel15->dlDmrsSymbPos); n_ptrs = (rel15->rbSize + rel15->PTRSFreqDensity - 1)/rel15->PTRSFreqDensity; } - int16_t mod_ptrs[n_ptrs<<1] __attribute__ ((aligned(16))); /// CRC, coding, interleaving and rate matching AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n"); @@ -153,6 +153,9 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, printf("\n"); #endif + if (IS_SOFTMODEM_DLSIM) + memcpy(harq->f, output, encoded_length); + for (int q=0; q<rel15->NrOfCodewords; q++) { /// scrambling start_meas(dlsch_scrambling_stats); @@ -214,6 +217,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, #endif stop_meas(&gNB->dlsch_layer_mapping_stats); + /// Resource mapping // Non interleaved VRB to PRB mapping @@ -235,6 +239,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, for (int nl=0; nl<rel15->nrOfLayers; nl++) { int dmrs_port = get_dmrs_port(nl,rel15->dmrsPorts); + // DMRS params for this dmrs port get_Wt(Wt, dmrs_port, dmrs_Type); get_Wf(Wf, dmrs_port, dmrs_Type); @@ -296,12 +301,14 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, /* calculate if current symbol is PTRS symbols */ ptrs_idx = 0; - + int16_t *mod_ptrs = NULL; if(rel15->pduBitmap & 0x1) { ptrs_symbol = is_ptrs_symbol(l,dlPtrsSymPos); if(ptrs_symbol) { /* PTRS QPSK Modulation for each OFDM symbol in a slot */ LOG_D(PHY,"Doing ptrs modulation for symbol %d, n_ptrs %d\n",l,n_ptrs); + int16_t mod_ptrsBuf[n_ptrs<<1] __attribute__ ((aligned(16))); + mod_ptrs =mod_ptrsBuf; nr_modulation(pdsch_dmrs[l][rel15->SCID], (n_ptrs<<1), DMRS_MOD_ORDER, mod_ptrs); } } @@ -312,7 +319,8 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, for (int i=0; i<rel15->rbSize*NR_NB_SC_PER_RB; i++) { /* check if cuurent RE is PTRS RE*/ is_ptrs_re = 0; - if (ptrs_symbol) + /* check for PTRS symbol and set flag for PTRS RE */ + if(ptrs_symbol){ is_ptrs_re = is_ptrs_subcarrier(k, rel15->rnti, nl, @@ -322,6 +330,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, rel15->PTRSReOffset, start_sc, frame_parms->ofdm_symbol_size); + } /* Map DMRS Symbol */ if ( (dmrs_symbol_map & (1 << l)) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) { @@ -337,6 +346,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, k_prime&=1; n+=(k_prime)?0:1; } + /* Map PTRS Symbol */ else if(is_ptrs_re){ txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + k)<<1) ] = (beta_ptrs*amp*mod_ptrs[ptrs_idx<<1]) >> 15; txdataF_precoding[nl][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (beta_ptrs*amp*mod_ptrs[(ptrs_idx<<1) + 1])>> 15; diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index daa4ed17230..bdf681c21d3 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -49,11 +49,6 @@ void nr_get_rbg_parms(NR_BWP_PARMS* bwp, uint8_t config_type); void nr_get_rbg_list(uint32_t bitmap, uint8_t n_rbg, uint8_t* rbg_list); - -uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx); - -uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx); - void nr_pdsch_codeword_scrambling(uint8_t *in, uint32_t size, uint8_t q, diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index f7abc2a513c..8672f3ae29a 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -69,6 +69,10 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, free16(harq->b, a_segments * 1056); harq->b = NULL; } + if (harq->f) { + free16(harq->f, N_RB * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS); + harq->f = NULL; + } for (int r = 0; r < a_segments; r++) { free(harq->c[r]); harq->c[r] = NULL; @@ -119,7 +123,6 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, bzero(dlsch,sizeof(NR_gNB_DLSCH_t)); dlsch->Kmimo = Kmimo; dlsch->Mdlharq = Mdlharq; - dlsch->Mlimit = 4; dlsch->Nsoft = Nsoft; int txdataf_size = frame_parms->N_RB_DL*NR_SYMBOLS_PER_SLOT*NR_NB_SC_PER_RB*8; // max pdsch encoded length for each layer @@ -177,6 +180,10 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, bzero(harq->c[r], 8448); } + harq->f = malloc16(N_RB * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS); + AssertFatal(harq->f, "cannot allocate harq->f\n"); + bzero(harq->f, N_RB * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS); + return(dlsch); } @@ -240,19 +247,12 @@ void ldpc8blocks( void *p) { impp->F, Kr-impp->F-2*(*impp->Zc), mod_order,nb_rb,rel15->nrOfLayers); - // for tbslbrm calculation according to 5.4.2.1 of 38.212 - uint8_t Nl = 4; - - if (rel15->nrOfLayers < Nl) - Nl = rel15->nrOfLayers; - uint32_t Tbslbrm = nr_compute_tbslbrm(rel15->mcsTable[0],nb_rb,Nl); - uint8_t Ilbrm = 1; + uint32_t Tbslbrm = rel15->maintenance_parms_v3.tbSizeLbrmBytes; uint8_t e[E]; bzero (e, E); - nr_rate_matching_ldpc(Ilbrm, - Tbslbrm, + nr_rate_matching_ldpc(Tbslbrm, impp->BG, *impp->Zc, impp->d[rr], @@ -313,12 +313,11 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, unsigned int crc=1; nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &harq->pdsch_pdu.pdsch_pdu_rel15; impp.Zc = &harq->Z; - float Coderate = 0.0; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ENCODING, VCD_FUNCTION_IN); uint32_t A = rel15->TBSize[0]<<3; unsigned char *a=harq->pdu; if ( rel15->rnti != SI_RNTI) - trace_NRpdu(DIRECTION_DOWNLINK, a, rel15->TBSize[0], 0, WS_C_RNTI, rel15->rnti, frame, slot,0, 0); + trace_NRpdu(DIRECTION_DOWNLINK, a, rel15->TBSize[0], WS_C_RNTI, rel15->rnti, frame, slot,0, 0); NR_gNB_SCH_STATS_t *stats=NULL; int first_free=-1; @@ -376,10 +375,9 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, memcpy(harq->b, a, (A / 8) + 3); // using 3 bytes to mimic the case of 24 bit crc } - if (rel15->targetCodeRate[0]<1000) - Coderate = (float)rel15->targetCodeRate[0] /(float) 1024; - else // to scale for mcs 20 and 26 in table 5.1.3.1-2 which are decimal and input 2* in nr_tbs_tools - Coderate = (float)rel15->targetCodeRate[0] /(float) 2048; + // target_code_rate is in 0.1 units + float Coderate = (float) rel15->targetCodeRate[0] / 10240.0f; + LOG_D(PHY,"DLSCH Coderate %f\n",Coderate); if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25) impp.BG = 2; diff --git a/openair1/PHY/NR_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_TRANSPORT/nr_pbch.c index fc7df464960..278c2dfd58c 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_pbch.c @@ -35,6 +35,7 @@ #include "PHY/NR_TRANSPORT/nr_transport_proto.h" #include "PHY/LTE_REFSIG/lte_refsig.h" #include "PHY/sse_intrin.h" +#include "executables/softmodem-common.h" //#define DEBUG_PBCH //#define DEBUG_PBCH_ENCODING @@ -248,6 +249,9 @@ int nr_generate_pbch(nfapi_nr_dl_tti_ssb_pdu *ssb_pdu, for (int i=0; i<NR_PBCH_PDU_BITS; i++) pbch->pbch_a |= ((pbch_pdu[i>>3]>>(7-(i&7)))&1)<<i; + // NSA to signal no coreset0 + const int ssb_sc_offset = get_softmodem_params()->sa ? config->ssb_table.ssb_subcarrier_offset.value : 31; + #ifdef DEBUG_PBCH_ENCODING for (int i=0; i<3; i++) printf("pbch_pdu[%d]: 0x%02x\n", i, pbch_pdu[i]); @@ -265,7 +269,7 @@ int nr_generate_pbch(nfapi_nr_dl_tti_ssb_pdu *ssb_pdu, for (int i=0; i<3; i++) pbch->pbch_a |= ((ssb_index>>(5-i))&1)<<(29+i); // resp. 6th, 5th and 4th bits of ssb_index else - pbch->pbch_a |= ((config->ssb_table.ssb_subcarrier_offset.value>>4)&1)<<29; //MSB of k_SSB (bit index 4) + pbch->pbch_a |= ((ssb_sc_offset>>4)&1)<<29; //MSB of k_SSB (bit index 4) LOG_D(PHY,"After extra byte: pbch_a = 0x%08x\n",pbch->pbch_a); diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c index b12a58526d9..eb012532ce6 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c @@ -175,11 +175,19 @@ void rx_nr_prach_ru(RU_t *ru, int msg1_frequencystart = ru->config.prach_config.num_prach_fd_occasions_list[numRA].k1.value; int sample_offset_slot; - if (!(slot%(fp->slots_per_subframe/2))) - sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1)); - else - sample_offset_slot = (prachStartSymbol==0?0:prachStartSymbol*(fp->ofdm_symbol_size+fp->nb_prefix_samples)); - //to be checked for mu=0; + if (prachStartSymbol == 0) { + sample_offset_slot = 0; + } else if (fp->slots_per_subframe == 1) { + if (prachStartSymbol <= 7) + sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0); + else + sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 2) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0) * 2; + } else { + if (!(slot%(fp->slots_per_subframe/2))) + sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0); + else + sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * prachStartSymbol; + } LOG_D(PHY,"frame %d, slot %d: doing rx_nr_prach_ru for format %d, numRA %d, prachStartSymbol %d, prachOccasion %d\n",frame,slot,prachFormat,numRA,prachStartSymbol,prachOccasion); @@ -193,89 +201,167 @@ void rx_nr_prach_ru(RU_t *ru, prach[aa] = (int16_t*)&ru->common.rxdata[aa][fp->get_samples_slot_timestamp(slot2,fp,0)+sample_offset_slot-ru->N_TA_offset]; } - idft_size_idx_t dftsize; - int dftlen=0; + int reps; + int Ncp; + int dftlen; int mu = fp->numerology_index; - int Ncp = 0; - int16_t *prach2; if (prach_sequence_length == 0) { LOG_D(PHY,"PRACH (ru %d) in %d.%d, format %d, msg1_frequencyStart %d\n", ru->idx,frame,slot2,prachFormat,msg1_frequencystart); - AssertFatal(prachFormat<4,"Illegal prach format %d for length 839\n",prachFormat); switch (prachFormat) { case 0: + reps = 1; Ncp = 3168; + dftlen = 24576; break; - + case 1: + reps = 2; Ncp = 21024; + dftlen = 24576; break; - + case 2: + reps = 4; Ncp = 4688; + dftlen = 24576; break; - + case 3: + reps = 4; Ncp = 3168; + dftlen = 6144; + break; + + default: + AssertFatal(1==0, "Illegal prach format %d for length 839\n", prachFormat); break; - } } else { LOG_D(PHY,"PRACH (ru %d) in %d.%d, format %s, msg1_frequencyStart %d,startSymbol %d\n", ru->idx,frame,slot,prachfmt[prachFormat],msg1_frequencystart,prachStartSymbol); - switch (prachFormat) { case 4: //A1 - Ncp = 288/(1<<mu); + reps = 2; + Ncp = 288 >> mu; break; - + case 5: //A2 - Ncp = 576/(1<<mu); + reps = 4; + Ncp = 576 >> mu; break; - + case 6: //A3 - Ncp = 864/(1<<mu); + reps = 6; + Ncp = 864 >> mu; break; - + case 7: //B1 - Ncp = 216/(1<<mu); - break; - + reps = 2; + Ncp = 216 >> mu; + break; + /* // B2 and B3 do not exist in FAPI case 4: //B2 - Ncp = 360/(1<<mu); + reps = 4; + Ncp = 360 >> mu; break; - + case 5: //B3 - Ncp = 504/(1<<mu); + reps = 6; + Ncp = 504 >> mu; break; */ + case 8: //B4 - Ncp = 936/(1<<mu); + reps = 12; + Ncp = 936 >> mu; break; - + case 9: //C0 - Ncp = 1240/(1<<mu); + reps = 1; + Ncp = 1240 >> mu; break; - + case 10: //C2 - Ncp = 2048/(1<<mu); + reps = 4; + Ncp = 2048 >> mu; break; - + default: AssertFatal(1==0,"unknown prach format %x\n",prachFormat); break; } + dftlen = 2048 >> mu; + } + + //actually what we should be checking here is how often the current prach crosses a 0.5ms boundary. I am not quite sure for which paramter set this would be the case, so I will ignore it for now and just check if the prach starts on a 0.5ms boundary + if(fp->numerology_index == 0) { + if (prachStartSymbol == 0 || prachStartSymbol == 7) + Ncp += 16; + } + else { + if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0) + Ncp += 16; } + + switch(fp->samples_per_subframe) { + case 7680: + // 5 MHz @ 7.68 Ms/s + Ncp >>= 2; + dftlen >>= 2; + break; + + case 15360: + // 10, 15 MHz @ 15.36 Ms/s + Ncp >>= 1; + dftlen >>= 1; + break; + + case 30720: + // 20, 25, 30 MHz @ 30.72 Ms/s + Ncp = Ncp; + dftlen = dftlen; + break; + + case 46080: + // 40 MHz @ 46.08 Ms/s + Ncp = (Ncp*3)/2; + dftlen = (dftlen*3)/2; + break; + + case 61440: + // 40, 50, 60 MHz @ 61.44 Ms/s + Ncp <<= 1; + dftlen <<= 1; + break; + + case 92160: + // 50, 60, 70, 80, 90 MHz @ 92.16 Ms/s + Ncp *= 3; + dftlen *= 3; + break; + + case 122880: + // 70, 80, 90, 100 MHz @ 122.88 Ms/s + Ncp <<= 2; + dftlen <<= 2; + break; + + default: + AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu); + } + + const idft_size_idx_t dftsize = get_dft(dftlen); + // Do forward transform if (LOG_DEBUGFLAG(PRACH)) { - LOG_D(PHY,"rx_prach: Doing PRACH FFT for nb_rx:%d Ncp:%d\n",ru->nb_rx, Ncp); + LOG_D(PHY, "rx_prach: Doing PRACH FFT for nb_rx:%d Ncp:%d dftlen:%d\n", ru->nb_rx, Ncp, dftlen); } - // Note: Assumes PUSCH SCS @ 30 kHz, take values for formats 0-2 and adjust for others below int kbar = 1; @@ -299,357 +385,13 @@ void rx_nr_prach_ru(RU_t *ru, k*=K; k+=kbar; - int reps=1; - for (int aa=0; aa<ru->nb_rx; aa++) { AssertFatal(prach[aa]!=NULL,"prach[%d] is null\n",aa); // do DFT - if (mu==1) { - switch(fp->samples_per_subframe) { - case 15360: - // 10, 15 MHz @ 15.36 Ms/s - prach2 = prach[aa] + (1*Ncp); // Ncp is for 30.72 Ms/s, so divide by 2 to bring to 15.36 Ms/s and multiply by 2 for I/Q - if (prach_sequence_length == 0) { - if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) { - dftlen=12288; - dft(DFT_12288,prach2,rxsigF[aa],1); - } - if (prachFormat == 1 || prachFormat == 2) { - dft(DFT_12288,prach2+24576,rxsigF[aa]+24576,1); - reps++; - } - if (prachFormat == 2) { - dft(DFT_12288,prach2+(24576*2),rxsigF[aa]+(24576*2),1); - dft(DFT_12288,prach2+(24576*3),rxsigF[aa]+(24576*3),1); - reps+=2; - } - if (prachFormat == 3) { - dftlen=3072; - for (int i=0;i<4;i++) dft(DFT_3072,prach2+(i*3072*2),rxsigF[aa]+(i*3072*2),1); - reps=4; - } - } else { // 839 sequence - if (prachStartSymbol == 0) prach2+=16; // 8 samples @ 15.36 Ms/s in first symbol of each half subframe (15/30 kHz only) - - dftlen=512; - dft(DFT_512,prach2,rxsigF[aa],1); - if (prachFormat != 9/*C0*/) { - dft(DFT_512,prach2+1024,rxsigF[aa]+1024,1); - reps++; - } - if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) { - dft(DFT_512,prach2+1024*2,rxsigF[aa]+1024*2,1); - dft(DFT_512,prach2+1024*3,rxsigF[aa]+1024*3,1); - reps+=2; - } - if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) { - dft(DFT_512,prach2+1024*4,rxsigF[aa]+1024*4,1); - dft(DFT_512,prach2+1024*5,rxsigF[aa]+1024*5,1); - reps+=2; - } - if (prachFormat == 8/*B4*/) { - for (int i=6;i<12;i++) dft(DFT_512,prach2+(1024*i),rxsigF[aa]+(1024*i),1); - reps+=6; - } - } - break; - - case 30720: - // 20, 25, 30 MHz @ 30.72 Ms/s - prach2 = prach[aa] + (2*Ncp); // Ncp is for 30.72 Ms/s, so just multiply by 2 for I/Q - if (prach_sequence_length == 0) { - if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) { - dftlen=24576; - dft(DFT_24576,prach2,rxsigF[aa],1); - } - if (prachFormat == 1 || prachFormat == 2) { - dft(DFT_24576,prach2+49152,rxsigF[aa]+49152,1); - reps++; - } - if (prachFormat == 2) { - dft(DFT_24576,prach2+(49152*2),rxsigF[aa]+(49152*2),1); - dft(DFT_24576,prach2+(49152*3),rxsigF[aa]+(49152*3),1); - reps+=2; - } - if (prachFormat == 3) { - dftlen=6144; - for (int i=0;i<4;i++) dft(DFT_6144,prach2+(i*6144*2),rxsigF[aa]+(i*6144*2),1); - reps=4; - } - } else { // 839 sequence - if (prachStartSymbol == 0) prach2+=32; // 16 samples @ 30.72 Ms/s in first symbol of each half subframe (15/30 kHz only) - - dftlen=1024; - dft(DFT_1024,prach2,rxsigF[aa],1); - if (prachFormat != 9/*C0*/) { - dft(DFT_1024,prach2+2048,rxsigF[aa]+2048,1); - reps++; - } - if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) { - dft(DFT_1024,prach2+2048*2,rxsigF[aa]+2048*2,1); - dft(DFT_1024,prach2+2048*3,rxsigF[aa]+2048*3,1); - reps+=2; - } - if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) { - dft(DFT_1024,prach2+2048*4,rxsigF[aa]+2048*4,1); - dft(DFT_1024,prach2+2048*5,rxsigF[aa]+2048*5,1); - reps+=2; - } - if (prachFormat == 8/*B4*/) { - for (int i=6;i<12;i++) dft(DFT_1024,prach2+(2048*i),rxsigF[aa]+(2048*i),1); - reps+=6; - } - } - break; - - case 61440: - // 40, 50, 60 MHz @ 61.44 Ms/s - prach2 = prach[aa] + (4*Ncp); // Ncp is for 30.72 Ms/s, so multiply by 2 for I/Q, and 2 to bring to 61.44 Ms/s - if (prach_sequence_length == 0) { - if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) { - dftlen=49152; - dft(DFT_49152,prach2,rxsigF[aa],1); - } - if (prachFormat == 1 || prachFormat == 2) { - dft(DFT_49152,prach2+98304,rxsigF[aa]+98304,1); - reps++; - } - if (prachFormat == 2) { - dft(DFT_49152,prach2+(98304*2),rxsigF[aa]+(98304*2),1); - dft(DFT_49152,prach2+(98304*3),rxsigF[aa]+(98304*3),1); - reps+=2; - } - if (prachFormat == 3) { - dftlen=12288; - for (int i=0;i<4;i++) dft(DFT_12288,prach2+(i*12288*2),rxsigF[aa]+(i*12288*2),1); - reps=4; - } - } else { // 839 sequence - if (prachStartSymbol == 0) prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe (15/30 kHz only) - - dftlen=2048; - dft(DFT_2048,prach2,rxsigF[aa],1); - if (prachFormat != 9/*C0*/) { - dft(DFT_2048,prach2+4096,rxsigF[aa]+4096,1); - reps++; - } - if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) { - dft(DFT_2048,prach2+4096*2,rxsigF[aa]+4096*2,1); - dft(DFT_2048,prach2+4096*3,rxsigF[aa]+4096*3,1); - reps+=2; - } - if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) { - dft(DFT_2048,prach2+4096*4,rxsigF[aa]+4096*4,1); - dft(DFT_2048,prach2+4096*5,rxsigF[aa]+4096*5,1); - reps+=2; - } - if (prachFormat == 8/*B4*/) { - for (int i=6;i<12;i++) dft(DFT_2048,prach2+(4096*i),rxsigF[aa]+(4096*i),1); - reps+=6; - } - } - break; - - case 46080: - // 40 MHz @ 46.08 Ms/s - prach2 = prach[aa] + (3*Ncp); // 46.08 is 1.5 * 30.72, times 2 for I/Q - if (prach_sequence_length == 0) { - if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) { - dftlen=36864; - dft(DFT_36864,prach2,rxsigF[aa],1); - } - if (prachFormat == 1 || prachFormat == 2) { - dft(DFT_36864,prach2+73728,rxsigF[aa]+73728,1); - reps++; - } - if (prachFormat == 2) { - dft(DFT_36864,prach2+(73728*2),rxsigF[aa]+(73728*2),1); - dft(DFT_36864,prach2+(73728*3),rxsigF[aa]+(73728*3),1); - reps+=2; - } - if (prachFormat == 3) { - dftlen=9216; - for (int i=0;i<4;i++) dft(DFT_9216,prach2+(i*9216*2),rxsigF[aa]+(i*9216*2),1); - reps=4; - } - } else { // 839 sequence - if (prachStartSymbol == 0) prach2+=48; // 24 samples @ 46.08 Ms/s in first symbol of each half subframe (15/30 kHz only) - - dftlen=1536; - dft(DFT_1536,prach2,rxsigF[aa],1); - if (prachFormat != 9/*C0*/) { - dft(DFT_1536,prach2+3072,rxsigF[aa]+3072,1); - reps++; - } - if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) { - dft(DFT_1536,prach2+3072*2,rxsigF[aa]+3072*2,1); - dft(DFT_1536,prach2+3072*3,rxsigF[aa]+3072*3,1); - reps+=2; - } - if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) { - dft(DFT_1536,prach2+3072*4,rxsigF[aa]+3072*4,1); - dft(DFT_1536,prach2+3072*5,rxsigF[aa]+3072*5,1); - reps+=2; - } - if (prachFormat == 8/*B4*/) { - for (int i=6;i<12;i++) dft(DFT_1536,prach2+(3072*i),rxsigF[aa]+(3072*i),1); - reps+=6; - } - } - break; - - case 122880: - // 70, 80, 90, 100 MHz @ 122.88 Ms/s - prach2 = prach[aa] + (8*Ncp); - if (prach_sequence_length == 0) { - if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) { - dftlen=98304; - dft(DFT_98304,prach2,rxsigF[aa],1); - } - if (prachFormat == 1 || prachFormat == 2) { - dft(DFT_98304,prach2+196608,rxsigF[aa]+196608,1); - reps++; - } - if (prachFormat == 2) { - dft(DFT_98304,prach2+(196608*2),rxsigF[aa]+(196608*2),1); - dft(DFT_98304,prach2+(196608*3),rxsigF[aa]+(196608*3),1); - reps+=2; - } - if (prachFormat == 3) { - dftlen=24576; - for (int i=0;i<4;i++) dft(DFT_24576,prach2+(i*2*24576),rxsigF[aa]+(i*2*24576),1); - reps=4; - } - } else { // 839 sequence - if (prachStartSymbol == 0) prach2+=128; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only) - - dftlen=4096; - dft(DFT_4096,prach2,rxsigF[aa],1); - if (prachFormat != 9/*C0*/) { - dft(DFT_4096,prach2+8192,rxsigF[aa]+8192,1); - reps++; - } - - if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) { - dft(DFT_4096,prach2+8192*2,rxsigF[aa]+8192*2,1); - dft(DFT_4096,prach2+8192*3,rxsigF[aa]+8192*3,1); - reps+=2; - } - if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) { - dft(DFT_4096,prach2+8192*4,rxsigF[aa]+8192*4,1); - dft(DFT_4096,prach2+8192*5,rxsigF[aa]+8192*5,1); - reps+=2; - } - if (prachFormat == 8/*B4*/) { - for (int i=6;i<12;i++) dft(DFT_4096,prach2+(8192*i),rxsigF[aa]+(8192*i),1); - reps+=6; - } - } - break; - - case 92160: - // 80, 90 MHz @ 92.16 Ms/s - prach2 = prach[aa] + (6*Ncp); - if (prach_sequence_length == 0) { - if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) { - dftlen=73728; - dft(DFT_73728,prach2,rxsigF[aa],1); - } - if (prachFormat == 1 || prachFormat == 2) { - dft(DFT_73728,prach2+147456,rxsigF[aa]+147456,1); - reps++; - } - if (prachFormat == 2) { - dft(DFT_73728,prach2+(147456*2),rxsigF[aa]+(147456*2),1); - dft(DFT_73728,prach2+(147456*3),rxsigF[aa]+(147456*3),1); - reps+=2; - } - if (prachFormat == 3) { - dftlen=18432; - for (int i=0;i<4;i++) dft(DFT_18432,prach2+(i*2*18432),rxsigF[aa]+(i*2*18432),1); - reps=4; - } - } else { - if (prachStartSymbol == 0) prach2+=96; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only) - - dftlen=3072; - dft(DFT_3072,prach2,rxsigF[aa],1); - if (prachFormat != 9/*C0*/) { - dft(DFT_3072,prach2+6144,rxsigF[aa]+6144,1); - reps++; - } - - if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) { - dft(DFT_3072,prach2+6144*2,rxsigF[aa]+6144*2,1); - dft(DFT_3072,prach2+6144*3,rxsigF[aa]+6144*3,1); - reps+=2; - } - if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) { - dft(DFT_3072,prach2+6144*4,rxsigF[aa]+6144*4,1); - dft(DFT_3072,prach2+6144*5,rxsigF[aa]+6144*5,1); - reps+=2; - } - if (prachFormat == 8/*B4*/) { - for (int i=6;i<12;i++) dft(DFT_3072,prach2+(6144*i),rxsigF[aa]+(6144*i),1); - reps+=6; - } - } - break; - default: - AssertFatal(1==0,"sample_rate %f MHz not support for NR PRACH yet\n", fp->samples_per_subframe / 1000.0); - } - } - else if (mu==3) { - if (fp->threequarter_fs) { - AssertFatal(1==0,"3/4 sampling not supported for numerology %d\n",mu); - } - if (prach_sequence_length == 0) { - AssertFatal(1==0,"long prach not supported for numerology %d\n",mu); - } - if (fp->N_RB_UL == 32) { - prach2 = prach[aa] + (Ncp<<2); // Ncp is for 30.72 Ms/s, so multiply by 2 for I/Q, and 2 for 61.44Msps - if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0) - prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe - dftlen=512; - dftsize = DFT_512; - } - else if (fp->N_RB_UL == 66) { - prach2 = prach[aa] + (Ncp<<3); // Ncp is for 30.72 Ms/s, so multiply by 4 for I/Q, and 2 for 122.88Msps - if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0) - prach2+=128; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe - dftlen=1024; - dftsize = DFT_1024; - } - else { - AssertFatal(1==0,"N_RB_UL %d not support for numerology %d\n",fp->N_RB_UL,mu); - } - - dft(dftsize,prach2,rxsigF[aa],1); - if (prachFormat != 9/*C0*/) { - dft(dftsize,prach2+dftlen*2,rxsigF[aa]+dftlen*2,1); - reps++; - } - - if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) { - dft(dftsize,prach2+dftlen*4,rxsigF[aa]+dftlen*4,1); - dft(dftsize,prach2+dftlen*6,rxsigF[aa]+dftlen*6,1); - reps+=2; - } - if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) { - dft(dftsize,prach2+dftlen*8,rxsigF[aa]+dftlen*8,1); - dft(dftsize,prach2+dftlen*10,rxsigF[aa]+dftlen*10,1); - reps+=2; - } - if (prachFormat == 8/*B4*/) { - for (int i=6;i<12;i++) - dft(dftsize,prach2+(dftlen*2*i),rxsigF[aa]+(dftlen*2*i),1); - reps+=6; - } - } - else { - AssertFatal(1==0,"Numerology not supported\n"); - } + int16_t *prach2 = prach[aa] + (2*Ncp); // times 2 for complex samples + for (int i = 0; i < reps; i++) + dft(dftsize, prach2 + 2*dftlen*i, rxsigF[aa] + 2*dftlen*i, 1); //LOG_M("ru_rxsigF_tmp.m","rxsFtmp", rxsigF[aa], dftlen*2*reps, 1, 1); diff --git a/openair1/PHY/NR_TRANSPORT/nr_scrambling.c b/openair1/PHY/NR_TRANSPORT/nr_scrambling.c index 4bbecfd994d..8a49a7ffe0d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_scrambling.c +++ b/openair1/PHY/NR_TRANSPORT/nr_scrambling.c @@ -52,6 +52,7 @@ void nr_codeword_scrambling(uint8_t *in, ((uint16_t*)&in32)[0] = _mm_movemask_epi8(_mm_slli_epi16(in128[0],7)); ((uint16_t*)&in32)[1] = _mm_movemask_epi8(_mm_slli_epi16(in128[1],7)); out[i]=(in32^s); + LOG_D(PHY,"in[%d] %x => %x\n",i,in32,out[i]); s=lte_gold_generic(&x1, &x2, 0); } //#elsif defined(__arm__) || defined(__aarch64) diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h index 2daf2af1fb8..74d19bf6f61 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h @@ -60,14 +60,6 @@ uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch, uint8_t nb_re_dmrs, uint uint32_t nr_get_E(uint32_t G, uint8_t C, uint8_t Qm, uint8_t Nl, uint8_t r); -uint8_t nr_get_Qm_ul(uint8_t Imcs, uint8_t table_idx); - -uint8_t nr_get_Qm_dl(uint8_t Imcs, uint8_t table_idx); - -uint32_t nr_get_code_rate_ul(uint8_t Imcs, uint8_t table_idx); - -uint32_t nr_get_code_rate_dl(uint8_t Imcs, uint8_t table_idx); - void compute_nr_prach_seq(uint8_t short_sequence, uint8_t num_sequences, uint8_t rootSequenceIndex, diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h index d22f3fe2c4f..0b81f5322df 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h @@ -144,21 +144,22 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, @param nb_rb_pusch The number of RBs allocated (used for Resource Allocation Type 1 in NR) @param frame_parms, Pointer to frame descriptor structure */ -void nr_ulsch_extract_rbs_single(int32_t **rxdataF, - NR_gNB_PUSCH *pusch_vars, - int slot, - unsigned char symbol, - uint8_t is_dmrs_symbol, - nfapi_nr_pusch_pdu_t *pusch_pdu, - NR_DL_FRAME_PARMS *frame_parms); +void nr_ulsch_extract_rbs(int32_t **rxdataF, + NR_gNB_PUSCH *pusch_vars, + int slot, + unsigned char symbol, + uint8_t is_dmrs_symbol, + nfapi_nr_pusch_pdu_t *pusch_pdu, + NR_DL_FRAME_PARMS *frame_parms); void nr_ulsch_scale_channel(int32_t **ul_ch_estimates_ext, NR_DL_FRAME_PARMS *frame_parms, NR_gNB_ULSCH_t *ulsch_gNB, - uint8_t symbol, - uint8_t start_symbol, - uint16_t nb_rb, - pusch_dmrs_type_t pusch_dmrs_type); + uint8_t symbol, + uint8_t is_dmrs_symbol, + uint32_t len, + uint8_t nrOfLayers, + uint16_t nb_rb); /** \brief This function computes the average channel level over all allocated RBs and antennas (TX/RX) in order to compute output shift for compensated signal @param ul_ch_estimates_ext Channel estimates in allocated RBs @@ -192,9 +193,10 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, int **ul_ch_mag, int **ul_ch_magb, int **rxdataF_comp, - int **rho, + int ***rho, NR_DL_FRAME_PARMS *frame_parms, unsigned char symbol, + int length, uint8_t is_dmrs_symbol, unsigned char mod_order, uint8_t nrOfLayers, @@ -262,8 +264,8 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp, @param mod_order modulation order */ void nr_ulsch_compute_llr(int32_t *rxdataF_comp, - int32_t **ul_ch_mag, - int32_t **ul_ch_magb, + int32_t *ul_ch_mag, + int32_t *ul_ch_magb, int16_t *ulsch_llr, uint32_t nb_rb, uint32_t nb_re, @@ -336,17 +338,27 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, int slot, nfapi_nr_srs_pdu_t *srs_pdu, nr_srs_info_t *nr_srs_info, - int32_t **srs_received_signal); + int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)]); void init_prach_list(PHY_VARS_gNB *gNB); void init_prach_ru_list(RU_t *ru); void free_nr_ru_prach_entry(RU_t *ru, int prach_id); uint8_t get_nr_prach_duration(uint8_t prach_format); -void nr_generate_csi_rs(PHY_VARS_gNB *gNB, - int16_t amp, - nfapi_nr_dl_tti_csi_rs_pdu_rel15_t csi_params, - int slot); +void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms, + int32_t **dataF, + const int16_t amp, + nr_csi_info_t *nr_csi_info, + const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params, + const int slot, + uint8_t *N_cdm_groups, + uint8_t *CDM_group_size, + uint8_t *k_prime, + uint8_t *l_prime, + uint8_t *N_ports, + uint8_t *j_cdm, + uint8_t *k_overline, + uint8_t *l_overline); void free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id); diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c index 3e3137739e2..e56a4607e2d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c @@ -68,12 +68,20 @@ void nr_fill_ulsch(PHY_VARS_gNB *gNB, ulsch->rnti = ulsch_pdu->rnti; //ulsch->rnti_type; ulsch->harq_mask |= 1<<harq_pid; - ulsch->harq_process_id[slot] = harq_pid; - ulsch->harq_processes[harq_pid]->frame=frame; - ulsch->harq_processes[harq_pid]->slot=slot; - ulsch->harq_processes[harq_pid]->handled= 0; - ulsch->harq_processes[harq_pid]->status= NR_ACTIVE; + NR_UL_gNB_HARQ_t *harq = ulsch->harq_processes[harq_pid]; + harq->frame=frame; + harq->slot=slot; + harq->handled = 0; + harq->status= NR_ACTIVE; + harq->new_rx = harq->ndi != ulsch_pdu->pusch_data.new_data_indicator; + if (harq->new_rx) { + harq->ndi = ulsch_pdu->pusch_data.new_data_indicator; + harq->round = 0; + } else { + harq->round++; + } + memcpy((void*)&ulsch->harq_processes[harq_pid]->ulsch_pdu, (void*)ulsch_pdu, sizeof(nfapi_nr_pusch_pdu_t)); LOG_D(PHY,"Initializing nFAPI for ULSCH, UE %d, harq_pid %d\n",ulsch_id,harq_pid); @@ -85,6 +93,33 @@ void nr_ulsch_unscrambling(int16_t* llr, uint32_t size, uint32_t Nid, uint32_t n nr_codeword_unscrambling(llr, size, 0, Nid, n_RNTI); } +void nr_ulsch_layer_demapping(int16_t *llr_cw, + uint8_t Nl, + uint8_t mod_order, + uint32_t length, + int16_t **llr_layers) +{ + + switch (Nl) { + case 1: + memcpy((void*)llr_cw, (void*)llr_layers[0], (length)*sizeof(int16_t)); + break; + case 2: + case 3: + case 4: + for (int i=0; i<(length/Nl/mod_order); i++) { + for (int l=0; l<Nl; l++) { + for (int m=0; m<mod_order; m++) { + llr_cw[i*Nl*mod_order+l*mod_order+m] = llr_layers[l][i*mod_order+m]; + } + } + } + break; + default: + AssertFatal(0, "Not supported number of layers %d\n", Nl); + } +} + void dump_pusch_stats(FILE *fd,PHY_VARS_gNB *gNB) { for (int i=0;i<gNB->number_of_nr_ulsch_max;i++) { diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch.h b/openair1/PHY/NR_TRANSPORT/nr_ulsch.h index 0791fd2bbc6..c7229bc5d07 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch.h @@ -71,6 +71,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, void nr_ulsch_unscrambling(int16_t* llr, uint32_t size, uint32_t Nid, uint32_t n_RNTI); +void nr_ulsch_layer_demapping(int16_t *llr_cw, + uint8_t Nl, + uint8_t mod_order, + uint32_t length, + int16_t **llr_layers); + void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 39f14b05f89..ef5c0c069e0 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -57,8 +57,7 @@ void free_gNB_ulsch(NR_gNB_ULSCH_t **ulschptr, uint16_t N_RB_UL) { - int i,r; - uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS; //number of segments to be allocated + uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*NR_MAX_NB_LAYERS; //number of segments to be allocated NR_gNB_ULSCH_t *ulsch = *ulschptr; if (N_RB_UL != 273) { @@ -66,17 +65,18 @@ void free_gNB_ulsch(NR_gNB_ULSCH_t **ulschptr, uint16_t N_RB_UL) a_segments = a_segments/273 +1; } - for (i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) { + for (int i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) { if (ulsch->harq_processes[i]) { if (ulsch->harq_processes[i]->b) { free_and_zero(ulsch->harq_processes[i]->b); ulsch->harq_processes[i]->b = NULL; } - for (r=0; r<a_segments; r++) { + for (int r=0; r<a_segments; r++) { free_and_zero(ulsch->harq_processes[i]->c[r]); free_and_zero(ulsch->harq_processes[i]->d[r]); - free_and_zero(ulsch->harq_processes[i]->w[r]); } + free_and_zero(ulsch->harq_processes[i]->c); + free_and_zero(ulsch->harq_processes[i]->d); free_and_zero(ulsch->harq_processes[i]); ulsch->harq_processes[i] = NULL; } @@ -90,7 +90,7 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations, uint16_t N_RB_UL) NR_gNB_ULSCH_t *ulsch; uint8_t i,r; - uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS; //number of segments to be allocated + uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*NR_MAX_NB_LAYERS; //number of segments to be allocated if (N_RB_UL != 273) { a_segments = a_segments*N_RB_UL; @@ -101,16 +101,16 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations, uint16_t N_RB_UL) ulsch = (NR_gNB_ULSCH_t *)malloc16_clear(sizeof(NR_gNB_ULSCH_t)); ulsch->max_ldpc_iterations = max_ldpc_iterations; - ulsch->Mlimit = 4; for (i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) { ulsch->harq_processes[i] = (NR_UL_gNB_HARQ_t *)malloc16_clear(sizeof(NR_UL_gNB_HARQ_t)); ulsch->harq_processes[i]->b = (uint8_t*)malloc16_clear(ulsch_bytes); + ulsch->harq_processes[i]->c = (uint8_t**)malloc16_clear(a_segments*sizeof(uint8_t *)); + ulsch->harq_processes[i]->d = (int16_t**)malloc16_clear(a_segments*sizeof(int16_t *)); for (r=0; r<a_segments; r++) { ulsch->harq_processes[i]->c[r] = (uint8_t*)malloc16_clear(8448*sizeof(uint8_t)); ulsch->harq_processes[i]->d[r] = (int16_t*)malloc16_clear((68*384)*sizeof(int16_t)); - ulsch->harq_processes[i]->w[r] = (int16_t*)malloc16_clear((3*(6144+64))*sizeof(int16_t)); } } @@ -135,10 +135,8 @@ void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch) ulsch->rnti_type = 0; ulsch->cyclicShift = 0; ulsch->cooperation_flag = 0; - ulsch->Mlimit = 0; ulsch->max_ldpc_iterations = 0; ulsch->last_iteration_cnt = 0; - for (i=0;i<NR_MAX_SLOTS_PER_FRAME;i++) ulsch->harq_process_id[i] = 0; for (i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) { if (ulsch->harq_processes[i]){ @@ -168,8 +166,6 @@ void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch) ulsch->harq_processes[i]->C=0; /// Pointers to code blocks after LDPC coding (38.212 V15.4.0 section 5.3.2) //int16_t *d[MAX_NUM_NR_ULSCH_SEGMENTS]; - /// LDPC processing buffer - //t_nrLDPC_procBuf* p_nrLDPC_procBuf[MAX_NUM_NR_ULSCH_SEGMENTS]; ulsch->harq_processes[i]->Z=0; /// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1) //int16_t e[MAX_NUM_NR_ULSCH_SEGMENTS][3*8448]; @@ -234,7 +230,6 @@ void nr_processULSegment(void* arg) { int rv_index = rdata->rv_index; int r_offset = rdata->r_offset; uint8_t kc = rdata->Kc; - uint32_t Tbslbrm = rdata->Tbslbrm; short* ulsch_llr = rdata->ulsch_llr; int max_ldpc_iterations = p_decoderParms->numMaxIter; int8_t llrProcBuf[OAI_UL_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))); @@ -244,8 +239,6 @@ void nr_processULSegment(void* arg) { __m128i *pv = (__m128i*)&z; __m128i *pl = (__m128i*)&l; - - uint8_t Ilbrm = 0; Kr = ulsch_harq->K; Kr_bytes = Kr>>3; @@ -262,9 +255,12 @@ void nr_processULSegment(void* arg) { //////////////////////////// ulsch_llr =====> ulsch_harq->e ////////////////////////////// + /// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1) + int16_t harq_e[3*8448]; + nr_deinterleaving_ldpc(E, Qm, - ulsch_harq->e[r], + harq_e, ulsch_llr+r_offset); //for (int i =0; i<16; i++) @@ -273,16 +269,7 @@ void nr_processULSegment(void* arg) { stop_meas(&phy_vars_gNB->ulsch_deinterleaving_stats); - /*LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n", - harq_pid,r, G, - Kr*3, - ulsch_harq->TBS, - Qm, - nb_rb, - n_layers, - pusch_pdu->pusch_data.rv_index, - ulsch_harq->round);*/ - ////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////// @@ -293,12 +280,11 @@ void nr_processULSegment(void* arg) { //start_meas(&phy_vars_gNB->ulsch_rate_unmatching_stats); - if (nr_rate_matching_ldpc_rx(Ilbrm, - Tbslbrm, + if (nr_rate_matching_ldpc_rx(rdata->tbslbrm, p_decoderParms->BG, p_decoderParms->Z, ulsch_harq->d[r], - ulsch_harq->e[r], + harq_e, ulsch_harq->C, rv_index, ulsch_harq->new_rx, @@ -361,13 +347,13 @@ void nr_processULSegment(void* arg) { if (check_crc((uint8_t*)llrProcBuf,length_dec,ulsch_harq->F,crc_type)) { #ifdef PRINT_CRC_CHECK - LOG_I(PHY, "Segment %d CRC OK, iterations %d/%d\n",r,no_iteration_ldpc,max_ldpc_iterations); + LOG_I(PHY,"Segment %d CRC OK, iterations %d/%d\n",r,no_iteration_ldpc,max_ldpc_iterations); #endif rdata->decodeIterations = no_iteration_ldpc; if (rdata->decodeIterations > p_decoderParms->numMaxIter) rdata->decodeIterations--; } else { #ifdef PRINT_CRC_CHECK - LOG_I(PHY, "CRC NOK\n"); + LOG_I(PHY,"CRC NOK\n"); #endif rdata->decodeIterations = max_ldpc_iterations + 1; } @@ -394,7 +380,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, uint32_t r_offset; uint32_t offset; int kc; - int Tbslbrm; int E; #ifdef PRINT_CRC_CHECK @@ -419,13 +404,10 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, phy_vars_gNB->nbDecode = 0; harq_process->processedSegments = 0; - - double Coderate = 0.0; // ------------------------------------------------------------------ uint16_t nb_rb = pusch_pdu->rb_size; uint8_t Qm = pusch_pdu->qam_mod_order; - uint16_t R = pusch_pdu->target_code_rate; uint8_t mcs = pusch_pdu->mcs_index; uint8_t n_layers = pusch_pdu->nrOfLayers; // ------------------------------------------------------------------ @@ -454,13 +436,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, A = (harq_process->TBS)<<3; - LOG_D(NR_PHY, "ULSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_rb %d, Qm %d, n_layers %d, Coderate %d\n", harq_pid, A, G, mcs, n_layers, nb_rb, Qm, n_layers, R); + // target_code_rate is in 0.1 units + float Coderate = (float) pusch_pdu->target_code_rate / 10240.0f; + + LOG_D(PHY,"ULSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_rb %d, Qm %d, Coderate %f RV %d round %d\n", + harq_pid, A, G, mcs, n_layers, nb_rb, Qm, Coderate, pusch_pdu->pusch_data.rv_index, harq_process->round); - if (R<1024) - Coderate = (float) R /(float) 1024; - else - Coderate = (float) R /(float) 2048; - if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25){ p_decParams->BG = 2; kc = 52; @@ -539,7 +520,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, if (!frame%100) printf("K %d C %d Z %d \n", harq_process->K, harq_process->C, harq_process->Z); #endif - Tbslbrm = nr_compute_tbslbrm(0,nb_rb,n_layers); p_decParams->Z = harq_process->Z; @@ -549,7 +529,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, r_offset = 0; - uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS; //number of segments to be allocated + uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*n_layers; //number of segments to be allocated if (nb_rb != 273) { a_segments = a_segments*nb_rb; @@ -590,10 +570,10 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, rdata->r_offset = r_offset; rdata->Kr_bytes = Kr_bytes; rdata->rv_index = pusch_pdu->pusch_data.rv_index; - rdata->Tbslbrm = Tbslbrm; rdata->offset = offset; rdata->ulsch = ulsch; rdata->ulsch_id = ULSCH_id; + rdata->tbslbrm = pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes; pushTpool(phy_vars_gNB->threadPool,req); phy_vars_gNB->nbDecode++; LOG_D(PHY,"Added a block to decode, in pipe: %d\n",phy_vars_gNB->nbDecode); diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index 44f4dd8bfc1..4b8315e1ce4 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -302,36 +302,32 @@ void nr_idft(int32_t *z, uint32_t Msc_PUSCH) } -void nr_ulsch_extract_rbs_single(int32_t **rxdataF, - NR_gNB_PUSCH *pusch_vars, - int slot, - unsigned char symbol, - uint8_t is_dmrs_symbol, - nfapi_nr_pusch_pdu_t *pusch_pdu, - NR_DL_FRAME_PARMS *frame_parms) -{ +void nr_ulsch_extract_rbs(int32_t **rxdataF, + NR_gNB_PUSCH *pusch_vars, + int slot, + unsigned char symbol, + uint8_t is_dmrs_symbol, + nfapi_nr_pusch_pdu_t *pusch_pdu, + NR_DL_FRAME_PARMS *frame_parms) { unsigned short start_re, re, nb_re_pusch; - unsigned char aarx; + unsigned char aarx, aatx; uint32_t rxF_ext_index = 0; uint32_t ul_ch0_ext_index = 0; uint32_t ul_ch0_index = 0; - uint8_t k_prime; - uint16_t n; int16_t *rxF,*rxF_ext; int *ul_ch0,*ul_ch0_ext; - uint8_t delta = 0; int soffset = (slot&3)*frame_parms->symbols_per_slot*frame_parms->ofdm_symbol_size; -#ifdef DEBUG_RB_EXT +#ifdef DEBUG_RB_EXT printf("--------------------symbol = %d-----------------------\n", symbol); printf("--------------------ch_ext_index = %d-----------------------\n", symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size); - #endif - uint8_t is_dmrs_re; + uint8_t is_data_re; start_re = (frame_parms->first_carrier_offset + (pusch_pdu->rb_start + pusch_pdu->bwp_start) * NR_NB_SC_PER_RB)%frame_parms->ofdm_symbol_size; nb_re_pusch = NR_NB_SC_PER_RB * pusch_pdu->rb_size; + #ifdef __AVX2__ int nb_re_pusch2 = nb_re_pusch + (nb_re_pusch&7); #else @@ -340,62 +336,64 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF, for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) { - rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol * frame_parms->ofdm_symbol_size)]; - rxF_ext = (int16_t *)&pusch_vars->rxdataF_ext[aarx][symbol * nb_re_pusch2]; // [hna] rxdataF_ext isn't contiguous in order to solve an alignment problem ib llr computation in case of mod_order = 4, 6 - - ul_ch0 = &pusch_vars->ul_ch_estimates[aarx][pusch_vars->dmrs_symbol*frame_parms->ofdm_symbol_size]; // update channel estimates if new dmrs symbol are available - - ul_ch0_ext = &pusch_vars->ul_ch_estimates_ext[aarx][symbol*nb_re_pusch2]; - - n = 0; - k_prime = 0; - rxF_ext_index = 0; - ul_ch0_ext_index = 0; - ul_ch0_index = 0; - + rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol * frame_parms->ofdm_symbol_size)]; + rxF_ext = (int16_t *)&pusch_vars->rxdataF_ext[aarx][symbol * nb_re_pusch2]; // [hna] rxdataF_ext isn't contiguous in order to solve an alignment problem ib llr computation in case of mod_order = 4, 6 + if (is_dmrs_symbol == 0) { - // - //rxF[ ((start_re + re)*2) % (frame_parms->ofdm_symbol_size*2)]); if (start_re + nb_re_pusch <= frame_parms->ofdm_symbol_size) { - memcpy1((void*)rxF_ext, - (void*)&rxF[start_re*2], - nb_re_pusch*sizeof(int32_t)); + memcpy1((void*)rxF_ext, (void*)&rxF[start_re*2], nb_re_pusch*sizeof(int32_t)); } else { - int neg_length = frame_parms->ofdm_symbol_size-start_re; - int pos_length = nb_re_pusch-neg_length; - - memcpy1((void*)rxF_ext,(void*)&rxF[start_re*2],neg_length*sizeof(int32_t)); - memcpy1((void*)&rxF_ext[2*neg_length],(void*)rxF,pos_length*sizeof(int32_t)); + int neg_length = frame_parms->ofdm_symbol_size-start_re; + int pos_length = nb_re_pusch-neg_length; + memcpy1((void*)rxF_ext,(void*)&rxF[start_re*2],neg_length*sizeof(int32_t)); + memcpy1((void*)&rxF_ext[2*neg_length],(void*)rxF,pos_length*sizeof(int32_t)); } - memcpy1((void*)ul_ch0_ext,(void*)ul_ch0,nb_re_pusch*sizeof(int32_t)); - } - else { - for (re = 0; re < nb_re_pusch; re++) { - is_dmrs_re = (re == get_dmrs_freq_idx_ul(n, k_prime, delta, pusch_pdu->dmrs_config_type)); + for (aatx = 0; aatx < pusch_pdu->nrOfLayers; aatx++) { + ul_ch0 = &pusch_vars->ul_ch_estimates[aatx*frame_parms->nb_antennas_rx+aarx][pusch_vars->dmrs_symbol*frame_parms->ofdm_symbol_size]; // update channel estimates if new dmrs symbol are available + ul_ch0_ext = &pusch_vars->ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*nb_re_pusch2]; + memcpy1((void*)ul_ch0_ext,(void*)ul_ch0,nb_re_pusch*sizeof(int32_t)); + } -#ifdef DEBUG_RB_EXT - printf("re = %d, kprime %d, n %d, is_dmrs_symbol = %d, symbol = %d\n", re, k_prime, n, is_dmrs_symbol, symbol); -#endif + } else { - /* save only data and respective channel estimates */ - if (is_dmrs_re == 0) { - rxF_ext[rxF_ext_index] = (rxF[ ((start_re + re)*2) % (frame_parms->ofdm_symbol_size*2)]); - rxF_ext[rxF_ext_index + 1] = (rxF[(((start_re + re)*2) + 1) % (frame_parms->ofdm_symbol_size*2)]); - ul_ch0_ext[ul_ch0_ext_index] = ul_ch0[ul_ch0_index]; + for (aatx = 0; aatx < pusch_pdu->nrOfLayers; aatx++) { + ul_ch0 = &pusch_vars->ul_ch_estimates[aatx*frame_parms->nb_antennas_rx+aarx][pusch_vars->dmrs_symbol*frame_parms->ofdm_symbol_size]; // update channel estimates if new dmrs symbol are available + ul_ch0_ext = &pusch_vars->ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*nb_re_pusch2]; + + rxF_ext_index = 0; + ul_ch0_ext_index = 0; + ul_ch0_index = 0; + for (re = 0; re < nb_re_pusch; re++) { + uint16_t k = start_re + re; + is_data_re = allowed_xlsch_re_in_dmrs_symbol(k, start_re, frame_parms->ofdm_symbol_size, pusch_pdu->num_dmrs_cdm_grps_no_data, pusch_pdu->dmrs_config_type); + if (++k >= frame_parms->ofdm_symbol_size) { + k -= frame_parms->ofdm_symbol_size; + } -#ifdef DEBUG_RB_EXT - printf("dmrs symb %d: rxF_ext[%d] = (%d,%d), ul_ch0_ext[%d] = (%d,%d)\n", + #ifdef DEBUG_RB_EXT + printf("re = %d, is_dmrs_symbol = %d, symbol = %d\n", re, is_dmrs_symbol, symbol); + #endif + + // save only data and respective channel estimates + if (is_data_re == 1) { + if (aatx == 0) { + rxF_ext[rxF_ext_index] = (rxF[ ((start_re + re)*2) % (frame_parms->ofdm_symbol_size*2)]); + rxF_ext[rxF_ext_index + 1] = (rxF[(((start_re + re)*2) + 1) % (frame_parms->ofdm_symbol_size*2)]); + rxF_ext_index +=2; + } + + ul_ch0_ext[ul_ch0_ext_index] = ul_ch0[ul_ch0_index]; + ul_ch0_ext_index++; + + #ifdef DEBUG_RB_EXT + printf("dmrs symb %d: rxF_ext[%d] = (%d,%d), ul_ch0_ext[%d] = (%d,%d)\n", is_dmrs_symbol,rxF_ext_index>>1, rxF_ext[rxF_ext_index],rxF_ext[rxF_ext_index+1], ul_ch0_ext_index, ((int16_t*)&ul_ch0_ext[ul_ch0_ext_index])[0], ((int16_t*)&ul_ch0_ext[ul_ch0_ext_index])[1]); -#endif - ul_ch0_ext_index++; - rxF_ext_index +=2; - } else { - n += k_prime; - k_prime ^= 1; + #endif + } + ul_ch0_index++; } - ul_ch0_index++; } } } @@ -406,16 +404,19 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext, NR_gNB_ULSCH_t *ulsch_gNB, uint8_t symbol, uint8_t is_dmrs_symbol, - unsigned short nb_rb, - pusch_dmrs_type_t pusch_dmrs_type) + uint32_t len, + uint8_t nrOfLayers, + unsigned short nb_rb) { #if defined(__x86_64__)||defined(__i386__) short rb, ch_amp; - unsigned char aarx; + unsigned char aarx,aatx; __m128i *ul_ch128, ch_amp128; + uint32_t nb_rb_0 = len/12 + ((len%12)?1:0); + // Determine scaling amplitude based the symbol ch_amp = 1024*8; //((pilots) ? (ulsch_gNB->sqrt_rho_b) : (ulsch_gNB->sqrt_rho_a)); @@ -431,35 +432,22 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext, int off = 0; #endif - for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) { - - ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aarx][symbol*(off+(nb_rb*NR_NB_SC_PER_RB))]; - - if (is_dmrs_symbol==1){ - if (pusch_dmrs_type == pusch_dmrs_type1) - nb_rb = nb_rb>>1; - else - nb_rb = (2*nb_rb)/3; - } - - for (rb=0;rb<nb_rb;rb++) { - + for (aatx = 0; aatx < nrOfLayers; aatx++) { + for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) { + ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*NR_NB_SC_PER_RB))]; + for (rb=0;rb < nb_rb_0;rb++) { ul_ch128[0] = _mm_mulhi_epi16(ul_ch128[0], ch_amp128); ul_ch128[0] = _mm_slli_epi16(ul_ch128[0], 3); ul_ch128[1] = _mm_mulhi_epi16(ul_ch128[1], ch_amp128); ul_ch128[1] = _mm_slli_epi16(ul_ch128[1], 3); - if (is_dmrs_symbol) { - ul_ch128+=2; - } else { - ul_ch128[2] = _mm_mulhi_epi16(ul_ch128[2], ch_amp128); - ul_ch128[2] = _mm_slli_epi16(ul_ch128[2], 3); - ul_ch128+=3; - - } + ul_ch128[2] = _mm_mulhi_epi16(ul_ch128[2], ch_amp128); + ul_ch128[2] = _mm_slli_epi16(ul_ch128[2], 3); + ul_ch128+=3; } } + } #endif } @@ -481,6 +469,8 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext, int16_t x = factor2(len); int16_t y = (len)>>x; + + uint32_t nb_rb_0 = len/12 + ((len%12)?1:0); #ifdef __AVX2__ int off = ((nb_rb&1) == 1)? 4:0; @@ -488,14 +478,14 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext, int off = 0; #endif - for (aatx = 0; aatx < nrOfLayers; aatx++) + for (aatx = 0; aatx < nrOfLayers; aatx++) { for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) { //clear average level avg128U = _mm_setzero_si128(); ul_ch128=(__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))]; - for (rb = 0; rb < len/12; rb++) { + for (rb = 0; rb < nb_rb_0; rb++) { avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[0], ul_ch128[0]), x)); avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[1], ul_ch128[1]), x)); avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[2], ul_ch128[2]), x)); @@ -506,8 +496,8 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext, ((int32_t*)&avg128U)[1] + ((int32_t*)&avg128U)[2] + ((int32_t*)&avg128U)[3]) / y; - } + } _mm_empty(); _m_empty(); @@ -520,7 +510,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext, int16x4_t *ul_ch128; symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - + uint32_t nb_rb_0 = len/12 + ((len%12)?1:0); for (aatx=0; aatx<nrOfLayers; aatx++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { //clear average level @@ -529,7 +519,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext, ul_ch128 = (int16x4_t *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*frame_parms->N_RB_UL*12]; - for (rb = 0; rb < nb_rb; rb++) { + for (rb = 0; rb < nb_rb_0; rb++) { // printf("rb %d : ",rb); // print_shorts("ch",&ul_ch128[0]); avg128U = vqaddq_s32(avg128U, vmull_s16(ul_ch128[0], ul_ch128[0])); @@ -568,14 +558,20 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext, #endif } + + +//============================================================================================== +// Pre-processing for LLR computation +//============================================================================================== void nr_ulsch_channel_compensation(int **rxdataF_ext, int **ul_ch_estimates_ext, int **ul_ch_mag, int **ul_ch_magb, int **rxdataF_comp, - int **rho, + int ***rho, NR_DL_FRAME_PARMS *frame_parms, unsigned char symbol, + int length, uint8_t is_dmrs_symbol, unsigned char mod_order, uint8_t nrOfLayers, @@ -591,22 +587,21 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, #ifdef DEBUG_CH_COMP int16_t *rxF, *ul_ch; int prnt_idx; - - for (int ant=0; ant<frame_parms->nb_antennas_rx; ant++) { - rxF = (int16_t *)&rxdataF_ext[ant][symbol*(off+(nb_rb*12))]; - ul_ch = (int16_t *)&ul_ch_estimates_ext[ant][symbol*(off+(nb_rb*12))]; - - printf("--------------------symbol = %d, mod_order = %d, output_shift = %d-----------------------\n", symbol, mod_order, output_shift); - printf("----------------Before compensation------------------\n"); - - for (prnt_idx=0;prnt_idx<12*5*2;prnt_idx+=2){ - - printf("rxF[%d] = (%d,%d)\n", prnt_idx>>1, rxF[prnt_idx],rxF[prnt_idx+1]); - printf("ul_ch[%d] = (%d,%d)\n", prnt_idx>>1, ul_ch[prnt_idx],ul_ch[prnt_idx+1]); - + for (int nl=0; nl<nrOfLayers; nl++) { + for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) { + rxF = (int16_t *) &rxdataF_ext[aarx][symbol * (off + (nb_rb * 12))]; + ul_ch = (int16_t *) &ul_ch_estimates_ext[nl * frame_parms->nb_antennas_rx + aarx][symbol * (off + (nb_rb * 12))]; + + printf("--------symbol = %d, mod_order = %d, output_shift = %d, layer %i, antenna rx = %d -----------\n", + symbol, mod_order, output_shift, nl, aarx); + printf("----------------Before compensation------------------\n"); + + for (prnt_idx = 0; prnt_idx < 12 * 5 * 2; prnt_idx += 2) { + printf("rxF[%d] = (%d,%d)\n", prnt_idx >> 1, rxF[prnt_idx], rxF[prnt_idx + 1]); + printf("ul_ch[%d] = (%d,%d)\n", prnt_idx >> 1, ul_ch[prnt_idx], ul_ch[prnt_idx + 1]); + } } } - #endif #ifdef DEBUG_CH_MAG @@ -637,20 +632,20 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0}; QAM_amp128b = _mm_setzero_si128(); + uint32_t nb_rb_0 = length/12 + ((length%12)?1:0); for (aatx=0; aatx<nrOfLayers; aatx++) { - if (mod_order == 4) { QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10) QAM_amp128b = _mm_setzero_si128(); - } else if (mod_order == 6) { + } + else if (mod_order == 6) { QAM_amp128 = _mm_set1_epi16(QAM64_n1); // QAM_amp128b = _mm_set1_epi16(QAM64_n2); } // printf("comp: rxdataF_comp %p, symbol %d\n",rxdataF_comp[0],symbol); - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - + for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))]; ul_ch_mag128 = (__m128i *)&ul_ch_mag[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))]; ul_ch_mag128b = (__m128i *)&ul_ch_magb[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))]; @@ -658,7 +653,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, rxdataF_comp128 = (__m128i *)&rxdataF_comp[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))]; - for (rb=0; rb<nb_rb; rb++) { + for (rb=0; rb<nb_rb_0; rb++) { if (mod_order>2) { // get channel amplitude if not QPSK @@ -679,6 +674,8 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, ul_ch_mag128[0] = _mm_mulhi_epi16(ul_ch_mag128[0],QAM_amp128); ul_ch_mag128[0] = _mm_slli_epi16(ul_ch_mag128[0],1); + ul_ch_mag128b[0] = _mm_mulhi_epi16(ul_ch_mag128b[0],QAM_amp128b); + ul_ch_mag128b[0] = _mm_slli_epi16(ul_ch_mag128b[0],1); // print_ints("ch: = ",(int32_t*)&mmtmpD0); // print_shorts("QAM_amp:",(int16_t*)&QAM_amp128); // print_shorts("mag:",(int16_t*)&ul_ch_mag128[0]); @@ -687,30 +684,24 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, ul_ch_mag128b[1] = ul_ch_mag128[1]; ul_ch_mag128[1] = _mm_mulhi_epi16(ul_ch_mag128[1],QAM_amp128); ul_ch_mag128[1] = _mm_slli_epi16(ul_ch_mag128[1],1); + + ul_ch_mag128b[1] = _mm_mulhi_epi16(ul_ch_mag128b[1],QAM_amp128b); + ul_ch_mag128b[1] = _mm_slli_epi16(ul_ch_mag128b[1],1); - if (is_dmrs_symbol==0) { - mmtmpD0 = _mm_madd_epi16(ul_ch128[2],ul_ch128[2]); - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0); + mmtmpD0 = _mm_madd_epi16(ul_ch128[2],ul_ch128[2]); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0); - ul_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1); - ul_ch_mag128b[2] = ul_ch_mag128[2]; + ul_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1); + ul_ch_mag128b[2] = ul_ch_mag128[2]; - ul_ch_mag128[2] = _mm_mulhi_epi16(ul_ch_mag128[2],QAM_amp128); - ul_ch_mag128[2] = _mm_slli_epi16(ul_ch_mag128[2],1); - } + ul_ch_mag128[2] = _mm_mulhi_epi16(ul_ch_mag128[2],QAM_amp128); + ul_ch_mag128[2] = _mm_slli_epi16(ul_ch_mag128[2],1); - ul_ch_mag128b[0] = _mm_mulhi_epi16(ul_ch_mag128b[0],QAM_amp128b); - ul_ch_mag128b[0] = _mm_slli_epi16(ul_ch_mag128b[0],1); + ul_ch_mag128b[2] = _mm_mulhi_epi16(ul_ch_mag128b[2],QAM_amp128b); + ul_ch_mag128b[2] = _mm_slli_epi16(ul_ch_mag128b[2],1); - ul_ch_mag128b[1] = _mm_mulhi_epi16(ul_ch_mag128b[1],QAM_amp128b); - ul_ch_mag128b[1] = _mm_slli_epi16(ul_ch_mag128b[1],1); - - if (is_dmrs_symbol==0) { - ul_ch_mag128b[2] = _mm_mulhi_epi16(ul_ch_mag128b[2],QAM_amp128b); - ul_ch_mag128b[2] = _mm_slli_epi16(ul_ch_mag128b[2],1); - } } // multiply by conjugated channel @@ -755,117 +746,153 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, // print_shorts("ch:",ul_ch128+1); // print_shorts("pack:",rxdataF_comp128+1); - if (is_dmrs_symbol==0) { - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(ul_ch128[2],rxdataF128[2]); - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[2],_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]); - // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); - mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); - mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - - rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128+2); - // print_shorts("ch:",ul_ch128+2); - // print_shorts("pack:",rxdataF_comp128+2); - - ul_ch128+=3; - ul_ch_mag128+=3; - ul_ch_mag128b+=3; - rxdataF128+=3; - rxdataF_comp128+=3; - } else { // we have a smaller PUSCH in symbols with pilots so skip last group of 4 REs and increment less - ul_ch128+=2; - ul_ch_mag128+=2; - ul_ch_mag128b+=2; - rxdataF128+=2; - rxdataF_comp128+=2; - } - - } - } - } - - if (rho) { - - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - rho128 = (__m128i *)&rho[aarx][symbol*frame_parms->N_RB_UL*12]; - ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_UL*12]; - ul_ch128_2 = (__m128i *)&ul_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_UL*12]; - - for (rb=0; rb<nb_rb; rb++) { // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(ul_ch128[0],ul_ch128_2[0]); - // print_ints("re",&mmtmpD0); - - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[0],_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]); - // print_ints("im",&mmtmpD1); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,ul_ch128_2[0]); - // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - // print_ints("re(shift)",&mmtmpD0); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); - // print_ints("im(shift)",&mmtmpD1); - mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); - mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - // print_ints("c0",&mmtmpD2); - // print_ints("c1",&mmtmpD3); - rho128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - - //print_shorts("rx:",ul_ch128_2); - //print_shorts("ch:",ul_ch128); - //print_shorts("pack:",rho128); - - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(ul_ch128[1],ul_ch128_2[1]); - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[1],_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,ul_ch128_2[1]); - // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); - mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); - mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - - - rho128[1] =_mm_packs_epi32(mmtmpD2,mmtmpD3); - //print_shorts("rx:",ul_ch128_2+1); - //print_shorts("ch:",ul_ch128+1); - //print_shorts("pack:",rho128+1); - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(ul_ch128[2],ul_ch128_2[2]); + mmtmpD0 = _mm_madd_epi16(ul_ch128[2],rxdataF128[2]); // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[2],_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,ul_ch128_2[2]); + mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]); // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - rho128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - //print_shorts("rx:",ul_ch128_2+2); + rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); + //print_shorts("rx:",rxdataF128+2); //print_shorts("ch:",ul_ch128+2); - //print_shorts("pack:",rho128+2); + //print_shorts("pack:",rxdataF_comp128+2); ul_ch128+=3; - ul_ch128_2+=3; - rho128+=3; - + ul_ch_mag128+=3; + ul_ch_mag128b+=3; + rxdataF128+=3; + rxdataF_comp128+=3; } + } + } + if (rho) { + //we compute the Tx correlation matrix for each Rx antenna + //As an example the 2x2 MIMO case requires + //rho[aarx][nb_aatx*nb_aatx] = [cov(H_aarx_0,H_aarx_0) cov(H_aarx_0,H_aarx_1) + // cov(H_aarx_1,H_aarx_0) cov(H_aarx_1,H_aarx_1)], aarx=0,...,nb_antennas_rx-1 + + int avg_rho_re[frame_parms->nb_antennas_rx][nrOfLayers*nrOfLayers]; + int avg_rho_im[frame_parms->nb_antennas_rx][nrOfLayers*nrOfLayers]; + + for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) { + for (aatx=0; aatx < nrOfLayers; aatx++) { + for (int atx=0; atx< nrOfLayers; atx++) { + + avg_rho_re[aarx][aatx*nrOfLayers+atx] = 0; + avg_rho_im[aarx][aatx*nrOfLayers+atx] = 0; + rho128 = (__m128i *)&rho[aarx][aatx*nrOfLayers+atx][symbol*(off+(nb_rb*12))]; + ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))]; + ul_ch128_2 = (__m128i *)&ul_ch_estimates_ext[atx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))]; + + for (rb=0; rb<nb_rb_0; rb++) { + // multiply by conjugated channel + mmtmpD0 = _mm_madd_epi16(ul_ch128[0],ul_ch128_2[0]); + // print_ints("re",&mmtmpD0); + + // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) + mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[0],_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]); + // print_ints("im",&mmtmpD1); + mmtmpD1 = _mm_madd_epi16(mmtmpD1,ul_ch128_2[0]); + // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + // print_ints("re(shift)",&mmtmpD0); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + // print_ints("im(shift)",&mmtmpD1); + mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); + mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); + // print_ints("c0",&mmtmpD2); + // print_ints("c1",&mmtmpD3); + rho128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); + + //print_shorts("rx:",ul_ch128_2); + //print_shorts("ch:",ul_ch128); + //print_shorts("pack:",rho128); + + avg_rho_re[aarx][aatx*nrOfLayers+atx] +=(((int16_t*)&rho128[0])[0]+ + ((int16_t*)&rho128[0])[2] + + ((int16_t*)&rho128[0])[4] + + ((int16_t*)&rho128[0])[6])/16;// + + avg_rho_im[aarx][aatx*nrOfLayers+atx] +=(((int16_t*)&rho128[0])[1]+ + ((int16_t*)&rho128[0])[3] + + ((int16_t*)&rho128[0])[5] + + ((int16_t*)&rho128[0])[7])/16;// + // multiply by conjugated channel + mmtmpD0 = _mm_madd_epi16(ul_ch128[1],ul_ch128_2[1]); + // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) + mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[1],_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); + mmtmpD1 = _mm_madd_epi16(mmtmpD1,ul_ch128_2[1]); + // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); + mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); + rho128[1] =_mm_packs_epi32(mmtmpD2,mmtmpD3); + //print_shorts("rx:",ul_ch128_2+1); + //print_shorts("ch:",ul_ch128+1); + //print_shorts("pack:",rho128+1); + + // multiply by conjugated channel + avg_rho_re[aarx][aatx*nrOfLayers+atx] +=(((int16_t*)&rho128[1])[0]+ + ((int16_t*)&rho128[1])[2] + + ((int16_t*)&rho128[1])[4] + + ((int16_t*)&rho128[1])[6])/16; + + avg_rho_im[aarx][aatx*nrOfLayers+atx] +=(((int16_t*)&rho128[1])[1]+ + ((int16_t*)&rho128[1])[3] + + ((int16_t*)&rho128[1])[5] + + ((int16_t*)&rho128[1])[7])/16; + + mmtmpD0 = _mm_madd_epi16(ul_ch128[2],ul_ch128_2[2]); + // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) + mmtmpD1 = _mm_shufflelo_epi16(ul_ch128[2],_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); + mmtmpD1 = _mm_madd_epi16(mmtmpD1,ul_ch128_2[2]); + // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); + mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); + + rho128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); + //print_shorts("rx:",ul_ch128_2+2); + //print_shorts("ch:",ul_ch128+2); + //print_shorts("pack:",rho128+2); + avg_rho_re[aarx][aatx*nrOfLayers+atx] +=(((int16_t*)&rho128[2])[0]+ + ((int16_t*)&rho128[2])[2] + + ((int16_t*)&rho128[2])[4] + + ((int16_t*)&rho128[2])[6])/16; + + avg_rho_im[aarx][aatx*nrOfLayers+atx] +=(((int16_t*)&rho128[2])[1]+ + ((int16_t*)&rho128[2])[3] + + ((int16_t*)&rho128[2])[5] + + ((int16_t*)&rho128[2])[7])/16; + + ul_ch128+=3; + ul_ch128_2+=3; + rho128+=3; + } + if (is_dmrs_symbol==1) { + //measurements->rx_correlation[0][0][aarx] = signal_energy(&rho[aarx][aatx*nb_aatx+atx][symbol*nb_rb*12],rb*12); + avg_rho_re[aarx][aatx*nrOfLayers+atx] = 16*avg_rho_re[aarx][aatx*nrOfLayers+atx]/(nb_rb*12); + avg_rho_im[aarx][aatx*nrOfLayers+atx] = 16*avg_rho_im[aarx][aatx*nrOfLayers+atx]/(nb_rb*12); + //printf("rho[rx]%d tx%d tx%d = Re: %d Im: %d\n",aarx, aatx,atx, avg_rho_re[aarx][aatx*nb_aatx+atx], avg_rho_im[aarx][aatx*nb_aatx+atx]); + } + } + } } } @@ -1070,19 +1097,17 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, #ifdef DEBUG_CH_COMP + for (int nl2=0; nl2<nrOfLayers; nl2++) { + for (int aarx2=0; aarx2<frame_parms->nb_antennas_rx; aarx2++) { + rxF = (int16_t *)&rxdataF_comp[nl2*frame_parms->nb_antennas_rx+aarx2][(symbol*(off+(nb_rb*12)))]; - for (int ant=0; ant<frame_parms->nb_antennas_rx; ant++) { - rxF = (int16_t *)&rxdataF_comp[ant][(symbol*(off+(nb_rb*12)))]; - - printf("----------------After compansation------------------\n"); - - for (prnt_idx=0;prnt_idx<12*5*2;prnt_idx+=2){ - - printf("rxF[%d] = (%d,%d)\n", prnt_idx>>1, rxF[prnt_idx],rxF[prnt_idx+1]); + printf("--------After compansation, layer %i, antenna rx %i----------\n", nl2, aarx2); + for (prnt_idx=0;prnt_idx<12*5*2;prnt_idx+=2){ + printf("rxF[%d] = (%d,%d)\n", prnt_idx>>1, rxF[prnt_idx],rxF[prnt_idx+1]); + } } } - #endif #ifdef DEBUG_CH_MAG @@ -1105,19 +1130,23 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, } void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int32_t **ul_ch_mag, - int32_t **ul_ch_magb, - uint8_t symbol, - uint16_t nb_rb) { + int32_t **rxdataF_comp, + int32_t **ul_ch_mag, + int32_t **ul_ch_magb, + int32_t ***rho, + uint8_t nrOfLayers, + uint8_t symbol, + uint16_t nb_rb, + int length) { int n_rx = frame_parms->nb_antennas_rx; #if defined(__x86_64__) || defined(__i386__) - __m128i *rxdataF_comp128[1+n_rx],*ul_ch_mag128[1+n_rx],*ul_ch_mag128b[1+n_rx]; + __m128i *rxdataF_comp128[2],*ul_ch_mag128[2],*ul_ch_mag128b[2]; #elif defined(__arm__) int16x8_t *rxdataF_comp128_0,*ul_ch_mag128_0,*ul_ch_mag128_0b; int16x8_t *rxdataF_comp128_1,*ul_ch_mag128_1,*ul_ch_mag128_1b; #endif int32_t i; + uint32_t nb_rb_0 = length/12 + ((length%12)?1:0); #ifdef __AVX2__ int off = ((nb_rb&1) == 1)? 4:0; @@ -1125,23 +1154,30 @@ void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms, int off = 0; #endif - if (frame_parms->nb_antennas_rx>1) { -#if defined(__x86_64__) || defined(__i386__) - int nb_re = nb_rb*12; - for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++) { - rxdataF_comp128[aa] = (__m128i *)&rxdataF_comp[aa][(symbol*(nb_re + off))]; - ul_ch_mag128[aa] = (__m128i *)&ul_ch_mag[aa][(symbol*(nb_re + off))]; - ul_ch_mag128b[aa] = (__m128i *)&ul_ch_magb[aa][(symbol*(nb_re + off))]; - } - for (int aa=1;aa<frame_parms->nb_antennas_rx;aa++) { - // MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation) - for (i=0; i<nb_rb*3; i++) { - rxdataF_comp128[0][i] = _mm_adds_epi16(rxdataF_comp128[0][i],rxdataF_comp128[aa][i]); - ul_ch_mag128[0][i] = _mm_adds_epi16(ul_ch_mag128[0][i], ul_ch_mag128[aa][i]); - ul_ch_mag128b[0][i] = _mm_adds_epi16(ul_ch_mag128b[0][i],ul_ch_mag128b[aa][i]); + if (n_rx > 1) { + #if defined(__x86_64__) || defined(__i386__) + for (int aatx=0; aatx<nrOfLayers; aatx++) { + int nb_re = nb_rb*12; + + rxdataF_comp128[0] = (__m128i *)&rxdataF_comp[aatx*frame_parms->nb_antennas_rx][(symbol*(nb_re + off))]; + ul_ch_mag128[0] = (__m128i *)&ul_ch_mag[aatx*frame_parms->nb_antennas_rx][(symbol*(nb_re + off))]; + ul_ch_mag128b[0] = (__m128i *)&ul_ch_magb[aatx*frame_parms->nb_antennas_rx][(symbol*(nb_re + off))]; + + for (int aa=1;aa < n_rx;aa++) { + rxdataF_comp128[1] = (__m128i *)&rxdataF_comp[aatx*frame_parms->nb_antennas_rx+aa][(symbol*(nb_re + off))]; + ul_ch_mag128[1] = (__m128i *)&ul_ch_mag[aatx*frame_parms->nb_antennas_rx+aa][(symbol*(nb_re + off))]; + ul_ch_mag128b[1] = (__m128i *)&ul_ch_magb[aatx*frame_parms->nb_antennas_rx+aa][(symbol*(nb_re + off))]; + + // MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation) + for (i=0; i<nb_rb_0*3; i++) { + rxdataF_comp128[0][i] = _mm_adds_epi16(rxdataF_comp128[0][i],rxdataF_comp128[1][i]); + ul_ch_mag128[0][i] = _mm_adds_epi16(ul_ch_mag128[0][i],ul_ch_mag128[1][i]); + ul_ch_mag128b[0][i] = _mm_adds_epi16(ul_ch_mag128b[0][i],ul_ch_mag128b[1][i]); + //rxdataF_comp128[0][i] = _mm_add_epi16(rxdataF_comp128_0[i],(*(__m128i *)&jitterc[0])); + } } } -#elif defined(__arm__) + #elif defined(__arm__) rxdataF_comp128_0 = (int16x8_t *)&rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp128_1 = (int16x8_t *)&rxdataF_comp[1][symbol*frame_parms->N_RB_DL*12]; ul_ch_mag128_0 = (int16x8_t *)&ul_ch_mag[0][symbol*frame_parms->N_RB_DL*12]; @@ -1156,7 +1192,7 @@ void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms, ul_ch_mag128_0b[i] = vhaddq_s16(ul_ch_mag128_0b[i],ul_ch_mag128_1b[i]); rxdataF_comp128_0[i] = vqaddq_s16(rxdataF_comp128_0[i],(*(int16x8_t *)&jitterc[0])); } -#endif + #endif } #if defined(__x86_64__) || defined(__i386__) @@ -1165,6 +1201,696 @@ void nr_ulsch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms, #endif } +/* Zero Forcing Rx function: nr_det_HhH() + * + * + * */ +void nr_ulsch_det_HhH(int32_t *after_mf_00,//a + int32_t *after_mf_01,//b + int32_t *after_mf_10,//c + int32_t *after_mf_11,//d + int32_t *det_fin,//1/ad-bc + unsigned short nb_rb, + unsigned char symbol, + int32_t shift) +{ + int16_t nr_conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ; + unsigned short rb; + __m128i *after_mf_00_128,*after_mf_01_128, *after_mf_10_128, *after_mf_11_128, ad_re_128, bc_re_128; //ad_im_128, bc_im_128; + __m128i *det_fin_128, det_re_128; //det_im_128, tmp_det0, tmp_det1; + + after_mf_00_128 = (__m128i *)after_mf_00; + after_mf_01_128 = (__m128i *)after_mf_01; + after_mf_10_128 = (__m128i *)after_mf_10; + after_mf_11_128 = (__m128i *)after_mf_11; + + det_fin_128 = (__m128i *)det_fin; + + for (rb=0; rb<3*nb_rb; rb++) { + + //complex multiplication (I_a+jQ_a)(I_d+jQ_d) = (I_aI_d - Q_aQ_d) + j(Q_aI_d + I_aQ_d) + //The imag part is often zero, we compute only the real part + ad_re_128 = _mm_sign_epi16(after_mf_00_128[0],*(__m128i*)&nr_conjug2[0]); + ad_re_128 = _mm_madd_epi16(ad_re_128,after_mf_11_128[0]); //Re: I_a0*I_d0 - Q_a1*Q_d1 + //ad_im_128 = _mm_shufflelo_epi16(after_mf_00_128[0],_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits + //ad_im_128 = _mm_shufflehi_epi16(ad_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits + //ad_im_128 = _mm_madd_epi16(ad_im_128,after_mf_11_128[0]);//Im: (Q_aI_d + I_aQ_d) + + //complex multiplication (I_b+jQ_b)(I_c+jQ_c) = (I_bI_c - Q_bQ_c) + j(Q_bI_c + I_bQ_c) + //The imag part is often zero, we compute only the real part + bc_re_128 = _mm_sign_epi16(after_mf_01_128[0],*(__m128i*)&nr_conjug2[0]); + bc_re_128 = _mm_madd_epi16(bc_re_128,after_mf_10_128[0]); //Re: I_b0*I_c0 - Q_b1*Q_c1 + //bc_im_128 = _mm_shufflelo_epi16(after_mf_01_128[0],_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_b0 Q_b1 I_b2 Q_b3]_64bits to [Q_b1 I_b0 Q_b3 I_b2]_64bits + //bc_im_128 = _mm_shufflehi_epi16(bc_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_b0 Q_b1 I_b2 Q_b3]_64bits to [Q_b1 I_b0 Q_b3 I_b2]_64bits + //bc_im_128 = _mm_madd_epi16(bc_im_128,after_mf_10_128[0]);//Im: (Q_bI_c + I_bQ_c) + + det_re_128 = _mm_sub_epi32(ad_re_128, bc_re_128); + //det_im_128 = _mm_sub_epi32(ad_im_128, bc_im_128); + + //det in Q30 format + det_fin_128[0] = _mm_abs_epi32(det_re_128); + + +#ifdef DEBUG_DLSCH_DEMOD + printf("\n Computing det_HhH_inv \n"); + //print_ints("det_re_128:",(int32_t*)&det_re_128); + //print_ints("det_im_128:",(int32_t*)&det_im_128); + print_ints("det_fin_128:",(int32_t*)&det_fin_128[0]); +#endif + det_fin_128+=1; + after_mf_00_128+=1; + after_mf_01_128+=1; + after_mf_10_128+=1; + after_mf_11_128+=1; + } + _mm_empty(); + _m_empty(); +} + +/* Zero Forcing Rx function: nr_inv_comp_muli + * Complex number multi: z = x*y + * = (x_re*y_re - x_im*y_im) + j(x_im*y_re + x_re*y_im) + * */ +__m128i nr_ulsch_inv_comp_muli(__m128i input_x, + __m128i input_y) +{ + int16_t nr_conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ; + + __m128i xy_re_128, xy_im_128; + __m128i output_z, tmp_z0, tmp_z1; + + // complex multiplication (x_re + jx_im)*(y_re + jy_im) = (x_re*y_re - x_im*y_im) + j(x_im*y_re + x_re*y_im) + + // the real part + xy_re_128 = _mm_sign_epi16(input_x,*(__m128i*)&nr_conjug2[0]); + xy_re_128 = _mm_madd_epi16(xy_re_128,input_y); //Re: (x_re*y_re - x_im*y_im) + + // the imag part + xy_im_128 = _mm_shufflelo_epi16(input_x,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits + xy_im_128 = _mm_shufflehi_epi16(xy_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits + xy_im_128 = _mm_madd_epi16(xy_im_128,input_y);//Im: (x_im*y_re + x_re*y_im) + + //convert back to Q15 before packing + xy_re_128 = _mm_srai_epi32(xy_re_128,4);//(2^15/64*2*16) + xy_im_128 = _mm_srai_epi32(xy_im_128,4); + + tmp_z0 = _mm_unpacklo_epi32(xy_re_128,xy_im_128); + //print_ints("unpack lo:",&tmp_z0[0]); + tmp_z1 = _mm_unpackhi_epi32(xy_re_128,xy_im_128); + //print_ints("unpack hi:",&tmp_z1[0]); + output_z = _mm_packs_epi32(tmp_z0,tmp_z1); + + _mm_empty(); + _m_empty(); + return(output_z); +} + +/* Zero Forcing Rx function: nr_conjch0_mult_ch1() + * + * + * */ +void nr_ulsch_conjch0_mult_ch1(int *ch0, + int *ch1, + int32_t *ch0conj_ch1, + unsigned short nb_rb, + unsigned char output_shift0) +{ + //This function is used to compute multiplications in H_hermitian * H matrix + short nr_conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1}; + unsigned short rb; + __m128i *dl_ch0_128,*dl_ch1_128, *ch0conj_ch1_128, mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3; + + dl_ch0_128 = (__m128i *)ch0; + dl_ch1_128 = (__m128i *)ch1; + + ch0conj_ch1_128 = (__m128i *)ch0conj_ch1; + + for (rb=0; rb<3*nb_rb; rb++) { + + mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch1_128[0]); + mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&nr_conjugate[0]); + mmtmpD1 = _mm_madd_epi16(mmtmpD1,dl_ch1_128[0]); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0); + mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); + mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); + + ch0conj_ch1_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); + + /*printf("\n Computing conjugates \n"); + print_shorts("ch0:",(int16_t*)&dl_ch0_128[0]); + print_shorts("ch1:",(int16_t*)&dl_ch1_128[0]); + print_shorts("pack:",(int16_t*)&ch0conj_ch1_128[0]);*/ + + dl_ch0_128+=1; + dl_ch1_128+=1; + ch0conj_ch1_128+=1; + } + _mm_empty(); + _m_empty(); +} +__m128i nr_ulsch_comp_muli_sum(__m128i input_x, + __m128i input_y, + __m128i input_w, + __m128i input_z, + __m128i det) +{ + int16_t nr_conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ; + + __m128i xy_re_128, xy_im_128, wz_re_128, wz_im_128; + __m128i output, tmp_z0, tmp_z1; + + // complex multiplication (x_re + jx_im)*(y_re + jy_im) = (x_re*y_re - x_im*y_im) + j(x_im*y_re + x_re*y_im) + // the real part + xy_re_128 = _mm_sign_epi16(input_x,*(__m128i*)&nr_conjug2[0]); + xy_re_128 = _mm_madd_epi16(xy_re_128,input_y); //Re: (x_re*y_re - x_im*y_im) + + // the imag part + xy_im_128 = _mm_shufflelo_epi16(input_x,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits + xy_im_128 = _mm_shufflehi_epi16(xy_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits + xy_im_128 = _mm_madd_epi16(xy_im_128,input_y);//Im: (x_im*y_re + x_re*y_im) + + // complex multiplication (w_re + jw_im)*(z_re + jz_im) = (w_re*z_re - w_im*z_im) + j(w_im*z_re + w_re*z_im) + // the real part + wz_re_128 = _mm_sign_epi16(input_w,*(__m128i*)&nr_conjug2[0]); + wz_re_128 = _mm_madd_epi16(wz_re_128,input_z); //Re: (w_re*z_re - w_im*z_im) + + // the imag part + wz_im_128 = _mm_shufflelo_epi16(input_w,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the low 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits + wz_im_128 = _mm_shufflehi_epi16(wz_im_128,_MM_SHUFFLE(2,3,0,1));//permutes IQs for the high 64 bits as [I_a0 Q_a1 I_a2 Q_a3]_64bits to [Q_a1 I_a0 Q_a3 I_a2]_64bits + wz_im_128 = _mm_madd_epi16(wz_im_128,input_z);//Im: (w_im*z_re + w_re*z_im) + + + xy_re_128 = _mm_sub_epi32(xy_re_128, wz_re_128); + xy_im_128 = _mm_sub_epi32(xy_im_128, wz_im_128); + //print_ints("rx_re:",(int32_t*)&xy_re_128[0]); + //print_ints("rx_Img:",(int32_t*)&xy_im_128[0]); + //divide by matrix det and convert back to Q15 before packing + int sum_det =0; + for (int k=0; k<4;k++) { + sum_det += ((((int *)&det[0])[k])>>2); + //printf("det_%d = %d log2 =%d \n",k,(((int *)&det[0])[k]),log2_approx(((int *)&det[0])[k])); + } + + xy_re_128 = _mm_slli_epi32(xy_re_128,5); + xy_re_128 = _mm_srai_epi32(xy_re_128,log2_approx(sum_det)); + xy_re_128 = _mm_slli_epi32(xy_re_128,5); + + xy_im_128 = _mm_slli_epi32(xy_im_128,5); + xy_im_128 = _mm_srai_epi32(xy_im_128,log2_approx(sum_det)); + xy_im_128 = _mm_slli_epi32(xy_im_128,5); + + tmp_z0 = _mm_unpacklo_epi32(xy_re_128,xy_im_128); + //print_ints("unpack lo:",&tmp_z0[0]); + tmp_z1 = _mm_unpackhi_epi32(xy_re_128,xy_im_128); + //print_ints("unpack hi:",&tmp_z1[0]); + output = _mm_packs_epi32(tmp_z0,tmp_z1); + + _mm_empty(); + _m_empty(); + return(output); +} +/* Zero Forcing Rx function: nr_construct_HhH_elements() + * + * + * */ +void nr_ulsch_construct_HhH_elements(int *conjch00_ch00, + int *conjch01_ch01, + int *conjch11_ch11, + int *conjch10_ch10,// + int *conjch20_ch20, + int *conjch21_ch21, + int *conjch30_ch30, + int *conjch31_ch31, + int *conjch00_ch01,//00_01 + int *conjch01_ch00,//01_00 + int *conjch10_ch11,//10_11 + int *conjch11_ch10,//11_10 + int *conjch20_ch21, + int *conjch21_ch20, + int *conjch30_ch31, + int *conjch31_ch30, + int32_t *after_mf_00, + int32_t *after_mf_01, + int32_t *after_mf_10, + int32_t *after_mf_11, + unsigned short nb_rb, + unsigned char symbol) +{ + //This function is used to construct the (H_hermitian * H matrix) matrix elements + unsigned short rb; + __m128i *conjch00_ch00_128, *conjch01_ch01_128, *conjch11_ch11_128, *conjch10_ch10_128; + __m128i *conjch20_ch20_128, *conjch21_ch21_128, *conjch30_ch30_128, *conjch31_ch31_128; + __m128i *conjch00_ch01_128, *conjch01_ch00_128, *conjch10_ch11_128, *conjch11_ch10_128; + __m128i *conjch20_ch21_128, *conjch21_ch20_128, *conjch30_ch31_128, *conjch31_ch30_128; + __m128i *after_mf_00_128, *after_mf_01_128, *after_mf_10_128, *after_mf_11_128; + + conjch00_ch00_128 = (__m128i *)conjch00_ch00; + conjch01_ch01_128 = (__m128i *)conjch01_ch01; + conjch11_ch11_128 = (__m128i *)conjch11_ch11; + conjch10_ch10_128 = (__m128i *)conjch10_ch10; + + conjch20_ch20_128 = (__m128i *)conjch20_ch20; + conjch21_ch21_128 = (__m128i *)conjch21_ch21; + conjch30_ch30_128 = (__m128i *)conjch30_ch30; + conjch31_ch31_128 = (__m128i *)conjch31_ch31; + + conjch00_ch01_128 = (__m128i *)conjch00_ch01; + conjch01_ch00_128 = (__m128i *)conjch01_ch00; + conjch10_ch11_128 = (__m128i *)conjch10_ch11; + conjch11_ch10_128 = (__m128i *)conjch11_ch10; + + conjch20_ch21_128 = (__m128i *)conjch20_ch21; + conjch21_ch20_128 = (__m128i *)conjch21_ch20; + conjch30_ch31_128 = (__m128i *)conjch30_ch31; + conjch31_ch30_128 = (__m128i *)conjch31_ch30; + + after_mf_00_128 = (__m128i *)after_mf_00; + after_mf_01_128 = (__m128i *)after_mf_01; + after_mf_10_128 = (__m128i *)after_mf_10; + after_mf_11_128 = (__m128i *)after_mf_11; + + for (rb=0; rb<3*nb_rb; rb++) { + + after_mf_00_128[0] =_mm_adds_epi16(conjch00_ch00_128[0],conjch10_ch10_128[0]);//00_00 + 10_10 + if (conjch20_ch20 != NULL) after_mf_00_128[0] =_mm_adds_epi16(after_mf_00_128[0],conjch20_ch20_128[0]); + if (conjch30_ch30 != NULL) after_mf_00_128[0] =_mm_adds_epi16(after_mf_00_128[0],conjch30_ch30_128[0]); + + after_mf_11_128[0] =_mm_adds_epi16(conjch01_ch01_128[0], conjch11_ch11_128[0]); //01_01 + 11_11 + if (conjch21_ch21 != NULL) after_mf_11_128[0] =_mm_adds_epi16(after_mf_11_128[0],conjch21_ch21_128[0]); + if (conjch31_ch31 != NULL) after_mf_11_128[0] =_mm_adds_epi16(after_mf_11_128[0],conjch31_ch31_128[0]); + + after_mf_01_128[0] =_mm_adds_epi16(conjch00_ch01_128[0], conjch10_ch11_128[0]);//00_01 + 10_11 + if (conjch20_ch21 != NULL) after_mf_01_128[0] =_mm_adds_epi16(after_mf_01_128[0],conjch20_ch21_128[0]); + if (conjch30_ch31 != NULL) after_mf_01_128[0] =_mm_adds_epi16(after_mf_01_128[0],conjch30_ch31_128[0]); + + after_mf_10_128[0] =_mm_adds_epi16(conjch01_ch00_128[0], conjch11_ch10_128[0]);//01_00 + 11_10 + if (conjch21_ch20 != NULL) after_mf_10_128[0] =_mm_adds_epi16(after_mf_10_128[0],conjch21_ch20_128[0]); + if (conjch31_ch30 != NULL) after_mf_10_128[0] =_mm_adds_epi16(after_mf_10_128[0],conjch31_ch30_128[0]); + +#ifdef DEBUG_DLSCH_DEMOD + if ((rb<=30)) + { + printf(" \n construct_HhH_elements \n"); + print_shorts("after_mf_00_128:",(int16_t*)&after_mf_00_128[0]); + print_shorts("after_mf_01_128:",(int16_t*)&after_mf_01_128[0]); + print_shorts("after_mf_10_128:",(int16_t*)&after_mf_10_128[0]); + print_shorts("after_mf_11_128:",(int16_t*)&after_mf_11_128[0]); + } +#endif + conjch00_ch00_128+=1; + conjch10_ch10_128+=1; + conjch01_ch01_128+=1; + conjch11_ch11_128+=1; + + if (conjch20_ch20 != NULL) conjch20_ch20_128+=1; + if (conjch21_ch21 != NULL) conjch21_ch21_128+=1; + if (conjch30_ch30 != NULL) conjch30_ch30_128+=1; + if (conjch31_ch31 != NULL) conjch31_ch31_128+=1; + + conjch00_ch01_128+=1; + conjch01_ch00_128+=1; + conjch10_ch11_128+=1; + conjch11_ch10_128+=1; + + if (conjch20_ch21 != NULL) conjch20_ch21_128+=1; + if (conjch21_ch20 != NULL) conjch21_ch20_128+=1; + if (conjch30_ch31 != NULL) conjch30_ch31_128+=1; + if (conjch31_ch30 != NULL) conjch31_ch30_128+=1; + + after_mf_00_128 += 1; + after_mf_01_128 += 1; + after_mf_10_128 += 1; + after_mf_11_128 += 1; + } + _mm_empty(); + _m_empty(); +} + +/* Zero Forcing Rx function: nr_ulsch_zero_forcing_rx_2layers() + * + * + * */ +uint8_t nr_ulsch_zero_forcing_rx_2layers(int **rxdataF_comp, + int **ul_ch_mag, + int **ul_ch_magb, + int **ul_ch_estimates_ext, + unsigned short nb_rb, + unsigned char n_rx, + unsigned char mod_order, + int shift, + unsigned char symbol, + int length) +{ + int *ch00, *ch01, *ch10, *ch11; + int *ch20, *ch30, *ch21, *ch31; + uint32_t nb_rb_0 = length/12 + ((length%12)?1:0); + + #ifdef __AVX2__ + int off = ((nb_rb&1) == 1)? 4:0; + #else + int off = 0; + #endif + + /* we need at least alignment to 16 bytes, let's put 32 to be sure + * (maybe not necessary but doesn't hurt) + */ + int32_t conjch00_ch01[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch01_ch00[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch10_ch11[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch11_ch10[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch00_ch00[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch01_ch01[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch10_ch10[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch11_ch11[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch20_ch20[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch21_ch21[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch30_ch30[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch31_ch31[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch20_ch21[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch30_ch31[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch21_ch20[12*nb_rb] __attribute__((aligned(32))); + int32_t conjch31_ch30[12*nb_rb] __attribute__((aligned(32))); + + int32_t af_mf_00[12*nb_rb] __attribute__((aligned(32))); + int32_t af_mf_01[12*nb_rb] __attribute__((aligned(32))); + int32_t af_mf_10[12*nb_rb] __attribute__((aligned(32))); + int32_t af_mf_11[12*nb_rb] __attribute__((aligned(32))); + int32_t determ_fin[12*nb_rb] __attribute__((aligned(32))); + + switch (n_rx) { + case 2:// + ch00 = (int *)&ul_ch_estimates_ext[0][symbol*(off+nb_rb*12)]; + ch01 = (int *)&ul_ch_estimates_ext[2][symbol*(off+nb_rb*12)]; + ch10 = (int *)&ul_ch_estimates_ext[1][symbol*(off+nb_rb*12)]; + ch11 = (int *)&ul_ch_estimates_ext[3][symbol*(off+nb_rb*12)]; + ch20 = NULL; + ch21 = NULL; + ch30 = NULL; + ch31 = NULL; + break; + + case 4:// + ch00 = (int *)&ul_ch_estimates_ext[0][symbol*(off+nb_rb*12)]; + ch01 = (int *)&ul_ch_estimates_ext[4][symbol*(off+nb_rb*12)]; + ch10 = (int *)&ul_ch_estimates_ext[1][symbol*(off+nb_rb*12)]; + ch11 = (int *)&ul_ch_estimates_ext[5][symbol*(off+nb_rb*12)]; + ch20 = (int *)&ul_ch_estimates_ext[2][symbol*(off+nb_rb*12)]; + ch21 = (int *)&ul_ch_estimates_ext[6][symbol*(off+nb_rb*12)]; + ch30 = (int *)&ul_ch_estimates_ext[3][symbol*(off+nb_rb*12)]; + ch31 = (int *)&ul_ch_estimates_ext[7][symbol*(off+nb_rb*12)]; + break; + + default: + return -1; + break; + } + + /* 1- Compute the rx channel matrix after compensation: (1/2^log2_max)x(H_herm x H) + * for n_rx = 2 + * |conj_H_00 conj_H_10| | H_00 H_01| |(conj_H_00xH_00+conj_H_10xH_10) (conj_H_00xH_01+conj_H_10xH_11)| + * | | x | | = | | + * |conj_H_01 conj_H_11| | H_10 H_11| |(conj_H_01xH_00+conj_H_11xH_10) (conj_H_01xH_01+conj_H_11xH_11)| + * + */ + + if (n_rx>=2){ + // (1/2^log2_maxh)*conj_H_00xH_00: (1/(64*2))conjH_00*H_00*2^15 + nr_ulsch_conjch0_mult_ch1(ch00, + ch00, + conjch00_ch00, + nb_rb_0, + shift); + // (1/2^log2_maxh)*conj_H_10xH_10: (1/(64*2))conjH_10*H_10*2^15 + nr_ulsch_conjch0_mult_ch1(ch10, + ch10, + conjch10_ch10, + nb_rb_0, + shift); + // conj_H_00xH_01 + nr_ulsch_conjch0_mult_ch1(ch00, + ch01, + conjch00_ch01, + nb_rb_0, + shift); // this shift is equal to the channel level log2_maxh + // conj_H_10xH_11 + nr_ulsch_conjch0_mult_ch1(ch10, + ch11, + conjch10_ch11, + nb_rb_0, + shift); + // conj_H_01xH_01 + nr_ulsch_conjch0_mult_ch1(ch01, + ch01, + conjch01_ch01, + nb_rb_0, + shift); + // conj_H_11xH_11 + nr_ulsch_conjch0_mult_ch1(ch11, + ch11, + conjch11_ch11, + nb_rb_0, + shift); + // conj_H_01xH_00 + nr_ulsch_conjch0_mult_ch1(ch01, + ch00, + conjch01_ch00, + nb_rb_0, + shift); + // conj_H_11xH_10 + nr_ulsch_conjch0_mult_ch1(ch11, + ch10, + conjch11_ch10, + nb_rb_0, + shift); + } + if (n_rx==4){ + // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2*16))conjH_20*H_20*2^15 + nr_ulsch_conjch0_mult_ch1(ch20, + ch20, + conjch20_ch20, + nb_rb_0, + shift); + + // (1/2^log2_maxh)*conj_H_30xH_30: (1/(64*2*4))conjH_30*H_30*2^15 + nr_ulsch_conjch0_mult_ch1(ch30, + ch30, + conjch30_ch30, + nb_rb_0, + shift); + + // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2))conjH_20*H_20*2^15 + nr_ulsch_conjch0_mult_ch1(ch20, + ch21, + conjch20_ch21, + nb_rb_0, + shift); + + nr_ulsch_conjch0_mult_ch1(ch30, + ch31, + conjch30_ch31, + nb_rb_0, + shift); + + nr_ulsch_conjch0_mult_ch1(ch21, + ch21, + conjch21_ch21, + nb_rb_0, + shift); + + nr_ulsch_conjch0_mult_ch1(ch31, + ch31, + conjch31_ch31, + nb_rb_0, + shift); + + // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2))conjH_20*H_20*2^15 + nr_ulsch_conjch0_mult_ch1(ch21, + ch20, + conjch21_ch20, + nb_rb_0, + shift); + + nr_ulsch_conjch0_mult_ch1(ch31, + ch30, + conjch31_ch30, + nb_rb_0, + shift); + + nr_ulsch_construct_HhH_elements(conjch00_ch00, + conjch01_ch01, + conjch11_ch11, + conjch10_ch10,// + conjch20_ch20, + conjch21_ch21, + conjch30_ch30, + conjch31_ch31, + conjch00_ch01, + conjch01_ch00, + conjch10_ch11, + conjch11_ch10,// + conjch20_ch21, + conjch21_ch20, + conjch30_ch31, + conjch31_ch30, + af_mf_00, + af_mf_01, + af_mf_10, + af_mf_11, + nb_rb_0, + symbol); + } + if (n_rx==2){ + nr_ulsch_construct_HhH_elements(conjch00_ch00, + conjch01_ch01, + conjch11_ch11, + conjch10_ch10,// + NULL, + NULL, + NULL, + NULL, + conjch00_ch01, + conjch01_ch00, + conjch10_ch11, + conjch11_ch10,// + NULL, + NULL, + NULL, + NULL, + af_mf_00, + af_mf_01, + af_mf_10, + af_mf_11, + nb_rb_0, + symbol); + } + //det_HhH = ad -bc + nr_ulsch_det_HhH(af_mf_00,//a + af_mf_01,//b + af_mf_10,//c + af_mf_11,//d + determ_fin, + nb_rb_0, + symbol, + shift); + /* 2- Compute the channel matrix inversion ********************************** + * + * |(conj_H_00xH_00+conj_H_10xH_10) (conj_H_00xH_01+conj_H_10xH_11)| + * A= | | + * |(conj_H_01xH_00+conj_H_11xH_10) (conj_H_01xH_01+conj_H_11xH_11)| + * + * + * + *inv(A) =(1/det)*[d -b + * -c a] + * + * + **************************************************************************/ + __m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*ul_ch_mag128_0=NULL,*ul_ch_mag128b_0=NULL,*determ_fin_128;//*dl_ch_mag128_1,*dl_ch_mag128b_1,*dl_ch_mag128r_1 + __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3; + __m128i *after_mf_a_128,*after_mf_b_128, *after_mf_c_128, *after_mf_d_128; + __m128i QAM_amp128={0},QAM_amp128b={0}; + + determ_fin_128 = (__m128i *)&determ_fin[0]; + + rxdataF_comp128_0 = (__m128i *)&rxdataF_comp[0][symbol*(off+nb_rb*12)];//aatx=0 @ aarx =0 + rxdataF_comp128_1 = (__m128i *)&rxdataF_comp[n_rx][symbol*(off+nb_rb*12)];//aatx=1 @ aarx =0 + + after_mf_a_128 = (__m128i *)af_mf_00; + after_mf_b_128 = (__m128i *)af_mf_01; + after_mf_c_128 = (__m128i *)af_mf_10; + after_mf_d_128 = (__m128i *)af_mf_11; + + if (mod_order>2) { + if (mod_order == 4) { + QAM_amp128 = _mm_set1_epi16(QAM16_n1); //2/sqrt(10) + QAM_amp128b = _mm_setzero_si128(); + } else if (mod_order == 6) { + QAM_amp128 = _mm_set1_epi16(QAM64_n1); //4/sqrt{42} + QAM_amp128b = _mm_set1_epi16(QAM64_n2); //2/sqrt{42} + } + ul_ch_mag128_0 = (__m128i *)&ul_ch_mag[0][symbol*(off+nb_rb*12)]; + ul_ch_mag128b_0 = (__m128i *)&ul_ch_magb[0][symbol*(off+nb_rb*12)]; + } + + for (int rb=0; rb<3*nb_rb_0; rb++) { + if (mod_order>2) { + int sum_det =0; + for (int k=0; k<4;k++) { + sum_det += ((((int *)&determ_fin_128[0])[k])>>2); + //printf("det_%d = %d\n",k,sum_det); + } + + mmtmpD2 = _mm_slli_epi32(determ_fin_128[0],5); + mmtmpD2 = _mm_srai_epi32(mmtmpD2,log2_approx(sum_det)); + mmtmpD2 = _mm_slli_epi32(mmtmpD2,5); + + mmtmpD3 = _mm_unpacklo_epi32(mmtmpD2,mmtmpD2); + + mmtmpD2 = _mm_unpackhi_epi32(mmtmpD2,mmtmpD2); + + mmtmpD2 = _mm_packs_epi32(mmtmpD3,mmtmpD2); + + ul_ch_mag128_0[0] = mmtmpD2; + ul_ch_mag128b_0[0] = mmtmpD2; + + ul_ch_mag128_0[0] = _mm_mulhi_epi16(ul_ch_mag128_0[0],QAM_amp128); + ul_ch_mag128_0[0] = _mm_slli_epi16(ul_ch_mag128_0[0],1); + + ul_ch_mag128b_0[0] = _mm_mulhi_epi16(ul_ch_mag128b_0[0],QAM_amp128b); + ul_ch_mag128b_0[0] = _mm_slli_epi16(ul_ch_mag128b_0[0],1); + + //print_shorts("mag layer 1:",(int16_t*)&dl_ch_mag128_0[0]); + //print_shorts("mag layer 2:",(int16_t*)&dl_ch_mag128_1[0]); + //print_shorts("magb layer 1:",(int16_t*)&dl_ch_mag128b_0[0]); + //print_shorts("magb layer 2:",(int16_t*)&dl_ch_mag128b_1[0]); + //print_shorts("magr layer 1:",(int16_t*)&dl_ch_mag128r_0[0]); + //print_shorts("magr layer 2:",(int16_t*)&dl_ch_mag128r_1[0]); + } + // multiply by channel Inv + //rxdataF_zf128_0 = rxdataF_comp128_0*d - b*rxdataF_comp128_1 + //rxdataF_zf128_1 = rxdataF_comp128_1*a - c*rxdataF_comp128_0 + //printf("layer_1 \n"); + mmtmpD0 = nr_ulsch_comp_muli_sum(rxdataF_comp128_0[0], + after_mf_d_128[0], + rxdataF_comp128_1[0], + after_mf_b_128[0], + determ_fin_128[0]); + + //printf("layer_2 \n"); + mmtmpD1 = nr_ulsch_comp_muli_sum(rxdataF_comp128_1[0], + after_mf_a_128[0], + rxdataF_comp128_0[0], + after_mf_c_128[0], + determ_fin_128[0]); + + rxdataF_comp128_0[0] = mmtmpD0; + rxdataF_comp128_1[0] = mmtmpD1; +#ifdef DEBUG_DLSCH_DEMOD + printf("\n Rx signal after ZF l%d rb%d\n",symbol,rb); + print_shorts(" Rx layer 1:",(int16_t*)&rxdataF_comp128_0[0]); + print_shorts(" Rx layer 2:",(int16_t*)&rxdataF_comp128_1[0]); +#endif + determ_fin_128 += 1; + ul_ch_mag128_0 += 1; + ul_ch_mag128b_0 += 1; + rxdataF_comp128_0 += 1; + rxdataF_comp128_1 += 1; + after_mf_a_128 += 1; + after_mf_b_128 += 1; + after_mf_c_128 += 1; + after_mf_d_128 += 1; + } + _mm_empty(); + _m_empty(); + return(0); +} + +//============================================================================================== + +/* Main Function */ int nr_rx_pusch(PHY_VARS_gNB *gNB, uint8_t ulsch_id, uint32_t frame, @@ -1186,7 +1912,10 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, bwp_start_subcarrier = ((rel15_ul->rb_start + rel15_ul->bwp_start)*NR_NB_SC_PER_RB + frame_parms->first_carrier_offset) % frame_parms->ofdm_symbol_size; LOG_D(PHY,"pusch %d.%d : bwp_start_subcarrier %d, rb_start %d, first_carrier_offset %d\n", frame,slot,bwp_start_subcarrier, rel15_ul->rb_start, frame_parms->first_carrier_offset); LOG_D(PHY,"pusch %d.%d : ul_dmrs_symb_pos %x\n",frame,slot,rel15_ul->ul_dmrs_symb_pos); - + LOG_D(PHY,"ulsch RX %x : start_rb %d nb_rb %d mcs %d Nl %d Tpmi %d bwp_start %d start_sc %d start_symbol %d num_symbols %d cdmgrpsnodata %d num_dmrs %d dmrs_ports %d\n", + rel15_ul->rnti,rel15_ul->rb_start,rel15_ul->rb_size,rel15_ul->mcs_index, + rel15_ul->nrOfLayers,0,rel15_ul->bwp_start,0,rel15_ul->start_symbol_index,rel15_ul->nr_of_symbols, + rel15_ul->num_dmrs_cdm_grps_no_data,rel15_ul->ul_dmrs_symb_pos,rel15_ul->dmrs_ports); //---------------------------------------------------------- //--------------------- Channel estimation --------------------- //---------------------------------------------------------- @@ -1194,11 +1923,13 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); symbol++) { uint8_t dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01; LOG_D(PHY, "symbol %d, dmrs_symbol_flag :%d\n", symbol, dmrs_symbol_flag); + if (dmrs_symbol_flag == 1) { if (gNB->pusch_vars[ulsch_id]->dmrs_symbol == INVALID_VALUE) gNB->pusch_vars[ulsch_id]->dmrs_symbol = symbol; - for (int nl=0; nl<rel15_ul->nrOfLayers; nl++) + for (int nl=0; nl<rel15_ul->nrOfLayers; nl++) { + nr_pusch_channel_estimation(gNB, slot, get_dmrs_port(nl,rel15_ul->dmrs_ports), @@ -1206,6 +1937,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, ulsch_id, bwp_start_subcarrier, rel15_ul); + } nr_gnb_measurements(gNB, ulsch_id, harq_pid, symbol,rel15_ul->nrOfLayers); @@ -1214,9 +1946,11 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] = 0; gNB->pusch_vars[ulsch_id]->ulsch_noise_power[aarx] = 0; } - gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] += signal_energy_nodc( - &gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][symbol * frame_parms->ofdm_symbol_size], + for (aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++) { + gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] += signal_energy_nodc( + &gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aatx*gNB->frame_parms.nb_antennas_rx+aarx][symbol * frame_parms->ofdm_symbol_size], rel15_ul->rb_size * 12); + } for (int rb = 0; rb < rel15_ul->rb_size; rb++) { gNB->pusch_vars[ulsch_id]->ulsch_noise_power[aarx] += gNB->measurements.n0_subband_power[aarx][rel15_ul->bwp_start + rel15_ul->rb_start + rb] / @@ -1229,6 +1963,17 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, } } } + + if (gNB->chest_time == 1) { // averaging time domain channel estimates + nr_chest_time_domain_avg(frame_parms, + gNB->pusch_vars[ulsch_id]->ul_ch_estimates, + rel15_ul->nr_of_symbols, + rel15_ul->start_symbol_index, + rel15_ul->ul_dmrs_symb_pos, + rel15_ul->rb_size); + + gNB->pusch_vars[ulsch_id]->dmrs_symbol = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, rel15_ul->start_symbol_index, rel15_ul->nr_of_symbols); + } stop_meas(&gNB->ulsch_channel_estimation_stats); #ifdef __AVX2__ @@ -1244,7 +1989,8 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, if ((rel15_ul->ul_dmrs_symb_pos >> ((symbol + 1) % frame_parms->symbols_per_slot)) & 0x01) AssertFatal(1==0,"Double DMRS configuration is not yet supported\n"); - gNB->pusch_vars[ulsch_id]->dmrs_symbol = symbol; + if (gNB->chest_time == 0) // Non averaging time domain channel estimates + gNB->pusch_vars[ulsch_id]->dmrs_symbol = symbol; if (rel15_ul->dmrs_config_type == 0) { // if no data in dmrs cdm group is 1 only even REs have no data @@ -1254,7 +2000,8 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, else { nb_re_pusch = rel15_ul->rb_size *(12 - (rel15_ul->num_dmrs_cdm_grps_no_data*4)); } - } else { + } + else { nb_re_pusch = rel15_ul->rb_size * NR_NB_SC_PER_RB; } @@ -1265,15 +2012,14 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, //--------------------- RBs extraction --------------------- //---------------------------------------------------------- if (nb_re_pusch > 0) { - start_meas(&gNB->ulsch_rbs_extraction_stats); - nr_ulsch_extract_rbs_single(gNB->common_vars.rxdataF, - gNB->pusch_vars[ulsch_id], - slot, - symbol, - dmrs_symbol_flag, - rel15_ul, - frame_parms); + nr_ulsch_extract_rbs(gNB->common_vars.rxdataF, + gNB->pusch_vars[ulsch_id], + slot, + symbol, + dmrs_symbol_flag, + rel15_ul, + frame_parms); stop_meas(&gNB->ulsch_rbs_extraction_stats); //---------------------------------------------------------- @@ -1284,8 +2030,9 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, gNB->ulsch[ulsch_id], symbol, dmrs_symbol_flag, - rel15_ul->rb_size, - rel15_ul->dmrs_config_type); + nb_re_pusch, + rel15_ul->nrOfLayers, + rel15_ul->rb_size); if (gNB->pusch_vars[ulsch_id]->cl_done==0) { nr_ulsch_channel_level(gNB->pusch_vars[ulsch_id]->ul_ch_estimates_ext, @@ -1319,6 +2066,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, (rel15_ul->nrOfLayers>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL, frame_parms, symbol, + nb_re_pusch, dmrs_symbol_flag, rel15_ul->qam_mod_order, rel15_ul->nrOfLayers, @@ -1331,19 +2079,32 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, gNB->pusch_vars[ulsch_id]->rxdataF_comp, gNB->pusch_vars[ulsch_id]->ul_ch_mag0, gNB->pusch_vars[ulsch_id]->ul_ch_magb0, + (rel15_ul->nrOfLayers>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL, + rel15_ul->nrOfLayers, symbol, - rel15_ul->rb_size); + rel15_ul->rb_size, + nb_re_pusch); + + if (rel15_ul->nrOfLayers == 2)//Apply zero forcing for 2 Tx layers + nr_ulsch_zero_forcing_rx_2layers(gNB->pusch_vars[ulsch_id]->rxdataF_comp, + gNB->pusch_vars[ulsch_id]->ul_ch_mag0, + gNB->pusch_vars[ulsch_id]->ul_ch_magb0, + gNB->pusch_vars[ulsch_id]->ul_ch_estimates_ext, + rel15_ul->rb_size, + frame_parms->nb_antennas_rx, + rel15_ul->qam_mod_order, + gNB->pusch_vars[ulsch_id]->log2_maxh, + symbol, + nb_re_pusch); stop_meas(&gNB->ulsch_mrc_stats); - // transform precoding = 0 means enabled - if (rel15_ul->transform_precoding == 0) { - - #ifdef __AVX2__ + if (rel15_ul->transform_precoding == transformPrecoder_enabled) { + #ifdef __AVX2__ // For odd number of resource blocks need byte alignment to multiple of 8 int nb_re_pusch2 = nb_re_pusch + (nb_re_pusch&7); - #else + #else int nb_re_pusch2 = nb_re_pusch; - #endif + #endif // perform IDFT operation on the compensated rxdata if transform precoding is enabled nr_idft(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[0][symbol * nb_re_pusch2], nb_re_pusch); @@ -1374,14 +2135,16 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, /*-------------------- LLRs computation -------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------------------------*/ start_meas(&gNB->ulsch_llr_stats); - nr_ulsch_compute_llr(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[0][symbol * (off + rel15_ul->rb_size * NR_NB_SC_PER_RB)], - gNB->pusch_vars[ulsch_id]->ul_ch_mag0, - gNB->pusch_vars[ulsch_id]->ul_ch_magb0, - &gNB->pusch_vars[ulsch_id]->llr[rxdataF_ext_offset * rel15_ul->qam_mod_order], - rel15_ul->rb_size, - gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[symbol], - symbol, - rel15_ul->qam_mod_order); + for (aatx=0; aatx < rel15_ul->nrOfLayers; aatx++) { + nr_ulsch_compute_llr(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aatx*frame_parms->nb_antennas_rx][symbol * (off + rel15_ul->rb_size * NR_NB_SC_PER_RB)], + gNB->pusch_vars[ulsch_id]->ul_ch_mag0[aatx*frame_parms->nb_antennas_rx], + gNB->pusch_vars[ulsch_id]->ul_ch_magb0[aatx*frame_parms->nb_antennas_rx], + &gNB->pusch_vars[ulsch_id]->llr_layers[aatx][rxdataF_ext_offset * rel15_ul->qam_mod_order], + rel15_ul->rb_size, + gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[symbol], + symbol, + rel15_ul->qam_mod_order); + } stop_meas(&gNB->ulsch_llr_stats); rxdataF_ext_offset += gNB->pusch_vars[ulsch_id]->ul_valid_re_per_slot[symbol]; } diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c index bf96a761060..f6eefe846ac 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c @@ -44,19 +44,19 @@ void nr_ulsch_qpsk_llr(int32_t *rxdataF_comp, uint32_t nb_re, uint8_t symbol) { - uint32_t *rxF = (uint32_t*)rxdataF_comp; - uint32_t *llr32 = (uint32_t*)ulsch_llr; + c16_t *rxF = (c16_t *)rxdataF_comp; + c16_t *llr32 = (c16_t *)ulsch_llr; if (!llr32) { LOG_E(PHY,"nr_ulsch_qpsk_llr: llr is null, symbol %d, llr32 = %p\n",symbol, llr32); } - /* - for (i = 0; i < nb_re; i++) { - *llr32 = *rxF; + for (int i = 0; i < nb_re; i++) { + //*llr32 = *rxF; + llr32->r = rxF->r >> 3; + llr32->i = rxF->i >> 3; rxF++; llr32++; - }*/ - memcpy1((void*)llr32,(void*)rxF,nb_re<<2); + } } //---------------------------------------------------------------------------------------------- @@ -64,7 +64,7 @@ void nr_ulsch_qpsk_llr(int32_t *rxdataF_comp, //---------------------------------------------------------------------------------------------- void nr_ulsch_16qam_llr(int32_t *rxdataF_comp, - int32_t **ul_ch_mag, + int32_t *ul_ch_mag, int16_t *ulsch_llr, uint32_t nb_rb, uint32_t nb_re, @@ -110,12 +110,12 @@ void nr_ulsch_16qam_llr(int32_t *rxdataF_comp, #if defined(__x86_64__) || defined(__i386__) #ifdef __AVX2__ - ch_mag = (__m256i*)&ul_ch_mag[0][(symbol*(off+(nb_rb*12)))]; + ch_mag = (__m256i*)&ul_ch_mag[(symbol*(off+(nb_rb*12)))]; #else - ch_mag = (__m128i*)&ul_ch_mag[0][(symbol*(off+(nb_rb*12)))]; + ch_mag = (__m128i*)&ul_ch_mag[(symbol*(off+(nb_rb*12)))]; #endif #elif defined(__arm__) - ch_mag = (int16x8_t*)&ul_ch_mag[0][(symbol*nb_rb*12)]; + ch_mag = (int16x8_t*)&ul_ch_mag[(symbol*nb_rb*12)]; #endif #ifdef __AVX2__ @@ -231,8 +231,8 @@ void nr_ulsch_16qam_llr(int32_t *rxdataF_comp, //---------------------------------------------------------------------------------------------- void nr_ulsch_64qam_llr(int32_t *rxdataF_comp, - int32_t **ul_ch_mag, - int32_t **ul_ch_magb, + int32_t *ul_ch_mag, + int32_t *ul_ch_magb, int16_t *ulsch_llr, uint32_t nb_rb, uint32_t nb_re, @@ -265,15 +265,15 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp, #if defined(__x86_64__) || defined(__i386__) #ifdef __AVX2__ - ch_mag = (__m256i*)&ul_ch_mag[0][(symbol*(off+(nb_rb*12)))]; - ch_magb = (__m256i*)&ul_ch_magb[0][(symbol*(off+(nb_rb*12)))]; + ch_mag = (__m256i*)&ul_ch_mag[(symbol*(off+(nb_rb*12)))]; + ch_magb = (__m256i*)&ul_ch_magb[(symbol*(off+(nb_rb*12)))]; #else - ch_mag = (__m128i*)&ul_ch_mag[0][(symbol*nb_rb*12)]; - ch_magb = (__m128i*)&ul_ch_magb[0][(symbol*nb_rb*12)]; + ch_mag = (__m128i*)&ul_ch_mag[(symbol*nb_rb*12)]; + ch_magb = (__m128i*)&ul_ch_magb[(symbol*nb_rb*12)]; #endif #elif defined(__arm__) - ch_mag = (int16x8_t*)&ul_ch_mag[0][(symbol*nb_rb*12)]; - ch_magb = (int16x8_t*)&ul_ch_magb[0][(symbol*nb_rb*12)]; + ch_mag = (int16x8_t*)&ul_ch_mag[(symbol*nb_rb*12)]; + ch_magb = (int16x8_t*)&ul_ch_magb[(symbol*nb_rb*12)]; #endif #ifdef __AVX2__ @@ -471,8 +471,8 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp, void nr_ulsch_compute_llr(int32_t *rxdataF_comp, - int32_t **ul_ch_mag, - int32_t **ul_ch_magb, + int32_t *ul_ch_mag, + int32_t *ul_ch_magb, int16_t *ulsch_llr, uint32_t nb_rb, uint32_t nb_re, diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c index fa177b98f50..85461df4414 100644 --- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c +++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c @@ -190,7 +190,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB, pucch_pdu->bit_len_harq,pucch_pdu->sr_flag); NR_gNB_UCI_STATS_t *uci_stats=NULL; - NR_gNB_UCI_STATS_t *first_uci_stats=NULL; + NR_gNB_UCI_STATS_t *first_uci_stats = gNB->uci_stats; for (int i=0;i<NUMBER_OF_NR_UCI_STATS_MAX;i++) if (gNB->uci_stats[i].rnti == pucch_pdu->rnti) { uci_stats = &gNB->uci_stats[i]; @@ -278,16 +278,30 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB, uint8_t maxpos=0; uint8_t index=0; + int nb_re_pucch = 12*pucch_pdu->prb_size; // prb size is 1 + int32_t rp[frame_parms->nb_antennas_rx][pucch_pdu->nr_of_symbols][nb_re_pucch],*tmp_rp; + for (int l=0; l<pucch_pdu->nr_of_symbols; l++) { l2 = l+pucch_pdu->start_symbol_index; + re_offset[l] = (12*prb_offset[l]) + frame_parms->first_carrier_offset; if (re_offset[l]>= frame_parms->ofdm_symbol_size) re_offset[l]-=frame_parms->ofdm_symbol_size; - - AssertFatal(re_offset[l]+12 < frame_parms->ofdm_symbol_size,"pucch straddles DC carrier, handle this!\n"); + for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++) { - c16_t *r=(c16_t*)&rxdataF[aa][soffset+(l2*frame_parms->ofdm_symbol_size)+re_offset[l]]; - for (n=0;n<12;n++) { + tmp_rp = &rxdataF[aa][soffset + l2*frame_parms->ofdm_symbol_size]; + if(re_offset[l] + nb_re_pucch > frame_parms->ofdm_symbol_size) { + int neg_length = frame_parms->ofdm_symbol_size-re_offset[l]; + int pos_length = nb_re_pucch-neg_length; + memcpy1((void*)rp[aa][l],(void*)&tmp_rp[re_offset[l]],neg_length*sizeof(int32_t)); + memcpy1((void*)&rp[aa][l][neg_length],(void*)tmp_rp,pos_length*sizeof(int32_t)); + } + else + memcpy1((void*)rp[aa][l],(void*)&tmp_rp[re_offset[l]],nb_re_pucch*sizeof(int32_t)); + + c16_t *r = (c16_t*)&rp[aa][l]; + + for (n=0;n<nb_re_pucch;n++) { xr[aa][l][n].r = (int32_t)x_re[l][n] * r[n].r + (int32_t)x_im[l][n] * r[n].i; xr[aa][l][n].i = (int32_t)x_re[l][n] * r[n].i - (int32_t)x_im[l][n] * r[n].r; #ifdef DEBUG_NR_PUCCH_RX @@ -317,8 +331,8 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB, corr[aa][l].r += xr[aa][l][n].r * idft12_re[seq_index][n] + xr[aa][l][n].i * idft12_im[seq_index][n]; corr[aa][l].i += xr[aa][l][n].r * idft12_im[seq_index][n] - xr[aa][l][n].i * idft12_re[seq_index][n]; } - corr[aa][l].r >>= 31; - corr[aa][l].i >>= 31; + corr[aa][l].r >>= 31; + corr[aa][l].i >>= 31; } } LOG_D(PHY,"PUCCH IDFT[%d/%d] = (%ld,%ld)=>%f\n", @@ -385,9 +399,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB, gNB->measurements.n0_subband_power_tot_dB[prb_offset[1]]); int SNRtimes10,sigenergy=0; for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++) - sigenergy += signal_energy_nodc(&rxdataF[aa][soffset+ - (pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size)+ - re_offset[0]],12); + sigenergy += signal_energy_nodc(rp[aa][0],12); SNRtimes10 = xrtmag_dBtimes10-(10*max_n0); int cqi; if (SNRtimes10 < -640) cqi=0; @@ -1545,7 +1557,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB, #ifdef DEBUG_NR_PUCCH_RX printf("cw_ML %d, metric %d dB\n",cw_ML,corr_dB); #endif - LOG_D(PHY,"slot %d PUCCH2 cw_ML %d, metric %d dB\n",slot,cw_ML,corr_dB); + LOG_D(PHY,"slot %d PUCCH2 cw_ML %d, metric %d dB\n", slot, cw_ML, corr_dB); decodedPayload[0]=(uint64_t)cw_ML; } diff --git a/openair1/PHY/NR_TRANSPORT/srs_rx.c b/openair1/PHY/NR_TRANSPORT/srs_rx.c index 2d7aefdee08..39c3846db59 100644 --- a/openair1/PHY/NR_TRANSPORT/srs_rx.c +++ b/openair1/PHY/NR_TRANSPORT/srs_rx.c @@ -98,7 +98,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, int slot, nfapi_nr_srs_pdu_t *srs_pdu, nr_srs_info_t *nr_srs_info, - int32_t **srs_received_signal) { + int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)]) { if(nr_srs_info->sc_list_length == 0) { LOG_E(NR_PHY, "(%d.%d) nr_srs_info was not generated yet!\n", frame, slot); @@ -113,6 +113,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, uint64_t symbol_offset = (n_symbols+l0)*frame_parms->ofdm_symbol_size; int32_t *rx_signal; + bool no_srs_signal = true; for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) { memset(srs_received_signal[ant], 0, frame_parms->ofdm_symbol_size*sizeof(int32_t)); @@ -121,6 +122,10 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) { srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]] = rx_signal[nr_srs_info->sc_list[sc_idx]]; + if (rx_signal[nr_srs_info->sc_list[sc_idx]] != 0) { + no_srs_signal = false; + } + #ifdef SRS_DEBUG uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*12; int subcarrier_log = nr_srs_info->sc_list[sc_idx]-subcarrier_offset; @@ -140,5 +145,11 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, #endif } } - return 0; + + if (no_srs_signal) { + LOG_W(NR_PHY, "No SRS signal\n"); + return -1; + } else { + return 0; + } } \ No newline at end of file diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c index 7fb73627798..5e2fc853873 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c @@ -120,7 +120,7 @@ short filt16a_m3_dc[16] = { -9831,-6554,-3277,0,3276,6553,9830,16384,12288,8192,4096,0,0,0,0,0}; short filt16a_1[16] = { -16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384}; +16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,0,0,0,0}; short filt16a_2l0[16] = { 16384,12288,8192,4096,-4096,0,0,0,0,0,0,0,0,0,0,0}; @@ -190,10 +190,10 @@ short filt8_mm1[8]= { 0,0,0,0,8192,16384,8192,0}; short filt8_dcl1[8]= { -0,0,0,16384,12288,8192,4096,0}; +0,0,16384,12288,8192,4096,0,0}; short filt8_dcr1[8]= { -0,0,0,0,4096,8192,12288,16384}; +0,0,0,4096,8192,12288,16384,0}; short filt8_dcl1_h[8]= { 0,16384,12288,8192,4096,0,0,0}; @@ -309,4 +309,17 @@ short filt16_middle4[16] = { 4096,8192,8192,8192,8192,8192,8192,8192,4096,0,0,0,0,0,0,0}; short filt16_end[16] = { - 4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0}; \ No newline at end of file + 4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0}; + +// CSI-RS +short filt24_start[24] = { + 12288,11605,10923,10240,9557,8875,8192,7509,6827,6144,5461,4779, + 0,0,0,0,0,0,0,0,0,0,0,0}; + +short filt24_end[24] = { + 4096,4779,5461,6144,6827,7509,8192,8875,9557,10240,10923,11605, + 16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384}; + +short filt24_middle[24] = { + 4096,4779,5461,6144,6827,7509,8192,8875,9557,10240,10923,11605, + 12288,11605,10923,10240,9557,8875,8192,7509,6827,6144,5461,4779}; diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h index f88bef56a0a..3bc802ce7a4 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h @@ -211,4 +211,10 @@ extern short filt8_end[8]; extern short filt16_start[16]; extern short filt16_middle4[16]; extern short filt16_end[16]; + +/*CSI-RS*/ +extern short filt24_start[24]; +extern short filt24_end[24]; +extern short filt24_middle[24]; + #endif diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 9756f1105f3..76eb901c876 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -567,6 +567,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, return(0); } +#define CH_INTERP 0 +#define NO_INTERP 1 /* Generic function to find the peak of channel estimation buffer */ void peak_estimator(int32_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t *peak_val) @@ -1029,7 +1031,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, unsigned char aarx; unsigned short k; unsigned int pilot_cnt; - int16_t ch[2],*pil,*rxF,*dl_ch,*fl,*fm,*fr; + int16_t ch[2],*pil,*rxF,*dl_ch; int ch_offset,symbol_offset; int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; @@ -1044,9 +1046,11 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, proc->thread_id, gNB_id,ch_offset,ue->frame_parms.ofdm_symbol_size,ue->frame_parms.Ncp,Ns,symbol); #endif - fl = filt16a_l1; - fm = filt16a_m1; - fr = filt16a_r1; +#if CH_INTERP + int16_t *fl = filt16a_l1; + int16_t *fm = filt16a_m1; + int16_t *fr = filt16a_r1; +#endif // checking if re-initialization of scrambling IDs is needed (should be done here but scrambling ID for PDCCH is not taken from RRC) if (scrambling_id != ue->scramblingID_pdcch){ @@ -1075,6 +1079,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, printf("dl_ch addr %p\n",dl_ch); #endif + #if CH_INTERP // if ((ue->frame_parms.N_RB_DL&1)==0) { // Treat first 2 pilots specially (left edge) ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -1203,6 +1208,33 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, rxF += 8; k += 4; } + #else //ELSE CH_INTERP + int ch_sum[2] = {0, 0}; + + for (pilot_cnt = 0; pilot_cnt < 3*nb_rb_coreset; pilot_cnt++) { + if (k >= ue->frame_parms.ofdm_symbol_size) { + k -= ue->frame_parms.ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+1)]; + } +#ifdef DEBUG_PDCCH + printf("pilot[%d] = (%d, %d)\trxF[%d] = (%d, %d)\n", pilot_cnt, pil[0], pil[1], k+1, rxF[0], rxF[1]); +#endif + ch_sum[0] += (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ch_sum[1] += (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + pil += 2; + rxF += 8; + k += 4; + + if (pilot_cnt % 3 == 2) { + ch[0] = ch_sum[0] / 3; + ch[1] = ch_sum[1] / 3; + multadd_real_vector_complex_scalar(filt16a_1, ch, dl_ch, 16); + dl_ch += 24; + ch_sum[0] = 0; + ch_sum[1] = 0; + } + } + #endif //END CH_INTERP //} @@ -1235,7 +1267,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, int ch_offset,symbol_offset; uint8_t nushift; - int **dl_ch_estimates =ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates; + int **dl_ch_estimates = ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates; int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; ch_offset = ue->frame_parms.ofdm_symbol_size*symbol; @@ -1245,7 +1277,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, k = bwp_start_subcarrier; int re_offset = k; -#ifdef DEBUG_CH +#ifdef DEBUG_PDSCH printf("PDSCH Channel Estimation : ThreadId %d, gNB_id %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, gNB_id,ch_offset,symbol_offset,ue->frame_parms.ofdm_symbol_size, ue->frame_parms.Ncp,Ns,k, symbol); #endif @@ -1360,7 +1392,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, printf("rxF addr %p p %d\n", rxF,p); printf("dl_ch addr %p nushift %d\n",dl_ch,nushift); #endif - if (config_type == NFAPI_NR_DMRS_TYPE1 && ue->prb_interpolation == 0) { + if (config_type == NFAPI_NR_DMRS_TYPE1 && ue->chest_freq == 0) { // Treat first 2 pilots specially (left edge) ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -1537,7 +1569,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, 8); } } - } else if (config_type == NFAPI_NR_DMRS_TYPE2 && ue->prb_interpolation == 0){ //pdsch_dmrs_type2 |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0| + } else if (config_type == NFAPI_NR_DMRS_TYPE2 && ue->chest_freq == 0){ //pdsch_dmrs_type2 |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0| // Treat first 4 pilots specially (left edge) ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -1797,6 +1829,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = ch_0 / 6; ch[1] = ch_1 / 6; +#if NO_INTERP + for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch; + dl_ch+=24; +#else multadd_real_vector_complex_scalar(filt8_avlip0, ch, dl_ch, @@ -1814,6 +1850,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch, 8); dl_ch -= 24; +#endif for (pilot_cnt=6; pilot_cnt<6*(nb_rb_pdsch-1); pilot_cnt += 6) { @@ -1861,6 +1898,11 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = ch_0 / 6; ch[1] = ch_1 / 6; + +#if NO_INTERP + for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch; + dl_ch+=24; +#else dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384 dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384 @@ -1882,6 +1924,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch, 8); dl_ch -= 16; +#endif } ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; @@ -1928,6 +1971,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = ch_0 / 6; ch[1] = ch_1 / 6; +#if NO_INTERP + for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch; + dl_ch+=24; +#else dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384 dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384 @@ -1942,6 +1989,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ch, dl_ch, 8); +#endif } else { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 4 DMRS REs and use a common value for the whole PRB int32_t ch_0, ch_1; @@ -1977,6 +2025,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = ch_0 / 4; ch[1] = ch_1 / 4; +#if NO_INTERP + for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch; + dl_ch+=24; +#else multadd_real_vector_complex_scalar(filt8_avlip0, ch, dl_ch, @@ -1994,6 +2046,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch, 8); dl_ch -= 24; +#endif for (pilot_cnt=4; pilot_cnt<4*(nb_rb_pdsch-1); pilot_cnt += 4) { int32_t ch_0, ch_1; @@ -2029,6 +2082,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = ch_0 / 4; ch[1] = ch_1 / 4; +#if NO_INTERP + for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch; + dl_ch+=24; +#else dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384 dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384 @@ -2050,6 +2107,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, dl_ch, 8); dl_ch -= 16; +#endif } ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; @@ -2083,6 +2141,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = ch_0 / 4; ch[1] = ch_1 / 4; +#if NO_INTERP + for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch; + dl_ch+=24; +#else dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384 dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384 @@ -2097,6 +2159,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ch, dl_ch, 8); +#endif } #ifdef DEBUG_PDSCH dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset]; @@ -2147,7 +2210,6 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue, RX_type_t rx_type) { //#define DEBUG_DL_PTRS 1 - int16_t *phase_per_symbol = NULL; int32_t *ptrs_re_symbol = NULL; int8_t ret = 0; /* harq specific variables */ @@ -2191,20 +2253,20 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue, } /* loop over antennas */ for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - phase_per_symbol = (int16_t*)pdsch_vars[gNB_id]->ptrs_phase_per_slot[aarx]; + c16_t *phase_per_symbol = (c16_t*)pdsch_vars[gNB_id]->ptrs_phase_per_slot[aarx]; ptrs_re_symbol = (int32_t*)pdsch_vars[gNB_id]->ptrs_re_per_slot[aarx]; ptrs_re_symbol[symbol] = 0; - phase_per_symbol[(2*symbol)+1] = 0; // Imag + phase_per_symbol[symbol].i = 0; // Imag /* set DMRS estimates to 0 angle with magnitude 1 */ if(is_dmrs_symbol(symbol,*dmrsSymbPos)) { /* set DMRS real estimation to 32767 */ - phase_per_symbol[2*symbol]=(int16_t)((1<<15)-1); // 32767 + phase_per_symbol[symbol].r=INT16_MAX; // 32767 #ifdef DEBUG_DL_PTRS - printf("[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d\n", symbol, phase_per_symbol[2*symbol],phase_per_symbol[(2*symbol)+1]); + printf("[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d\n", symbol, phase_per_symbol[symbol].r,phase_per_symbol[symbol].i); #endif } else { // real ptrs value is set to 0 - phase_per_symbol[2*symbol] = 0; // Real + phase_per_symbol[symbol].r = 0; // Real } if(dlsch0_harq->status == ACTIVE) { @@ -2226,12 +2288,11 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue, /*------------------------------------------------------------------------------------------------------- */ nr_ptrs_cpe_estimation(*K_ptrs,*ptrsReOffset,*dmrsConfigType,*nb_rb, rnti, - (int16_t *)&pdsch_vars[gNB_id]->dl_ch_ptrs_estimates_ext[aarx][symbol*nb_re_pdsch], nr_slot_rx, symbol,frame_parms->ofdm_symbol_size, (int16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(symbol * nb_re_pdsch)], ue->nr_gold_pdsch[gNB_id][nr_slot_rx][symbol][0], - &phase_per_symbol[2* symbol], + (int16_t*)&phase_per_symbol[symbol], &ptrs_re_symbol[symbol]); } }// HARQ 0 @@ -2243,7 +2304,7 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue, /*------------------------------------------------------------------------------------------------------- */ /* If L-PTRS is > 0 then we need interpolation */ if(*L_ptrs > 0) { - ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, phase_per_symbol, *startSymbIndex, *nbSymb); + ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, (int16_t*)phase_per_symbol, *startSymbIndex, *nbSymb); if(ret != 0) { LOG_W(PHY,"[PTRS] Compensation is skipped due to error in PTRS slot processing !!\n"); } @@ -2262,11 +2323,11 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue, /* Skip rotation if the slot processing is wrong */ if((!is_dmrs_symbol(i,*dmrsSymbPos)) && (ret == 0)) { #ifdef DEBUG_DL_PTRS - printf("[PHY][DL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[2* i],phase_per_symbol[(2* i) +1]); + printf("[PHY][DL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[i].r,phase_per_symbol[i].i); #endif - rotate_cpx_vector((int16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)], - &phase_per_symbol[2* i], - (int16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)], + rotate_cpx_vector((c16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)], + &phase_per_symbol[i], + (c16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)], ((*nb_rb) * NR_NB_SC_PER_RB), 15); }// if not DMRS Symbol }// symbol loop diff --git a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c new file mode 100644 index 00000000000..43944b2fa87 --- /dev/null +++ b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c @@ -0,0 +1,969 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*********************************************************************** +* +* FILENAME : csi_rx.c +* +* MODULE : +* +* DESCRIPTION : function to receive the channel state information +* +************************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "executables/nr-softmodem-common.h" +#include "nr_transport_proto_ue.h" +#include "PHY/phy_extern_nr_ue.h" +#include "common/utils/nr/nr_common.h" +#include "PHY/NR_TRANSPORT/nr_transport_proto.h" +#include "PHY/NR_UE_ESTIMATION/filt16a_32.h" + +// 10*log10(pow(2,30)) +#define pow_2_30_dB 90 + +//#define NR_CSIRS_DEBUG +//#define NR_CSIIM_DEBUG + +void nr_det_A_MF_2x2(int32_t *a_mf_00, + int32_t *a_mf_01, + int32_t *a_mf_10, + int32_t *a_mf_11, + int32_t *det_fin, + const unsigned short nb_rb) { + + int16_t nr_conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ; + + __m128i ad_re_128, bc_re_128, det_re_128; + + __m128i *a_mf_00_128 = (__m128i *)a_mf_00; + __m128i *a_mf_01_128 = (__m128i *)a_mf_01; + __m128i *a_mf_10_128 = (__m128i *)a_mf_10; + __m128i *a_mf_11_128 = (__m128i *)a_mf_11; + __m128i *det_fin_128 = (__m128i *)det_fin; + + for (int rb = 0; rb<3*nb_rb; rb++) { + + //complex multiplication (I_a+jQ_a)(I_d+jQ_d) = (I_aI_d - Q_aQ_d) + j(Q_aI_d + I_aQ_d) + //The imag part is often zero, we compute only the real part + ad_re_128 = _mm_sign_epi16(a_mf_00_128[0],*(__m128i*)&nr_conjug2[0]); + ad_re_128 = _mm_madd_epi16(ad_re_128,a_mf_11_128[0]); //Re: I_a0*I_d0 - Q_a1*Q_d1 + + //complex multiplication (I_b+jQ_b)(I_c+jQ_c) = (I_bI_c - Q_bQ_c) + j(Q_bI_c + I_bQ_c) + //The imag part is often zero, we compute only the real part + bc_re_128 = _mm_sign_epi16(a_mf_01_128[0],*(__m128i*)&nr_conjug2[0]); + bc_re_128 = _mm_madd_epi16(bc_re_128,a_mf_10_128[0]); //Re: I_b0*I_c0 - Q_b1*Q_c1 + + det_re_128 = _mm_sub_epi32(ad_re_128, bc_re_128); + + //det in Q30 format + det_fin_128[0] = _mm_abs_epi32(det_re_128); + + det_fin_128+=1; + a_mf_00_128+=1; + a_mf_01_128+=1; + a_mf_10_128+=1; + a_mf_11_128+=1; + } + _mm_empty(); + _m_empty(); +} + +void nr_squared_matrix_element(int32_t *a, + int32_t *a_sq, + const unsigned short nb_rb) { + __m128i *a_128 = (__m128i *)a; + __m128i *a_sq_128 = (__m128i *)a_sq; + for (int rb=0; rb<3*nb_rb; rb++) { + a_sq_128[0] = _mm_madd_epi16(a_128[0], a_128[0]); + a_sq_128+=1; + a_128+=1; + } + _mm_empty(); + _m_empty(); +} + +void nr_numer_2x2(int32_t *a_00_sq, + int32_t *a_01_sq, + int32_t *a_10_sq, + int32_t *a_11_sq, + int32_t *num_fin, + const unsigned short nb_rb) { + __m128i *a_00_sq_128 = (__m128i *)a_00_sq; + __m128i *a_01_sq_128 = (__m128i *)a_01_sq; + __m128i *a_10_sq_128 = (__m128i *)a_10_sq; + __m128i *a_11_sq_128 = (__m128i *)a_11_sq; + __m128i *num_fin_128 = (__m128i *)num_fin; + for (int rb=0; rb<3*nb_rb; rb++) { + __m128i sq_a_plus_sq_d_128 = _mm_add_epi32(a_00_sq_128[0], a_11_sq_128[0]); + __m128i sq_b_plus_sq_c_128 = _mm_add_epi32(a_01_sq_128[0], a_10_sq_128[0]); + num_fin_128[0] = _mm_add_epi32(sq_a_plus_sq_d_128, sq_b_plus_sq_c_128); + num_fin_128+=1; + a_00_sq_128+=1; + a_01_sq_128+=1; + a_10_sq_128+=1; + a_11_sq_128+=1; + } + _mm_empty(); + _m_empty(); +} + +bool is_csi_rs_in_symbol(const fapi_nr_dl_config_csirs_pdu_rel15_t csirs_config_pdu, const int symbol) { + + bool ret = false; + + // 38.211-Table 7.4.1.5.3-1: CSI-RS locations within a slot + switch(csirs_config_pdu.row){ + case 1: + case 2: + case 3: + case 4: + case 6: + case 9: + if(symbol == csirs_config_pdu.symb_l0) { + ret = true; + } + break; + case 5: + case 7: + case 8: + case 10: + case 11: + case 12: + if(symbol == csirs_config_pdu.symb_l0 || symbol == (csirs_config_pdu.symb_l0+1) ) { + ret = true; + } + break; + case 13: + case 14: + case 16: + case 17: + if(symbol == csirs_config_pdu.symb_l0 || symbol == (csirs_config_pdu.symb_l0+1) || + symbol == csirs_config_pdu.symb_l1 || symbol == (csirs_config_pdu.symb_l1+1)) { + ret = true; + } + break; + case 15: + case 18: + if(symbol == csirs_config_pdu.symb_l0 || symbol == (csirs_config_pdu.symb_l0+1) || symbol == (csirs_config_pdu.symb_l0+2) ) { + ret = true; + } + break; + default: + AssertFatal(0==1, "Row %d is not valid for CSI Table 7.4.1.5.3-1\n", csirs_config_pdu.row); + } + + return ret; +} + +int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue, + const UE_nr_rxtx_proc_t *proc, + const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu, + const nr_csi_info_t *nr_csi_info, + const uint8_t N_cdm_groups, + const uint8_t CDM_group_size, + const uint8_t k_prime, + const uint8_t l_prime, + const uint8_t *j_cdm, + const uint8_t *k_overline, + const uint8_t *l_overline, + int32_t csi_rs_received_signal[][ue->frame_parms.samples_per_slot_wCP], + uint32_t *rsrp, + int *rsrp_dBm) { + + int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; + const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + uint16_t meas_count = 0; + uint32_t rsrp_sum = 0; + + for (int ant_rx = 0; ant_rx < frame_parms->nb_antennas_rx; ant_rx++) { + + for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) { + + // for freq density 0.5 checks if even or odd RB + if(csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) { + continue; + } + + for (int cdm_id = 0; cdm_id < N_cdm_groups; cdm_id++) { + for (int s = 0; s < CDM_group_size; s++) { + + // loop over frequency resource elements within a group + for (int kp = 0; kp <= k_prime; kp++) { + + uint16_t k = (frame_parms->first_carrier_offset + (rb*NR_NB_SC_PER_RB)+k_overline[cdm_id] + kp) % frame_parms->ofdm_symbol_size; + + // loop over time resource elements within a group + for (int lp = 0; lp <= l_prime; lp++) { + uint16_t symb = lp + l_overline[cdm_id]; + uint64_t symbol_offset = symb*frame_parms->ofdm_symbol_size; + c16_t *rx_signal = (c16_t*)&rxdataF[ant_rx][symbol_offset]; + c16_t *rx_csi_rs_signal = (c16_t*)&csi_rs_received_signal[ant_rx][symbol_offset]; + rx_csi_rs_signal[k].r = rx_signal[k].r; + rx_csi_rs_signal[k].i = rx_signal[k].i; + + rsrp_sum += (((int32_t)(rx_csi_rs_signal[k].r)*rx_csi_rs_signal[k].r) + + ((int32_t)(rx_csi_rs_signal[k].i)*rx_csi_rs_signal[k].i)); + + meas_count++; + +#ifdef NR_CSIRS_DEBUG + int dataF_offset = proc->nr_slot_rx*ue->frame_parms.samples_per_slot_wCP; + uint16_t port_tx = s+j_cdm[cdm_id]*CDM_group_size; + c16_t *tx_csi_rs_signal = (c16_t*)&nr_csi_info->csi_rs_generated_signal[port_tx][symbol_offset+dataF_offset]; + LOG_I(NR_PHY, "l,k (%2d,%4d) |\tport_tx %d (%4d,%4d)\tant_rx %d (%4d,%4d)\n", + symb, + k, + port_tx+3000, + tx_csi_rs_signal[k].r, + tx_csi_rs_signal[k].i, + ant_rx, + rx_csi_rs_signal[k].r, + rx_csi_rs_signal[k].i); +#endif + } + } + } + } + } + } + + + *rsrp = rsrp_sum/meas_count; + *rsrp_dBm = dB_fixed(*rsrp) + 30 - pow_2_30_dB + - ((int)openair0_cfg[0].rx_gain[0] - (int)openair0_cfg[0].rx_gain_offset[0]) - dB_fixed(ue->frame_parms.ofdm_symbol_size); + +#ifdef NR_CSIRS_DEBUG + LOG_I(NR_PHY, "RSRP = %i (%i dBm)\n", *rsrp, *rsrp_dBm); +#endif + + return 0; +} + +uint32_t calc_power_csirs(const uint16_t *x, const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu) { + uint64_t sum_x = 0; + uint64_t sum_x2 = 0; + uint16_t size = 0; + for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) { + if (csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) { + continue; + } + sum_x = sum_x + x[rb-csirs_config_pdu->start_rb]; + sum_x2 = sum_x2 + x[rb]*x[rb-csirs_config_pdu->start_rb]; + size++; + } + return sum_x2/size - (sum_x/size)*(sum_x/size); +} + +int nr_csi_rs_channel_estimation(const PHY_VARS_NR_UE *ue, + const UE_nr_rxtx_proc_t *proc, + const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu, + const nr_csi_info_t *nr_csi_info, + const int32_t **csi_rs_generated_signal, + const int32_t csi_rs_received_signal[][ue->frame_parms.samples_per_slot_wCP], + const uint8_t N_cdm_groups, + const uint8_t CDM_group_size, + const uint8_t k_prime, + const uint8_t l_prime, + const uint8_t N_ports, + const uint8_t *j_cdm, + const uint8_t *k_overline, + const uint8_t *l_overline, + int32_t csi_rs_ls_estimated_channel[][N_ports][ue->frame_parms.ofdm_symbol_size], + int32_t csi_rs_estimated_channel_freq[][N_ports][ue->frame_parms.ofdm_symbol_size], + int16_t *log2_re, + int16_t *log2_maxh, + uint32_t *noise_power) { + + const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + const int dataF_offset = proc->nr_slot_rx*ue->frame_parms.samples_per_slot_wCP; + *noise_power = 0; + int maxh = 0; + int count = 0; + + for (int ant_rx = 0; ant_rx < frame_parms->nb_antennas_rx; ant_rx++) { + + /// LS channel estimation + + for(uint16_t port_tx = 0; port_tx<N_ports; port_tx++) { + memset(csi_rs_ls_estimated_channel[ant_rx][port_tx], 0, frame_parms->ofdm_symbol_size*sizeof(int32_t)); + } + + for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) { + + // for freq density 0.5 checks if even or odd RB + if(csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) { + continue; + } + + for (int cdm_id = 0; cdm_id < N_cdm_groups; cdm_id++) { + for (int s = 0; s < CDM_group_size; s++) { + + uint16_t port_tx = s+j_cdm[cdm_id]*CDM_group_size; + + // loop over frequency resource elements within a group + for (int kp = 0; kp <= k_prime; kp++) { + + uint16_t kinit = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size; + uint16_t k = kinit + k_overline[cdm_id] + kp; + + // loop over time resource elements within a group + for (int lp = 0; lp <= l_prime; lp++) { + uint16_t symb = lp + l_overline[cdm_id]; + uint64_t symbol_offset = symb*frame_parms->ofdm_symbol_size; + c16_t *tx_csi_rs_signal = (c16_t*)&csi_rs_generated_signal[port_tx][symbol_offset+dataF_offset]; + c16_t *rx_csi_rs_signal = (c16_t*)&csi_rs_received_signal[ant_rx][symbol_offset]; + c16_t *csi_rs_ls_estimated_channel16 = (c16_t*)&csi_rs_ls_estimated_channel[ant_rx][port_tx][0]; + + int16_t csi_rs_ls_estimated_channel_re = (int16_t)(((int32_t)tx_csi_rs_signal[k].r*rx_csi_rs_signal[k].r + (int32_t)tx_csi_rs_signal[k].i*rx_csi_rs_signal[k].i)>>nr_csi_info->csi_rs_generated_signal_bits); + int16_t csi_rs_ls_estimated_channel_im = (int16_t)(((int32_t)tx_csi_rs_signal[k].r*rx_csi_rs_signal[k].i - (int32_t)tx_csi_rs_signal[k].i*rx_csi_rs_signal[k].r)>>nr_csi_info->csi_rs_generated_signal_bits); + + // This is not just the LS estimation for each (k,l), but also the sum of the different contributions + // for the sake of optimizing the memory used. + csi_rs_ls_estimated_channel16[kinit].r += csi_rs_ls_estimated_channel_re; + csi_rs_ls_estimated_channel16[kinit].i += csi_rs_ls_estimated_channel_im; + } + } + } + } + } + +#ifdef NR_CSIRS_DEBUG + for(int symb = 0; symb < NR_SYMBOLS_PER_SLOT; symb++) { + if(!is_csi_rs_in_symbol(*csirs_config_pdu,symb)) { + continue; + } + for(int k = 0; k<frame_parms->ofdm_symbol_size; k++) { + LOG_I(NR_PHY, "l,k (%2d,%4d) | ", symb, k); + for(uint16_t port_tx = 0; port_tx<N_ports; port_tx++) { + uint64_t symbol_offset = symb*frame_parms->ofdm_symbol_size; + c16_t *tx_csi_rs_signal = (c16_t*)&csi_rs_generated_signal[port_tx][symbol_offset+dataF_offset]; + c16_t *rx_csi_rs_signal = (c16_t*)&csi_rs_received_signal[ant_rx][symbol_offset]; + c16_t *csi_rs_ls_estimated_channel16 = (c16_t*)&csi_rs_ls_estimated_channel[ant_rx][port_tx][0]; + printf("port_tx %d --> ant_rx %d, tx (%4d,%4d), rx (%4d,%4d), ls (%4d,%4d) | ", + port_tx+3000, ant_rx, + tx_csi_rs_signal[k].r, tx_csi_rs_signal[k].i, + rx_csi_rs_signal[k].r, rx_csi_rs_signal[k].i, + csi_rs_ls_estimated_channel16[k].r, csi_rs_ls_estimated_channel16[k].i); + } + printf("\n"); + } + } +#endif + + /// Channel interpolation + + for(uint16_t port_tx = 0; port_tx<N_ports; port_tx++) { + memset(csi_rs_estimated_channel_freq[ant_rx][port_tx], 0, frame_parms->ofdm_symbol_size*sizeof(int32_t)); + } + + for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) { + + // for freq density 0.5 checks if even or odd RB + if(csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) { + continue; + } + + count++; + + uint16_t k = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size; + for(uint16_t port_tx = 0; port_tx<N_ports; port_tx++) { + int16_t *csi_rs_ls_estimated_channel16 = (int16_t*)&csi_rs_ls_estimated_channel[ant_rx][port_tx][k]; + int16_t *csi_rs_estimated_channel16 = (int16_t *)&csi_rs_estimated_channel_freq[ant_rx][port_tx][k]; + if( (k == 0) || (k == frame_parms->first_carrier_offset) ) { // Start of OFDM symbol case or first occupied subcarrier case + multadd_real_vector_complex_scalar(filt24_start, csi_rs_ls_estimated_channel16, csi_rs_estimated_channel16, 24); + } else if( ( (k + NR_NB_SC_PER_RB) >= frame_parms->ofdm_symbol_size) || + (rb == (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs-1)) ) { // End of OFDM symbol case or Last occupied subcarrier case + multadd_real_vector_complex_scalar(filt24_end, csi_rs_ls_estimated_channel16, csi_rs_estimated_channel16 - 3*sizeof(uint64_t), 24); + } else { // Middle case + multadd_real_vector_complex_scalar(filt24_middle, csi_rs_ls_estimated_channel16, csi_rs_estimated_channel16 - 3*sizeof(uint64_t), 24); + } + } + } + + /// Power noise estimation + uint16_t noise_real[frame_parms->nb_antennas_rx][N_ports][csirs_config_pdu->nr_of_rbs]; + uint16_t noise_imag[frame_parms->nb_antennas_rx][N_ports][csirs_config_pdu->nr_of_rbs]; + for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) { + if (csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) { + continue; + } + uint16_t k = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size; + for(uint16_t port_tx = 0; port_tx<N_ports; port_tx++) { + c16_t *csi_rs_ls_estimated_channel16 = (c16_t*)&csi_rs_ls_estimated_channel[ant_rx][port_tx][k]; + c16_t *csi_rs_estimated_channel16 = (c16_t *)&csi_rs_estimated_channel_freq[ant_rx][port_tx][k]; + noise_real[ant_rx][port_tx][rb-csirs_config_pdu->start_rb] = abs(csi_rs_ls_estimated_channel16->r-csi_rs_estimated_channel16->r); + noise_imag[ant_rx][port_tx][rb-csirs_config_pdu->start_rb] = abs(csi_rs_ls_estimated_channel16->i-csi_rs_estimated_channel16->i); + maxh = cmax3(maxh, abs(csi_rs_estimated_channel16->r), abs(csi_rs_estimated_channel16->i)); + } + } + for(uint16_t port_tx = 0; port_tx<N_ports; port_tx++) { + *noise_power += (calc_power_csirs(noise_real[ant_rx][port_tx], csirs_config_pdu) + calc_power_csirs(noise_imag[ant_rx][port_tx],csirs_config_pdu)); + } + +#ifdef NR_CSIRS_DEBUG + for(int k = 0; k<frame_parms->ofdm_symbol_size; k++) { + int rb = k >= frame_parms->first_carrier_offset ? + (k - frame_parms->first_carrier_offset)/NR_NB_SC_PER_RB : + (k + frame_parms->ofdm_symbol_size - frame_parms->first_carrier_offset)/NR_NB_SC_PER_RB; + LOG_I(NR_PHY, "(k = %4d) |\t", k); + for(uint16_t port_tx = 0; port_tx<N_ports; port_tx++) { + c16_t *csi_rs_ls_estimated_channel16 = (c16_t*)&csi_rs_ls_estimated_channel[ant_rx][port_tx][0]; + c16_t *csi_rs_estimated_channel16 = (c16_t *)&csi_rs_estimated_channel_freq[ant_rx][port_tx][0]; + printf("Channel port_tx %d --> ant_rx %d : ls (%4d,%4d), int (%4d,%4d), noise (%4d,%4d) | ", + port_tx+3000, ant_rx, + csi_rs_ls_estimated_channel16[k].r, csi_rs_ls_estimated_channel16[k].i, + csi_rs_estimated_channel16[k].r, csi_rs_estimated_channel16[k].i, + rb >= csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs ? 0 : noise_real[ant_rx][port_tx][rb-csirs_config_pdu->start_rb], + rb >= csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs ? 0 : noise_imag[ant_rx][port_tx][rb-csirs_config_pdu->start_rb]); + } + printf("\n"); + } +#endif + + } + + *noise_power /= (frame_parms->nb_antennas_rx*N_ports); + *log2_maxh = log2_approx(maxh-1); + *log2_re = log2_approx(count-1); + +#ifdef NR_CSIRS_DEBUG + LOG_I(NR_PHY, "Noise power estimation based on CSI-RS: %i\n", *noise_power); +#endif + + return 0; +} + +int nr_csi_rs_ri_estimation(const PHY_VARS_NR_UE *ue, + const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu, + const nr_csi_info_t *nr_csi_info, + const uint8_t N_ports, + int32_t csi_rs_estimated_channel_freq[][N_ports][ue->frame_parms.ofdm_symbol_size], + const int16_t log2_maxh, + uint8_t *rank_indicator) { + + const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + const int16_t cond_dB_threshold = 5; + int count = 0; + *rank_indicator = 0; + + if (ue->frame_parms.nb_antennas_rx == 1 || N_ports == 1) { + return 0; + } else if( !(ue->frame_parms.nb_antennas_rx == 2 && N_ports == 2) ) { + LOG_W(NR_PHY, "Rank indicator computation is not implemented for %i x %i system\n", + ue->frame_parms.nb_antennas_rx, N_ports); + return -1; + } + + /* Example 2x2: Hh x H = + * | conjch00 conjch10 | x | ch00 ch01 | = | conjch00*ch00+conjch10*ch10 conjch00*ch01+conjch10*ch11 | + * | conjch01 conjch11 | | ch10 ch11 | | conjch01*ch00+conjch11*ch10 conjch01*ch01+conjch11*ch11 | + */ + + int32_t csi_rs_estimated_conjch_ch[frame_parms->nb_antennas_rx][N_ports][frame_parms->nb_antennas_rx][N_ports][frame_parms->ofdm_symbol_size] __attribute__((aligned(32))); + int32_t csi_rs_estimated_A_MF[N_ports][N_ports][frame_parms->ofdm_symbol_size] __attribute__((aligned(32))); + int32_t csi_rs_estimated_A_MF_sq[N_ports][N_ports][frame_parms->ofdm_symbol_size] __attribute__((aligned(32))); + int32_t csi_rs_estimated_determ_fin[frame_parms->ofdm_symbol_size] __attribute__((aligned(32))); + int32_t csi_rs_estimated_numer_fin[frame_parms->ofdm_symbol_size] __attribute__((aligned(32))); + + const uint8_t sum_shift = 1; // log2(2x2) = 2, which is a shift of 1 bit + + for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) { + + if (csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) { + continue; + } + uint16_t k = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size; + + for (int ant_rx_conjch = 0; ant_rx_conjch < frame_parms->nb_antennas_rx; ant_rx_conjch++) { + for(uint16_t port_tx_conjch = 0; port_tx_conjch < N_ports; port_tx_conjch++) { + for (int ant_rx_ch = 0; ant_rx_ch < frame_parms->nb_antennas_rx; ant_rx_ch++) { + for(uint16_t port_tx_ch = 0; port_tx_ch < N_ports; port_tx_ch++) { + + // conjch x ch computation + nr_conjch0_mult_ch1(&csi_rs_estimated_channel_freq[ant_rx_conjch][port_tx_conjch][k], + &csi_rs_estimated_channel_freq[ant_rx_ch][port_tx_ch][k], + &csi_rs_estimated_conjch_ch[ant_rx_conjch][port_tx_conjch][ant_rx_ch][port_tx_ch][k], + 1, + log2_maxh); + + // construct Hh x H elements + if(ant_rx_conjch == ant_rx_ch) { + nr_a_sum_b((__m128i *)&csi_rs_estimated_A_MF[port_tx_conjch][port_tx_ch][k], + (__m128i *)&csi_rs_estimated_conjch_ch[ant_rx_conjch][port_tx_conjch][ant_rx_ch][port_tx_ch][k], + 1); + } + } + } + } + } + + // compute the determinant of A_MF (denominator) + nr_det_A_MF_2x2(&csi_rs_estimated_A_MF[0][0][k], + &csi_rs_estimated_A_MF[0][1][k], + &csi_rs_estimated_A_MF[1][0][k], + &csi_rs_estimated_A_MF[1][1][k], + &csi_rs_estimated_determ_fin[k], + 1); + + // compute the square of A_MF (numerator) + nr_squared_matrix_element(&csi_rs_estimated_A_MF[0][0][k], &csi_rs_estimated_A_MF_sq[0][0][k], 1); + nr_squared_matrix_element(&csi_rs_estimated_A_MF[0][1][k], &csi_rs_estimated_A_MF_sq[0][1][k], 1); + nr_squared_matrix_element(&csi_rs_estimated_A_MF[1][0][k], &csi_rs_estimated_A_MF_sq[1][0][k], 1); + nr_squared_matrix_element(&csi_rs_estimated_A_MF[1][1][k], &csi_rs_estimated_A_MF_sq[1][1][k], 1); + nr_numer_2x2(&csi_rs_estimated_A_MF_sq[0][0][k], + &csi_rs_estimated_A_MF_sq[0][1][k], + &csi_rs_estimated_A_MF_sq[1][0][k], + &csi_rs_estimated_A_MF_sq[1][1][k], + &csi_rs_estimated_numer_fin[k], + 1); + +#ifdef NR_CSIRS_DEBUG + for(uint16_t port_tx_conjch = 0; port_tx_conjch < N_ports; port_tx_conjch++) { + for(uint16_t port_tx_ch = 0; port_tx_ch < N_ports; port_tx_ch++) { + c16_t *csi_rs_estimated_A_MF_k = (c16_t *) &csi_rs_estimated_A_MF[port_tx_conjch][port_tx_ch][k]; + LOG_I(NR_PHY, "(%i) csi_rs_estimated_A_MF[%i][%i] = (%i, %i)\n", + k, port_tx_conjch, port_tx_ch, csi_rs_estimated_A_MF_k->r, csi_rs_estimated_A_MF_k->i); + c16_t *csi_rs_estimated_A_MF_sq_k = (c16_t *) &csi_rs_estimated_A_MF_sq[port_tx_conjch][port_tx_ch][k]; + LOG_I(NR_PHY, "(%i) csi_rs_estimated_A_MF_sq[%i][%i] = (%i, %i)\n", + k, port_tx_conjch, port_tx_ch, csi_rs_estimated_A_MF_sq_k->r, csi_rs_estimated_A_MF_sq_k->i); + } + } + LOG_I(NR_PHY, "(%i) csi_rs_estimated_determ_fin = %i\n", k, csi_rs_estimated_determ_fin[k]); + LOG_I(NR_PHY, "(%i) csi_rs_estimated_numer_fin = %i\n", k, csi_rs_estimated_numer_fin[k]>>sum_shift); +#endif + + // compute the conditional number + for (int sc_idx=0; sc_idx < NR_NB_SC_PER_RB; sc_idx++) { + int8_t csi_rs_estimated_denum_db = dB_fixed(csi_rs_estimated_determ_fin[k + sc_idx]); + int8_t csi_rs_estimated_numer_db = dB_fixed(csi_rs_estimated_numer_fin[k + sc_idx]>>sum_shift); + int8_t cond_db = csi_rs_estimated_numer_db - csi_rs_estimated_denum_db; + +#ifdef NR_CSIRS_DEBUG + LOG_I(NR_PHY, "csi_rs_estimated_denum_db = %i\n", csi_rs_estimated_denum_db); + LOG_I(NR_PHY, "csi_rs_estimated_numer_db = %i\n", csi_rs_estimated_numer_db); + LOG_I(NR_PHY, "cond_db = %i\n", cond_db); +#endif + + if (cond_db < cond_dB_threshold) { + count++; + } else { + count--; + } + } + } + + // conditional number is lower than cond_dB_threshold in half on more REs + if (count > 0) { + *rank_indicator = 1; + } + +#ifdef NR_CSIRS_DEBUG + LOG_I(NR_PHY, "count = %i\n", count); + LOG_I(NR_PHY, "rank = %i\n", (*rank_indicator)+1); +#endif + + return 0; +} + +int nr_csi_rs_pmi_estimation(const PHY_VARS_NR_UE *ue, + const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu, + const nr_csi_info_t *nr_csi_info, + const uint8_t N_ports, + const int32_t csi_rs_estimated_channel_freq[][N_ports][ue->frame_parms.ofdm_symbol_size], + const uint32_t interference_plus_noise_power, + const uint8_t rank_indicator, + const int16_t log2_re, + uint8_t *i1, + uint8_t *i2, + uint32_t *precoded_sinr_dB) { + + const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + memset(i1,0,3*sizeof(uint8_t)); + i2[0] = 0; + + // i1 is a three-element vector in the form of [i11 i12 i13], when CodebookType is specified as 'Type1SinglePanel'. + // Note that i13 is not applicable when the number of transmission layers is one of {1, 5, 6, 7, 8}. + // i2, for 'Type1SinglePanel' codebook type, it is a scalar when PMIMode is specified as 'wideband', and when PMIMode + // is specified as 'subband' or when PRGSize, the length of the i2 vector equals to the number of subbands or PRGs. + // Note that when the number of CSI-RS ports is 2, the applicable codebook type is 'Type1SinglePanel'. In this case, + // the precoding matrix is obtained by a single index (i2 field here) based on TS 38.214 Table 5.2.2.2.1-1. + // The first column is applicable if the UE is reporting a Rank = 1, whereas the second column is applicable if the + // UE is reporting a Rank = 2. + + if(N_ports == 1 || interference_plus_noise_power == 0) { + return 0; + } + + if(rank_indicator == 0 || rank_indicator == 1) { + + int32_t sum_re[4] = {0}; + int32_t sum_im[4] = {0}; + int32_t sum2_re[4] = {0}; + int32_t sum2_im[4] = {0}; + int32_t tested_precoded_sinr[4] = {0}; + + for (int rb = csirs_config_pdu->start_rb; rb < (csirs_config_pdu->start_rb+csirs_config_pdu->nr_of_rbs); rb++) { + + if (csirs_config_pdu->freq_density <= 1 && csirs_config_pdu->freq_density != (rb % 2)) { + continue; + } + uint16_t k = (frame_parms->first_carrier_offset + rb * NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size; + + for (int ant_rx = 0; ant_rx < frame_parms->nb_antennas_rx; ant_rx++) { + + c16_t *csi_rs_estimated_channel_p0 = (c16_t *) &csi_rs_estimated_channel_freq[ant_rx][0][k]; + c16_t *csi_rs_estimated_channel_p1 = (c16_t *) &csi_rs_estimated_channel_freq[ant_rx][1][k]; + + // H_p0 + 1*H_p1 = (H_p0_re + H_p1_re) + 1j*(H_p0_im + H_p1_im) + sum_re[0] += (csi_rs_estimated_channel_p0->r+csi_rs_estimated_channel_p1->r); + sum_im[0] += (csi_rs_estimated_channel_p0->i+csi_rs_estimated_channel_p1->i); + sum2_re[0] += ((csi_rs_estimated_channel_p0->r+csi_rs_estimated_channel_p1->r)*(csi_rs_estimated_channel_p0->r+csi_rs_estimated_channel_p1->r))>>log2_re; + sum2_im[0] += ((csi_rs_estimated_channel_p0->i+csi_rs_estimated_channel_p1->i)*(csi_rs_estimated_channel_p0->i+csi_rs_estimated_channel_p1->i))>>log2_re; + + // H_p0 + 1j*H_p1 = (H_p0_re - H_p1_im) + 1j*(H_p0_im + H_p1_re) + sum_re[1] += (csi_rs_estimated_channel_p0->r-csi_rs_estimated_channel_p1->i); + sum_im[1] += (csi_rs_estimated_channel_p0->i+csi_rs_estimated_channel_p1->r); + sum2_re[1] += ((csi_rs_estimated_channel_p0->r-csi_rs_estimated_channel_p1->i)*(csi_rs_estimated_channel_p0->r-csi_rs_estimated_channel_p1->i))>>log2_re; + sum2_im[1] += ((csi_rs_estimated_channel_p0->i+csi_rs_estimated_channel_p1->r)*(csi_rs_estimated_channel_p0->i+csi_rs_estimated_channel_p1->r))>>log2_re; + + // H_p0 - 1*H_p1 = (H_p0_re - H_p1_re) + 1j*(H_p0_im - H_p1_im) + sum_re[2] += (csi_rs_estimated_channel_p0->r-csi_rs_estimated_channel_p1->r); + sum_im[2] += (csi_rs_estimated_channel_p0->i-csi_rs_estimated_channel_p1->i); + sum2_re[2] += ((csi_rs_estimated_channel_p0->r-csi_rs_estimated_channel_p1->r)*(csi_rs_estimated_channel_p0->r-csi_rs_estimated_channel_p1->r))>>log2_re; + sum2_im[2] += ((csi_rs_estimated_channel_p0->i-csi_rs_estimated_channel_p1->i)*(csi_rs_estimated_channel_p0->i-csi_rs_estimated_channel_p1->i))>>log2_re; + + // H_p0 - 1j*H_p1 = (H_p0_re + H_p1_im) + 1j*(H_p0_im - H_p1_re) + sum_re[3] += (csi_rs_estimated_channel_p0->r+csi_rs_estimated_channel_p1->i); + sum_im[3] += (csi_rs_estimated_channel_p0->i-csi_rs_estimated_channel_p1->r); + sum2_re[3] += ((csi_rs_estimated_channel_p0->r+csi_rs_estimated_channel_p1->i)*(csi_rs_estimated_channel_p0->r+csi_rs_estimated_channel_p1->i))>>log2_re; + sum2_im[3] += ((csi_rs_estimated_channel_p0->i-csi_rs_estimated_channel_p1->r)*(csi_rs_estimated_channel_p0->i-csi_rs_estimated_channel_p1->r))>>log2_re; + } + } + + // We should perform >>nr_csi_info->log2_re here for all terms, but since sum2_re and sum2_im can be high values, + // we performed this above. + for(int p = 0; p<4; p++) { + int32_t power_re = sum2_re[p] - (sum_re[p]>>log2_re)*(sum_re[p]>>log2_re); + int32_t power_im = sum2_im[p] - (sum_im[p]>>log2_re)*(sum_im[p]>>log2_re); + tested_precoded_sinr[p] = (power_re+power_im)/(int32_t)interference_plus_noise_power; + } + + if(rank_indicator == 0) { + for(int tested_i2 = 0; tested_i2 < 4; tested_i2++) { + if(tested_precoded_sinr[tested_i2] > tested_precoded_sinr[i2[0]]) { + i2[0] = tested_i2; + } + } + *precoded_sinr_dB = dB_fixed(tested_precoded_sinr[i2[0]]); + } else { + i2[0] = tested_precoded_sinr[0]+tested_precoded_sinr[2] > tested_precoded_sinr[1]+tested_precoded_sinr[3] ? 0 : 1; + *precoded_sinr_dB = dB_fixed((tested_precoded_sinr[i2[0]] + tested_precoded_sinr[i2[0]+2])>>1); + } + + } else { + LOG_W(NR_PHY, "PMI computation is not implemented for rank indicator %i\n", rank_indicator+1); + return -1; + } + + return 0; +} + +int nr_csi_rs_cqi_estimation(const uint32_t precoded_sinr, + uint8_t *cqi) { + + *cqi = 0; + + // Default SINR table for an AWGN channel for SISO scenario, considering 0.1 BLER condition and TS 38.214 Table 5.2.2.1-2 + if(precoded_sinr>0 && precoded_sinr<=2) { + *cqi = 4; + } else if(precoded_sinr==3) { + *cqi = 5; + } else if(precoded_sinr>3 && precoded_sinr<=5) { + *cqi = 6; + } else if(precoded_sinr>5 && precoded_sinr<=7) { + *cqi = 7; + } else if(precoded_sinr>7 && precoded_sinr<=9) { + *cqi = 8; + } else if(precoded_sinr==10) { + *cqi = 9; + } else if(precoded_sinr>10 && precoded_sinr<=12) { + *cqi = 10; + } else if(precoded_sinr>12 && precoded_sinr<=15) { + *cqi = 11; + } else if(precoded_sinr==16) { + *cqi = 12; + } else if(precoded_sinr>16 && precoded_sinr<=18) { + *cqi = 13; + } else if(precoded_sinr==19) { + *cqi = 14; + } else if(precoded_sinr>19) { + *cqi = 15; + } + + return 0; +} + +int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue, + const UE_nr_rxtx_proc_t *proc, + const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu, + uint32_t *interference_plus_noise_power) { + + int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; + const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + + const uint16_t end_rb = csiim_config_pdu->start_rb + csiim_config_pdu->nr_of_rbs > csiim_config_pdu->bwp_size ? + csiim_config_pdu->bwp_size : csiim_config_pdu->start_rb + csiim_config_pdu->nr_of_rbs; + + int32_t count = 0; + int32_t sum_re = 0; + int32_t sum_im = 0; + int32_t sum2_re = 0; + int32_t sum2_im = 0; + + int l_csiim[4] = {-1, -1, -1, -1}; + + for(int symb_idx = 0; symb_idx < 4; symb_idx++) { + + uint8_t symb = csiim_config_pdu->l_csiim[symb_idx]; + bool done = false; + for (int symb_idx2 = 0; symb_idx2 < symb_idx; symb_idx2++) { + if (l_csiim[symb_idx2] == symb) { + done = true; + } + } + + if (done) { + continue; + } + + l_csiim[symb_idx] = symb; + uint64_t symbol_offset = symb*frame_parms->ofdm_symbol_size; + + for (int ant_rx = 0; ant_rx < frame_parms->nb_antennas_rx; ant_rx++) { + + c16_t *rx_signal = (c16_t*)&rxdataF[ant_rx][symbol_offset]; + + for (int rb = csiim_config_pdu->start_rb; rb < end_rb; rb++) { + + uint16_t sc0_offset = (frame_parms->first_carrier_offset + rb*NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size; + + for (int sc_idx = 0; sc_idx<4; sc_idx++) { + + uint16_t sc = sc0_offset + csiim_config_pdu->k_csiim[sc_idx]; + +#ifdef NR_CSIIM_DEBUG + LOG_I(NR_PHY, "(ant_rx %i, sc %i) real %i, imag %i\n", ant_rx, rb, rx_signal[sc].r, rx_signal[sc].i); +#endif + + sum_re += rx_signal[sc].r; + sum_im += rx_signal[sc].i; + sum2_re += rx_signal[sc].r*rx_signal[sc].r; + sum2_im += rx_signal[sc].i*rx_signal[sc].i; + count++; + } + } + } + } + + int32_t power_re = sum2_re/count - (sum_re/count)*(sum_re/count); + int32_t power_im = sum2_im/count - (sum_im/count)*(sum_im/count); + + *interference_plus_noise_power = power_re + power_im; + +#ifdef NR_CSIIM_DEBUG + LOG_I(NR_PHY, "interference_plus_noise_power based on CSI-IM = %i\n", *interference_plus_noise_power); +#endif + + return 0; +} + +int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id) { + + if(!ue->csiim_vars[gNB_id]->active) { + return -1; + } + + const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu = (fapi_nr_dl_config_csiim_pdu_rel15_t*)&ue->csiim_vars[gNB_id]->csiim_config_pdu; + +#ifdef NR_CSIIM_DEBUG + LOG_I(NR_PHY, "csiim_config_pdu->bwp_size = %i\n", csiim_config_pdu->bwp_size); + LOG_I(NR_PHY, "csiim_config_pdu->bwp_start = %i\n", csiim_config_pdu->bwp_start); + LOG_I(NR_PHY, "csiim_config_pdu->subcarrier_spacing = %i\n", csiim_config_pdu->subcarrier_spacing); + LOG_I(NR_PHY, "csiim_config_pdu->start_rb = %i\n", csiim_config_pdu->start_rb); + LOG_I(NR_PHY, "csiim_config_pdu->nr_of_rbs = %i\n", csiim_config_pdu->nr_of_rbs); + LOG_I(NR_PHY, "csiim_config_pdu->k_csiim = %i.%i.%i.%i\n", csiim_config_pdu->k_csiim[0], csiim_config_pdu->k_csiim[1], csiim_config_pdu->k_csiim[2], csiim_config_pdu->k_csiim[3]); + LOG_I(NR_PHY, "csiim_config_pdu->l_csiim = %i.%i.%i.%i\n", csiim_config_pdu->l_csiim[0], csiim_config_pdu->l_csiim[1], csiim_config_pdu->l_csiim[2], csiim_config_pdu->l_csiim[3]); +#endif + + nr_csi_im_power_estimation(ue, proc, csiim_config_pdu, &ue->nr_csi_info->interference_plus_noise_power); + ue->nr_csi_info->csi_im_meas_computed = true; + + return 0; +} + +int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id) { + + if(!ue->csirs_vars[gNB_id]->active) { + return -1; + } + + const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu = (fapi_nr_dl_config_csirs_pdu_rel15_t*)&ue->csirs_vars[gNB_id]->csirs_config_pdu; + +#ifdef NR_CSIRS_DEBUG + LOG_I(NR_PHY, "csirs_config_pdu->subcarrier_spacing = %i\n", csirs_config_pdu->subcarrier_spacing); + LOG_I(NR_PHY, "csirs_config_pdu->cyclic_prefix = %i\n", csirs_config_pdu->cyclic_prefix); + LOG_I(NR_PHY, "csirs_config_pdu->start_rb = %i\n", csirs_config_pdu->start_rb); + LOG_I(NR_PHY, "csirs_config_pdu->nr_of_rbs = %i\n", csirs_config_pdu->nr_of_rbs); + LOG_I(NR_PHY, "csirs_config_pdu->csi_type = %i (0:TRS, 1:CSI-RS NZP, 2:CSI-RS ZP)\n", csirs_config_pdu->csi_type); + LOG_I(NR_PHY, "csirs_config_pdu->row = %i\n", csirs_config_pdu->row); + LOG_I(NR_PHY, "csirs_config_pdu->freq_domain = %i\n", csirs_config_pdu->freq_domain); + LOG_I(NR_PHY, "csirs_config_pdu->symb_l0 = %i\n", csirs_config_pdu->symb_l0); + LOG_I(NR_PHY, "csirs_config_pdu->symb_l1 = %i\n", csirs_config_pdu->symb_l1); + LOG_I(NR_PHY, "csirs_config_pdu->cdm_type = %i\n", csirs_config_pdu->cdm_type); + LOG_I(NR_PHY, "csirs_config_pdu->freq_density = %i (0: dot5 (even RB), 1: dot5 (odd RB), 2: one, 3: three)\n", csirs_config_pdu->freq_density); + LOG_I(NR_PHY, "csirs_config_pdu->scramb_id = %i\n", csirs_config_pdu->scramb_id); + LOG_I(NR_PHY, "csirs_config_pdu->power_control_offset = %i\n", csirs_config_pdu->power_control_offset); + LOG_I(NR_PHY, "csirs_config_pdu->power_control_offset_ss = %i\n", csirs_config_pdu->power_control_offset_ss); +#endif + + const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + int32_t csi_rs_received_signal[frame_parms->nb_antennas_rx][frame_parms->samples_per_slot_wCP]; + uint8_t N_cdm_groups = 0; + uint8_t CDM_group_size = 0; + uint8_t k_prime = 0; + uint8_t l_prime = 0; + uint8_t N_ports = 0; + uint8_t j_cdm[16]; + uint8_t k_overline[16]; + uint8_t l_overline[16]; + int16_t log2_re = 0; + int16_t log2_maxh = 0; + uint32_t rsrp = 0; + int rsrp_dBm = 0; + uint32_t noise_power = 0; + uint8_t rank_indicator = 0; + uint32_t precoded_sinr_dB = 0; + uint8_t cqi = 0; + uint8_t i1[3]; + uint8_t i2[1]; + + nr_generate_csi_rs(frame_parms, + ue->nr_csi_info->csi_rs_generated_signal, + AMP, + ue->nr_csi_info, + (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *) csirs_config_pdu, + proc->nr_slot_rx, + &N_cdm_groups, + &CDM_group_size, + &k_prime, + &l_prime, + &N_ports, + j_cdm, + k_overline, + l_overline); + + int32_t csi_rs_ls_estimated_channel[frame_parms->nb_antennas_rx][N_ports][frame_parms->ofdm_symbol_size]; + int32_t csi_rs_estimated_channel_freq[frame_parms->nb_antennas_rx][N_ports][frame_parms->ofdm_symbol_size]; + + nr_get_csi_rs_signal(ue, + proc, + csirs_config_pdu, + ue->nr_csi_info, + N_cdm_groups, + CDM_group_size, + k_prime, + l_prime, + j_cdm, + k_overline, + l_overline, + csi_rs_received_signal, + &rsrp, + &rsrp_dBm); + + nr_csi_rs_channel_estimation(ue, + proc, + csirs_config_pdu, + ue->nr_csi_info, + (const int32_t **) ue->nr_csi_info->csi_rs_generated_signal, + csi_rs_received_signal, + N_cdm_groups, + CDM_group_size, + k_prime, + l_prime, + N_ports, + j_cdm, + k_overline, + l_overline, + csi_rs_ls_estimated_channel, + csi_rs_estimated_channel_freq, + &log2_re, + &log2_maxh, + &noise_power); + + nr_csi_rs_ri_estimation(ue, + csirs_config_pdu, + ue->nr_csi_info, + N_ports, + csi_rs_estimated_channel_freq, + log2_maxh, + &rank_indicator); + + nr_csi_rs_pmi_estimation(ue, + csirs_config_pdu, + ue->nr_csi_info, + N_ports, + csi_rs_estimated_channel_freq, + ue->nr_csi_info->csi_im_meas_computed ? ue->nr_csi_info->interference_plus_noise_power : noise_power, + rank_indicator, + log2_re, + i1, + i2, + &precoded_sinr_dB); + + nr_csi_rs_cqi_estimation(precoded_sinr_dB, &cqi); + + LOG_I(NR_PHY, "RSRP = %i dBm, RI = %i, i1 = %i.%i.%i, i2 = %i, SINR = %i dB, CQI = %i\n", + rsrp_dBm, rank_indicator+1, i1[0], i1[1], i1[2], i2[0], precoded_sinr_dB, cqi); + + // Send CSI measurements to MAC + fapi_nr_csirs_measurements_t csirs_measurements; + csirs_measurements.rsrp = rsrp; + csirs_measurements.rsrp_dBm = rsrp_dBm; + csirs_measurements.rank_indicator = rank_indicator; + csirs_measurements.i1 = *i1; + csirs_measurements.i2 = *i2; + csirs_measurements.cqi = cqi; + nr_downlink_indication_t dl_indication; + fapi_nr_rx_indication_t *rx_ind = calloc(sizeof(*rx_ind),1); + nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id, NULL); + nr_fill_rx_indication(rx_ind, FAPI_NR_CSIRS_IND, gNB_id, ue, NULL, NULL, 1, proc, (void *)&csirs_measurements); + if (ue->if_inst && ue->if_inst->dl_indication) { + ue->if_inst->dl_indication(&dl_indication, NULL); + } else { + free(rx_ind); + } + + return 0; +} diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c index 308d033fbee..68a0ec56d8f 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c @@ -142,7 +142,8 @@ static void nr_pdcch_demapping_deinterleaving(uint32_t *llr, int B_rb = reg_bundle_size_L/coreset_time_dur; // nb of RBs occupied by each REG bundle int num_bundles_per_cce = 6/reg_bundle_size_L; - int max_bundles = NR_MAX_PDCCH_AGG_LEVEL*num_bundles_per_cce; + int n_cce = N_regs/6; + int max_bundles = n_cce*num_bundles_per_cce; int f_bundle_j_list[max_bundles]; // for each bundle @@ -359,10 +360,7 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF, * According to this equations, DM-RS PDCCH are mapped on k where k%12==1 || k%12==5 || k%12==9 * */ - // the bitmap coreset_frq_domain contains 45 bits -#define CORESET_FREQ_DOMAIN_BITMAP_SIZE 45 - // each bit is associated to 6 RBs -#define BIT_TO_NBR_RB_CORESET_FREQ_DOMAIN 6 + #define NBR_RE_PER_RB_WITH_DMRS 12 // after removing the 3 DMRS RE, the RB contains 9 RE with PDCCH #define NBR_RE_PER_RB_WITHOUT_DMRS 9 @@ -920,7 +918,7 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue, proc->frame_rx, proc->nr_slot_rx,n_rnti,nr_dci_format_string[rel15->dci_format_options[k]],CCEind,dci_length,*(unsigned long long*)dci_estimation); uint16_t mb = nr_dci_false_detection(dci_estimation,tmp_e,L*108,n_rnti, NR_POLAR_DCI_MESSAGE_TYPE, dci_length, L); ue->dci_thres = (ue->dci_thres + mb) / 2; - if (mb > (ue->dci_thres+20)) { + if (mb > (ue->dci_thres+30)) { LOG_W(PHY,"DCI false positive. Dropping DCI index %d. Mismatched bits: %d/%d. Current DCI threshold: %d\n",j,mb,L*108,ue->dci_thres); continue; } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 95d2cd95779..1635c8bba9c 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -140,7 +140,6 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint dlsch->Mdlharq = Mdlharq; dlsch->number_harq_processes_for_pdsch = Mdlharq; dlsch->Nsoft = Nsoft; - dlsch->Mlimit = 4; dlsch->max_ldpc_iterations = max_ldpc_iterations; for (int i=0; i<Mdlharq; i++) { @@ -222,7 +221,6 @@ bool nr_ue_postDecode(PHY_VARS_NR_UE *phy_vars_ue, notifiedFIFO_elt_t *req, bool //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n", // phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round); harq_process->status = SCH_IDLE; - harq_process->DLround = 0; harq_process->ack = 1; //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n", @@ -237,11 +235,6 @@ bool nr_ue_postDecode(PHY_VARS_NR_UE *phy_vars_ue, notifiedFIFO_elt_t *req, bool //LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n", // phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round); harq_process->ack = 0; - if (harq_process->DLround >= dlsch->Mlimit) { - harq_process->status = SCH_IDLE; - harq_process->DLround = 0; - phy_vars_ue->dl_stats[4]++; - } //if(is_crnti) { // LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n", @@ -289,8 +282,6 @@ void nr_processDLSegment(void* arg) { __m128i *pv = (__m128i*)&z; __m128i *pl = (__m128i*)&l; - uint8_t Ilbrm = 1; - Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb" Kr_bytes = Kr>>3; K_bits_F = Kr-harq_process->F; @@ -323,8 +314,7 @@ void nr_processDLSegment(void* arg) { harq_process->round); */ //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_IN); - if (nr_rate_matching_ldpc_rx(Ilbrm, - Tbslbrm, + if (nr_rate_matching_ldpc_rx(Tbslbrm, p_decoderParms->BG, p_decoderParms->Z, harq_process->d[r], @@ -433,8 +423,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, uint16_t nb_symb_sch, uint8_t nr_slot_rx, uint8_t harq_pid, - uint8_t is_crnti, - uint8_t llr8_flag) { + uint8_t is_crnti) { uint32_t A,E; uint32_t G; uint32_t ret,offset; @@ -451,9 +440,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, phy_vars_ue->dl_stats[harq_process->DLround]++; LOG_D(PHY,"Round %d RV idx %d\n",harq_process->DLround,harq_process->rvidx); uint8_t kc; - uint32_t Tbslbrm;// = 950984; uint16_t nb_rb;// = 30; - double Coderate;// = 0.0; uint8_t dmrs_Type = harq_process->dmrsConfigType; AssertFatal(dmrs_Type == 0 || dmrs_Type == 1, "Illegal dmrs_type %d\n", dmrs_Type); uint8_t nb_re_dmrs; @@ -502,22 +489,17 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, } */ nb_rb = harq_process->nb_rb; - harq_process->trials[harq_process->DLround]++; - uint16_t nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs - harq_process->TBS = nr_compute_tbs(harq_process->Qm,harq_process->R,nb_rb,nb_symb_sch,nb_re_dmrs*dmrs_length, nb_rb_oh, 0, harq_process->Nl); A = harq_process->TBS; ret = dlsch->max_ldpc_iterations + 1; dlsch->last_iteration_cnt = ret; harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, dmrs_length, harq_process->Qm,harq_process->Nl); G = harq_process->G; - LOG_D(PHY,"%d.%d DLSCH Decoding, harq_pid %d TBS %d (%d) G %d nb_re_dmrs %d length dmrs %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n", - frame,nr_slot_rx,harq_pid,A,A/8,G, nb_re_dmrs, dmrs_length, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb); + // target_code_rate is in 0.1 units + float Coderate = (float) harq_process->R / 10240.0f; - if ((harq_process->R)<1024) - Coderate = (float) (harq_process->R) /(float) 1024; - else - Coderate = (float) (harq_process->R) /(float) 2048; + LOG_D(PHY,"%d.%d DLSCH Decoding, harq_pid %d TBS %d (%d) G %d nb_re_dmrs %d length dmrs %d mcs %d Nl %d nb_symb_sch %d nb_rb %d Qm %d Coderate %f\n", + frame,nr_slot_rx,harq_pid,A,A/8,G, nb_re_dmrs, dmrs_length, harq_process->mcs, harq_process->Nl, nb_symb_sch, nb_rb, harq_process->Qm, Coderate); if ((A <=292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) { p_decParams->BG = 2; @@ -567,10 +549,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD) && (!frame%100)) LOG_I(PHY,"K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl); } - if ((harq_process->Nl)<4) - Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,harq_process->Nl); - else - Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,4); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT); p_decParams->Z = harq_process->Z; @@ -621,7 +599,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, rdata->r_offset = r_offset; rdata->Kr_bytes = Kr_bytes; rdata->rv_index = harq_process->rvidx; - rdata->Tbslbrm = Tbslbrm; + rdata->Tbslbrm = harq_process->tbslbrm; rdata->offset = offset; rdata->dlsch = dlsch; rdata->dlsch_id = 0; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index 9cedc333569..6728f0260c0 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -260,13 +260,6 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, return -1; } - dlsch0_harq->Qm = nr_get_Qm_dl(dlsch[0]->harq_processes[harq_pid]->mcs, dlsch[0]->harq_processes[harq_pid]->mcs_table); - dlsch0_harq->R = nr_get_code_rate_dl(dlsch[0]->harq_processes[harq_pid]->mcs, dlsch[0]->harq_processes[harq_pid]->mcs_table); - if (dlsch0_harq->Qm == 0 || dlsch0_harq->R == 0) { - LOG_W(MAC, "Invalid code rate or Mod order, likely due to unexpected DL DCI.\n"); - return -1; - } - #ifdef DEBUG_HARQ printf("[DEMOD] MIMO mode = %d\n", dlsch0_harq->mimo_mode); printf("[DEMOD] cw for TB0 = %d, cw for TB1 = %d\n", codeword_TB0, codeword_TB1); @@ -326,7 +319,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, dlsch0_harq->n_dmrs_cdm_groups, dlsch0_harq->Nl, frame_parms, - dlsch0_harq->dlDmrsSymbPos); + dlsch0_harq->dlDmrsSymbPos, + ue->chest_time); stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]); if (cpumeas(CPUMEAS_GETSTATE)) LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d type %d: Pilot/Data extraction %5.2f \n", @@ -472,88 +466,87 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, if (cpumeas(CPUMEAS_GETSTATE)) LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine and zero forcing %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0)); - start_meas(&ue->generic_stat_bis[proc->thread_id][slot]); + start_meas(&ue->generic_stat_bis[proc->thread_id][slot]); /* Store the valid DL RE's */ - pdsch_vars[gNB_id]->dl_valid_re[symbol-1] = nb_re_pdsch; + pdsch_vars[gNB_id]->dl_valid_re[symbol-1] = nb_re_pdsch; - if(dlsch0_harq->status == ACTIVE) { - startSymbIdx = dlsch0_harq->start_symbol; - nbSymb = dlsch0_harq->nb_symbols; - pduBitmap = dlsch0_harq->pduBitmap; - } - if(dlsch1_harq) { - startSymbIdx = dlsch1_harq->start_symbol; - nbSymb = dlsch1_harq->nb_symbols; - pduBitmap = dlsch1_harq->pduBitmap; - } + if(dlsch0_harq->status == ACTIVE) { + startSymbIdx = dlsch0_harq->start_symbol; + nbSymb = dlsch0_harq->nb_symbols; + pduBitmap = dlsch0_harq->pduBitmap; + } + if(dlsch1_harq) { + startSymbIdx = dlsch1_harq->start_symbol; + nbSymb = dlsch1_harq->nb_symbols; + pduBitmap = dlsch1_harq->pduBitmap; + } - /* Check for PTRS bitmap and process it respectively */ - if((pduBitmap & 0x1) && (type == PDSCH)) { - nr_pdsch_ptrs_processing(ue, - pdsch_vars, - frame_parms, - dlsch0_harq, - dlsch1_harq, - gNB_id, - nr_slot_rx, - symbol, - (nb_rb_pdsch*12), - dlsch[0]->rnti,rx_type); - pdsch_vars[gNB_id]->dl_valid_re[symbol-1] -= pdsch_vars[gNB_id]->ptrs_re_per_slot[0][symbol]; - } + /* Check for PTRS bitmap and process it respectively */ + if((pduBitmap & 0x1) && (type == PDSCH)) { + nr_pdsch_ptrs_processing(ue, + pdsch_vars, + frame_parms, + dlsch0_harq, + dlsch1_harq, + gNB_id, + nr_slot_rx, + symbol, + (nb_rb_pdsch*12), + dlsch[0]->rnti,rx_type); + pdsch_vars[gNB_id]->dl_valid_re[symbol-1] -= pdsch_vars[gNB_id]->ptrs_re_per_slot[0][symbol]; + } - /* at last symbol in a slot calculate LLR's for whole slot */ - if(symbol == (startSymbIdx + nbSymb -1)) { - for(uint8_t i =startSymbIdx; i < (startSymbIdx+nbSymb);i++) { - /* re evaluating the first symbol flag as LLR's are done in symbol loop */ - if(i == startSymbIdx && i < 3) { - first_symbol_flag =1; - } - else { - first_symbol_flag=0; - } - /* Calculate LLR's for each symbol */ - nr_dlsch_llr(pdsch_vars, frame_parms, - rxdataF_comp_ptr, dl_ch_mag_ptr, - dlsch0_harq, dlsch1_harq, - rx_type, harq_pid, - gNB_id, gNB_id_i, - first_symbol_flag, - i, nb_rb_pdsch, - codeword_TB0, codeword_TB1, - pdsch_vars[gNB_id]->dl_valid_re[i-1], - nr_slot_rx, beamforming_mode); + /* at last symbol in a slot calculate LLR's for whole slot */ + if(symbol == (startSymbIdx + nbSymb -1)) { + for(uint8_t i =startSymbIdx; i < (startSymbIdx+nbSymb);i++) { + /* re evaluating the first symbol flag as LLR's are done in symbol loop */ + if(i == startSymbIdx && i < 3) { + first_symbol_flag =1; } - - int dmrs_type = dlsch[0]->harq_processes[harq_pid]->dmrsConfigType; - uint8_t nb_re_dmrs; - uint16_t dmrs_len = get_num_dmrs(dlsch[0]->harq_processes[harq_pid]->dlDmrsSymbPos); - if (dmrs_type==NFAPI_NR_DMRS_TYPE1) { - nb_re_dmrs = 6*dlsch[0]->harq_processes[harq_pid]->n_dmrs_cdm_groups; - } else { - nb_re_dmrs = 4*dlsch[0]->harq_processes[harq_pid]->n_dmrs_cdm_groups; + else { + first_symbol_flag=0; } - dlsch[0]->harq_processes[harq_pid]->G = nr_get_G(dlsch[0]->harq_processes[harq_pid]->nb_rb, - dlsch[0]->harq_processes[harq_pid]->nb_symbols, - nb_re_dmrs, - dmrs_len, - dlsch[0]->harq_processes[harq_pid]->Qm, - dlsch[0]->harq_processes[harq_pid]->Nl); - nr_dlsch_layer_demapping(pdsch_vars[gNB_id]->llr, - dlsch[0]->harq_processes[harq_pid]->Nl, - dlsch[0]->harq_processes[harq_pid]->Qm, - dlsch[0]->harq_processes[harq_pid]->G, - codeword_TB0, - codeword_TB1, - pdsch_vars[gNB_id]->layer_llr); + /* Calculate LLR's for each symbol */ + nr_dlsch_llr(pdsch_vars, frame_parms, + rxdataF_comp_ptr, dl_ch_mag_ptr, + dlsch0_harq, dlsch1_harq, + rx_type, harq_pid, + gNB_id, gNB_id_i, + first_symbol_flag, + i, nb_rb_pdsch, + codeword_TB0, codeword_TB1, + pdsch_vars[gNB_id]->dl_valid_re[i-1], + nr_slot_rx, beamforming_mode); + } + int dmrs_type = dlsch[0]->harq_processes[harq_pid]->dmrsConfigType; + uint8_t nb_re_dmrs; + uint16_t dmrs_len = get_num_dmrs(dlsch[0]->harq_processes[harq_pid]->dlDmrsSymbPos); + if (dmrs_type==NFAPI_NR_DMRS_TYPE1) { + nb_re_dmrs = 6*dlsch[0]->harq_processes[harq_pid]->n_dmrs_cdm_groups; + } else { + nb_re_dmrs = 4*dlsch[0]->harq_processes[harq_pid]->n_dmrs_cdm_groups; } + dlsch[0]->harq_processes[harq_pid]->G = nr_get_G(dlsch[0]->harq_processes[harq_pid]->nb_rb, + dlsch[0]->harq_processes[harq_pid]->nb_symbols, + nb_re_dmrs, + dmrs_len, + dlsch[0]->harq_processes[harq_pid]->Qm, + dlsch[0]->harq_processes[harq_pid]->Nl); + nr_dlsch_layer_demapping(pdsch_vars[gNB_id]->llr, + dlsch[0]->harq_processes[harq_pid]->Nl, + dlsch[0]->harq_processes[harq_pid]->Qm, + dlsch[0]->harq_processes[harq_pid]->G, + codeword_TB0, + codeword_TB1, + pdsch_vars[gNB_id]->layer_llr); + } - stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]); - if (cpumeas(CPUMEAS_GETSTATE)) - LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0)); + stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]); + if (cpumeas(CPUMEAS_GETSTATE)) + LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0)); -// Please keep it: useful for debugging + // Please keep it: useful for debugging #ifdef DEBUG_PDSCH_RX char filename[50]; uint8_t aa = 0; @@ -1617,7 +1610,8 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF, unsigned short nb_rb_pdsch, uint8_t n_dmrs_cdm_groups, NR_DL_FRAME_PARMS *frame_parms, - uint16_t dlDmrsSymbPos) + uint16_t dlDmrsSymbPos, + int chest_time_type) { if (config_type == NFAPI_NR_DMRS_TYPE1) { AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2, @@ -1628,7 +1622,12 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF, } const unsigned short start_re = (frame_parms->first_carrier_offset + start_rb * NR_NB_SC_PER_RB) % frame_parms->ofdm_symbol_size; - const int8_t validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos, symbol); + int8_t validDmrsEst; + + if (chest_time_type == 0) + validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos,symbol); + else + validDmrsEst = get_next_dmrs_symbol_in_slot(dlDmrsSymbPos,0,14); // get first dmrs symbol index for (unsigned char aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) { @@ -1715,7 +1714,8 @@ void nr_dlsch_extract_rbs(int **rxdataF, uint8_t n_dmrs_cdm_groups, uint8_t Nl, NR_DL_FRAME_PARMS *frame_parms, - uint16_t dlDmrsSymbPos) + uint16_t dlDmrsSymbPos, + int chest_time_type) { unsigned short k,rb; @@ -1733,7 +1733,10 @@ void nr_dlsch_extract_rbs(int **rxdataF, nushift = (n_dmrs_cdm_groups -1)<<1;//delta in Table 7.4.1.1.2-2 } - validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos,symbol); + if (chest_time_type == 0) + validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos,symbol); + else + validDmrsEst = get_next_dmrs_symbol_in_slot(dlDmrsSymbPos,0,14); // get first dmrs symbol index for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { @@ -2600,7 +2603,7 @@ static int nr_dlsch_llr(NR_UE_PDSCH **pdsch_vars, } if (dlsch1_harq) { - switch (nr_get_Qm_dl(dlsch1_harq->mcs,dlsch1_harq->mcs_table)) { + switch (dlsch1_harq->Qm) { case 2 : if (rx_type==rx_standard) { nr_dlsch_qpsk_llr(frame_parms, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c index 7c75884fa6b..ca15a5b5be8 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c @@ -638,11 +638,10 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, uint8_t beamforming_mode) { - uint32_t *rxF = (uint32_t *)&rxdataF_comp[((int32_t)symbol*nb_rb*12)]; - uint32_t *llr32; + c16_t *rxF = (c16_t *)&rxdataF_comp[((int32_t)symbol*nb_rb*12)]; + c16_t *llr32 = (c16_t *)dlsch_llr; int i; - llr32 = (uint32_t*)dlsch_llr; if (!llr32) { LOG_E(PHY,"nr_dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p\n",symbol, llr32); return(-1); @@ -656,8 +655,10 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, llr32); */ for (i=0; i<len; i++) { - *llr32 = *rxF; - //printf("dlsch_qpsk_llr %d : (%d,%d)\n",i,((int16_t*)llr32)[0],((int16_t*)llr32)[1]); + //*llr32 = *rxF; + llr32->r = rxF->r >> 3; + llr32->i = rxF->i >> 3; + //printf("dlsch_qpsk_llr %d : (%d,%d)\n", i, llr32->r, llr32->i); rxF++; llr32++; } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index e248ce87cb2..ea7bde5377f 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -362,6 +362,8 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, nr_gold_pdsch(ue, i, ue->scramblingID_dlsch[i]); } + nr_init_csi_rs(fp, ue->nr_csi_info->nr_gold_csi_rs, fp->Nid_cell); + // initialize the pusch dmrs for (int i=0; i<NR_NB_NSCID; i++) { ue->scramblingID_ulsch[i]=fp->Nid_cell; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c index 4927fe37a25..8437b8f8f37 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c @@ -67,7 +67,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t uint8_t Mod_id, fd_occasion, preamble_index, restricted_set, not_found; uint16_t rootSequenceIndex, prach_fmt_id, NCS, *prach_root_sequence_map, preamble_offset = 0; uint16_t preamble_shift = 0, preamble_index0, n_shift_ra, n_shift_ra_bar, d_start=INT16_MAX, numshift, N_ZC, u, offset, offset2, first_nonzero_root_idx; - int16_t prach_tmp[98304*2*4] __attribute__((aligned(32))); + int16_t prach_tmp[(4688+4*24576)*4*2] __attribute__((aligned(32))); int16_t Ncp = 0, amp, *prach, *prach2, *prachF, *Xu; int32_t Xu_re, Xu_im; @@ -102,10 +102,19 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t nrUE_config->prach_config.num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index, ue->X_u); - if (slot % (fp->slots_per_subframe / 2) == 0) - sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1)); - else - sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * prachStartSymbol; + if (prachStartSymbol == 0) { + sample_offset_slot = 0; + } else if (fp->slots_per_subframe == 1) { + if (prachStartSymbol <= 7) + sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0); + else + sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 2) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0) * 2; + } else { + if (slot % (fp->slots_per_subframe / 2) == 0) + sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0); + else + sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * prachStartSymbol; + } prach_start = fp->get_samples_slot_timestamp(slot, fp, 0) + sample_offset_slot; @@ -232,897 +241,254 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t preamble_offset, first_nonzero_root_idx); - Xu = (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx]; - - #if defined (PRACH_WRITE_OUTPUT_DEBUG) - LOG_M("X_u.m", "X_u", (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx], N_ZC, 1, 1); - #endif - - /******************************************************** - * - * In function init_prach_tables: - * to compute quantized roots of unity ru(n) = 32767 * exp j*[ (2 * PI * n) / N_ZC ] - * - * In compute_prach_seq: - * to calculate Xu = DFT xu = xu (inv_u*k) * Xu[0] (This is a Zadoff-Chou sequence property: DFT ZC sequence is another ZC sequence) - * - * In generate_prach: - * to do the cyclic-shifted DFT by multiplying Xu[k] * ru[k*preamble_shift] as: - * If X[k] = DFT x(n) -> X_shifted[k] = DFT x(n+preamble_shift) = X[k] * exp -j*[ (2*PI*k*preamble_shift) / N_ZC ] - * - *********************************************************/ - - if (mu==1) { - switch(fp->samples_per_subframe) { - case 15360: - // 10, 15 MHz @ 15.36 Ms/s - if (prach_sequence_length == 0) { - if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2) - dftlen = 12288; - if (prach_fmt_id == 3) - dftlen = 3072; - } else { // 839 sequence - dftlen = 512; - } - break; - - case 30720: - // 20, 25, 30 MHz @ 30.72 Ms/s - if (prach_sequence_length == 0) { - if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2) - dftlen = 24576; - if (prach_fmt_id == 3) - dftlen = 6144; - } else { // 839 sequence - dftlen = 1024; - } - break; - - case 46080: - // 40 MHz @ 46.08 Ms/s - if (prach_sequence_length == 0) { - if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2) - dftlen = 36864; - if (prach_fmt_id == 3) - dftlen = 9216; - } else { // 839 sequence - dftlen = 1536; - } - break; - - case 61440: - // 40, 50, 60 MHz @ 61.44 Ms/s - if (prach_sequence_length == 0) { - if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2) - dftlen = 49152; - if (prach_fmt_id == 3) - dftlen = 12288; - } else { // 839 sequence - dftlen = 2048; - } - break; - - case 92160: - // 50, 60, 70, 80, 90 MHz @ 92.16 Ms/s - if (prach_sequence_length == 0) { - if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2) - dftlen = 73728; - if (prach_fmt_id == 3) - dftlen = 18432; - } else { // 839 sequence - dftlen = 3072; - } - break; - - case 122880: - // 70, 80, 90, 100 MHz @ 122.88 Ms/s - if (prach_sequence_length == 0) { - if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2) - dftlen = 98304; - if (prach_fmt_id == 3) - dftlen = 24576; - } else { // 839 sequence - dftlen = 4096; - } - break; - - default: - AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu); - } - } - else if (mu==3) { - if (fp->threequarter_fs) - AssertFatal(1==0,"3/4 sampling not supported for numerology %d\n",mu); - - if (prach_sequence_length == 0) - AssertFatal(1==0,"long prach not supported for numerology %d\n",mu); - - if (fp->N_RB_UL == 32) - dftlen=512; - else if (fp->N_RB_UL == 66) - dftlen=1024; - else - AssertFatal(1==0,"N_RB_UL %d not support for numerology %d\n",fp->N_RB_UL,mu); - } - - - for (offset=0,offset2=0; offset<N_ZC; offset++,offset2+=preamble_shift) { - - if (offset2 >= N_ZC) - offset2 -= N_ZC; - - Xu_re = (((int32_t)Xu[offset<<1]*amp)>>15); - Xu_im = (((int32_t)Xu[1+(offset<<1)]*amp)>>15); - prachF[k++]= ((Xu_re*nr_ru[offset2<<1]) - (Xu_im*nr_ru[1+(offset2<<1)]))>>15; - prachF[k++]= ((Xu_im*nr_ru[offset2<<1]) + (Xu_re*nr_ru[1+(offset2<<1)]))>>15; - - if (k==dftlen) k=0; - } - - #if defined (PRACH_WRITE_OUTPUT_DEBUG) - LOG_M("prachF.m", "prachF", &prachF[1804], 1024, 1, 1); - LOG_M("Xu.m", "Xu", Xu, N_ZC, 1, 1); - #endif - + // Ncp and dftlen here is given in terms of T_s wich is 30.72MHz sampling if (prach_sequence_length == 0) { - - AssertFatal(prach_fmt_id < 4, "Illegal PRACH format %d for sequence length 839\n", prach_fmt_id); - - // Ncp here is given in terms of T_s wich is 30.72MHz sampling switch (prach_fmt_id) { case 0: Ncp = 3168; + dftlen = 24576; break; + case 1: Ncp = 21024; + dftlen = 24576; break; + case 2: Ncp = 4688; + dftlen = 24576; break; + case 3: Ncp = 3168; + dftlen = 6144; break; - } + default: + AssertFatal(1==0, "Illegal PRACH format %d for sequence length 839\n", prach_fmt_id); + break; + } } else { - switch (prach_fmt_id) { case 4: //A1 - Ncp = 288/(1<<mu); + Ncp = 288 >> mu; break; + case 5: //A2 - Ncp = 576/(1<<mu); + Ncp = 576 >> mu; break; + case 6: //A3 - Ncp = 864/(1<<mu); + Ncp = 864 >> mu; break; + case 7: //B1 - Ncp = 216/(1<<mu); - break; + Ncp = 216 >> mu; + break; + /* case 4: //B2 - Ncp = 360/(1<<mu); + Ncp = 360 >> mu; break; + case 5: //B3 - Ncp = 504/(1<<mu); + Ncp = 504 >> mu; break; */ + case 8: //B4 - Ncp = 936/(1<<mu); + Ncp = 936 >> mu; break; + case 9: //C0 - Ncp = 1240/(1<<mu); + Ncp = 1240 >> mu; break; + case 10: //C2 - Ncp = 2048/(1<<mu); + Ncp = 2048 >> mu; break; + default: AssertFatal(1==0,"Unknown PRACH format ID %d\n", prach_fmt_id); break; } + dftlen = 2048 >> mu; } - #ifdef NR_PRACH_DEBUG - LOG_D(PHY, "PRACH [UE %d] Ncp %d, dftlen %d \n", Mod_id, Ncp, dftlen); - #endif - //actually what we should be checking here is how often the current prach crosses a 0.5ms boundary. I am not quite sure for which paramter set this would be the case, so I will ignore it for now and just check if the prach starts on a 0.5ms boundary - uint8_t use_extended_prach_prefix = 0; if(fp->numerology_index == 0) { if (prachStartSymbol == 0 || prachStartSymbol == 7) - use_extended_prach_prefix = 1; + Ncp += 16; } else { if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0) - use_extended_prach_prefix = 1; + Ncp += 16; } - if (mu == 3) { - switch (fp->samples_per_subframe) { - case 61440: // 32 PRB case, 61.44 Msps - Ncp<<=1; //to account for 61.44Mbps - // This is after cyclic prefix - prach2 = prach+(Ncp<<1); //times 2 for complex samples - if (prach_sequence_length == 0) - AssertFatal(1==0,"no long PRACH for this PRACH size %d\n",fp->N_RB_UL); - else { - if (use_extended_prach_prefix) - Ncp+=32; // 16*kappa, kappa=2 for 61.44Msps - prach2 = prach+(Ncp<<1); //times 2 for complex samples - if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) { - idft(IDFT_512,prachF,prach2,1); - // here we have |empty | Prach512 | - if (prach_fmt_id != 9) { - memmove(prach2+(512<<1),prach2,(512<<2)); - prach_len = (512*2)+Ncp; - } - else prach_len = (512*1)+Ncp; - memmove(prach,prach+(512<<1),(Ncp<<2)); - // here we have |Prefix | Prach512 | Prach512 (if ! 0xc0) | - } else if (prach_fmt_id == 5) { // 6x512 - idft(IDFT_512,prachF,prach2,1); - // here we have |empty | Prach512 | - memmove(prach2+(512<<1),prach2,(512<<2)); - // here we have |empty | Prach512 | Prach512| empty512 | empty512 | - memmove(prach2+(512<<2),prach2,(512<<3)); - // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | - memmove(prach,prach+(512<<1),(Ncp<<2)); - // here we have |Prefix | Prach512 | - prach_len = (512*4)+Ncp; - } else if (prach_fmt_id == 6) { // 6x512 - idft(IDFT_512,prachF,prach2,1); - // here we have |empty | Prach512 | - memmove(prach2+(512<<1),prach2,(512<<2)); - // here we have |empty | Prach512 | Prach512| empty512 | empty512 | empty512 | empty512 - memmove(prach2+(512<<2),prach2,(512<<3)); - // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | empty512 | empty512 - memmove(prach2+(512<<3),prach2,(512<<3)); - // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512 - memmove(prach,prach+(512<<1),(Ncp<<2)); - // here we have |Prefix | Prach512 | - prach_len = (512*6)+Ncp; - } else if (prach_fmt_id == 8) { // 12x512 - idft(IDFT_512,prachF,prach2,1); - // here we have |empty | Prach512 | - memmove(prach2+(512<<1),prach2,(512<<2)); - // here we have |empty | Prach512 | Prach512| empty512 | empty512 | empty512 | empty512 - memmove(prach2+(512<<2),prach2,(512<<3)); - // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | empty512 | empty512 - memmove(prach2+(512<<3),prach2,(512<<3)); - // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512 - memmove(prach2+(512<<1)*6,prach2,(512<<2)*6); - // here we have |empty | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512| - memmove(prach,prach+(512<<1),(Ncp<<2)); - // here we have |Prefix | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512| Prach512 | Prach512 | Prach512 | Prach512| - prach_len = (512*12)+Ncp; - } - } - break; + switch(fp->samples_per_subframe) { + case 7680: + // 5 MHz @ 7.68 Ms/s + Ncp >>= 2; + dftlen >>= 2; + break; - case 122880: // 66 PRB case, 122.88 Msps - Ncp<<=2; //to account for 122.88Mbps - // This is after cyclic prefix - prach2 = prach+(Ncp<<1); //times 2 for complex samples - if (prach_sequence_length == 0) - AssertFatal(1==0,"no long PRACH for this PRACH size %d\n",fp->N_RB_UL); - else { - if (use_extended_prach_prefix) - Ncp+=64; // 16*kappa, kappa=4 for 122.88Msps - prach2 = prach+(Ncp<<1); //times 2 for complex samples - if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) { - idft(IDFT_1024,prachF,prach2,1); - // here we have |empty | Prach1024 | - if (prach_fmt_id != 9) { - memmove(prach2+(1024<<1),prach2,(1024<<2)); - prach_len = (1024*2)+Ncp; - } - else prach_len = (1024*1)+Ncp; - memmove(prach,prach+(1024<<1),(Ncp<<2)); - // here we have |Prefix | Prach1024 | Prach1024 (if ! 0xc0) | - } else if (prach_fmt_id == 5) { // 6x1024 - idft(IDFT_1024,prachF,prach2,1); - // here we have |empty | Prach1024 | - memmove(prach2+(1024<<1),prach2,(1024<<2)); - // here we have |empty | Prach1024 | Prach1024| empty1024 | empty1024 | - memmove(prach2+(1024<<2),prach2,(1024<<3)); - // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | - memmove(prach,prach+(1024<<1),(Ncp<<2)); - // here we have |Prefix | Prach1024 | - prach_len = (1024*4)+Ncp; - } else if (prach_fmt_id == 6) { // 6x1024 - idft(IDFT_1024,prachF,prach2,1); - // here we have |empty | Prach1024 | - memmove(prach2+(1024<<1),prach2,(1024<<2)); - // here we have |empty | Prach1024 | Prach1024| empty1024 | empty1024 | empty1024 | empty1024 - memmove(prach2+(1024<<2),prach2,(1024<<3)); - // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | empty1024 | empty1024 - memmove(prach2+(1024<<3),prach2,(1024<<3)); - // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024 - memmove(prach,prach+(1024<<1),(Ncp<<2)); - // here we have |Prefix | Prach1024 | - prach_len = (1024*6)+Ncp; - } else if (prach_fmt_id == 8) { // 12x1024 - idft(IDFT_1024,prachF,prach2,1); - // here we have |empty | Prach1024 | - memmove(prach2+(1024<<1),prach2,(1024<<2)); - // here we have |empty | Prach1024 | Prach1024| empty1024 | empty1024 | empty1024 | empty1024 - memmove(prach2+(1024<<2),prach2,(1024<<3)); - // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | empty1024 | empty1024 - memmove(prach2+(1024<<3),prach2,(1024<<3)); - // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024 - memmove(prach2+(1024<<1)*6,prach2,(1024<<2)*6); - // here we have |empty | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024| - memmove(prach,prach+(1024<<1),(Ncp<<2)); - // here we have |Prefix | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024| Prach1024 | Prach1024 | Prach1024 | Prach1024| - prach_len = (1024*12)+Ncp; - } - } - break; + case 15360: + // 10, 15 MHz @ 15.36 Ms/s + Ncp >>= 1; + dftlen >>= 1; + break; - default: - AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu); - } - } else if (mu == 1) { - switch (fp->samples_per_subframe) { - case 15360: // full sampling @ 15.36 Ms/s - Ncp = Ncp/2; // to account for 15.36 Ms/s - // This is after cyclic prefix - prach2 = prach+(2*Ncp); // times 2 for complex samples - if (prach_sequence_length == 0){ - if (prach_fmt_id == 0) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s - idft(IDFT_12288,prachF,prach2,1); - // here we have | empty | Prach12288 | - memmove(prach,prach+(12288<<1),(Ncp<<2)); - // here we have | Prefix | Prach12288 | - prach_len = 12288+Ncp; - } else if (prach_fmt_id == 1) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s - idft(IDFT_12288,prachF,prach2,1); - // here we have | empty | Prach12288 | empty12288 | - memmove(prach2+(12288<<1),prach2,(12288<<2)); - // here we have | empty | Prach12288 | Prach12288 | - memmove(prach,prach+(12288<<2),(Ncp<<2)); - // here we have | Prefix | Prach12288 | Prach12288 | - prach_len = (12288*2)+Ncp; - } else if (prach_fmt_id == 2) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s - idft(IDFT_12288,prachF,prach2,1); - // here we have | empty | Prach12288 | empty12288 | empty12288 | empty12288 | - memmove(prach2+(12288<<1),prach2,(12288<<2)); - // here we have | empty | Prach12288 | Prach12288 | empty12288 | empty12288 | - memmove(prach2+(12288<<2),prach2,(12288<<3)); - // here we have | empty | Prach12288 | Prach12288 | Prach12288 | Prach12288 | - memmove(prach,prach+(12288<<3),(Ncp<<2)); - // here we have | Prefix | Prach12288 | Prach12288 | Prach12288 | Prach12288 | - prach_len = (12288*4)+Ncp; - } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s, 3072 samples @ 15.36 Ms/s - idft(IDFT_3072,prachF,prach2,1); - // here we have | empty | Prach3072 | empty3072 | empty3072 | empty3072 | - memmove(prach2+(3072<<1),prach2,(3072<<2)); - // here we have | empty | Prach3072 | Prach3072 | empty3072 | empty3072 | - memmove(prach2+(3072<<2),prach2,(3072<<3)); - // here we have | empty | Prach3072 | Prach3072 | Prach3072 | Prach3072 | - memmove(prach,prach+(3072<<3),(Ncp<<2)); - // here we have | Prefix | Prach3072 | Prach3072 | Prach3072 | Prach3072 | - prach_len = (3072*4)+Ncp; - } - } else { // short PRACH sequence - if (use_extended_prach_prefix) - Ncp += 8; // 16*kappa, kappa=0.5 for 15.36 Ms/s - prach2 = prach+(2*Ncp); // times 2 for complex samples - if (prach_fmt_id == 9) { - idft(IDFT_512,prachF,prach2,1); - // here we have | empty | Prach512 | - memmove(prach,prach+(512<<1),(Ncp<<2)); - // here we have | Prefix | Prach512 | - prach_len = (512*1)+Ncp; - } else if (prach_fmt_id == 4 || prach_fmt_id == 7) { - idft(IDFT_512,prachF,prach2,1); - // here we have | empty | Prach512 | empty512 | - memmove(prach2+(512<<1),prach2,(512<<2)); - // here we have | empty | Prach512 | Prach512 | - memmove(prach,prach+(512<<1),(Ncp<<2)); - // here we have | Prefix | Prach512 | Prach512 | - prach_len = (512*2)+Ncp; - } else if (prach_fmt_id == 5) { // 4x512 - idft(IDFT_512,prachF,prach2,1); - // here we have | empty | Prach512 | empty512 | empty512 | empty512 | - memmove(prach2+(512<<1),prach2,(512<<2)); - // here we have | empty | Prach512 | Prach512 | empty512 | empty512 | - memmove(prach2+(512<<2),prach2,(512<<3)); - // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | - memmove(prach,prach+(512<<1),(Ncp<<2)); - // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 | - prach_len = (512*4)+Ncp; - } else if (prach_fmt_id == 6) { // 6x512 - idft(IDFT_512,prachF,prach2,1); - // here we have | empty | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | - memmove(prach2+(512<<1),prach2,(512<<2)); - // here we have | empty | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | - memmove(prach2+(512<<2),prach2,(512<<3)); - // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 | - memmove(prach2+(512<<3),prach2,(512<<3)); - // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | - memmove(prach,prach+(512<<1),(Ncp<<2)); - // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | - prach_len = (512*6)+Ncp; - } else if (prach_fmt_id == 8) { // 12x512 - idft(IDFT_512,prachF,prach2,1); - // here we have | empty | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | - memmove(prach2+(512<<1),prach2,(512<<2)); - // here we have | empty | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | - memmove(prach2+(512<<2),prach2,(512<<3)); - // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | - memmove(prach2+(512<<3),prach2,(512<<3)); - // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | - memmove(prach2+(512<<1)*6,prach2,(512<<2)*6); - // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | - memmove(prach,prach+(512<<1),(Ncp<<2)); - // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | - prach_len = (512*12)+Ncp; - } - } - break; + case 30720: + // 20, 25, 30 MHz @ 30.72 Ms/s + Ncp = Ncp; + dftlen = dftlen; + break; - case 30720: // full sampling @ 30.72 Ms/s - Ncp = Ncp*1; // to account for 30.72 Ms/s - // This is after cyclic prefix - prach2 = prach+(2*Ncp); // times 2 for complex samples - if (prach_sequence_length == 0){ - if (prach_fmt_id == 0) { // 24576 samples @ 30.72 Ms/s - idft(IDFT_24576,prachF,prach2,1); - // here we have | empty | Prach24576 | - memmove(prach,prach+(24576<<1),(Ncp<<2)); - // here we have | Prefix | Prach24576 | - prach_len = 24576+Ncp; - } else if (prach_fmt_id == 1) { // 24576 samples @ 30.72 Ms/s - idft(IDFT_24576,prachF,prach2,1); - // here we have | empty | Prach24576 | empty24576 | - memmove(prach2+(24576<<1),prach2,(24576<<2)); - // here we have | empty | Prach24576 | Prach24576 | - memmove(prach,prach+(24576<<2),(Ncp<<2)); - // here we have | Prefix | Prach24576 | Prach24576 | - prach_len = (24576*2)+Ncp; - } else if (prach_fmt_id == 2) { // 24576 samples @ 30.72 Ms/s - idft(IDFT_24576,prachF,prach2,1); - // here we have | empty | Prach24576 | empty24576 | empty24576 | empty24576 | - memmove(prach2+(24576<<1),prach2,(24576<<2)); - // here we have | empty | Prach24576 | Prach24576 | empty24576 | empty24576 | - memmove(prach2+(24576<<2),prach2,(24576<<3)); - // here we have | empty | Prach24576 | Prach24576 | Prach24576 | Prach24576 | - memmove(prach,prach+(24576<<3),(Ncp<<2)); - // here we have | Prefix | Prach24576 | Prach24576 | Prach24576 | Prach24576 | - prach_len = (24576*4)+Ncp; - } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s - idft(IDFT_6144,prachF,prach2,1); - // here we have | empty | Prach6144 | empty6144 | empty6144 | empty6144 | - memmove(prach2+(6144<<1),prach2,(6144<<2)); - // here we have | empty | Prach6144 | Prach6144 | empty6144 | empty6144 | - memmove(prach2+(6144<<2),prach2,(6144<<3)); - // here we have | empty | Prach6144 | Prach6144 | Prach6144 | Prach6144 | - memmove(prach,prach+(6144<<3),(Ncp<<2)); - // here we have | Prefix | Prach6144 | Prach6144 | Prach6144 | Prach6144 | - prach_len = (6144*4)+Ncp; - } - } else { // short PRACH sequence - if (use_extended_prach_prefix) - Ncp += 16; // 16*kappa, kappa=1 for 30.72Msps - prach2 = prach+(2*Ncp); // times 2 for complex samples - if (prach_fmt_id == 9) { - idft(IDFT_1024,prachF,prach2,1); - // here we have | empty | Prach1024 | - memmove(prach,prach+(1024<<1),(Ncp<<2)); - // here we have | Prefix | Prach1024 | - prach_len = (1024*1)+Ncp; - } else if (prach_fmt_id == 4 || prach_fmt_id == 7) { - idft(IDFT_1024,prachF,prach2,1); - // here we have | empty | Prach1024 | empty1024 | - memmove(prach2+(1024<<1),prach2,(1024<<2)); - // here we have | empty | Prach1024 | Prach1024 | - memmove(prach,prach+(1024<<1),(Ncp<<2)); - // here we have | Prefix | Prach1024 | Prach1024 | - prach_len = (1024*2)+Ncp; - } else if (prach_fmt_id == 5) { // 4x1024 - idft(IDFT_1024,prachF,prach2,1); - // here we have | empty | Prach1024 | empty1024 | empty1024 | empty1024 | - memmove(prach2+(1024<<1),prach2,(1024<<2)); - // here we have | empty | Prach1024 | Prach1024 | empty1024 | empty1024 | - memmove(prach2+(1024<<2),prach2,(1024<<3)); - // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | - memmove(prach,prach+(1024<<1),(Ncp<<2)); - // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 | - prach_len = (1024*4)+Ncp; - } else if (prach_fmt_id == 6) { // 6x1024 - idft(IDFT_1024,prachF,prach2,1); - // here we have | empty | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | - memmove(prach2+(1024<<1),prach2,(1024<<2)); - // here we have | empty | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | - memmove(prach2+(1024<<2),prach2,(1024<<3)); - // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 | - memmove(prach2+(1024<<3),prach2,(1024<<3)); - // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | - memmove(prach,prach+(1024<<1),(Ncp<<2)); - // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | - prach_len = (1024*6)+Ncp; - } else if (prach_fmt_id == 8) { // 12x1024 - idft(IDFT_1024,prachF,prach2,1); - // here we have | empty | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | - memmove(prach2+(1024<<1),prach2,(1024<<2)); - // here we have | empty | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | - memmove(prach2+(1024<<2),prach2,(1024<<3)); - // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | - memmove(prach2+(1024<<3),prach2,(1024<<3)); - // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | - memmove(prach2+(1024<<1)*6,prach2,(1024<<2)*6); - // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | - memmove(prach,prach+(1024<<1),(Ncp<<2)); - // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | - prach_len = (1024*12)+Ncp; - } - } - break; + case 46080: + // 40 MHz @ 46.08 Ms/s + Ncp = (Ncp*3)/2; + dftlen = (dftlen*3)/2; + break; - case 61440: // full sampling @ 61.44 Ms/s - Ncp = Ncp*2; // to account for 61.44 Ms/s - // This is after cyclic prefix - prach2 = prach+(Ncp<<1); //times 2 for complex samples - if (prach_sequence_length == 0){ - if (prach_fmt_id == 0) { //24576 samples @ 30.72 Ms/s, 49152 samples @ 61.44 Ms/s - idft(IDFT_49152,prachF,prach2,1); - // here we have |empty | Prach49152| - memmove(prach,prach+(49152<<1),(Ncp<<2)); - // here we have |Prefix | Prach49152| - prach_len = 49152+Ncp; - } else if (prach_fmt_id == 1) { //24576 samples @ 30.72 Ms/s, 49152 samples @ 61.44 Ms/s - idft(IDFT_49152,prachF,prach2,1); - memmove(prach2+(49152<<1),prach2,(49152<<2)); - // here we have |empty | Prach49152 | Prach49152| - memmove(prach,prach+(49152<<2),(Ncp<<2)); - // here we have |Prefix | Prach49152 | Prach49152| - prach_len = (49152*2)+Ncp; - } else if (prach_fmt_id == 2) { //24576 samples @ 30.72 Ms/s, 49152 samples @ 61.44 Ms/s - idft(IDFT_49152,prachF,prach2,1); - memmove(prach2+(49152<<1),prach2,(49152<<2)); - // here we have |empty | Prach49152 | Prach49152| empty49152 | empty49152 - memmove(prach2+(49152<<2),prach2,(49152<<3)); - // here we have |empty | Prach49152 | Prach49152| Prach49152 | Prach49152 - memmove(prach,prach+(49152<<3),(Ncp<<2)); - // here we have |Prefix | Prach49152 | Prach49152| Prach49152 | Prach49152 - prach_len = (49152*4)+Ncp; - } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s, 12288 samples @ 61.44 Ms/s - idft(IDFT_12288,prachF,prach2,1); - memmove(prach2+(12288<<1),prach2,(12288<<2)); - // here we have |empty | Prach12288 | Prach12288| empty12288 | empty12288 - memmove(prach2+(12288<<2),prach2,(12288<<3)); - // here we have |empty | Prach12288 | Prach12288| Prach12288 | Prach12288 - memmove(prach,prach+(12288<<3),(Ncp<<2)); - // here we have |Prefix | Prach12288 | Prach12288| Prach12288 | Prach12288 - prach_len = (12288*4)+Ncp; - } - } else { // short PRACH sequence - if (use_extended_prach_prefix) - Ncp+=32; // 16*kappa, kappa=2 for 61.44Msps - prach2 = prach+(Ncp<<1); //times 2 for complex samples - if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) { - idft(IDFT_2048,prachF,prach2,1); - // here we have |empty | Prach2048 | - if (prach_fmt_id != 9) { - memmove(prach2+(2048<<1),prach2,(2048<<2)); - prach_len = (2048*2)+Ncp; - } - else prach_len = (2048*1)+Ncp; - memmove(prach,prach+(2048<<1),(Ncp<<2)); - // here we have |Prefix | Prach2048 | Prach2048 (if ! 0xc0) | - } else if (prach_fmt_id == 5) { // 6x2048 - idft(IDFT_2048,prachF,prach2,1); - // here we have |empty | Prach2048 | - memmove(prach2+(2048<<1),prach2,(2048<<2)); - // here we have |empty | Prach2048 | Prach2048| empty2048 | empty2048 | - memmove(prach2+(2048<<2),prach2,(2048<<3)); - // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | - memmove(prach,prach+(2048<<1),(Ncp<<2)); - // here we have |Prefix | Prach2048 | - prach_len = (2048*4)+Ncp; - } else if (prach_fmt_id == 6) { // 6x2048 - idft(IDFT_2048,prachF,prach2,1); - // here we have |empty | Prach2048 | - memmove(prach2+(2048<<1),prach2,(2048<<2)); - // here we have |empty | Prach2048 | Prach2048| empty2048 | empty2048 | empty2048 | empty2048 - memmove(prach2+(2048<<2),prach2,(2048<<3)); - // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | empty2048 | empty2048 - memmove(prach2+(2048<<3),prach2,(2048<<3)); - // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048 - memmove(prach,prach+(2048<<1),(Ncp<<2)); - // here we have |Prefix | Prach2048 | - prach_len = (2048*6)+Ncp; - } else if (prach_fmt_id == 8) { // 12x2048 - idft(IDFT_2048,prachF,prach2,1); - // here we have |empty | Prach2048 | - memmove(prach2+(2048<<1),prach2,(2048<<2)); - // here we have |empty | Prach2048 | Prach2048| empty2048 | empty2048 | empty2048 | empty2048 - memmove(prach2+(2048<<2),prach2,(2048<<3)); - // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | empty2048 | empty2048 - memmove(prach2+(2048<<3),prach2,(2048<<3)); - // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048 - memmove(prach2+(2048<<1)*6,prach2,(2048<<2)*6); - // here we have |empty | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048 | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048| - memmove(prach,prach+(2048<<1),(Ncp<<2)); - // here we have |Prefix | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048 | Prach2048 | Prach2048| Prach2048 | Prach2048 | Prach2048 | Prach2048| - prach_len = (2048*12)+Ncp; - } - } - break; + case 61440: + // 40, 50, 60 MHz @ 61.44 Ms/s + Ncp <<= 1; + dftlen <<= 1; + break; - case 46080: // threequarter sampling @ 46.08 Ms/s - Ncp = (Ncp*3)/2; - prach2 = prach+(Ncp<<1); - if (prach_sequence_length == 0){ - if (prach_fmt_id == 0) { - idft(IDFT_36864,prachF,prach2,1); - // here we have |empty | Prach73728| - memmove(prach,prach+(36864<<1),(Ncp<<2)); - // here we have |Prefix | Prach73728| - prach_len = (36864*1)+Ncp; - } else if (prach_fmt_id == 1) { - idft(IDFT_36864,prachF,prach2,1); - memmove(prach2+(36864<<1),prach2,(36864<<2)); - // here we have |empty | Prach73728 | Prach73728| - memmove(prach,prach+(36864<<2),(Ncp<<2)); - // here we have |Prefix | Prach73728 | Prach73728| - prach_len = (36864*2)+Ncp; - } else if (prach_fmt_id == 2) { - idft(IDFT_36864,prachF,prach2,1); - memmove(prach2+(36864<<1),prach2,(36864<<2)); - // here we have |empty | Prach73728 | Prach73728| empty73728 | empty73728 - memmove(prach2+(36864<<2),prach2,(36864<<3)); - // here we have |empty | Prach73728 | Prach73728| Prach73728 | Prach73728 - memmove(prach,prach+(36864<<3),(Ncp<<2)); - // here we have |Prefix | Prach73728 | Prach73728| Prach73728 | Prach73728 - prach_len = (36864*4)+Ncp; - } else if (prach_fmt_id == 3) { - idft(IDFT_9216,prachF,prach2,1); - memmove(prach2+(9216<<1),prach2,(9216<<2)); - // here we have |empty | Prach9216 | Prach9216| empty9216 | empty9216 - memmove(prach2+(9216<<2),prach2,(9216<<3)); - // here we have |empty | Prach9216 | Prach9216| Prach9216 | Prach9216 - memmove(prach,prach+(9216<<3),(Ncp<<2)); - // here we have |Prefix | Prach9216 | Prach9216| Prach9216 | Prach9216 - prach_len = (9216*4)+Ncp; - } - } else { // short sequence - if (use_extended_prach_prefix) - Ncp+=24; // 16*kappa, kappa=1.5 for 46.08Msps - prach2 = prach+(Ncp<<1); //times 2 for complex samples - if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) { - idft(IDFT_1536,prachF,prach2,1); - // here we have |empty | Prach1536 | - if (prach_fmt_id != 9) { - memmove(prach2+(1536<<1),prach2,(1536<<2)); - prach_len = (1536*2)+Ncp; - } else prach_len = (1536*1)+Ncp; - - memmove(prach,prach+(1536<<1),(Ncp<<2)); - // here we have |Prefix | Prach1536 | Prach1536 (if ! 0xc0) | - - } else if (prach_fmt_id == 5) { // 6x1536 - idft(IDFT_1536,prachF,prach2,1); - // here we have |empty | Prach1536 | - memmove(prach2+(1536<<1),prach2,(1536<<2)); - // here we have |empty | Prach1536 | Prach1536| empty1536 | empty1536 | - memmove(prach2+(1536<<2),prach2,(1536<<3)); - // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | - memmove(prach,prach+(1536<<1),(Ncp<<2)); - // here we have |Prefix | Prach1536 | - prach_len = (1536*4)+Ncp; - } else if (prach_fmt_id == 6) { // 6x1536 - idft(IDFT_1536,prachF,prach2,1); - // here we have |empty | Prach1536 | - memmove(prach2+(1536<<1),prach2,(1536<<2)); - // here we have |empty | Prach1536 | Prach1536| empty1536 | empty1536 | empty1536 | empty1536 - memmove(prach2+(1536<<2),prach2,(1536<<3)); - // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | empty1536 | empty1536 - memmove(prach2+(1536<<3),prach2,(1536<<3)); - // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536 - memmove(prach,prach+(1536<<1),(Ncp<<2)); - // here we have |Prefix | Prach1536 | - prach_len = (1536*6)+Ncp; - } else if (prach_fmt_id == 8) { // 12x1536 - idft(IDFT_1536,prachF,prach2,1); - // here we have |empty | Prach1536 | - memmove(prach2+(1536<<1),prach2,(1536<<2)); - // here we have |empty | Prach1536 | Prach1536| empty1536 | empty1536 | empty1536 | empty1536 - memmove(prach2+(1536<<2),prach2,(1536<<3)); - // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | empty1536 | empty1536 - memmove(prach2+(1536<<3),prach2,(1536<<3)); - // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536 - memmove(prach2+(1536<<1)*6,prach2,(1536<<2)*6); - // here we have |empty | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536 | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536| - memmove(prach,prach+(1536<<1),(Ncp<<2)); - // here we have |Prefix | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536 | Prach1536 | Prach1536| Prach1536 | Prach1536 | Prach1536 | Prach1536| - prach_len = (1536*12)+Ncp; - } - } - break; + case 92160: + // 50, 60, 70, 80, 90 MHz @ 92.16 Ms/s + Ncp *= 3; + dftlen *= 3; + break; - case 122880: // full sampling @ 122.88 Ms/s - Ncp<<=2; //to account for 122.88Mbps - // This is after cyclic prefix - prach2 = prach+(Ncp<<1); //times 2 for complex samples - if (prach_sequence_length == 0){ - if (prach_fmt_id == 0) { //24576 samples @ 30.72 Ms/s, 98304 samples @ 122.88 Ms/s - idft(IDFT_98304,prachF,prach2,1); - // here we have |empty | Prach98304| - memmove(prach,prach+(98304<<1),(Ncp<<2)); - // here we have |Prefix | Prach98304| - prach_len = (98304*1)+Ncp; - } else if (prach_fmt_id == 1) { - idft(IDFT_98304,prachF,prach2,1); - memmove(prach2+(98304<<1),prach2,(98304<<2)); - // here we have |empty | Prach98304 | Prach98304| - memmove(prach,prach+(98304<<2),(Ncp<<2)); - // here we have |Prefix | Prach98304 | Prach98304| - prach_len = (98304*2)+Ncp; - } else if (prach_fmt_id == 2) { - idft(IDFT_98304,prachF,prach2,1); - memmove(prach2+(98304<<1),prach2,(98304<<2)); - // here we have |empty | Prach98304 | Prach98304| empty98304 | empty98304 - memmove(prach2+(98304<<2),prach2,(98304<<3)); - // here we have |empty | Prach98304 | Prach98304| Prach98304 | Prach98304 - memmove(prach,prach+(98304<<3),(Ncp<<2)); - // here we have |Prefix | Prach98304 | Prach98304| Prach98304 | Prach98304 - prach_len = (98304*4)+Ncp; - } else if (prach_fmt_id == 3) { // 4x6144, Ncp 3168 - idft(IDFT_24576,prachF,prach2,1); - memmove(prach2+(24576<<1),prach2,(24576<<2)); - // here we have |empty | Prach24576 | Prach24576| empty24576 | empty24576 - memmove(prach2+(24576<<2),prach2,(24576<<3)); - // here we have |empty | Prach24576 | Prach24576| Prach24576 | Prach24576 - memmove(prach,prach+(24576<<3),(Ncp<<2)); - // here we have |Prefix | Prach24576 | Prach24576| Prach24576 | Prach24576 - prach_len = (24576*4)+Ncp; - } - } else { // short sequence - if (use_extended_prach_prefix) - Ncp+=64; // 16*kappa, kappa=4 for 122.88Msps - prach2 = prach+(Ncp<<1); //times 2 for complex samples - if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) { - idft(IDFT_4096,prachF,prach2,1); - // here we have |empty | Prach4096 | - if (prach_fmt_id != 9) { - memmove(prach2+(4096<<1),prach2,(4096<<2)); - prach_len = (4096*2)+Ncp; - } else prach_len = (4096*1)+Ncp; - memmove(prach,prach+(4096<<1),(Ncp<<2)); - // here we have |Prefix | Prach4096 | Prach4096 (if ! 0xc0) | - } else if (prach_fmt_id == 5) { // 4x4096 - idft(IDFT_4096,prachF,prach2,1); - // here we have |empty | Prach4096 | - memmove(prach2+(4096<<1),prach2,(4096<<2)); - // here we have |empty | Prach4096 | Prach4096| empty4096 | empty4096 | - memmove(prach2+(4096<<2),prach2,(4096<<3)); - // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | - memmove(prach,prach+(4096<<1),(Ncp<<2)); - // here we have |Prefix | Prach4096 | - prach_len = (4096*4)+Ncp; - } else if (prach_fmt_id == 6) { // 6x4096 - idft(IDFT_4096,prachF,prach2,1); - // here we have |empty | Prach4096 | - memmove(prach2+(4096<<1),prach2,(4096<<2)); - // here we have |empty | Prach4096 | Prach4096| empty4096 | empty4096 | empty4096 | empty4096 - memmove(prach2+(4096<<2),prach2,(4096<<3)); - // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | empty4096 | empty4096 - memmove(prach2+(4096<<3),prach2,(4096<<3)); - // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096 - memmove(prach,prach+(4096<<1),(Ncp<<2)); - // here we have |Prefix | Prach4096 | - prach_len = (4096*6)+Ncp; - } else if (prach_fmt_id == 8) { // 12x4096 - idft(IDFT_4096,prachF,prach2,1); - // here we have |empty | Prach4096 | - memmove(prach2+(4096<<1),prach2,(4096<<2)); - // here we have |empty | Prach4096 | Prach4096| empty4096 | empty4096 | empty4096 | empty4096 - memmove(prach2+(4096<<2),prach2,(4096<<3)); - // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | empty4096 | empty4096 - memmove(prach2+(4096<<3),prach2,(4096<<3)); - // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096 - memmove(prach2+(4096<<1)*6,prach2,(4096<<2)*6); - // here we have |empty | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096 | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096| - memmove(prach,prach+(4096<<1),(Ncp<<2)); - // here we have |Prefix | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096 | Prach4096 | Prach4096| Prach4096 | Prach4096 | Prach4096 | Prach4096| - prach_len = (4096*12)+Ncp; - } - } - break; + case 122880: + // 70, 80, 90, 100 MHz @ 122.88 Ms/s + Ncp <<= 2; + dftlen <<= 2; + break; - case 92160: // three quarter sampling @ 92.16 Ms/s - Ncp = (Ncp*3); //to account for 92.16 Msps - prach2 = prach+(Ncp<<1); //times 2 for complex samples - if (prach_sequence_length == 0){ - if (prach_fmt_id == 0) { - idft(IDFT_73728,prachF,prach2,1); - // here we have |empty | Prach73728| - memmove(prach,prach+(73728<<1),(Ncp<<2)); - // here we have |Prefix | Prach73728| - prach_len = (73728*1)+Ncp; - } else if (prach_fmt_id == 1) { - idft(IDFT_73728,prachF,prach2,1); - memmove(prach2+(73728<<1),prach2,(73728<<2)); - // here we have |empty | Prach73728 | Prach73728| - memmove(prach,prach+(73728<<2),(Ncp<<2)); - // here we have |Prefix | Prach73728 | Prach73728| - prach_len = (73728*2)+Ncp; - } if (prach_fmt_id == 2) { - idft(IDFT_73728,prachF,prach2,1); - memmove(prach2+(73728<<1),prach2,(73728<<2)); - // here we have |empty | Prach73728 | Prach73728| empty73728 | empty73728 - memmove(prach2+(73728<<2),prach2,(73728<<3)); - // here we have |empty | Prach73728 | Prach73728| Prach73728 | Prach73728 - memmove(prach,prach+(73728<<3),(Ncp<<2)); - // here we have |Prefix | Prach73728 | Prach73728| Prach73728 | Prach73728 - prach_len = (73728*4)+Ncp; - } else if (prach_fmt_id == 3) { - idft(IDFT_18432,prachF,prach2,1); - memmove(prach2+(18432<<1),prach2,(18432<<2)); - // here we have |empty | Prach18432 | Prach18432| empty18432 | empty18432 - memmove(prach2+(18432<<2),prach2,(18432<<3)); - // here we have |empty | Prach18432 | Prach18432| Prach18432 | Prach18432 - memmove(prach,prach+(18432<<3),(Ncp<<2)); - // here we have |Prefix | Prach18432 | Prach18432| Prach18432 | Prach18432 - prach_len = (18432*4)+Ncp; - } - } else { // short sequence - if (use_extended_prach_prefix) - Ncp+=48; // 16*kappa, kappa=3 for 92.16Msps - prach2 = prach+(Ncp<<1); //times 2 for complex samples - if (prach_fmt_id == 4 || prach_fmt_id == 7 || prach_fmt_id == 9) { - idft(IDFT_3072,prachF,prach2,1); - // here we have |empty | Prach3072 | - if (prach_fmt_id != 9) { - memmove(prach2+(3072<<1),prach2,(3072<<2)); - prach_len = (3072*2)+Ncp; - } else prach_len = (3072*1)+Ncp; - memmove(prach,prach+(3072<<1),(Ncp<<2)); - // here we have |Prefix | Prach3072 | Prach3072 (if ! 0xc0) | - } else if (prach_fmt_id == 6) { // 6x3072 - idft(IDFT_3072,prachF,prach2,1); - // here we have |empty | Prach3072 | - memmove(prach2+(3072<<1),prach2,(3072<<2)); - // here we have |empty | Prach3072 | Prach3072| empty3072 | empty3072 | empty3072 | empty3072 - memmove(prach2+(3072<<2),prach2,(3072<<3)); - // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | empty3072 | empty3072 - memmove(prach2+(3072<<3),prach2,(3072<<3)); - // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072 - memmove(prach,prach+(3072<<1),(Ncp<<2)); - // here we have |Prefix | Prach3072 | - prach_len = (3072*6)+Ncp; - } else if (prach_fmt_id == 5) { // 4x3072 - idft(IDFT_3072,prachF,prach2,1); - // here we have |empty | Prach3072 | - memmove(prach2+(3072<<1),prach2,(3072<<2)); - // here we have |empty | Prach3072 | Prach3072| empty3072 | empty3072 | - memmove(prach2+(3072<<2),prach2,(3072<<3)); - // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | - memmove(prach,prach+(3072<<1),(Ncp<<2)); - // here we have |Prefix | Prach3072 | - prach_len = (3072*4)+Ncp; - } else if (prach_fmt_id == 6) { // 12x3072 - idft(IDFT_3072,prachF,prach2,1); - // here we have |empty | Prach3072 | - memmove(prach2+(3072<<1),prach2,(3072<<2)); - // here we have |empty | Prach3072 | Prach3072| empty3072 | empty3072 | empty3072 | empty3072 - memmove(prach2+(3072<<2),prach2,(3072<<3)); - // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | empty3072 | empty3072 - memmove(prach2+(3072<<3),prach2,(3072<<3)); - // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072 - memmove(prach2+(3072<<1)*6,prach2,(3072<<2)*6); - // here we have |empty | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072 | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072| - memmove(prach,prach+(3072<<1),(Ncp<<2)); - // here we have |Prefix | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072 | Prach3072 | Prach3072| Prach3072 | Prach3072 | Prach3072 | Prach3072| - prach_len = (3072*12)+Ncp; - } - } - break; + default: + AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu); + } - default: - AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu); + #ifdef NR_PRACH_DEBUG + LOG_I(PHY, "PRACH [UE %d] Ncp %d, dftlen %d \n", Mod_id, Ncp, dftlen); + #endif + + /******************************************************** + * + * In function init_prach_tables: + * to compute quantized roots of unity ru(n) = 32767 * exp j*[ (2 * PI * n) / N_ZC ] + * + * In compute_prach_seq: + * to calculate Xu = DFT xu = xu (inv_u*k) * Xu[0] (This is a Zadoff-Chou sequence property: DFT ZC sequence is another ZC sequence) + * + * In generate_prach: + * to do the cyclic-shifted DFT by multiplying Xu[k] * ru[k*preamble_shift] as: + * If X[k] = DFT x(n) -> X_shifted[k] = DFT x(n+preamble_shift) = X[k] * exp -j*[ (2*PI*k*preamble_shift) / N_ZC ] + * + *********************************************************/ + + Xu = (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx]; + + #if defined (PRACH_WRITE_OUTPUT_DEBUG) + LOG_M("X_u.m", "X_u", (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx], N_ZC, 1, 1); + #endif + + for (offset=0,offset2=0; offset<N_ZC; offset++,offset2+=preamble_shift) { + + if (offset2 >= N_ZC) + offset2 -= N_ZC; + + Xu_re = (((int32_t)Xu[offset<<1]*amp)>>15); + Xu_im = (((int32_t)Xu[1+(offset<<1)]*amp)>>15); + prachF[k++]= ((Xu_re*nr_ru[offset2<<1]) - (Xu_im*nr_ru[1+(offset2<<1)]))>>15; + prachF[k++]= ((Xu_im*nr_ru[offset2<<1]) + (Xu_re*nr_ru[1+(offset2<<1)]))>>15; + + if (k==dftlen) k=0; + } + + #if defined (PRACH_WRITE_OUTPUT_DEBUG) + LOG_M("prachF.m", "prachF", &prachF[1804], 1024, 1, 1); + LOG_M("Xu.m", "Xu", Xu, N_ZC, 1, 1); + #endif + + // This is after cyclic prefix + prach2 = prach+(2*Ncp); // times 2 for complex samples + const idft_size_idx_t idft_size = get_idft(dftlen); + idft(idft_size, prachF, prach, 1); + memmove(prach2, prach, (dftlen<<2)); + + if (prach_sequence_length == 0) { + if (prach_fmt_id == 0) { + // here we have | empty | Prach | + memcpy(prach, prach+(dftlen<<1), (Ncp<<2)); + // here we have | Prefix | Prach | + prach_len = dftlen+Ncp; + } else if (prach_fmt_id == 1) { + // here we have | empty | Prach | empty | + memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2)); + // here we have | empty | Prach | Prach | + memcpy(prach, prach+(dftlen<<2), (Ncp<<2)); + // here we have | Prefix | Prach | Prach | + prach_len = (dftlen*2)+Ncp; + } else if (prach_fmt_id == 2 || prach_fmt_id == 3) { + // here we have | empty | Prach | empty | empty | empty | + memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2)); + // here we have | empty | Prach | Prach | empty | empty | + memcpy(prach2+(dftlen<<2), prach2, (dftlen<<3)); + // here we have | empty | Prach | Prach | Prach | Prach | + memcpy(prach, prach+(dftlen<<3), (Ncp<<2)); + // here we have | Prefix | Prach | Prach | Prach | Prach | + prach_len = (dftlen*4)+Ncp; + } + } else { // short PRACH sequence + if (prach_fmt_id == 9) { + // here we have | empty | Prach | + memcpy(prach, prach+(dftlen<<1), (Ncp<<2)); + // here we have | Prefix | Prach | + prach_len = (dftlen*1)+Ncp; + } else if (prach_fmt_id == 4 || prach_fmt_id == 7) { + // here we have | empty | Prach | empty | + memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2)); + // here we have | empty | Prach | Prach | + memcpy(prach, prach+(dftlen<<1), (Ncp<<2)); + // here we have | Prefix | Prach | Prach | + prach_len = (dftlen*2)+Ncp; + } else if (prach_fmt_id == 5) { // 4xdftlen + // here we have | empty | Prach | empty | empty | empty | + memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2)); + // here we have | empty | Prach | Prach | empty | empty | + memcpy(prach2+(dftlen<<2), prach2, (dftlen<<3)); + // here we have | empty | Prach | Prach | Prach | Prach | + memcpy(prach, prach+(dftlen<<1), (Ncp<<2)); + // here we have | Prefix | Prach | Prach | Prach | Prach | + prach_len = (dftlen*4)+Ncp; + } else if (prach_fmt_id == 6) { // 6xdftlen + // here we have | empty | Prach | empty | empty | empty | empty | empty | + memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2)); + // here we have | empty | Prach | Prach | empty | empty | empty | empty | + memcpy(prach2+(dftlen<<2), prach2, (dftlen<<3)); + // here we have | empty | Prach | Prach | Prach | Prach | empty | empty | + memcpy(prach2+(dftlen<<3), prach2, (dftlen<<3)); + // here we have | empty | Prach | Prach | Prach | Prach | Prach | Prach | + memcpy(prach, prach+(dftlen<<1), (Ncp<<2)); + // here we have | Prefix | Prach | Prach | Prach | Prach | Prach | Prach | + prach_len = (dftlen*6)+Ncp; + } else if (prach_fmt_id == 8) { // 12xdftlen + // here we have | empty | Prach | empty | empty | empty | empty | empty | empty | empty | empty | empty | empty | empty | + memcpy(prach2+(dftlen<<1), prach2, (dftlen<<2)); + // here we have | empty | Prach | Prach | empty | empty | empty | empty | empty | empty | empty | empty | empty | empty | + memcpy(prach2+(dftlen<<2), prach2, (dftlen<<3)); + // here we have | empty | Prach | Prach | Prach | Prach | empty | empty | empty | empty | empty | empty | empty | empty | + memcpy(prach2+(dftlen<<3), prach2, (dftlen<<3)); + // here we have | empty | Prach | Prach | Prach | Prach | Prach | Prach | empty | empty | empty | empty | empty | empty | + memcpy(prach2+(dftlen<<1)*6, prach2, (dftlen<<2)*6); + // here we have | empty | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | + memcpy(prach, prach+(dftlen<<1), (Ncp<<2)); + // here we have | Prefix | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | Prach | + prach_len = (dftlen*12)+Ncp; } } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index 72fa255955b..6d99ac9b8c2 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -63,10 +63,12 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlsch, uint16_t N_RB_DL); */ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_turbo_iterations,uint16_t N_RB_DL); +void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, + uint16_t N_RB_UL, + NR_DL_FRAME_PARMS* frame_parms); -void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulsch, uint16_t N_RB_UL); -NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids); +NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids, NR_DL_FRAME_PARMS* frame_parms); /** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream QPSK/QPSK reception. @param stream0_in Input from channel compensated (MR combined) stream 0 @@ -707,7 +709,8 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF, unsigned short nb_rb_pdsch, uint8_t n_dmrs_cdm_groups, NR_DL_FRAME_PARMS *frame_parms, - uint16_t dlDmrsSymbPos); + uint16_t dlDmrsSymbPos, + int chest_time_type); /** \fn dlsch_extract_rbs_multiple(int32_t **rxdataF, int32_t **dl_ch_estimates, @@ -745,7 +748,8 @@ void nr_dlsch_extract_rbs(int **rxdataF, uint8_t n_dmrs_cdm_groups, uint8_t Nl, NR_DL_FRAME_PARMS *frame_parms, - uint16_t dlDmrsSymbPos); + uint16_t dlDmrsSymbPos, + int chest_time_type); /** \fn dlsch_extract_rbs_TM7(int32_t **rxdataF, int32_t **dl_bf_ch_estimates, @@ -851,10 +855,6 @@ void construct_HhH_elements(int *ch0conj_ch0, int32_t *after_mf_11, unsigned short nb_rb); -void squared_matrix_element(int32_t *Hh_h_00, - int32_t *Hh_h_00_sq, - unsigned short nb_rb); - void dlsch_channel_level_TM34_meas(int *ch00, int *ch01, int *ch10, @@ -881,19 +881,15 @@ void nr_dlsch_detection_mrc(int **rxdataF_comp, unsigned short nb_rb, int length); -void det_HhH(int32_t *after_mf_00, - int32_t *after_mf_01, - int32_t *after_mf_10, - int32_t *after_mf_11, - int32_t *det_fin_128, - unsigned short nb_rb); +void nr_conjch0_mult_ch1(int *ch0, + int *ch1, + int32_t *ch0conj_ch1, + unsigned short nb_rb, + unsigned char output_shift0); -void numer(int32_t *Hh_h_00_sq, - int32_t *Hh_h_01_sq, - int32_t *Hh_h_10_sq, - int32_t *Hh_h_11_sq, - int32_t *num_fin, - unsigned short nb_rb); +void nr_a_sum_b(__m128i *input_x, + __m128i *input_y, + unsigned short nb_rb); uint8_t rank_estimation_tm3_tm4(int *dl_ch_estimates_00, int *dl_ch_estimates_01, @@ -1011,8 +1007,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, uint16_t nb_symb_sch, uint8_t nr_slot_rx, uint8_t harq_pid, - uint8_t is_crnti, - uint8_t llr8_flag); + uint8_t is_crnti); int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, NR_UE_ULSCH_t *ulsch, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h index 4086f60f02e..96f31a1624b 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h @@ -84,9 +84,9 @@ typedef struct { /// Pointer to the payload + CRC uint8_t *b; /// Pointers to transport block segments - uint8_t *c[MAX_NUM_NR_ULSCH_SEGMENTS]; + uint8_t **c; /// LDPC-code outputs - uint8_t *d[MAX_NUM_NR_ULSCH_SEGMENTS]; + uint8_t **d; /// LDPC-code outputs (TS 36.212 V15.4.0, Sec 5.3.2 p. 17) uint8_t *e; /// Rate matching (Interleaving) outputs (TS 36.212 V15.4.0, Sec 5.4.2.2 p. 30) @@ -161,15 +161,13 @@ typedef struct { //uint8_t num_cba_dci[10]; /// allocated CBA RNTI //uint16_t cba_rnti[4];//NUM_MAX_CBA_GROUP]; - /// UL max-harq-retransmission - uint16_t Mlimit; } NR_UE_ULSCH_t; typedef struct { /// Indicator of first reception uint8_t first_rx; /// Last Ndi received for this process on DCI (used for C-RNTI only) - uint8_t DCINdi; + uint8_t Ndi; /// DLSCH status flag indicating SCH_status_t status; /// Transport block size @@ -241,10 +239,6 @@ typedef struct { vrb_t vrb_type; /// downlink power offset field uint8_t dl_power_off; - /// trials per round statistics - uint32_t trials[8]; - /// error statistics per round - uint32_t errors[8]; /// codeword this transport block is mapped to uint8_t codeword; /// HARQ-ACKs @@ -260,6 +254,7 @@ typedef struct { uint16_t ptrs_symbols; // PTRS symbol index, to be updated every PTRS symbol within a slot. uint8_t ptrs_symbol_index; + uint32_t tbslbrm; uint8_t nscid; uint16_t dlDmrsScramblingId; /// PDU BITMAP @@ -310,9 +305,7 @@ typedef struct { /// Maximum number of LDPC iterations uint8_t max_ldpc_iterations; /// number of iterations used in last turbo decoding - uint8_t last_iteration_cnt; - /// Maximum number of HARQ rounds - uint8_t Mlimit; + uint8_t last_iteration_cnt; } NR_UE_DLSCH_t; typedef enum {format0_0, @@ -341,7 +334,7 @@ typedef struct { /// Position of first CCE of the dci int firstCCE; /// flag to indicate that this is a RA response - boolean_t ra_flag; + bool ra_flag; /// rnti rnti_t rnti; /// rnti type diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c index d3f362b90cc..80b803779dc 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c @@ -67,7 +67,7 @@ void nr_rf_card_config_gain(openair0_config_t *openair0_cfg, openair0_cfg->autocal[i] = 1; if (i < openair0_cfg->rx_num_channels) { - LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_gain %f, rx_gain %f\n", + LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_gain %.0f, rx_gain %.0f\n", i, rf_chain, openair0_cfg->tx_gain[i], @@ -103,11 +103,12 @@ void nr_rf_card_config_freq(openair0_config_t *openair0_cfg, openair0_cfg->autocal[i] = 1; if (i < openair0_cfg->rx_num_channels) { - LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_freq %f Hz, rx_freq %f Hz\n", + LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_freq %.0f Hz, rx_freq %.0f Hz, tune_offset %.0f\n", i, rf_chain, openair0_cfg->tx_freq[i], - openair0_cfg->rx_freq[i]); + openair0_cfg->rx_freq[i], + openair0_cfg->tune_offset); } } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c index 87ba2090e7c..ef952b01529 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c @@ -43,10 +43,10 @@ //#define DEBUG_ULSCH_CODING -void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL) +void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, + uint16_t N_RB_UL, + NR_DL_FRAME_PARMS* frame_parms) { -{ - int i, r; NR_UE_ULSCH_t *ulsch = *ulschptr; if (ulsch) { @@ -54,15 +54,15 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL) printf("Freeing ulsch %p\n",ulsch); #endif - uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS; //number of segments to be allocated - - if (N_RB_UL != 273) { - a_segments = a_segments*N_RB_UL; - a_segments = a_segments/273 +1; - } + int max_layers = (frame_parms->nb_antennas_tx<NR_MAX_NB_LAYERS) ? frame_parms->nb_antennas_tx : NR_MAX_NB_LAYERS; + uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*max_layers; //number of segments to be allocated + if (N_RB_UL != 273) { + a_segments = a_segments*N_RB_UL; + a_segments = a_segments/273 +1; + } - for (i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) { + for (int i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) { if (ulsch->harq_processes[i]) { if (ulsch->harq_processes[i]->a) { @@ -81,7 +81,7 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL) free16(ulsch->harq_processes[i]->f,14*N_RB_UL*12*8); ulsch->harq_processes[i]->f = NULL; } - for (r=0; r<a_segments; r++) { + for (int r=0; r<a_segments; r++) { if (ulsch->harq_processes[i]->c[r]) { free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768); ulsch->harq_processes[i]->c[r] = NULL; @@ -94,6 +94,15 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL) } + if (ulsch->harq_processes[i]->c) { + free16(ulsch->harq_processes[i]->c,a_segments); + ulsch->harq_processes[i]->c = NULL; + } + if (ulsch->harq_processes[i]->d) { + free16(ulsch->harq_processes[i]->d,a_segments); + ulsch->harq_processes[i]->d = NULL; + } + free16(ulsch->harq_processes[i],sizeof(NR_UL_UE_HARQ_t)); ulsch->harq_processes[i] = NULL; } @@ -101,13 +110,13 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr, uint16_t N_RB_UL) free16(ulsch,sizeof(NR_UE_ULSCH_t)); *ulschptr = NULL; } - } -NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids) -{ - uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS; //number of segments to be allocated +NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids, NR_DL_FRAME_PARMS* frame_parms) { + + int max_layers = (frame_parms->nb_antennas_tx<NR_MAX_NB_LAYERS) ? frame_parms->nb_antennas_tx : NR_MAX_NB_LAYERS; + uint16_t a_segments = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*max_layers; //number of segments to be allocated if (N_RB_UL != 273) { a_segments = a_segments*N_RB_UL; @@ -121,10 +130,6 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids) memset(ulsch, 0, sizeof(*ulsch)); ulsch->number_harq_processes_for_pusch = NR_MAX_ULSCH_HARQ_PROCESSES; - ulsch->Mlimit = 4; // maximum harq retransmissions - - //for (i=0; i<10; i++) - //ulsch->harq_ids[i] = 0; for (int i = 0; i < number_of_harq_pids; i++) { @@ -140,6 +145,8 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL, int number_of_harq_pids) DevAssert(ulsch->harq_processes[i]->b); bzero(ulsch->harq_processes[i]->b,ulsch_bytes); + ulsch->harq_processes[i]->c = malloc16(a_segments*sizeof(uint8_t *)); + ulsch->harq_processes[i]->d = malloc16(a_segments*sizeof(uint16_t *)); for (int r = 0; r < a_segments; r++) { // account for filler in first segment and CRCs for multiple segment case ulsch->harq_processes[i]->c[r] = malloc16(8448); @@ -171,8 +178,8 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, NR_UE_ULSCH_t *ulsch, NR_DL_FRAME_PARMS* frame_parms, uint8_t harq_pid, - unsigned int G) -{ + unsigned int G) { + start_meas(&ue->ulsch_encoding_stats); /////////////////////////parameters and variables initialization///////////////////////// @@ -181,23 +188,22 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, unsigned int crc = 1; NR_UL_UE_HARQ_t *harq_process = ulsch->harq_processes[harq_pid]; uint16_t nb_rb = harq_process->pusch_pdu.rb_size; - uint32_t A = harq_process->pusch_pdu.pusch_data.tb_size*8; + uint32_t A = harq_process->pusch_pdu.pusch_data.tb_size<<3; uint32_t *pz = &harq_process->Z; - uint8_t mod_order = nr_get_Qm_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table); - uint16_t R = nr_get_code_rate_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table); + uint8_t mod_order = harq_process->pusch_pdu.qam_mod_order; uint16_t Kr=0; uint32_t r_offset=0; uint32_t F=0; - uint8_t Ilbrm = 0; - uint32_t Tbslbrm = 950984; //max tbs - float Coderate = 0.0; + // target_code_rate is in 0.1 units + float Coderate = (float) harq_process->pusch_pdu.target_code_rate / 10240.0f; + /////////// ///////////////////////////////////////////////////////////////////////////////////////// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_UE_ULSCH_ENCODING, VCD_FUNCTION_IN); LOG_D(NR_PHY, "ulsch coding nb_rb %d, Nl = %d\n", nb_rb, harq_process->pusch_pdu.nrOfLayers); - LOG_D(NR_PHY, "ulsch coding A %d G %d mod_order %d\n", A, G, mod_order); + LOG_D(NR_PHY, "ulsch coding A %d G %d mod_order %d Coderate %f\n", A, G, mod_order, Coderate); LOG_D(NR_PHY, "harq_pid %d harq_process->ndi %d, pusch_data.new_data_indicator %d\n", harq_pid,harq_process->ndi,harq_process->pusch_pdu.pusch_data.new_data_indicator); @@ -217,6 +223,8 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, printf("\n"); */ + int max_payload_bytes = MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*harq_process->pusch_pdu.nrOfLayers*1056; + if (A > 3824) { // Add 24-bit crc (polynomial A) to payload crc = crc24a(harq_process->a,A)>>8; @@ -228,7 +236,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, harq_process->B = A+24; - AssertFatal((A/8)+4 <= MAX_NR_ULSCH_PAYLOAD_BYTES,"A %d is too big (A/8+4 = %d > %d)\n",A,(A/8)+4,MAX_NR_ULSCH_PAYLOAD_BYTES); + AssertFatal((A/8)+4 <= max_payload_bytes,"A %d is too big (A/8+4 = %d > %d)\n",A,(A/8)+4,max_payload_bytes); memcpy(harq_process->b,harq_process->a,(A/8)+4); } @@ -242,7 +250,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, harq_process->B = A+16; - AssertFatal((A/8)+3 <= MAX_NR_ULSCH_PAYLOAD_BYTES,"A %d is too big (A/8+3 = %d > %d)\n",A,(A/8)+3,MAX_NR_ULSCH_PAYLOAD_BYTES); + AssertFatal((A/8)+3 <= max_payload_bytes,"A %d is too big (A/8+3 = %d > %d)\n",A,(A/8)+3,max_payload_bytes); memcpy(harq_process->b,harq_process->a,(A/8)+3); // using 3 bytes to mimic the case of 24 bit crc } @@ -252,11 +260,6 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, ///////////////////////// b---->| block segmentation |---->c ///////////////////////// /////////// - if (R<1024) - Coderate = (float) R /(float) 1024; - else - Coderate = (float) R /(float) 2048; - if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25){ harq_process->BG = 2; } @@ -302,7 +305,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, printf("start ldpc encoder segment %d/%d\n",r,harq_process->C); printf("input %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); for (int cnt =0 ; cnt < 22*(*pz)/8; cnt ++){ - printf("%d ", harq_process->c[r][cnt]); + printf("%d ", harq_process->c[r][cnt]); } printf("\n"); @@ -376,12 +379,9 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, uint32_t E = nr_get_E(G, harq_process->C, mod_order, harq_process->pusch_pdu.nrOfLayers, r); - Tbslbrm = nr_compute_tbslbrm(0,nb_rb,harq_process->pusch_pdu.nrOfLayers); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RATE_MATCHING_LDPC, VCD_FUNCTION_IN); start_meas(&ue->ulsch_rate_matching_stats); - if (nr_rate_matching_ldpc(Ilbrm, - Tbslbrm, + if (nr_rate_matching_ldpc(0, harq_process->BG, *pz, harq_process->d[r], diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index bab0c75aff1..eaeffd08099 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -38,6 +38,7 @@ #include "PHY/MODULATION/nr_modulation.h" #include "PHY/MODULATION/modulation_common.h" #include "common/utils/assertions.h" +#include "common/utils/nr/nr_common.h" #include "common/utils/LOG/vcd_signal_dumper.h" #include "PHY/NR_TRANSPORT/nr_transport_common_proto.h" #include "PHY/NR_TRANSPORT/nr_sch_dmrs.h" @@ -114,15 +115,14 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, LOG_D(PHY,"nr_ue_ulsch_procedures hard_id %d %d.%d\n",harq_pid,frame,slot); - uint32_t available_bits; - int32_t **txdataF; int8_t Wf[2], Wt[2]; int l_prime[2], delta; uint8_t nb_dmrs_re_per_rb; - int ap, i; + int i; int sample_offsetF, N_RE_prime; NR_DL_FRAME_PARMS *frame_parms = &UE->frame_parms; + int32_t **txdataF = UE->common_vars.txdataF; int N_PRB_oh = 0; // higher layer (RRC) parameter xOverhead in PUSCH-ServingCellConfig uint16_t number_dmrs_symbols = 0; @@ -155,9 +155,8 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, nb_dmrs_re_per_rb = ((dmrs_type == pusch_dmrs_type1) ? 6:4)*cdm_grps_no_data; - LOG_D(PHY,"ulsch %x : start_rb %d bwp_start %d start_sc %d start_symbol %d num_symbols %d cdmgrpsnodata %d num_dmrs %d dmrs_re_per_rb %d\n", - rnti,start_rb,pusch_pdu->bwp_start,start_sc,start_symbol,number_of_symbols,cdm_grps_no_data,number_dmrs_symbols,nb_dmrs_re_per_rb); - + LOG_D(PHY,"ulsch TX %x : start_rb %d nb_rb %d mod_order %d Nl %d Tpmi %d bwp_start %d start_sc %d start_symbol %d num_symbols %d cdmgrpsnodata %d num_dmrs %d dmrs_re_per_rb %d\n", + rnti,start_rb,nb_rb,mod_order,Nl,pusch_pdu->Tpmi,pusch_pdu->bwp_start,start_sc,start_symbol,number_of_symbols,cdm_grps_no_data,number_dmrs_symbols,nb_dmrs_re_per_rb); // TbD num_of_mod_symbols is set but never used N_RE_prime = NR_NB_SC_PER_RB*number_of_symbols - nb_dmrs_re_per_rb*number_dmrs_symbols - N_PRB_oh; harq_process_ul_ue->num_of_mod_symbols = N_RE_prime*nb_rb; @@ -172,7 +171,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, trace_NRpdu(DIRECTION_UPLINK, harq_process_ul_ue->a, harq_process_ul_ue->pusch_pdu.pusch_data.tb_size, - 0, WS_C_RNTI, rnti, frame, slot, 0, 0); + WS_C_RNTI, rnti, frame, slot, 0, 0); if (nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, G) == -1) return; @@ -184,7 +183,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, /////////////////////////ULSCH scrambling///////////////////////// /////////// - available_bits = G; + uint32_t available_bits = G; uint32_t scrambled_output[(available_bits>>5)+1]; memset(scrambled_output, 0, ((available_bits>>5)+1)*sizeof(uint32_t)); @@ -201,7 +200,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, /////////////////////////ULSCH modulation///////////////////////// /////////// - int max_num_re = number_of_symbols*nb_rb*NR_NB_SC_PER_RB; + int max_num_re = Nl*number_of_symbols*nb_rb*NR_NB_SC_PER_RB; int32_t d_mod[max_num_re] __attribute__ ((aligned(16))); nr_modulation(scrambled_output, // assume one codeword for the moment @@ -209,7 +208,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, mod_order, (int16_t *)d_mod); - /////////// //////////////////////////////////////////////////////////////////////// @@ -284,8 +282,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, /// Transform-coded "y"-sequences (for definition see 38-211 V15.3.0 2018-09, subsection 6.3.1.4) int32_t y[max_num_re] __attribute__ ((aligned(16))); - // if transform precoding is enbaled (value 0) - if (pusch_pdu->transform_precoding == 0) { + if (pusch_pdu->transform_precoding == transformPrecoder_enabled) { uint32_t nb_re_pusch=nb_rb * NR_NB_SC_PER_RB; uint32_t y_offset = 0; @@ -315,20 +312,20 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, LOG_D(PHY,"Transform precoding being done on data- symbol: %d, nb_re_pusch: %d, y_offset: %d\n", l, nb_re_pusch, y_offset); #ifdef DEBUG_PUSCH_MAPPING - printf("NR_ULSCH_UE: y_offset %d\t nb_re_pusch %d \t Symbol %d \t nb_rb %d \n", - y_offset, nb_re_pusch, l, nb_rb); + printf("NR_ULSCH_UE: y_offset %d\t nb_re_pusch %d \t Symbol %d \t nb_rb %d \n", + y_offset, nb_re_pusch, l, nb_rb); #endif } #ifdef DEBUG_DFT_IDFT - int32_t debug_symbols[max_num_re] __attribute__ ((aligned(16))); + int32_t debug_symbols[MAX_NUM_NR_RE] __attribute__ ((aligned(16))); int offset = 0; printf("NR_ULSCH_UE: available_bits: %d, mod_order: %d", available_bits,mod_order); for (int ll = 0; ll < (available_bits/mod_order); ll++) { - debug_symbols[ll] = y[ll]; + debug_symbols[ll] = ulsch_ue->y[ll]; } - + printf("NR_ULSCH_UE: numSym: %d, num_dmrs_sym: %d", number_of_symbols,number_dmrs_symbols); for (int ll = 0; ll < (number_of_symbols-number_dmrs_symbols); ll++) { nr_idft(&debug_symbols[offset], nb_re_pusch); @@ -341,32 +338,33 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, #endif } - else - memcpy(y, tx_layers[0], (available_bits/mod_order)*sizeof(int32_t)); - for (int nl = 0; nl < Nl; nl++) - free_and_zero(tx_layers[nl]); - free_and_zero(tx_layers); + /////////// + //////////////////////////////////////////////////////////////////////// + + /////////////////////////ULSCH RE mapping///////////////////////// /////////// - txdataF = UE->common_vars.txdataF; - - for (ap=0; ap< Nl; ap++) { + int encoded_length = frame_parms->N_RB_UL*14*NR_NB_SC_PER_RB*mod_order*Nl; + int16_t **tx_precoding = (int16_t **)malloc16_clear(Nl*sizeof(int16_t *)); + for (int nl=0; nl<Nl; nl++) + tx_precoding[nl] = (int16_t *)malloc16_clear((encoded_length<<1)*sizeof(int16_t)); + for (int nl=0; nl < Nl; nl++) { uint8_t k_prime = 0; uint16_t m = 0; - #ifdef DEBUG_PUSCH_MAPPING printf("NR_ULSCH_UE: Value of CELL ID %d /t, u %d \n", frame_parms->Nid_cell, u); #endif - // DMRS params for this ap - get_Wt(Wt, ap, dmrs_type); - get_Wf(Wf, ap, dmrs_type); - delta = get_delta(ap, dmrs_type); + int dmrs_port = get_dmrs_port(nl,pusch_pdu->dmrs_ports); + // DMRS params for this dmrs port + get_Wt(Wt, dmrs_port, dmrs_type); + get_Wf(Wf, dmrs_port, dmrs_type); + delta = get_delta(dmrs_port, dmrs_type); for (int l=start_symbol; l<start_symbol+number_of_symbols; l++) { @@ -379,8 +377,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, if ((ul_dmrs_symb_pos >> l) & 0x01) { is_dmrs_sym = 1; - // transform precoding disabled (value 1) - if (pusch_pdu->transform_precoding == 1){ + if (pusch_pdu->transform_precoding == transformPrecoder_disabled){ if (dmrs_type == pusch_dmrs_type1) dmrs_idx = (pusch_pdu->bwp_start + start_rb)*6; @@ -396,7 +393,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, } } else if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) { - AssertFatal(pusch_pdu->transform_precoding == 1, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n"); + AssertFatal(pusch_pdu->transform_precoding == transformPrecoder_disabled, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n"); if(is_ptrs_symbol(l, ulsch_ue->ptrs_symbols)) { is_ptrs_sym = 1; @@ -405,7 +402,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, } for (i=0; i< nb_rb*NR_NB_SC_PER_RB; i++) { - uint8_t is_dmrs = 0; uint8_t is_ptrs = 0; @@ -417,7 +413,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, } else if (is_ptrs_sym) { is_ptrs = is_ptrs_subcarrier(k, rnti, - ap, + nl, dmrs_type, K_ptrs, nb_rb, @@ -428,67 +424,146 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, if (is_dmrs == 1) { // if transform precoding is enabled - if (pusch_pdu->transform_precoding == 0) { - - ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[2*dmrs_idx]) >> 15; - ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[(2*dmrs_idx) + 1]) >> 15; - + if (pusch_pdu->transform_precoding == transformPrecoder_enabled) { + ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[2*dmrs_idx]) >> 15; + ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[(2*dmrs_idx) + 1]) >> 15; } else { - - ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[dmrs_idx<<1]) >> 15; - ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; - + ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[dmrs_idx<<1]) >> 15; + ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; } #ifdef DEBUG_PUSCH_MAPPING - printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t dmrs: %d %d\n", - dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1], - ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1]); + printf("DMRS: Layer: %d\t, dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t dmrs: %d %d\n", + nl, dmrs_idx, l, k, k_prime, n, ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1], + ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1]); #endif - dmrs_idx++; k_prime++; k_prime&=1; n+=(k_prime)?0:1; - + } else if (is_ptrs == 1) { - - ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (beta_ptrs*AMP*mod_ptrs[ptrs_idx<<1]) >> 15; - ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (beta_ptrs*AMP*mod_ptrs[(ptrs_idx<<1) + 1]) >> 15; - + ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = (beta_ptrs*AMP*mod_ptrs[ptrs_idx<<1]) >> 15; + ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = (beta_ptrs*AMP*mod_ptrs[(ptrs_idx<<1) + 1]) >> 15; ptrs_idx++; - } else if (!is_dmrs_sym || allowed_xlsch_re_in_dmrs_symbol(k, start_sc, frame_parms->ofdm_symbol_size, cdm_grps_no_data, dmrs_type)) { - - ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = ((int16_t *) y)[m<<1]; - ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = ((int16_t *) y)[(m<<1) + 1]; + if (pusch_pdu->transform_precoding == transformPrecoder_disabled) { + ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = ((int16_t *)tx_layers[nl])[m<<1]; + ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = ((int16_t *)tx_layers[nl])[(m<<1) + 1]; + } + else { + ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = ((int16_t *) y)[m<<1]; + ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = ((int16_t *) y)[(m<<1) + 1]; + } #ifdef DEBUG_PUSCH_MAPPING - printf("m %d\t l %d \t k %d \t txdataF: %d %d\n", - m, l, k, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1], - ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1]); + printf("DATA: layer %d\t m %d\t l %d \t k %d \t tx_precoding: %d %d\n", + nl, m, l, k, ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1], + ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1]); #endif m++; } else { - - ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = 0; - ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = 0; - + ((int16_t*)tx_precoding[nl])[(sample_offsetF)<<1] = 0; + ((int16_t*)tx_precoding[nl])[((sample_offsetF)<<1) + 1] = 0; } if (++k >= frame_parms->ofdm_symbol_size) k -= frame_parms->ofdm_symbol_size; - } - } - } + } //for (i=0; i< nb_rb*NR_NB_SC_PER_RB; i++) + }//for (l=start_symbol; l<start_symbol+number_of_symbols; l++) + }//for (nl=0; nl < Nl; nl++) + + + + /////////////////////////ULSCH precoding///////////////////////// + /////////// + ///Layer Precoding and Antenna port mapping + // tx_layers 0-3 are mapped on antenna ports + // The precoding info is supported by nfapi such as num_prgs, prg_size, prgs_list and pm_idx + // The same precoding matrix is applied on prg_size RBs, Thus + // pmi = prgs_list[rbidx/prg_size].pm_idx, rbidx =0,...,rbSize-1 + // The Precoding matrix: + for (int ap=0; ap<frame_parms->nb_antennas_tx; ap++) { + for (int l=start_symbol; l<start_symbol+number_of_symbols; l++) { + uint16_t k = start_sc; + + for (int rb=0; rb<nb_rb; rb++) { + //get pmi info + uint8_t pmi=pusch_pdu->Tpmi; + + if (pmi == 0) {//unitary Precoding + if(ap< pusch_pdu->nrOfLayers) + memcpy((void*)&txdataF[ap][l*frame_parms->ofdm_symbol_size + k], + (void*)&tx_precoding[ap][2*(l*frame_parms->ofdm_symbol_size + k)], + NR_NB_SC_PER_RB*sizeof(int32_t)); + else + memset((void*)&txdataF[ap][l*frame_parms->ofdm_symbol_size + k], + 0, + NR_NB_SC_PER_RB*sizeof(int32_t)); + + k += NR_NB_SC_PER_RB; + if (k >= frame_parms->ofdm_symbol_size) { + k -= frame_parms->ofdm_symbol_size; + } + } + else { + //get the precoding matrix weights: + char *W_prec; + switch (frame_parms->nb_antennas_tx) { + case 1://1 antenna port + W_prec = nr_W_1l_2p[pmi][ap]; + break; + case 2://2 antenna ports + if (pusch_pdu->nrOfLayers == 1)//1 layer + W_prec = nr_W_1l_2p[pmi][ap]; + else//2 layers + W_prec = nr_W_2l_2p[pmi][ap]; + break; + case 4://4 antenna ports + if (pusch_pdu->nrOfLayers == 1)//1 layer + W_prec = nr_W_1l_4p[pmi][ap]; + else if (pusch_pdu->nrOfLayers == 2)//2 layers + W_prec = nr_W_2l_4p[pmi][ap]; + else if (pusch_pdu->nrOfLayers == 3)//3 layers + W_prec = nr_W_3l_4p[pmi][ap]; + else//4 layers + W_prec = nr_W_4l_4p[pmi][ap]; + break; + default: + LOG_D(PHY,"Precoding 1,2, or 4 antenna ports are currently supported\n"); + W_prec = nr_W_1l_2p[pmi][ap]; + break; + } + + for (int i=0; i<NR_NB_SC_PER_RB; i++) { + int32_t re_offset = l*frame_parms->ofdm_symbol_size + k; + int32_t precodatatx_F = nr_layer_precoder(tx_precoding, W_prec, pusch_pdu->nrOfLayers, re_offset); + ((int16_t*)txdataF[ap])[(re_offset<<1)] = ((int16_t *) &precodatatx_F)[0]; + ((int16_t*)txdataF[ap])[(re_offset<<1) + 1] = ((int16_t *) &precodatatx_F)[1]; + + if (++k >= frame_parms->ofdm_symbol_size) { + k -= frame_parms->ofdm_symbol_size; + } + } + } + } //RB loop + } // symbol loop + }// port loop NR_UL_UE_HARQ_t *harq_process_ulsch=NULL; harq_process_ulsch = UE->ulsch[thread_id][gNB_id]->harq_processes[harq_pid]; harq_process_ulsch->status = SCH_IDLE; + for (int nl = 0; nl < Nl; nl++) { + free_and_zero(tx_layers[nl]); + free_and_zero(tx_precoding[nl]); + } + free_and_zero(tx_layers); + free_and_zero(tx_precoding); + /////////// //////////////////////////////////////////////////////////////////////// @@ -498,7 +573,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE, uint8_t slot, NR_DL_FRAME_PARMS *frame_parms, - uint8_t Nl) { + uint8_t n_antenna_ports) { int tx_offset, ap; int32_t **txdata; @@ -520,25 +595,23 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE, txdataF = UE->common_vars.txdataF; int symb_offset = (slot%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot; - for(ap = 0; ap < Nl; ap++) { + for(ap = 0; ap < n_antenna_ports; ap++) { for (int s=0;s<NR_NUMBER_OF_SYMBOLS_PER_SLOT;s++){ - - LOG_D(PHY,"In %s: rotating txdataF symbol %d (%d) => (%d.%d)\n", - __FUNCTION__, - s, - s + symb_offset, - frame_parms->symbol_rotation[1][2 * (s + symb_offset)], - frame_parms->symbol_rotation[1][1 + (2 * (s + symb_offset))]); - - rotate_cpx_vector((int16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], - &frame_parms->symbol_rotation[1][2 * (s + symb_offset)], - (int16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], + c16_t rot=((c16_t*)frame_parms->symbol_rotation[1])[s + symb_offset]; + LOG_D(PHY,"rotating txdataF symbol %d (%d) => (%d.%d)\n", + s, + s + symb_offset, + rot.r, rot.i); + + rotate_cpx_vector((c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], + &rot, + (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], frame_parms->ofdm_symbol_size, 15); } } - for (ap = 0; ap < Nl; ap++) { + for (ap = 0; ap < n_antenna_ports; ap++) { if (frame_parms->Ncp == 1) { // extended cyclic prefix PHY_ofdm_mod(txdataF[ap], &txdata[ap][tx_offset], diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index 52f9e67b251..d2034f3abf4 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -48,138 +48,8 @@ #include "PHY/NR_REFSIG/sss_nr.h" #include "PHY/NR_UE_TRANSPORT/cic_filter_nr.h" -/******************************************************************* -* -* NAME : get_idft -* -* PARAMETERS : size of ofdm symbol -* -* RETURN : index pointing to the dft func in the dft library -* -* DESCRIPTION : get idft function depending of ofdm size -* -*********************************************************************/ - //#define DBG_PSS_NR -idft_size_idx_t get_idft(int ofdm_symbol_size) -{ - - - switch (ofdm_symbol_size) { - case 128: - return IDFT_128; - break; - - case 256: - return IDFT_256; - break; - - case 512: - return IDFT_512; - break; - - case 768: - return IDFT_768; - break; - - case 1024: - return IDFT_1024; - break; - - case 1536: - return IDFT_1536; - break; - - case 2048: - return IDFT_2048; - break; - - case 3072: - return IDFT_3072; - break; - - case 4096: - return IDFT_4096; - break; - - case 8192: - return IDFT_8192; - break; - - default: - printf("function get_idft : unsupported ofdm symbol size \n"); - assert(0); - break; - } - return IDFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function -} - -/******************************************************************* -* -* NAME : get_dft -* -* PARAMETERS : size of ofdm symbol -* -* RETURN : function for discrete fourier transform -* -* DESCRIPTION : get dft function depending of ofdm size -* -*********************************************************************/ - -dft_size_idx_t get_dft(int ofdm_symbol_size) -{ - - - switch (ofdm_symbol_size) { - case 128: - return DFT_128; - break; - - case 256: - return DFT_256; - break; - - case 384: - return DFT_384; - break; - - case 512: - return DFT_512; - break; - - case 768: - return DFT_768; - break; - - case 1024: - return DFT_1024; - break; - - case 1536: - return DFT_1536; - break; - - case 2048: - return DFT_2048; - break; - - case 4096: - return DFT_4096; - break; - - case 8192: - return DFT_8192; - break; - - default: - printf("function get_dft : unsupported ofdm symbol size \n"); - assert(0); - break; - } - return DFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function; -} - /******************************************************************* * * NAME : generate_pss_nr diff --git a/openair1/PHY/TOOLS/calibration_scope.c b/openair1/PHY/TOOLS/calibration_scope.c index da1acb51757..d3397b033f1 100644 --- a/openair1/PHY/TOOLS/calibration_scope.c +++ b/openair1/PHY/TOOLS/calibration_scope.c @@ -34,7 +34,7 @@ typedef struct OAIgraph { int h; int waterFallh; double *waterFallAvg; - boolean_t initDone; + bool initDone; int iteration; void (*funct) (struct OAIgraph *graph, calibData_t *); } OAIgraph_t; @@ -159,7 +159,7 @@ static void oai_xygraph_getbuff(OAIgraph_t *graph, float **x, float **y, int len *y=old_y; } -static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int layer, boolean_t NoAutoScale) { +static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int layer, bool NoAutoScale) { fl_redraw_object(graph->graph); if ( NoAutoScale && graph->iteration%NoAutoScale == 0) { diff --git a/openair1/PHY/TOOLS/cmult_sv.c b/openair1/PHY/TOOLS/cmult_sv.c index dc57964ca52..a9d502b9eb1 100644 --- a/openair1/PHY/TOOLS/cmult_sv.c +++ b/openair1/PHY/TOOLS/cmult_sv.c @@ -144,207 +144,10 @@ void multadd_real_four_symbols_vector_complex_scalar(int16_t *x, _m_empty(); } - -/* -int rotate_cpx_vector(int16_t *x, - int16_t *alpha, - int16_t *y, - uint32_t N, - uint16_t output_shift, - uint8_t format) -{ - // Multiply elementwise two complex vectors of N elements - // x - input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| - // We assume x1 with a dynamic of 15 bit maximum - // - // alpha - input 2 in the format |Re0 Im0| - // We assume x2 with a dynamic of 15 bit maximum - // - // y - output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| - // - // N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; - // - // output_shift - shift at output to return in Q1.15 - // format - 0 means alpha is in shuffled format, 1 means x is in shuffled format - - uint32_t i; // loop counter - - register __m128i m0,m1; - - - - __m128i *x_128; - __m128i *y_128; - - - shift = _mm_cvtsi32_si128(output_shift); - x_128 = (__m128i *)&x[0]; - - if (format==0) { // alpha is in shuffled format for complex multiply - ((int16_t *)&alpha_128)[0] = alpha[0]; - ((int16_t *)&alpha_128)[1] = -alpha[1]; - ((int16_t *)&alpha_128)[2] = alpha[1]; - ((int16_t *)&alpha_128)[3] = alpha[0]; - ((int16_t *)&alpha_128)[4] = alpha[0]; - ((int16_t *)&alpha_128)[5] = -alpha[1]; - ((int16_t *)&alpha_128)[6] = alpha[1]; - ((int16_t *)&alpha_128)[7] = alpha[0]; - } else { // input is in shuffled format for complex multiply - ((int16_t *)&alpha_128)[0] = alpha[0]; - ((int16_t *)&alpha_128)[1] = alpha[1]; - ((int16_t *)&alpha_128)[2] = alpha[0]; - ((int16_t *)&alpha_128)[3] = alpha[1]; - ((int16_t *)&alpha_128)[4] = alpha[0]; - ((int16_t *)&alpha_128)[5] = alpha[1]; - ((int16_t *)&alpha_128)[6] = alpha[0]; - ((int16_t *)&alpha_128)[7] = alpha[1]; - } - - y_128 = (__m128i *)&y[0]; - - // _mm_empty(); - // return(0); - - // we compute 4 cpx multiply for each loop - for(i=0; i<(N>>3); i++) { - - m0 = _mm_madd_epi16(x_128[0],alpha_128); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0] - m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude - m1=m0; - m0 = _mm_packs_epi32(m1,m0); // 1- pack in a 128 bit register [re im re im] - y_128[0] = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im] - m0 = _mm_madd_epi16(x_128[1],alpha_128); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0] - m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude - m1 = m0; - m1 = _mm_packs_epi32(m1,m0); // 1- pack in a 128 bit register [re im re im] - y_128[1] = _mm_unpacklo_epi32(m1,m1); // 1- pack in a 128 bit register [re im re im] - m0 = _mm_madd_epi16(x_128[2],alpha_128); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0] - m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude - m1 = m0; - m1 = _mm_packs_epi32(m1,m0); // 1- pack in a 128 bit register [re im re im] - y_128[2] = _mm_unpacklo_epi32(m1,m1); // 1- pack in a 128 bit register [re im re im] - m0 = _mm_madd_epi16(x_128[3],alpha_128); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0] - m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude - m1 = m0; - m1 = _mm_packs_epi32(m1,m0); // 1- pack in a 128 bit register [re im re im] - y_128[3] = _mm_unpacklo_epi32(m1,m1); // 1- pack in a 128 bit register [re im re im] - if (format==1) { // Put output in proper format (Re,-Im,Im,Re), shuffle = (0,1,3,2) = 0x1e - - y_128[0] = _mm_shufflelo_epi16(y_128[0],0x1e); - y_128[0] = _mm_shufflehi_epi16(y_128[0],0x1e); - ((int16_t*)&y_128[0])[1] = -((int16_t*)&y_128[0])[1]; - ((int16_t*)&y_128[0])[5] = -((int16_t*)&y_128[0])[5]; - y_128[1] = _mm_shufflelo_epi16(y_128[1],0x1e); - y_128[1] = _mm_shufflehi_epi16(y_128[1],0x1e); - ((int16_t*)&y_128[1])[1] = -((int16_t*)&y_128[1])[1]; - ((int16_t*)&y_128[1])[5] = -((int16_t*)&y_128[1])[5]; - y_128[2] = _mm_shufflelo_epi16(y_128[2],0x1e); - y_128[2] = _mm_shufflehi_epi16(y_128[2],0x1e); - ((int16_t*)&y_128[2])[1] = -((int16_t*)&y_128[2])[1]; - ((int16_t*)&y_128[2])[5] = -((int16_t*)&y_128[2])[5]; - y_128[3] = _mm_shufflelo_epi16(y_128[3],0x1e); - y_128[3] = _mm_shufflehi_epi16(y_128[3],0x1e); - ((int16_t*)&y_128[3])[1] = -((int16_t*)&y_128[3])[1]; - ((int16_t*)&y_128[3])[5] = -((int16_t*)&y_128[3])[5]; - } - - - x_128+=4; - y_128 +=4; - } - - - _mm_empty(); - _m_empty(); - - return(0); -} - -int rotate_cpx_vector2(int16_t *x, - int16_t *alpha, - int16_t *y, - uint32_t N, - uint16_t output_shift, - uint8_t format) -{ - // Multiply elementwise two complex vectors of N elements - // x - input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| - // We assume x1 with a dynamic of 15 bit maximum - // - // alpha - input 2 in the format |Re0 Im0| - // We assume x2 with a dynamic of 15 bit maximum - // - // y - output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| - // - // N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; - // - // log2_amp - increase the output amplitude by a factor 2^log2_amp (default is 0) - // WARNING: log2_amp>0 can cause overflow!! - - uint32_t i; // loop counter - - register __m128i m0,m1; - - - __m128i *x_128; - __m128i *y_128; - - - shift = _mm_cvtsi32_si128(output_shift); - x_128 = (__m128i *)&x[0]; - - if (format==0) { // alpha is in shuffled format for complex multiply - ((int16_t *)&alpha_128)[0] = alpha[0]; - ((int16_t *)&alpha_128)[1] = -alpha[1]; - ((int16_t *)&alpha_128)[2] = alpha[1]; - ((int16_t *)&alpha_128)[3] = alpha[0]; - ((int16_t *)&alpha_128)[4] = alpha[0]; - ((int16_t *)&alpha_128)[5] = -alpha[1]; - ((int16_t *)&alpha_128)[6] = alpha[1]; - ((int16_t *)&alpha_128)[7] = alpha[0]; - } else { // input is in shuffled format for complex multiply - ((int16_t *)&alpha_128)[0] = alpha[0]; - ((int16_t *)&alpha_128)[1] = alpha[1]; - ((int16_t *)&alpha_128)[2] = alpha[0]; - ((int16_t *)&alpha_128)[3] = alpha[1]; - ((int16_t *)&alpha_128)[4] = alpha[0]; - ((int16_t *)&alpha_128)[5] = alpha[1]; - ((int16_t *)&alpha_128)[6] = alpha[0]; - ((int16_t *)&alpha_128)[7] = alpha[1]; - } - - y_128 = (__m128i *)&y[0]; - - // we compute 4 cpx multiply for each loop - for(i=0; i<(N>>1); i++) { - - - m0 = _mm_madd_epi16(x_128[i],alpha_128); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0] - m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude - m1=m0; - m1 = _mm_packs_epi32(m1,m0); // 1- pack in a 128 bit register [re im re im] - y_128[i] = _mm_unpacklo_epi32(m1,m1); // 1- pack in a 128 bit register [re im re im] - if (format==1) { // Put output in proper format (Re,-Im,Im,Re), shuffle = (0,1,3,2) = 0x1e - - y_128[i] = _mm_shufflelo_epi16(y_128[i],0x1e); - y_128[i] = _mm_shufflehi_epi16(y_128[i],0x1e); - ((int16_t*)&y_128[i])[1] = -((int16_t*)&y_128[i])[1]; - ((int16_t*)&y_128[i])[5] = -((int16_t*)&y_128[i])[5]; - } - } - - - _mm_empty(); - _m_empty(); - - - return(0); -} -*/ - -int rotate_cpx_vector(int16_t *x, - int16_t *alpha, - int16_t *y, +#ifdef __AVX2__ +void rotate_cpx_vector(c16_t *x, + c16_t *alpha, + c16_t *y, uint32_t N, uint16_t output_shift) { @@ -372,28 +175,28 @@ int rotate_cpx_vector(int16_t *x, __m128i shift = _mm_cvtsi32_si128(output_shift); register simd_q15_t m0,m1,m2,m3; - ((int16_t *)&alpha_128)[0] = alpha[0]; - ((int16_t *)&alpha_128)[1] = -alpha[1]; - ((int16_t *)&alpha_128)[2] = alpha[1]; - ((int16_t *)&alpha_128)[3] = alpha[0]; - ((int16_t *)&alpha_128)[4] = alpha[0]; - ((int16_t *)&alpha_128)[5] = -alpha[1]; - ((int16_t *)&alpha_128)[6] = alpha[1]; - ((int16_t *)&alpha_128)[7] = alpha[0]; + ((int16_t *)&alpha_128)[0] = alpha->r; + ((int16_t *)&alpha_128)[1] = -alpha->i; + ((int16_t *)&alpha_128)[2] = alpha->i; + ((int16_t *)&alpha_128)[3] = alpha->r; + ((int16_t *)&alpha_128)[4] = alpha->r; + ((int16_t *)&alpha_128)[5] = -alpha->i; + ((int16_t *)&alpha_128)[6] = alpha->i; + ((int16_t *)&alpha_128)[7] = alpha->r; #elif defined(__arm__) int32x4_t shift; int32x4_t ab_re0,ab_re1,ab_im0,ab_im1,re32,im32; int16_t reflip[8] __attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1}; int32x4x2_t xtmp; - ((int16_t *)&alpha_128)[0] = alpha[0]; - ((int16_t *)&alpha_128)[1] = alpha[1]; - ((int16_t *)&alpha_128)[2] = alpha[0]; - ((int16_t *)&alpha_128)[3] = alpha[1]; - ((int16_t *)&alpha_128)[4] = alpha[0]; - ((int16_t *)&alpha_128)[5] = alpha[1]; - ((int16_t *)&alpha_128)[6] = alpha[0]; - ((int16_t *)&alpha_128)[7] = alpha[1]; + ((int16_t *)&alpha_128)[0] = alpha->r; + ((int16_t *)&alpha_128)[1] = alpha->i; + ((int16_t *)&alpha_128)[2] = alpha->r; + ((int16_t *)&alpha_128)[3] = alpha->i; + ((int16_t *)&alpha_128)[4] = alpha->r; + ((int16_t *)&alpha_128)[5] = alpha->i; + ((int16_t *)&alpha_128)[6] = alpha->r; + ((int16_t *)&alpha_128)[7] = alpha->i; int16x8_t bflip = vrev32q_s16(alpha_128); int16x8_t bconj = vmulq_s16(alpha_128,*(int16x8_t *)reflip); shift = vdupq_n_s32(-output_shift); @@ -439,9 +242,9 @@ int rotate_cpx_vector(int16_t *x, _mm_empty(); _m_empty(); - return(0); + return; } - +#endif /* int mult_vector32_scalar(int16_t *x1, int x2, @@ -536,7 +339,7 @@ main () int16_t input[256] __attribute__((aligned(16))); int16_t input2[256] __attribute__((aligned(16))); int16_t output[256] __attribute__((aligned(16))); - int16_t alpha[2]; + c16_t alpha; int i; @@ -574,8 +377,8 @@ main () input2[14] = 1000; input2[15] = 2000; - alpha[0]=32767; - alpha[1]=0; + alpha->r=32767; + alpha->i=0; //mult_cpx_vector(input,input2,output,L,0); rotate_cpx_vector_norep(input,alpha,input,L,15); diff --git a/openair1/PHY/TOOLS/lte_ue_scope.c b/openair1/PHY/TOOLS/lte_ue_scope.c index 9b3f65d7d13..2c45437cdfa 100644 --- a/openair1/PHY/TOOLS/lte_ue_scope.c +++ b/openair1/PHY/TOOLS/lte_ue_scope.c @@ -51,9 +51,9 @@ void reset_stats(FL_OBJECT *button, long arg) { int i,j,k; PHY_VARS_eNB *phy_vars_eNB = RC.eNB[0][0]; - for (i=0; i<NUMBER_OF_DLSCH_MAX; i++) { - for (k=0; k<8; k++) { //harq_processes - for (j=0; j<phy_vars_eNB->dlsch[i][0]->Mlimit; j++) { + for (i=0; i<NUMBER_OF_UE_MAX; i++) { + for (k=0; k<NUMBER_OF_DLSCH_MAX; k++) { //harq_processes + for (j=0; j<phy_vars_eNB->dlsch[k][0]->Mlimit; j++) { phy_vars_eNB->UE_stats[i].dlsch_NAK[k][j]=0; phy_vars_eNB->UE_stats[i].dlsch_ACK[k][j]=0; phy_vars_eNB->UE_stats[i].dlsch_trials[k][j]=0; diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index 723813fbb62..d4b28361d24 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -60,7 +60,7 @@ typedef struct OAIgraph { int h; int waterFallh; double *waterFallAvg; - boolean_t initDone; + bool initDone; int iteration; void (*gNBfunct) (struct OAIgraph *graph, scopeData_t *p, int UE_id); void (*nrUEfunct)(scopeGraphData_t **data, struct OAIgraph *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id); @@ -208,7 +208,7 @@ static void oai_xygraph_getbuff(OAIgraph_t *graph, float **x, float **y, int len *y=old_y; } -static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int layer, boolean_t NoAutoScale) { +static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int layer, bool NoAutoScale) { fl_redraw_object(graph->graph); if ( NoAutoScale && graph->iteration%NoAutoScale == 0) { diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index f272e513c2a..a539b9d7719 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -33,8 +33,11 @@ extern "C" { #endif +#include <stdio.h> #include <stdint.h> +#include <assert.h> #include "PHY/sse_intrin.h" +#include "common/utils/assertions.h" #define CEILIDIV(a,b) ((a+b-1)/b) #define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1)) @@ -102,15 +105,6 @@ void multadd_complex_vector_real_scalar(int16_t *x, uint8_t zero_flag, uint32_t N); -int rotate_cpx_vector(int16_t *x, - int16_t *alpha, - int16_t *y, - uint32_t N, - uint16_t output_shift); - - - - /*!\fn void init_fft(uint16_t size,uint8_t logsize,uint16_t *rev) \brief Initialize the FFT engine for a given size @param size Size of the FFT @@ -319,6 +313,65 @@ typedef enum dft_size_idx { #define SZ_iENUM(Sz) IDFT_ ## Sz, +/******************************************************************* +* +* NAME : get_dft +* +* PARAMETERS : size of ofdm symbol +* +* RETURN : function for discrete fourier transform +* +* DESCRIPTION : get dft function depending of ofdm size +* +*********************************************************************/ +static inline +dft_size_idx_t get_dft(int ofdm_symbol_size) +{ + switch (ofdm_symbol_size) { + case 128: + return DFT_128; + case 256: + return DFT_256; + case 512: + return DFT_512; + case 1024: + return DFT_1024; + case 1536: + return DFT_1536; + case 2048: + return DFT_2048; + case 3072: + return DFT_3072; + case 4096: + return DFT_4096; + case 6144: + return DFT_6144; + case 8192: + return DFT_8192; + case 9216: + return DFT_9216; + case 12288: + return DFT_12288; + case 18432: + return DFT_18432; + case 24576: + return DFT_24576; + case 36864: + return DFT_36864; + case 49152: + return DFT_49152; + case 73728: + return DFT_73728; + case 98304: + return DFT_98304; + default: + printf("function get_dft : unsupported ofdm symbol size \n"); + assert(0); + break; + } + return DFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function; +} + typedef enum idft_size_idx { FOREACH_IDFTSZ(SZ_iENUM) IDFT_SIZE_IDXTABLESIZE @@ -344,9 +397,67 @@ struct { #endif +/******************************************************************* +* +* NAME : get_idft +* +* PARAMETERS : size of ofdm symbol +* +* RETURN : index pointing to the dft func in the dft library +* +* DESCRIPTION : get idft function depending of ofdm size +* +*********************************************************************/ +static inline +idft_size_idx_t get_idft(int ofdm_symbol_size) +{ + switch (ofdm_symbol_size) { + case 128: + return IDFT_128; + case 256: + return IDFT_256; + case 512: + return IDFT_512; + case 1024: + return IDFT_1024; + case 1536: + return IDFT_1536; + case 2048: + return IDFT_2048; + case 3072: + return IDFT_3072; + case 4096: + return IDFT_4096; + case 6144: + return IDFT_6144; + case 8192: + return IDFT_8192; + case 9216: + return IDFT_9216; + case 12288: + return IDFT_12288; + case 18432: + return IDFT_18432; + case 24576: + return IDFT_24576; + case 36864: + return IDFT_36864; + case 49152: + return IDFT_49152; + case 73728: + return IDFT_73728; + case 98304: + return IDFT_98304; + default: + printf("function get_idft : unsupported ofdm symbol size \n"); + assert(0); + break; + } + return IDFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function +} -/*!\fn int32_t rotate_cpx_vector(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N,uint16_t output_shift) +/*!\fn int32_t rotate_cpx_vector(c16_t *x,c16_t *alpha,c16_t *y,uint32_t N,uint16_t output_shift) This function performs componentwise multiplication of a vector with a complex scalar. @param x Vector input (Q1.15) in the format |Re0 Im0|,......,|Re(N-1) Im(N-1)| @param alpha Scalar input (Q1.15) in the format |Re0 Im0| @@ -356,11 +467,11 @@ This function performs componentwise multiplication of a vector with a complex s The function implemented is : \f$\mathbf{y} = \alpha\mathbf{x}\f$ */ -int32_t rotate_cpx_vector(int16_t *x, - int16_t *alpha, - int16_t *y, - uint32_t N, - uint16_t output_shift); +void rotate_cpx_vector(c16_t *x, + c16_t *alpha, + c16_t *y, + uint32_t N, + uint16_t output_shift); //cadd_sv.c diff --git a/openair1/PHY/defs_common.h b/openair1/PHY/defs_common.h index d13fe260deb..c93e3a7de9c 100644 --- a/openair1/PHY/defs_common.h +++ b/openair1/PHY/defs_common.h @@ -754,7 +754,7 @@ typedef struct { /// Position of first CCE of the dci int firstCCE; /// flag to indicate that this is a RA response - boolean_t ra_flag; + bool ra_flag; /// rnti rnti_t rnti; /// harq_pid @@ -775,7 +775,7 @@ typedef struct { /// Position of first CCE of the dci int firstCCE; /// flag to indicate that this is a RA response - boolean_t ra_flag; + bool ra_flag; /// rnti rnti_t rnti; /// Format @@ -806,7 +806,7 @@ typedef struct { /// Position of first CCE of the dci int firstCCE; /// flag to indicate that this is a RA response - boolean_t ra_flag; + bool ra_flag; /// rnti rnti_t rnti; /// Format @@ -907,7 +907,7 @@ typedef enum {no_relay=1,unicast_relay_type1,unicast_relay_type2, multicast_rela -#define MCS_COUNT 28 +#define MCS_COUNT 29 #define MCS_TABLE_LENGTH_MAX 64 diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 0b9fd8564ec..bc93b5820a1 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -48,7 +48,6 @@ #define MAX_NUM_RU_PER_gNB MAX_NUM_RU_PER_eNB #define MAX_PUCCH0_NID 8 - typedef struct { int nb_id; int Nid[MAX_PUCCH0_NID]; @@ -97,6 +96,8 @@ typedef struct { uint32_t subframe; /// MIMO mode for this DLSCH MIMO_mode_t mimo_mode; + /// Interleaver outputs + uint8_t *f; /// LDPC lifting size uint32_t Z; } NR_DL_gNB_HARQ_t; @@ -187,8 +188,6 @@ typedef struct { uint8_t codebook_index; /// Maximum number of HARQ processes uint8_t Mdlharq; - /// Maximum number of HARQ rounds - uint8_t Mlimit; /// MIMO transmission mode indicator for this sub-frame uint8_t Kmimo; /// Nsoft parameter related to UE Category @@ -277,7 +276,7 @@ typedef struct { /// The payload + CRC (24 bits) in bits (38.212 V15.4.0 section 5.1) uint32_t B; /// Pointers to code blocks after code block segmentation and CRC attachment (38.212 V15.4.0 section 5.2.2) - uint8_t *c[MAX_NUM_NR_ULSCH_SEGMENTS]; + uint8_t **c; /// Number of bits in each code block (38.212 V15.4.0 section 5.2.2) uint32_t K; /// Number of "Filler" bits added in the code block segmentation (38.212 V15.4.0 section 5.2.2) @@ -285,11 +284,9 @@ typedef struct { /// Number of code blocks after code block segmentation (38.212 V15.4.0 section 5.2.2) uint32_t C; /// Pointers to code blocks after LDPC coding (38.212 V15.4.0 section 5.3.2) - int16_t *d[MAX_NUM_NR_ULSCH_SEGMENTS]; + int16_t **d; /// LDPC lifting size (38.212 V15.4.0 table 5.3.2-1) uint32_t Z; - /// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1) - int16_t e[MAX_NUM_NR_ULSCH_SEGMENTS][3*8448]; /// Number of bits in each code block after rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1) uint32_t E; /// Number of segments processed so far @@ -344,8 +341,6 @@ typedef struct { int16_t q_RI[MAX_RI_PAYLOAD]; /// Temporary h sequence to flag PUSCH_x/PUSCH_y symbols which are not scrambled uint8_t h[MAX_NUM_CHANNEL_BITS]; - /// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15) - int16_t *w[MAX_NUM_NR_ULSCH_SEGMENTS]; ////////////////////////////////////////////////////////////// } NR_UL_gNB_HARQ_t; @@ -353,8 +348,6 @@ typedef struct { typedef struct { /// Pointers to 16 HARQ processes for the ULSCH NR_UL_gNB_HARQ_t *harq_processes[NR_MAX_ULSCH_HARQ_PROCESSES]; - /// Current HARQ process id - int harq_process_id[NR_MAX_SLOTS_PER_FRAME]; /// HARQ process mask, indicates which processes are currently active uint16_t harq_mask; /// ACK/NAK Bundling flag @@ -381,8 +374,6 @@ typedef struct { uint8_t cyclicShift; /// for cooperative communication uint8_t cooperation_flag; - /// Maximum number of HARQ rounds - uint8_t Mlimit; /// Maximum number of LDPC iterations uint8_t max_ldpc_iterations; /// number of iterations used in last LDPC decoding @@ -438,10 +429,6 @@ typedef struct { /// - first index: rx antenna id [0..nb_antennas_rx[ /// - second index: ? [0..2*ofdm_symbol_size[ int32_t **rxdataF_ext; - /// \brief Holds the received data in the frequency domain for the allocated RBs in normal format. - /// - first index: rx antenna id [0..nb_antennas_rx[ - /// - second index (definition from phy_init_lte_eNB()): ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **rxdataF_ext2; /// \brief Hold the channel estimates in time domain based on DRS. /// - first index: rx antenna id [0..nb_antennas_rx[ /// - second index: ? [0..4*ofdm_symbol_size[ @@ -454,14 +441,6 @@ typedef struct { /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ int32_t **ul_ch_estimates_ext; - /// \brief Hold the PTRS phase estimates in frequency domain. - /// - first index: rx antenna id [0..nb_antennas_rx[ - /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **ul_ch_ptrs_estimates; - /// \brief Uplink phase estimates extracted in PRBS. - /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **ul_ch_ptrs_estimates_ext; /// \brief Holds the compensated signal. /// - first index: rx antenna id [0..nb_antennas_rx[ /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ @@ -477,7 +456,7 @@ typedef struct { /// \brief Cross-correlation of two UE signals. /// - first index: rx antenna [0..nb_antennas_rx[ /// - second index: symbol [0..] - int32_t **rho; + int32_t ***rho; /// \f$\log_2(\max|H_i|^2)\f$ int16_t log2_maxh; /// \brief Magnitude of Uplink Channel first layer (16QAM level/First 64QAM level). @@ -507,6 +486,10 @@ typedef struct { /// \brief llr values. /// - first index: ? [0..1179743] (hard coded) int16_t *llr; + /// \brief llr values per layer. + /// - first index: ? [0..3] (hard coded) + /// - first index: ? [0..1179743] (hard coded) + int16_t **llr_layers; /// DMRS symbol index, to be updated every DMRS symbol within a slot. uint8_t dmrs_symbol; // PTRS symbol index, to be updated every PTRS symbol within a slot. @@ -782,6 +765,9 @@ typedef struct PHY_VARS_gNB_s { /// SRS variables nr_srs_info_t *nr_srs_info[NUMBER_OF_NR_SRS_MAX]; + /// CSI variables + nr_csi_info_t *nr_csi_info; + uint8_t pbch_configured; char gNB_generate_rar; @@ -813,12 +799,9 @@ typedef struct PHY_VARS_gNB_s { // Mask of occupied RBs, per symbol and PRB uint32_t rb_mask_ul[14][9]; - /// CSI RS sequence - uint32_t ***nr_gold_csi_rs; - /// PRS sequence uint32_t ****nr_gold_prs; - + /// Indicator set to 0 after first SR uint8_t first_sr[NUMBER_OF_NR_SR_MAX]; @@ -848,14 +831,17 @@ typedef struct PHY_VARS_gNB_s { int **dl_precoder_SgNB[3]; char log2_maxp; /// holds the maximum channel/precoder coefficient - int prb_interpolation; + int max_ldpc_iterations; + /// indicate the channel estimation technique in time domain + int chest_time; + /// indicate the channel estimation technique in freq domain + int chest_freq; /// if ==0 enables phy only test mode int mac_enabled; /// counter to average prach energh over first 100 prach opportunities int prach_energy_counter; - int csi_gold_init; int pdcch_gold_init; int pdsch_gold_init[2]; int pusch_gold_init[2]; @@ -945,8 +931,8 @@ typedef struct LDPCDecode_s { int segment_r; int r_offset; int offset; - int Tbslbrm; int decodeIterations; + uint32_t tbslbrm; } ldpcDecode_t; struct ldpcReqId { diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 2991a4b9566..61b84cfe042 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -279,10 +279,6 @@ typedef struct { /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **dl_ch_estimates_ext; - /// \brief Downlink channel estimates extracted in PRBS. - /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - second index: ? [0..168*N_RB_DL[ - int32_t **dl_ch_ptrs_estimates_ext; /// \brief Downlink beamforming channel estimates in frequency domain. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[ @@ -611,6 +607,16 @@ typedef struct { fapi_nr_ul_config_prach_pdu prach_pdu; } NR_UE_PRACH; +typedef struct { + bool active; + fapi_nr_dl_config_csiim_pdu_rel15_t csiim_config_pdu; +} NR_UE_CSI_IM; + +typedef struct { + bool active; + fapi_nr_dl_config_csirs_pdu_rel15_t csirs_config_pdu; +} NR_UE_CSI_RS; + typedef struct { bool active; fapi_nr_ul_config_srs_pdu srs_config_pdu; @@ -724,6 +730,8 @@ typedef struct { NR_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_PDCCH *pdcch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_gNB_MAX]; + NR_UE_CSI_IM *csiim_vars[NUMBER_OF_CONNECTED_gNB_MAX]; + NR_UE_CSI_RS *csirs_vars[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_SRS *srs_vars[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_PUCCH *pucch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX][NR_MAX_NB_LAYERS>4 ? 2:1]; // two RxTx Threads @@ -783,11 +791,10 @@ typedef struct { uint32_t X_u[64][839]; - - uint32_t perfect_ce; // flag to activate PRB based averaging of channel estimates // when off, defaults to frequency domain interpolation - int prb_interpolation; + int chest_freq; + int chest_time; int generate_ul_signal[NUMBER_OF_CONNECTED_gNB_MAX]; UE_NR_SCAN_INFO_t scan_info[NB_BANDS_MAX]; @@ -875,6 +882,8 @@ typedef struct { /// N0 (used for abstraction) double N0; + uint8_t max_ldpc_iterations; + /// PDSCH Varaibles PDSCH_CONFIG_DEDICATED pdsch_config_dedicated[NUMBER_OF_CONNECTED_gNB_MAX]; @@ -887,6 +896,9 @@ typedef struct { /// SRS variables nr_srs_info_t *nr_srs_info; + /// CSI variables + nr_csi_info_t *nr_csi_info; + //#if defined(UPGRADE_RAT_NR) #if 1 SystemInformationBlockType1_nr_t systemInformationBlockType1_nr; @@ -984,8 +996,8 @@ typedef struct { SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX]; SLIST_HEAD(ral_thresholds_lte_poll_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX]; #endif - - int dl_stats[5]; + int dl_errors; + int dl_stats[8]; void* scopeData; } PHY_VARS_NR_UE; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 71360623bfc..d102858a579 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -43,6 +43,7 @@ #define nr_slot_t lte_subframe_t #define MAX_NUM_SUBCARRIER_SPACING 5 +#define NR_MAX_OFDM_SYMBOL_SIZE 4096 #define NR_NB_SC_PER_RB 12 #define NR_NB_REG_PER_CCE 6 @@ -85,16 +86,21 @@ #define NR_MAX_CSET_DURATION 3 #define NR_MAX_NB_RBG 18 + #define NR_MAX_NB_LAYERS 4 // 8 +#define NR_MAX_NB_PORTS 32 + #define NR_MAX_NB_HARQ_PROCESSES 16 #define NR_MAX_PDSCH_TBS 3824 #define NR_MAX_SIB_LENGTH 2976 // 3GPP TS 38.331 section 5.2.1 - The physical layer imposes a limit to the maximum size a SIB can take. The maximum SIB1 or SI message size is 2976 bits. -#define MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER 34 +#define MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER 36 + +#define MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER 34 -#define MAX_NUM_NR_ULSCH_SEGMENTS 34 -#define MAX_NR_ULSCH_PAYLOAD_BYTES (MAX_NUM_NR_ULSCH_SEGMENTS*1056) +#define MAX_NUM_NR_CHANNEL_BITS (4*14*273*12*8) // 14 symbols, 273 RB +#define MAX_NUM_NR_RE (4*14*273*12) #define MAX_NUM_NR_SRS_SYMBOLS 4 @@ -242,17 +248,20 @@ typedef struct { typedef struct { uint16_t sc_list_length; - uint16_t *sc_list; + uint16_t sc_list[6*273]; uint8_t srs_generated_signal_bits; - int32_t *srs_generated_signal; - int32_t **srs_received_signal; - int32_t **srs_ls_estimated_channel; - int32_t **srs_estimated_channel_freq; - int32_t **srs_estimated_channel_time; - int32_t **srs_estimated_channel_time_shifted; - uint32_t *noise_power; + int32_t srs_generated_signal[OFDM_SYMBOL_SIZE_SAMPLES_MAX * MAX_NUM_NR_SRS_SYMBOLS]; } nr_srs_info_t; +typedef struct { + uint16_t csi_gold_init; + uint32_t ***nr_gold_csi_rs; + uint8_t csi_rs_generated_signal_bits; + int32_t **csi_rs_generated_signal; + bool csi_im_meas_computed; + uint32_t interference_plus_noise_power; +} nr_csi_info_t; + typedef struct NR_DL_FRAME_PARMS NR_DL_FRAME_PARMS; typedef uint32_t (*get_samples_per_slot_t)(int slot, NR_DL_FRAME_PARMS* fp); @@ -341,10 +350,10 @@ struct NR_DL_FRAME_PARMS { lte_prefix_type_t Ncp; /// sequence which is computed based on carrier frequency and numerology to rotate/derotate each OFDM symbol according to Section 5.3 in 38.211 /// First dimension is for the direction of the link (0 DL, 1 UL) - int16_t symbol_rotation[2][224*2]; + c16_t symbol_rotation[2][224]; /// sequence used to compensate the phase rotation due to timeshifted OFDM symbols /// First dimenstion is for different CP lengths - int16_t timeshift_symbol_rotation[4096*2] __attribute__ ((aligned (16))); + c16_t timeshift_symbol_rotation[4096*2] __attribute__ ((aligned (16))); /// shift of pilot position in one RB uint8_t nushift; /// SRS configuration from TS 38.331 RRC diff --git a/openair1/SCHED/ru_procedures.c b/openair1/SCHED/ru_procedures.c index dc84279a961..443b1c79897 100644 --- a/openair1/SCHED/ru_procedures.c +++ b/openair1/SCHED/ru_procedures.c @@ -71,9 +71,9 @@ #include "common/utils/system.h" #include <time.h> - -extern int oai_exit; - +#include "openair1/SCHED/sched_common_extern.h" +#include "targets/RT/USER/lte-softmodem.h" +#include "common/ran_context.h" void feptx0(RU_t *ru, int slot) @@ -616,9 +616,11 @@ void init_fep_thread(RU_t *ru, } -extern void kill_fep_thread(RU_t *ru) +void kill_fep_thread(RU_t *ru) { RU_proc_t *proc = &ru->proc; + if (proc->pthread_fep == 0) + return; pthread_mutex_lock( &proc->mutex_fep ); proc->instance_cnt_fep = 0; pthread_cond_signal(&proc->cond_fep); @@ -630,9 +632,11 @@ extern void kill_fep_thread(RU_t *ru) } -extern void kill_feptx_thread(RU_t *ru) +void kill_feptx_thread(RU_t *ru) { RU_proc_t *proc = &ru->proc; + if (proc->pthread_feptx == 0) + return; pthread_mutex_lock( &proc->mutex_feptx ); proc->instance_cnt_feptx = 0; pthread_cond_signal(&proc->cond_feptx); diff --git a/openair1/SCHED/sched_common_extern.h b/openair1/SCHED/sched_common_extern.h index b5edc6f38e3..2236c5f31dc 100644 --- a/openair1/SCHED/sched_common_extern.h +++ b/openair1/SCHED/sched_common_extern.h @@ -29,4 +29,6 @@ extern int16_t hundred_times_delta_TF[100]; extern uint16_t hundred_times_log10_NPRB[100]; +void kill_fep_thread(RU_t *ru); + #endif /*__SCHED_EXTERN_H__ */ diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c index 48728ba44ad..5c08a0f479f 100644 --- a/openair1/SCHED_NR/fapi_nr_l1.c +++ b/openair1/SCHED_NR/fapi_nr_l1.c @@ -251,7 +251,6 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){ if (number_dl_pdu>0) oai_nfapi_dl_tti_req(DL_req); - } stop_meas(&gNB->schedule_response_stats); } diff --git a/openair1/SCHED_NR/nr_ru_procedures.c b/openair1/SCHED_NR/nr_ru_procedures.c index b90f14a129d..3d5e4a0ce4d 100644 --- a/openair1/SCHED_NR/nr_ru_procedures.c +++ b/openair1/SCHED_NR/nr_ru_procedures.c @@ -526,7 +526,8 @@ void nr_fep0(RU_t *ru, int first_half) { end_symbol = NR_SYMBOLS_PER_SLOT; } - LOG_D(PHY,"In fep0 for slot = %d, first_half = %d, start_symbol = %d, end_symbol = %d\n", proc->tti_rx, first_half, start_symbol, end_symbol); + LOG_D(PHY,"In fep0 for slot = %d, first_half = %d, start_symbol = %d, end_symbol = %d, nb_antennas_rx = %d,N_TA_offset = %d\n", + proc->tti_rx, first_half, start_symbol, end_symbol,fp->nb_antennas_rx,ru->N_TA_offset); // printf("fep0: slot %d\n",slot); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX+proc->tti_rx, 1); diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index ffbedf3da72..2e3a5dd58bf 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -45,24 +45,12 @@ #include "intertask_interface.h" //#define DEBUG_RXDATA +//#define SRS_IND_DEBUG uint8_t SSB_Table[38]={0,2,4,6,8,10,12,14,254,254,16,18,20,22,24,26,28,30,254,254,32,34,36,38,40,42,44,46,254,254,48,50,52,54,56,58,60,62}; extern uint8_t nfapi_mode; -void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_scf_t *cfg, NR_DL_FRAME_PARMS *fp) { - - uint8_t sco = 0; - if (((fp->freq_range == nr_FR1) && (cfg->ssb_table.ssb_subcarrier_offset.value<24)) || - ((fp->freq_range == nr_FR2) && (cfg->ssb_table.ssb_subcarrier_offset.value<12)) ) { - if (fp->freq_range == nr_FR1) - sco = cfg->ssb_table.ssb_subcarrier_offset.value>>cfg->ssb_config.scs_common.value; - } - - fp->ssb_start_subcarrier = (12 * cfg->ssb_table.ssb_offset_point_a.value + sco); - LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier,cfg->ssb_table.ssb_offset_point_a.value,sco); -} - void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_dl_tti_ssb_pdu ssb_pdu) { NR_DL_FRAME_PARMS *fp=&gNB->frame_parms; @@ -84,7 +72,12 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ int ssb_start_symbol_abs = nr_get_ssb_start_symbol(fp,ssb_index); // computing the starting symbol for current ssb ssb_start_symbol = ssb_start_symbol_abs % fp->symbols_per_slot; // start symbol wrt slot - nr_set_ssb_first_subcarrier(cfg, fp); // setting the first subcarrier + // setting the first subcarrier + const int scs = cfg->ssb_config.scs_common.value; + const int prb_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>scs : ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>(scs-2); + const int sc_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset>>scs : ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset; + fp->ssb_start_subcarrier = (12 * prb_offset + sc_offset); + LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier, prb_offset, sc_offset); LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol); nr_generate_pss(&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); @@ -192,8 +185,8 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, NR_gNB_CSIRS_t *csirs = &msgTx->csirs_pdu[i]; if (csirs->active == 1) { LOG_D(PHY, "CSI-RS generation started in frame %d.%d\n",frame,slot); - nfapi_nr_dl_tti_csi_rs_pdu_rel15_t csi_params = csirs->csirs_pdu.csi_rs_pdu_rel15; - nr_generate_csi_rs(gNB, AMP, csi_params, slot); + nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params = &csirs->csirs_pdu.csi_rs_pdu_rel15; + nr_generate_csi_rs(&gNB->frame_parms, gNB->common_vars.txdataF, AMP, gNB->nr_csi_info, csi_params, slot, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); csirs->active = 0; } } @@ -267,13 +260,6 @@ void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) { ulsch_harq->ulsch_pdu.rb_size, ulsch_harq->TBS, r); - ulsch_harq->round++; - if (ulsch_harq->round >= ulsch->Mlimit) { - ulsch_harq->status = SCH_IDLE; - ulsch_harq->round = 0; - ulsch_harq->handled = 0; - ulsch->harq_mask &= ~(1 << rdata->harq_pid); - } ulsch_harq->handled = 1; LOG_D(PHY, "ULSCH %d in error\n",rdata->ulsch_id); @@ -364,6 +350,14 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH number_dmrs_symbols, // number of dmrs symbols irrespective of single or double symbol dmrs pusch_pdu->qam_mod_order, pusch_pdu->nrOfLayers); + + + nr_ulsch_layer_demapping(gNB->pusch_vars[ULSCH_id]->llr, + pusch_pdu->nrOfLayers, + pusch_pdu->qam_mod_order, + G, + gNB->pusch_vars[ULSCH_id]->llr_layers); + //---------------------------------------------------------- //------------------- ULSCH unscrambling ------------------- //---------------------------------------------------------- @@ -430,17 +424,8 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id, if (timing_advance_update > 63) timing_advance_update = 63; if (crc_flag == 0) LOG_D(PHY, "%d.%d : Received PUSCH : Estimated timing advance PUSCH is = %d, timing_advance_update is %d \n", frame,slot_rx,sync_pos,timing_advance_update); - else if (harq_process->round>0 || dtx_flag == 0) { // increment round if crc_flag == 1 and not(dtx_flag ==1 and round==0) - harq_process->round++; - if (harq_process->round >= ulsch->Mlimit) { - harq_process->status = SCH_IDLE; - harq_process->round = 0; - harq_process->handled = 0; - ulsch->harq_mask &= ~(1 << harq_pid); - } - } - // estimate UL_CQI for MAC + // estimate UL_CQI for MAC int SNRtimes10 = dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot) - dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot); @@ -590,7 +575,7 @@ void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { LOG_D(PHY,"symbol %d Filling rb_mask_ul rb_size %d\n",symbol,ulsch_harq->ulsch_pdu.rb_size); for (rb=0; rb<ulsch_harq->ulsch_pdu.rb_size; rb++) { rb2 = rb+ulsch_harq->ulsch_pdu.rb_start+ulsch_harq->ulsch_pdu.bwp_start; - gNB->rb_mask_ul[symbol][rb2>>5] |= (1<<(rb2&31)); + gNB->rb_mask_ul[symbol][rb2 >> 5] |= 1U << (rb2 & 31); } } } @@ -642,10 +627,38 @@ void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) } +int fill_srs_reported_symbol_list(nfapi_nr_srs_indication_reported_symbol_t *reported_symbol_list, + const nfapi_nr_srs_pdu_t *srs_pdu, + const int N_RB_UL, + const int8_t *snr_per_rb, + const int srs_est) { + + reported_symbol_list->num_rbs = srs_bandwidth_config[srs_pdu->config_index][srs_pdu->bandwidth_index][0]; + + if (!reported_symbol_list->rb_list) { + reported_symbol_list->rb_list = (nfapi_nr_srs_indication_reported_symbol_resource_block_t*) calloc(1, N_RB_UL*sizeof(nfapi_nr_srs_indication_reported_symbol_resource_block_t)); + } + + for(int rb = 0; rb < reported_symbol_list->num_rbs; rb++) { + if (srs_est<0) { + reported_symbol_list->rb_list[rb].rb_snr = 0xFF; + } else if (snr_per_rb[rb] < -64) { + reported_symbol_list->rb_list[rb].rb_snr = 0; + } else if (snr_per_rb[rb] > 63) { + reported_symbol_list->rb_list[rb].rb_snr = 0xFE; + } else { + reported_symbol_list->rb_list[rb].rb_snr = (snr_per_rb[rb] + 64)<<1; + } + } + + return 0; +} + int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { /* those variables to log T_GNB_PHY_PUCCH_PUSCH_IQ only when we try to decode */ int pucch_decode_done = 0; int pusch_decode_done = 0; + int pusch_DTX = 0; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,1); LOG_D(PHY,"phy_procedures_gNB_uespec_RX frame %d, slot %d\n",frame_rx,slot_rx); @@ -785,7 +798,8 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { if (no_sig) { LOG_D(PHY, "PUSCH not detected in frame %d, slot %d\n", frame_rx, slot_rx); nr_fill_indication(gNB, frame_rx, slot_rx, ULSCH_id, harq_pid, 1,1); - return 1; + pusch_DTX++; + continue; } gNB->pusch_vars[ULSCH_id]->ulsch_power_tot=0; gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot=0; @@ -803,10 +817,15 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot), dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot),gNB->pusch_thres); gNB->pusch_vars[ULSCH_id]->ulsch_power_tot = gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot; - nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 1,1); gNB->pusch_vars[ULSCH_id]->DTX=1; if (stats) stats->DTX++; - return 1; + if (!get_softmodem_params()->phy_test) { + /* in case of phy_test mode, we still want to decode to measure execution time. + Therefore, we don't yet call nr_fill_indication, it will be called later */ + nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 1,1); + pusch_DTX++; + continue; + } } else { LOG_D(PHY, "PUSCH detected in %d.%d (%d,%d,%d)\n",frame_rx,slot_rx, dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot), @@ -836,29 +855,88 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { LOG_D(NR_PHY, "(%d.%d) gNB is waiting for SRS, id = %i\n", frame_rx, slot_rx, i); + NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; nfapi_nr_srs_pdu_t *srs_pdu = &srs->srs_pdu; + uint8_t N_symb_SRS = 1<<srs_pdu->num_symbols; + int32_t srs_received_signal[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size*N_symb_SRS]; + int32_t srs_ls_estimated_channel[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size*N_symb_SRS]; + int32_t srs_estimated_channel_freq[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size*N_symb_SRS] __attribute__ ((aligned(32))); + int32_t srs_estimated_channel_time[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size] __attribute__ ((aligned(32))); + int32_t srs_estimated_channel_time_shifted[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size]; + uint32_t noise_power_per_rb[srs_pdu->bwp_size]; + int8_t snr_per_rb[srs_pdu->bwp_size]; + uint32_t signal_power; + uint32_t noise_power; + int8_t snr; // At least currently, the configuration is constant, so it is enough to generate the sequence just once. if(gNB->nr_srs_info[i]->sc_list_length == 0) { - generate_srs_nr(srs_pdu, &gNB->frame_parms, gNB->nr_srs_info[i]->srs_generated_signal, gNB->nr_srs_info[i], AMP, frame_rx, slot_rx); + generate_srs_nr(srs_pdu, frame_parms, gNB->nr_srs_info[i]->srs_generated_signal, gNB->nr_srs_info[i], AMP, frame_rx, slot_rx); } - nr_get_srs_signal(gNB,frame_rx,slot_rx,srs_pdu, gNB->nr_srs_info[i], gNB->nr_srs_info[i]->srs_received_signal); - - nr_srs_channel_estimation(gNB,frame_rx,slot_rx,srs_pdu, - gNB->nr_srs_info[i], - gNB->nr_srs_info[i]->srs_generated_signal, - gNB->nr_srs_info[i]->srs_received_signal, - gNB->nr_srs_info[i]->srs_estimated_channel_freq, - gNB->nr_srs_info[i]->srs_estimated_channel_time, - gNB->nr_srs_info[i]->srs_estimated_channel_time_shifted, - gNB->nr_srs_info[i]->noise_power); + const int srs_est = nr_get_srs_signal(gNB,frame_rx,slot_rx, srs_pdu, gNB->nr_srs_info[i], srs_received_signal); + + if (srs_est >= 0) { + nr_srs_channel_estimation(gNB, + frame_rx, + slot_rx, + srs_pdu, + gNB->nr_srs_info[i], + gNB->nr_srs_info[i]->srs_generated_signal, + srs_received_signal, + srs_ls_estimated_channel, + srs_estimated_channel_freq, + srs_estimated_channel_time, + srs_estimated_channel_time_shifted, + &signal_power, + noise_power_per_rb, + &noise_power, + snr_per_rb, + &snr); + } T(T_GNB_PHY_UL_FREQ_CHANNEL_ESTIMATE, T_INT(0), T_INT(srs_pdu->rnti), T_INT(frame_rx), T_INT(0), T_INT(0), - T_BUFFER(gNB->nr_srs_info[i]->srs_estimated_channel_freq[0], gNB->frame_parms.ofdm_symbol_size*sizeof(int32_t))); + T_BUFFER(srs_estimated_channel_freq[0], frame_parms->ofdm_symbol_size*sizeof(int32_t))); T(T_GNB_PHY_UL_TIME_CHANNEL_ESTIMATE, T_INT(0), T_INT(srs_pdu->rnti), T_INT(frame_rx), T_INT(0), T_INT(0), - T_BUFFER(gNB->nr_srs_info[i]->srs_estimated_channel_time_shifted[0], gNB->frame_parms.ofdm_symbol_size*sizeof(int32_t))); + T_BUFFER(srs_estimated_channel_time_shifted[0], frame_parms->ofdm_symbol_size*sizeof(int32_t))); + + const uint16_t num_srs = gNB->UL_INFO.srs_ind.number_of_pdus; + gNB->UL_INFO.srs_ind.pdu_list = &gNB->srs_pdu_list[0]; + gNB->UL_INFO.srs_ind.sfn = frame_rx; + gNB->UL_INFO.srs_ind.slot = slot_rx; + gNB->srs_pdu_list[num_srs].handle = srs_pdu->handle; + gNB->srs_pdu_list[num_srs].rnti = srs_pdu->rnti; + gNB->srs_pdu_list[num_srs].timing_advance = srs_est >= 0 ? nr_est_timing_advance_srs(frame_parms, + srs_estimated_channel_time) : 0xFFFF; + gNB->srs_pdu_list[num_srs].num_symbols = 1<<srs_pdu->num_symbols; + gNB->srs_pdu_list[num_srs].wide_band_snr = srs_est >= 0 ? (snr + 64)<<1 : 0xFF; // 0xFF will be set if this field is invalid + gNB->srs_pdu_list[num_srs].num_reported_symbols = 1<<srs_pdu->num_symbols; + if(!gNB->srs_pdu_list[num_srs].reported_symbol_list) { + gNB->srs_pdu_list[num_srs].reported_symbol_list = (nfapi_nr_srs_indication_reported_symbol_t*) calloc(1, gNB->srs_pdu_list[num_srs].num_reported_symbols*sizeof(nfapi_nr_srs_indication_reported_symbol_t)); + } + fill_srs_reported_symbol_list(&gNB->srs_pdu_list[num_srs].reported_symbol_list[0], + srs_pdu, + frame_parms->N_RB_UL, + snr_per_rb, + srs_est); + + gNB->UL_INFO.srs_ind.number_of_pdus += 1; + +#ifdef SRS_IND_DEBUG + LOG_I(NR_PHY, "gNB->UL_INFO.srs_ind.sfn = %i\n", gNB->UL_INFO.srs_ind.sfn); + LOG_I(NR_PHY, "gNB->UL_INFO.srs_ind.slot = %i\n", gNB->UL_INFO.srs_ind.slot); + LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].rnti = 0x%04x\n", num_srs, gNB->srs_pdu_list[num_srs].rnti); + LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].timing_advance = %i\n", num_srs, gNB->srs_pdu_list[num_srs].timing_advance); + LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].num_symbols = %i\n", num_srs, gNB->srs_pdu_list[num_srs].num_symbols); + LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].wide_band_snr = %i\n", num_srs, gNB->srs_pdu_list[num_srs].wide_band_snr); + LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].num_reported_symbols = %i\n", num_srs, gNB->srs_pdu_list[num_srs].num_reported_symbols); + LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].reported_symbol_list[0].num_rbs = %i\n", num_srs, gNB->srs_pdu_list[num_srs].reported_symbol_list[0].num_rbs); + for(int rb = 0; rb < gNB->srs_pdu_list[num_srs].reported_symbol_list[0].num_rbs; rb++) { + LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].reported_symbol_list[0].rb_list[%3i].rb_snr = %i\n", + num_srs, rb, gNB->srs_pdu_list[num_srs].reported_symbol_list[0].rb_list[rb].rb_snr); + } +#endif srs->active = 0; } @@ -866,15 +944,11 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { } stop_meas(&gNB->phy_proc_rx); - // figure out a better way to choose slot_rx, 19 is ok for a particular TDD configuration with 30kHz SCS - if ((frame_rx&127) == 0 && slot_rx==19) { - LOG_I(NR_PHY, "Number of bad PUCCH received: %lu\n", gNB->bad_pucch); - } if (pucch_decode_done || pusch_decode_done) { T(T_GNB_PHY_PUCCH_PUSCH_IQ, T_INT(frame_rx), T_INT(slot_rx), T_BUFFER(&gNB->common_vars.rxdataF[0][0], gNB->frame_parms.symbols_per_slot * gNB->frame_parms.ofdm_symbol_size * 4)); } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,0); - return 0; + return pusch_DTX; } diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index 9bcf659eac8..fa354d22843 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -373,6 +373,7 @@ int get_tx_harq_id(NR_UE_ULSCH_t *ulsch, int slot_tx); int is_pbch_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp); int is_ssb_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp); +bool is_csi_rs_in_symbol(fapi_nr_dl_config_csirs_pdu_rel15_t csirs_config_pdu, int symbol); /*! \brief This function prepares the dl indication to pass to the MAC @param @@ -404,7 +405,7 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, NR_UE_DLSCH_t *dlsch1, uint16_t n_pdus, UE_nr_rxtx_proc_t *proc, - void * typeSpecific); + void *typeSpecific); bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, @@ -427,6 +428,9 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id, NR_UE_PDCCH_CONFIG *phy_pdcch_config, int n_ss); +int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id); + +int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id); #endif diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index 51b34fb9baa..f4c863bb408 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -44,7 +44,7 @@ extern PHY_VARS_NR_UE ***PHY_vars_UE_g; -const char *dl_pdu_type[]={"DCI", "DLSCH", "RA_DLSCH", "SI_DLSCH", "P_DLSCH"}; +const char *dl_pdu_type[]={"DCI", "DLSCH", "RA_DLSCH", "SI_DLSCH", "P_DLSCH", "CSI_RS", "CSI_IM"}; const char *ul_pdu_type[]={"PRACH", "PUCCH", "PUSCH", "SRS"}; queue_t nr_rx_ind_queue; queue_t nr_crc_ind_queue; @@ -315,6 +315,10 @@ void configure_dlsch(NR_UE_DLSCH_t *dlsch0, dlsch0_harq->mcs = dlsch_config_pdu->mcs; dlsch0_harq->rvidx = dlsch_config_pdu->rv; dlsch0->g_pucch = dlsch_config_pdu->accumulated_delta_PUCCH; + dlsch0_harq->R = dlsch_config_pdu->targetCodeRate; + dlsch0_harq->Qm = dlsch_config_pdu->qamModOrder; + dlsch0_harq->TBS = dlsch_config_pdu->TBS; + dlsch0_harq->tbslbrm = dlsch_config_pdu->tbslbrm; dlsch0_harq->nscid = dlsch_config_pdu->nscid; dlsch0_harq->dlDmrsScramblingId = dlsch_config_pdu->dlDmrsScramblingId; //get nrOfLayers from DCI info @@ -341,6 +345,7 @@ void configure_dlsch(NR_UE_DLSCH_t *dlsch0, LOG_D(MAC, ">>>> \tdlsch0->g_pucch = %d\tdlsch0_harq.mcs = %d\n", dlsch0->g_pucch, dlsch0_harq->mcs); } + int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ bool found = false; @@ -355,12 +360,16 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ NR_UE_DLSCH_t *dlsch0 = NULL; NR_UE_ULSCH_t *ulsch = PHY_vars_UE_g[module_id][cc_id]->ulsch[thread_id][0]; NR_UE_PUCCH *pucch_vars = PHY_vars_UE_g[module_id][cc_id]->pucch_vars[thread_id][0]; + NR_UE_CSI_IM *csiim_vars = PHY_vars_UE_g[module_id][cc_id]->csiim_vars[0]; + NR_UE_CSI_RS *csirs_vars = PHY_vars_UE_g[module_id][cc_id]->csirs_vars[0]; NR_UE_PDCCH_CONFIG *phy_pdcch_config = NULL; if(scheduled_response->dl_config != NULL){ fapi_nr_dl_config_request_t *dl_config = scheduled_response->dl_config; fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu; fapi_nr_dl_config_dci_dl_pdu_rel15_t *pdcch_config; + fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu; + fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu; for (int i = 0; i < dl_config->number_pdus; ++i){ AssertFatal(dl_config->number_pdus < FAPI_NR_DL_CONFIG_LIST_NUM,"dl_config->number_pdus %d out of bounds\n",dl_config->number_pdus); @@ -382,10 +391,14 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ LOG_D(PHY,"Number of DCI SearchSpaces %d\n",phy_pdcch_config->nb_search_space); break; case FAPI_NR_DL_CONFIG_TYPE_CSI_IM: - LOG_I(PHY,"Received CSI-IM PDU at FAPI\n"); + csiim_config_pdu = &dl_config->dl_config_list[i].csiim_config_pdu.csiim_config_rel15; + memcpy((void*)&(csiim_vars->csiim_config_pdu), (void*)csiim_config_pdu, sizeof(fapi_nr_dl_config_csiim_pdu_rel15_t)); + csiim_vars->active = true; break; case FAPI_NR_DL_CONFIG_TYPE_CSI_RS: - LOG_I(PHY,"Received CSI-RS PDU at FAPI\n"); + csirs_config_pdu = &dl_config->dl_config_list[i].csirs_config_pdu.csirs_config_rel15; + memcpy((void*)&(csirs_vars->csirs_config_pdu), (void*)csirs_config_pdu, sizeof(fapi_nr_dl_config_csirs_pdu_rel15_t)); + csirs_vars->active = true; break; case FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH: dlsch_config_pdu = &dl_config->dl_config_list[i].dlsch_config_pdu.dlsch_config_rel15; @@ -424,7 +437,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ for (int i = 0; i < ul_config->number_pdus; ++i){ AssertFatal(ul_config->ul_config_list[i].pdu_type <= FAPI_NR_UL_CONFIG_TYPES,"pdu_type %d out of bounds\n",ul_config->ul_config_list[i].pdu_type); - LOG_D(PHY, "In %s: processing %s PDU of %d total UL PDUs (ul_config %p) \n", __FUNCTION__, ul_pdu_type[ul_config->ul_config_list[i].pdu_type - 1], ul_config->number_pdus, ul_config); + LOG_D(PHY, "In %s i %d: processing %s PDU of %d total UL PDUs (ul_config %p) \n", __FUNCTION__, i, ul_pdu_type[ul_config->ul_config_list[i].pdu_type - 1], ul_config->number_pdus, ul_config); uint8_t pdu_type = ul_config->ul_config_list[i].pdu_type, current_harq_pid, gNB_id = 0; /* PRACH */ @@ -449,6 +462,8 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ if (harq_process_ul_ue){ nfapi_nr_ue_pusch_pdu_t *pusch_pdu = &harq_process_ul_ue->pusch_pdu; + + LOG_D(PHY, "In %s i %d: copy pusch_config_pdu nrOfLayers:%d, num_dmrs_cdm_grps_no_data:%d \n", __FUNCTION__, i, pusch_config_pdu->nrOfLayers,pusch_config_pdu->num_dmrs_cdm_grps_no_data); memcpy(pusch_pdu, pusch_config_pdu, sizeof(nfapi_nr_ue_pusch_pdu_t)); diff --git a/openair1/SCHED_NR_UE/harq_nr.c b/openair1/SCHED_NR_UE/harq_nr.c index a9ff01d78a4..795cea5dfa7 100644 --- a/openair1/SCHED_NR_UE/harq_nr.c +++ b/openair1/SCHED_NR_UE/harq_nr.c @@ -308,7 +308,7 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) dl_harq->status = SCH_IDLE; dl_harq->first_rx = 1; dl_harq->DLround = 0; - dl_harq->DCINdi = 1; + dl_harq->Ndi = 1; dl_harq->ack = DL_ACKNACK_NO_SET; } @@ -329,7 +329,7 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) * *********************************************************************/ -void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int rv, uint8_t rnti_type) { +void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int dci_ndi, int rv, uint8_t rnti_type) { if (rnti_type == _SI_RNTI_ || rnti_type == _P_RNTI_ || @@ -339,10 +339,9 @@ void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int dl_harq->first_rx = 1; } else { LOG_D(PHY,"receive harq process: %p harqPid=%d, rv=%d, ndi=%d, rntiType=%d new transmission= %s\n", - dl_harq, harq_pid, rv, ndi, rnti_type, dl_harq->DCINdi != ndi ? "yes":"no"); + dl_harq, harq_pid, rv, dci_ndi, rnti_type, dl_harq->Ndi != dci_ndi ? "yes":"no"); AssertFatal(rv<4 && rv>=0, "invalid redondancy version %d\n", rv); - - if (ndi!=dl_harq->DCINdi) { + if (dci_ndi!=dl_harq->Ndi) { if (dl_harq->ack == DL_NACK) LOG_D(PHY,"New transmission on a harq pid (%d) never acknowledged\n", harq_pid); else @@ -354,7 +353,7 @@ void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int LOG_D(PHY,"Starting retransmission on a harq pid (%d), rv (%d)\n", harq_pid, rv); } - if (ndi!=dl_harq->DCINdi) { + if (dci_ndi!=dl_harq->Ndi) { dl_harq->first_rx = true; dl_harq->DLround = 0; } else { @@ -364,7 +363,7 @@ void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int dl_harq->status = ACTIVE; - dl_harq->DCINdi = ndi; + dl_harq->Ndi = dci_ndi; //dl_harq->status = SCH_IDLE; } } diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 4a8abe83e96..8ef26ffd8ab 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -36,6 +36,7 @@ #include "assertions.h" #include "defs.h" #include "PHY/defs_nr_UE.h" +#include "PHY/NR_REFSIG/dmrs_nr.h" #include "PHY/phy_extern_nr_ue.h" #include "PHY/MODULATION/modulation_UE.h" #include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h" @@ -120,9 +121,8 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1, uint16_t n_pdus, - UE_nr_rxtx_proc_t *proc, - void * typeSpecific){ - + UE_nr_rxtx_proc_t *proc, + void *typeSpecific){ NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; @@ -134,7 +134,6 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, trace_NRpdu(DIRECTION_DOWNLINK, dlsch0->harq_processes[dlsch0->current_harq_pid]->b, dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS / 8, - pdu_type, WS_C_RNTI, dlsch0->rnti, proc->frame_rx, @@ -176,6 +175,11 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.ssb_start_subcarrier = frame_parms->ssb_start_subcarrier; rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.rsrp_dBm = ue->measurements.rsrp_dBm[gNB_id]; break; + case FAPI_NR_CSIRS_IND: + memcpy(&rx_ind->rx_indication_body[n_pdus - 1].csirs_measurements, + (fapi_nr_csirs_measurements_t*)typeSpecific, + sizeof(*(fapi_nr_csirs_measurements_t*)typeSpecific)); + break; default: break; } @@ -284,7 +288,8 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN); - memset(ue->common_vars.txdataF[0], 0, sizeof(int)*14*ue->frame_parms.ofdm_symbol_size); + for(int i=0; i< ue->frame_parms.nb_antennas_tx; ++i) + memset(ue->common_vars.txdataF[i], 0, sizeof(int)*14*ue->frame_parms.ofdm_symbol_size); LOG_D(PHY,"****** start TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, slot_tx); @@ -611,6 +616,15 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int gNB_ } } + if (ue->chest_time == 1) { // averaging time domain channel estimates + nr_chest_time_domain_avg(&ue->frame_parms, + ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates, + dlsch0_harq->nb_symbols, + dlsch0_harq->start_symbol, + dlsch0_harq->dlDmrsSymbPos, + pdsch_nb_rb); + } + uint16_t first_symbol_with_data = s0; uint32_t dmrs_data_re; @@ -801,8 +815,7 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, nb_symb_sch, nr_slot_rx, harq_pid, - pdsch==PDSCH?1:0, - dlsch0->harq_processes[harq_pid]->TBS>256?1:0); + pdsch==PDSCH); LOG_T(PHY,"dlsch decoding, ret = %d\n", ret); @@ -878,8 +891,7 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, nb_symb_sch, nr_slot_rx, harq_pid, - pdsch==PDSCH?1:0,//proc->decoder_switch, - dlsch1->harq_processes[harq_pid]->TBS>256?1:0); + pdsch==PDSCH);//proc->decoder_switch LOG_T(PHY,"CW dlsch decoding, ret1 = %d\n", ret1); stop_meas(&ue->dlsch_decoding_stats[proc->thread_id]); @@ -918,21 +930,25 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, const double N_TA_max = Ta_max * bw_scaling * tc_factor; NR_UE_MAC_INST_t *mac = get_mac_inst(0); + NR_BWP_Id_t dl_bwp = mac->DL_BWP_Id; + NR_BWP_Id_t ul_bwp = mac->UL_BWP_Id; NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL; - if (mac->ULbwp[0] && - mac->ULbwp[0]->bwp_Dedicated && - mac->ULbwp[0]->bwp_Dedicated->pusch_Config && - mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup && - mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList) { - pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList->choice.setup; - } - else if (mac->ULbwp[0] && - mac->ULbwp[0]->bwp_Common && - mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon && - mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup && - mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) { - pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList; + if(ul_bwp){ + if (mac->ULbwp[ul_bwp-1] && + mac->ULbwp[ul_bwp-1]->bwp_Dedicated && + mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config && + mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config->choice.setup && + mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList) { + pusch_TimeDomainAllocationList = mac->ULbwp[ul_bwp-1]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList->choice.setup; + } + else if (mac->ULbwp[ul_bwp-1] && + mac->ULbwp[ul_bwp-1]->bwp_Common && + mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon && + mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon->choice.setup && + mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) { + pusch_TimeDomainAllocationList = mac->ULbwp[ul_bwp-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList; + } } else if (mac->scc_SIB && mac->scc_SIB->uplinkConfigCommon && @@ -943,12 +959,15 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, } long mapping_type_ul = pusch_TimeDomainAllocationList ? pusch_TimeDomainAllocationList->list.array[0]->mappingType : NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeA; - NR_PDSCH_Config_t *pdsch_Config = (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup) ? mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup : NULL; + NR_PDSCH_Config_t *pdsch_Config = NULL; NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = NULL; - if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList) - pdsch_TimeDomainAllocationList = pdsch_Config->pdsch_TimeDomainAllocationList->choice.setup; - else if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList) - pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; + if(dl_bwp){ + pdsch_Config = (mac->DLbwp[dl_bwp-1] && mac->DLbwp[dl_bwp-1]->bwp_Dedicated->pdsch_Config->choice.setup) ? mac->DLbwp[dl_bwp-1]->bwp_Dedicated->pdsch_Config->choice.setup : NULL; + if (mac->DLbwp[dl_bwp-1] && mac->DLbwp[dl_bwp-1]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList) + pdsch_TimeDomainAllocationList = pdsch_Config->pdsch_TimeDomainAllocationList->choice.setup; + else if (mac->DLbwp[dl_bwp-1] && mac->DLbwp[dl_bwp-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList) + pdsch_TimeDomainAllocationList = mac->DLbwp[dl_bwp-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; + } else if (mac->scc_SIB && mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup) pdsch_TimeDomainAllocationList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; long mapping_type_dl = pdsch_TimeDomainAllocationList ? pdsch_TimeDomainAllocationList->list.array[0]->mappingType : NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA; @@ -1002,7 +1021,7 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, d_2_1 = 1; /* d_2_2 */ - const double d_2_2 = 0.0; // set to 0 because there is only 1 BWP: TODO this should corresponds to the switching time as defined in TS 38.133 + const double d_2_2 = pusch_d_2_2_timing_capability_1[numerology][1]; /* N_t_1 time duration in msec of N_1 symbols corresponding to a PDSCH reception time // N_t_2 time duration in msec of N_2 symbols corresponding to a PUSCH preparation time */ @@ -1306,8 +1325,7 @@ int is_ssb_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_ //uint8_t half_frame_index = fp->half_frame_bit; //uint8_t i_ssb = fp->ssb_index; uint8_t Lmax = fp->Lmax; - - if (!(frame%(1<<(config->ssb_table.ssb_period-1)))){ + if ((config->ssb_table.ssb_period > 0) && !(frame % (1 << (config->ssb_table.ssb_period - 1)))) { if(Lmax <= 8) { if(slot <=3 && (((config->ssb_table.ssb_mask_list[0].ssb_mask << 2*slot)&0x80000000) == 0x80000000 || ((config->ssb_table.ssb_mask_list[0].ssb_mask << (2*slot +1))&0x80000000) == 0x80000000)) @@ -1484,7 +1502,17 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, if ((frame_rx%64 == 0) && (nr_slot_rx==0)) { LOG_I(NR_PHY,"============================================\n"); - LOG_I(NR_PHY,"Harq round stats for Downlink: %d/%d/%d/%d DLSCH errors: %d\n",ue->dl_stats[0],ue->dl_stats[1],ue->dl_stats[2],ue->dl_stats[3],ue->dl_stats[4]); + // fixed text + 8 HARQs rounds à 10 ("999999999/") + NULL + // if we use 999999999 HARQs, that should be sufficient for at least 138 hours + const size_t harq_output_len = 31 + 10 * 8 + 1; + char output[harq_output_len]; + char *p = output; + const char *end = output + harq_output_len; + p += snprintf(p, end - p, "Harq round stats for Downlink: %d", ue->dl_stats[0]); + for (int round = 1; round < 16 && (round < 3 || ue->dl_stats[round] != 0); ++round) + p += snprintf(p, end - p,"/%d", ue->dl_stats[round]); + LOG_I(NR_PHY,"%s/0\n", output); + LOG_I(NR_PHY,"============================================\n"); } @@ -1697,6 +1725,36 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, } + // do procedures for CSI-IM + if ((ue->csiim_vars[gNB_id]) && (ue->csiim_vars[gNB_id]->active == 1)) { + int l_csiim[4] = {-1, -1, -1, -1}; + for(int symb_idx = 0; symb_idx < 4; symb_idx++) { + bool nr_slot_fep_done = false; + for (int symb_idx2 = 0; symb_idx2 < symb_idx; symb_idx2++) { + if (l_csiim[symb_idx2] == ue->csiim_vars[gNB_id]->csiim_config_pdu.l_csiim[symb_idx]) { + nr_slot_fep_done = true; + } + } + l_csiim[symb_idx] = ue->csiim_vars[gNB_id]->csiim_config_pdu.l_csiim[symb_idx]; + if(nr_slot_fep_done == false) { + nr_slot_fep(ue, proc, ue->csiim_vars[gNB_id]->csiim_config_pdu.l_csiim[symb_idx], nr_slot_rx); + } + } + nr_ue_csi_im_procedures(ue, proc, gNB_id); + ue->csiim_vars[gNB_id]->active = 0; + } + + // do procedures for CSI-RS + if ((ue->csirs_vars[gNB_id]) && (ue->csirs_vars[gNB_id]->active == 1)) { + for(int symb = 0; symb < NR_SYMBOLS_PER_SLOT; symb++) { + if(is_csi_rs_in_symbol(ue->csirs_vars[gNB_id]->csirs_config_pdu,symb)) { + nr_slot_fep(ue, proc, symb, nr_slot_rx); + } + } + nr_ue_csi_rs_procedures(ue, proc, gNB_id); + ue->csirs_vars[gNB_id]->active = 0; + } + start_meas(&ue->generic_stat); if (nr_slot_rx==9) { diff --git a/openair1/SCHED_NR_UE/phy_sch_processing_time.h b/openair1/SCHED_NR_UE/phy_sch_processing_time.h index 1962df22eed..81cc4496a26 100644 --- a/openair1/SCHED_NR_UE/phy_sch_processing_time.h +++ b/openair1/SCHED_NR_UE/phy_sch_processing_time.h @@ -106,4 +106,36 @@ float pusch_N_2_timing_capability_2[3][2] = { { 0, 5 }, { 1, 5.5 }, { 2, 11 }, -}; \ No newline at end of file +}; + +/* TS 38.133 Table 8.6.2-1: BWP switch delay capability 1 +// corresponding to the PUSCH preparation time d_2_2 [slots] +// where mu corresponds to the one of {mu_DL, mu_UL} +// resulting with the largest T_proc_2 +// where mu_DL is the SCS with which the PDCCH +// carrying the DCI scheduling the PUSCH was transmitted +// mu_UL is the SCS of the UL channel with which PUSCH to be transmitted +*/ +float pusch_d_2_2_timing_capability_1[4][2] = { +/* mu d_2_2 */ +{ 0, 1 }, +{ 1, 2 }, +{ 2, 3 }, +{ 3, 6 }, +}; + +/* TS 38.133 Table 8.6.2-1: BWP switch delay capability 2 +// corresponding to the PUSCH preparation time d_2_2 [slots] +// where mu corresponds to the one of {mu_DL, mu_UL} +// resulting with the largest T_proc_2 +// where mu_DL is the SCS with which the PDCCH +// carrying the DCI scheduling the PUSCH was transmitted +// mu_UL is the SCS of the UL channel with which PUSCH to be transmitted +*/ +float pusch_d_2_2_timing_capability_2[4][2] = { +/* mu d_2_2 */ +{ 0, 3 }, +{ 1, 5 }, +{ 2, 9 }, +{ 3, 18 }, +}; diff --git a/openair1/SCHED_UE/phy_procedures_lte_ue.c b/openair1/SCHED_UE/phy_procedures_lte_ue.c index aa0ff0db80f..cdf4cf39f9a 100644 --- a/openair1/SCHED_UE/phy_procedures_lte_ue.c +++ b/openair1/SCHED_UE/phy_procedures_lte_ue.c @@ -460,7 +460,7 @@ void ue_compute_srs_occasion(PHY_VARS_UE *ue, is_pucch2_subframe = (is_ri_TXOp(ue,proc,eNB_id) && (ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex>0)) || is_pucch2_subframe; // check ACK/SR transmission - if(frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission == FALSE) { + if(frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission == false) { if(is_SR_TXOp(ue,proc,eNB_id)) { uint32_t SR_payload = 0; diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 231d63cf047..8aff47c86b8 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -512,12 +512,16 @@ int main(int argc, char **argv) { int re; int s,Kr,Kr_bytes; LTE_DL_FRAME_PARMS *frame_parms; - double s_re0[30720*2],s_im0[30720*2],r_re0[30720*2],r_im0[30720*2]; - double s_re1[30720*2],s_im1[30720*2],r_re1[30720*2],r_im1[30720*2]; - double *s_re[2]= {s_re0,s_re1}; - double *s_im[2]= {s_im0,s_im1}; - double *r_re[2]= {r_re0,r_re1}; - double *r_im[2]= {r_im0,r_im1}; + double *tmpTX[4], *tmpRX[4] ; + for (int i = 0; i < 4; i++) { + tmpTX[i] = malloc(30720 * NB_ANTENNAS_TX * sizeof(*tmpTX)); + tmpRX[i] = malloc(30720 * NB_ANTENNAS_RX * sizeof(*tmpRX)); + } + double *s_re[NB_ANTENNAS_TX] = {tmpTX[0], tmpTX[1]}; + double *s_im[NB_ANTENNAS_TX] = {tmpTX[2], tmpTX[3]}; + double *r_re[NB_ANTENNAS_RX] = {tmpRX[0], tmpRX[1]}; + double *r_im[NB_ANTENNAS_RX] = {tmpRX[2], tmpRX[3]}; + uint8_t transmission_mode=1,n_tx_port=1,n_tx_phy=1,n_rx=2; int eNB_id = 0; unsigned char round; diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 7efe9f4530e..5aad30405bf 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -1338,20 +1338,16 @@ int main(int argc, char **argv) { break; } - for (k=0; k<NUMBER_OF_UE_MAX; k++) { - // Create transport channel structures for 2 transport blocks (MIMO) - for (i=0; i<2; i++) { - eNB->dlsch[k][i] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0,&eNB->frame_parms); - - if (!eNB->dlsch[k][i]) { - printf("Can't get eNB dlsch structures\n"); - exit(-1); - } + // Create transport channel structures for 1 transport block + eNB->dlsch[0][0] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0,&eNB->frame_parms); - eNB->dlsch[k][i]->rnti = n_rnti+k; - } + if (!eNB->dlsch[0][0]) { + printf("Can't get eNB dlsch structures\n"); + exit(-1); } + eNB->dlsch[0][0]->rnti = n_rnti+k; + #ifdef ENABLE_MBMS_SIM eNB->dlsch_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL, 0, &eNB->frame_parms); #endif diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index a1894d03d73..0f98eb337a6 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -358,7 +358,7 @@ int main(int argc, char **argv) { unsigned short input_buffer_length; unsigned int ret; unsigned int coded_bits_per_codeword,nsymb; - unsigned int tx_lev=0,tx_lev_dB,trials,errs[5]= {0,0,0,0,0},round_trials[4]= {0,0,0,0}; + unsigned int tx_lev = 0, tx_lev_dB = 0, trials, errs[6] = {0}, round_trials[4] = {0}; FILE *bler_fd=NULL; char bler_fname[512]; FILE *time_meas_fd=NULL; @@ -387,7 +387,6 @@ int main(int argc, char **argv) { double cpu_freq_GHz; int iter_trials; uint32_t UL_alloc_pdu; - int s,Kr,Kr_bytes; int dump_perf=0; static int dump_table =0; double effective_rate=0.0; @@ -1233,20 +1232,21 @@ int main(int argc, char **argv) { if (n_frames==1) { printf("ULSCH errors found o_ACK[0]= %d\n",eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0]); - +#ifdef DUMP_EACH_VALUE + int Kr_bytes; for (s=0; s<eNB->ulsch[0]->harq_processes[harq_pid]->C; s++) { if (s<eNB->ulsch[0]->harq_processes[harq_pid]->Cminus) - Kr = eNB->ulsch[0]->harq_processes[harq_pid]->Kminus; + Kr_bytes = eNB->ulsch[0]->harq_processes[harq_pid]->Kminus; else - Kr = eNB->ulsch[0]->harq_processes[harq_pid]->Kplus; - - Kr_bytes = Kr>>3; + Kr_bytes = eNB->ulsch[0]->harq_processes[harq_pid]->Kplus; + Kr_bytes = Kr_bytes >> 3; printf("Decoded_output (Segment %d):\n",s); for (i=0; i<Kr_bytes; i++) printf("%d : %x (%x)\n",i,eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i], eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i]^UE->ulsch[0]->harq_processes[harq_pid]->c[s][i]); } +#endif dump_ulsch(eNB,eNB->proc.frame_rx,subframe,0,round); round=5; diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index 6f747b36a63..39cd5407955 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -47,14 +47,18 @@ #include "openair1/SIMULATION/RF/rf.h" #include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h" #include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c" +#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h" + //#define DEBUG_NR_DLSCHSIM +THREAD_STRUCT thread_struct; PHY_VARS_gNB *gNB; PHY_VARS_NR_UE *UE; RAN_CONTEXT_t RC; UE_nr_rxtx_proc_t proc; int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; +uint64_t downlink_frequency[MAX_NUM_CCs][4]; double cpuf; //uint8_t nfapi_mode = 0; @@ -110,15 +114,16 @@ int main(int argc, char **argv) //int run_initial_sync=0; int loglvl = OAILOG_WARNING; uint8_t dlsch_threads = 0; - float target_error_rate = 0.01; - uint64_t SSB_positions=0x01; - uint16_t nb_symb_sch = 12; - uint16_t nb_rb = 50; - uint8_t Imcs = 9; - uint8_t mcs_table = 0; - double DS_TDL = .03; - cpuf = get_cpu_freq_GHz(); - char gNBthreads[128]="n"; + float target_error_rate = 0.01; + uint64_t SSB_positions=0x01; + uint16_t nb_symb_sch = 12; + uint16_t nb_rb = 50; + uint8_t Imcs = 9; + uint8_t mcs_table = 0; + double DS_TDL = .03; + cpuf = get_cpu_freq_GHz(); + char gNBthreads[128]="n"; + int Tbslbrm = 950984; if (load_configmodule(argc, argv, CONFIG_ENABLECMDLINEONLY) == 0) { exit_fun("[NR_DLSCHSIM] Error, configuration module init failed\n"); @@ -294,7 +299,7 @@ int main(int argc, char **argv) break; case 'X': - strncpy(gNBthreads, optarg, sizeof(gNBthreads)); + strncpy(gNBthreads, optarg, sizeof(gNBthreads)-1); gNBthreads[sizeof(gNBthreads)-1]=0; break; @@ -426,13 +431,10 @@ int main(int argc, char **argv) NR_gNB_DLSCH_t *dlsch = msgDataTx.dlsch[0][0]; nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &dlsch->harq_process.pdsch_pdu.pdsch_pdu_rel15; //time_stats_t *rm_stats, *te_stats, *i_stats; - uint8_t is_crnti = 0, llr8_flag = 0; + uint8_t is_crnti = 0; unsigned int TBS = 8424; - unsigned int available_bits; uint8_t nb_re_dmrs = 6; // No data in dmrs symbol uint16_t length_dmrs = 1; - unsigned char mod_order; - uint16_t rate; uint8_t Nl = 1; uint8_t rvidx = 0; dlsch->rnti = 1; @@ -440,9 +442,9 @@ int main(int argc, char **argv) dlsch->harq_processes[0]->rvidx = rvidx;*/ //printf("dlschsim harqid %d nb_rb %d, mscs %d\n",dlsch->harq_ids[subframe], // dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->mcs,dlsch->harq_processes[0]->Nl); - mod_order = nr_get_Qm_dl(Imcs, mcs_table); - rate = nr_get_code_rate_dl(Imcs, mcs_table); - available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1); + unsigned char mod_order = nr_get_Qm_dl(Imcs, mcs_table); + uint16_t rate = nr_get_code_rate_dl(Imcs, mcs_table); + unsigned int available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1); TBS = nr_compute_tbs(mod_order,rate, nb_rb, nb_symb_sch, nb_re_dmrs*length_dmrs, 0, 0, Nl); printf("available bits %u TBS %u mod_order %d\n", available_bits, TBS, mod_order); //dlsch->harq_ids[subframe]= 0; @@ -457,6 +459,7 @@ int main(int argc, char **argv) rel15->dlDmrsSymbPos = 4; rel15->mcsIndex[0] = Imcs; rel15->numDmrsCdmGrpsNoData = 1; + rel15->maintenance_parms_v3.tbSizeLbrmBytes = Tbslbrm; double modulated_input[16 * 68 * 384]; // [hna] 16 segments, 68*Zc short channel_output_fixed[16 * 68 * 384]; //unsigned char *estimated_output; @@ -473,9 +476,11 @@ int main(int argc, char **argv) harq_process->Qm = mod_order; harq_process->rvidx = rvidx; harq_process->R = rate; + harq_process->TBS = TBS; harq_process->dmrsConfigType = NFAPI_NR_DMRS_TYPE1; harq_process->dlDmrsSymbPos = 4; harq_process->n_dmrs_cdm_groups = 1; + harq_process->tbslbrm = Tbslbrm; printf("harq process ue mcs = %d Qm = %d, symb %d\n", harq_process->mcs, harq_process->Qm, nb_symb_sch); unsigned char *test_input=dlsch->harq_process.pdu; @@ -492,8 +497,8 @@ int main(int argc, char **argv) //printf("crc32: [0]->0x%08x\n",crc24c(test_input, 32)); // generate signal - unsigned char output[rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS] __attribute__((aligned(32))); - bzero(output,rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS); + unsigned char output[rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS] __attribute__((aligned(32))); + bzero(output,rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS); if (input_fd == NULL) { nr_dlsch_encoding(gNB, frame, slot, &dlsch->harq_process, frame_parms,output,NULL,NULL,NULL,NULL,NULL,NULL,NULL); } @@ -545,7 +550,7 @@ int main(int argc, char **argv) ret = nr_dlsch_decoding(UE, &proc, 0, channel_output_fixed, &UE->frame_parms, dlsch0_ue, dlsch0_ue->harq_processes[0], frame, nb_symb_sch, - slot,harq_pid, is_crnti, llr8_flag); + slot,harq_pid, is_crnti); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0, VCD_FUNCTION_OUT); diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index eff65fa6069..57c6589ca4e 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -66,6 +66,7 @@ #include "NR_RRCReconfiguration.h" #define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0)) #include "SIMULATION/LTE_PHY/common_sim.h" +#include "PHY/NR_REFSIG/dmrs_nr.h" #include <openair2/LAYER2/MAC/mac_vars.h> #include <openair2/RRC/LTE/rrc_vars.h> @@ -96,13 +97,20 @@ uint16_t sl_ahead=0; uint64_t downlink_frequency[MAX_NUM_CCs][4]; THREAD_STRUCT thread_struct; nfapi_ue_release_request_body_t release_rntis; -uint32_t N_RB_DL = 106; //Fixme: Uniq dirty DU instance, by global var, datamodel need better management instance_t DUuniqInstance=0; instance_t CUuniqInstance=0; -teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer_id, int outgoing_bearer_id, teid_t outgoing_teid, - transport_layer_addr_t remoteAddr, int port, gtpCallback callBack) { -return 0; +teid_t newGtpuCreateTunnel(instance_t instance, + rnti_t rnti, + int incoming_bearer_id, + int outgoing_bearer_id, + teid_t outgoing_teid, + int qfi, + transport_layer_addr_t remoteAddr, + int port, + gtpCallback callBack, + gtpCallbackSDAP callBackSDAP) { + return 0; } int newGtpuDeleteAllTunnels(instance_t instance, rnti_t rnti) { @@ -210,11 +218,9 @@ int nr_derive_key(int alg_type, uint8_t alg_id, } void config_common(int Mod_idP, - int ssb_SubcarrierOffset, - rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts, + int pdsch_AntennaPorts, int pusch_AntennaPorts, - NR_ServingCellConfigCommon_t *scc - ); + NR_ServingCellConfigCommon_t *scc); int generate_dlsch_header(unsigned char *mac_header, unsigned char num_sdus, @@ -243,10 +249,10 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(module_id_t module_idP, return 0; } -nr_bler_struct nr_bler_data[NR_NUM_MCS]; - void processSlotTX(void *arg) {} +nr_bler_struct nr_bler_data[NR_NUM_MCS]; + //nFAPI P7 dummy functions to avoid linking errors int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0); } @@ -265,35 +271,50 @@ void update_ptrs_config(NR_CellGroupConfig_t *secondaryCellGroup, uint16_t *rbSi void update_dmrs_config(NR_CellGroupConfig_t *scg, int8_t* dmrs_arg); extern void fix_scd(NR_ServingCellConfig_t *scd);// forward declaration -/* specific dlsim DL preprocessor: uses rbStart/rbSize/mcs/nrOfLayers from command line of - dlsim, does not search for CCE/PUCCH occasion but simply sets to 0 */ +/* specific dlsim DL preprocessor: uses rbStart/rbSize/mcs/nrOfLayers from command line of dlsim */ int g_mcsIndex = -1, g_mcsTableIdx = 0, g_rbStart = -1, g_rbSize = -1, g_nrOfLayers = 1; void nr_dlsim_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t slot) { - NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info; - AssertFatal(UE_info->num_UEs == 1, "can have only a single UE\n"); - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[0]; + + NR_UE_info_t *UE_info = RC.nrmac[module_id]->UE_info.list[0]; + AssertFatal(RC.nrmac[module_id]->UE_info.list[1]==NULL, "can have only a single UE\n"); + NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl; NR_ServingCellConfigCommon_t *scc = RC.nrmac[0]->common_channels[0].ServingCellConfigCommon; - /* manually set free CCE to 0 */ const int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific; sched_ctrl->search_space = get_searchspace(NULL, scc, sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Dedicated : NULL, target_ss); - uint8_t nr_of_candidates; - find_aggregation_candidates(&sched_ctrl->aggregation_level, - &nr_of_candidates, - sched_ctrl->search_space,4); - sched_ctrl->coreset = get_coreset(module_id, scc, sched_ctrl->active_bwp->bwp_Dedicated, sched_ctrl->search_space, target_ss); - sched_ctrl->cce_index = 0; + uint8_t nr_of_candidates = 0; + if (g_mcsIndex < 4) { + find_aggregation_candidates(&sched_ctrl->aggregation_level, + &nr_of_candidates, + sched_ctrl->search_space,8); + } + if (nr_of_candidates == 0) { + find_aggregation_candidates(&sched_ctrl->aggregation_level, + &nr_of_candidates, + sched_ctrl->search_space,4); + } + sched_ctrl->coreset = get_coreset(RC.nrmac[module_id], scc, sched_ctrl->active_bwp->bwp_Dedicated, sched_ctrl->search_space, target_ss); + uint32_t Y = get_Y(sched_ctrl->search_space, slot, UE_info->rnti); + int CCEIndex = find_pdcch_candidate(RC.nrmac[module_id], + /* CC_id = */ 0, + sched_ctrl->aggregation_level, + nr_of_candidates, + &sched_ctrl->sched_pdcch, + sched_ctrl->coreset, + Y); + AssertFatal(CCEIndex>=0, "%4d.%2d could not find CCE for DL DCI UE %d/RNTI %04x\n", frame, slot, 0, UE_info->rnti); + sched_ctrl->cce_index = CCEIndex; NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static; nr_set_pdsch_semi_static(NULL, scc, - UE_info->CellGroup[0], + UE_info->CellGroup, sched_ctrl->active_bwp, NULL, - /* tda = */ 2, + /* tda = */ 0, g_nrOfLayers, sched_ctrl, ps); @@ -315,8 +336,7 @@ void nr_dlsim_preprocessor(module_id_t module_id, ps->N_PRB_DMRS * ps->N_DMRS_SLOT, 0 /* N_PRB_oh, 0 for initialBWP */, 0 /* tb_scaling */, - ps->nrOfLayers) - >> 3; + ps->nrOfLayers) >> 3; /* the simulator assumes the HARQ PID is equal to the slot number */ sched_pdsch->dl_harq_pid = slot; @@ -360,10 +380,13 @@ int main(int argc, char **argv) int i,aa;//,l; double sigma2, sigma2_dB=10, SNR, snr0=-2.0, snr1=2.0; uint8_t snr1set=0; - double roundStats[500] = {0}; - double blerStats[500] = {0}; - double berStats[500] = {0}; - double snrStats[500] = {0}; + uint32_t errors_scrambling[4][100] = {{0}}; + int n_errors[4][100] = {{0}}; + int round_trials[4][100] = {{0}}; + double roundStats[100] = {0}; + double blerStats[4][100] = {{0}}; + double berStats[4][100] = {{0}}; + double snrStats[100] = {0}; float effRate; //float psnr; float eff_tp_check = 0.7; @@ -381,7 +404,7 @@ int main(int argc, char **argv) //int freq_offset; // int subframe_offset; // char fname[40], vname[40]; - int trial, n_trials = 1, n_errors = 0, n_false_positive = 0; + int trial, n_trials = 1, n_false_positive = 0; //int n_errors2, n_alamouti; uint8_t n_tx=1,n_rx=1; uint8_t round; @@ -437,7 +460,8 @@ int main(int argc, char **argv) uint16_t rbSize = 106; uint8_t mcsIndex = 9; uint8_t dlsch_threads = 0; - int prb_inter = 0; + int chest_type[2] = {0}; + uint8_t max_ldpc_iterations = 5; if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0) { exit_fun("[NR_DLSIM] Error, configuration module init failed\n"); } @@ -448,7 +472,7 @@ int main(int argc, char **argv) FILE *scg_fd=NULL; - while ((c = getopt (argc, argv, "f:hA:pf:g:in:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:d:e:q:m:w:T:U:X:")) != -1) { + while ((c = getopt (argc, argv, "f:hA:pf:g:i:n:s:S:t:x:y:z:M:N:F:GR:dPI:L:Ea:b:d:e:m:w:T:U:q:X:Y")) != -1) { switch (c) { case 'f': scg_fd = fopen(optarg,"r"); @@ -505,7 +529,9 @@ int main(int argc, char **argv) break; case 'i': - prb_inter=1; + for(i=0; i < atoi(optarg); i++){ + chest_type[i] = atoi(argv[optind++]); + } break; case 'n': @@ -592,9 +618,7 @@ int main(int argc, char **argv) break; case 'I': - run_initial_sync=1; - //target_error_rate=0.1; - slot = 0; + max_ldpc_iterations = atoi(optarg); break; case 'L': @@ -652,15 +676,21 @@ int main(int argc, char **argv) dmrs_arg[i] = atoi(argv[optind++]); } break; - + case 'X': - strncpy(gNBthreads, optarg, sizeof(gNBthreads)); + strncpy(gNBthreads, optarg, sizeof(gNBthreads)-1); gNBthreads[sizeof(gNBthreads)-1]=0; break; - + + case 'Y': + run_initial_sync=1; + //target_error_rate=0.1; + slot = 0; + break; + default: case 'h': - printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", + printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", argv[0]); printf("-h This message\n"); printf("-L <log level, 0(errors), 1(warning), 2(analysis), 3(info), 4(debug), 5(trace)>\n"); @@ -669,11 +699,11 @@ int main(int argc, char **argv) printf("-n Number of frames to simulate\n"); printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n"); printf("-S Ending SNR, runs from SNR0 to SNR1\n"); - printf("-t Delay spread for multipath channel\n"); + //printf("-t Delay spread for multipath channel\n"); printf("-g [A,B,C,D,E,F,G,R] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models or R for MIMO model (ignores delay spread and Ricean factor)\n"); printf("-y Number of TX antennas used in gNB\n"); printf("-z Number of RX antennas used in UE\n"); - printf("-i Activate PRB based averaging for channel estimation. Frequncy domain interpolation by default.\n"); + printf("-i Change channel estimation technique. Arguments list: Frequency domain {0:Linear interpolation, 1:PRB based averaging}, Time domain {0:Estimates of last DMRS symbol, 1:Average of DMRS symbols}\n"); //printf("-j Relative strength of second intefering gNB (in dB) - cell_id mod 3 = 2\n"); printf("-R N_RB_DL\n"); printf("-O oversampling factor (1,2,4,8,16)\n"); @@ -690,12 +720,14 @@ int main(int argc, char **argv) printf("-e MSC index\n"); printf("-q MCS Table index\n"); printf("-t Acceptable effective throughput (in percentage)\n"); + printf("-I Maximum LDPC decoder iterations\n"); printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n"); printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:2} DMRS ConfType{1:2}, e.g. -U 3 0 2 1 \n"); printf("-P Print DLSCH performances\n"); printf("-w Write txdata to binary file (one frame)\n"); printf("-d number of dlsch threads, 0: no dlsch parallelization\n"); - printf("-X gNB thread pool configuration, n => no threads"); + printf("-X gNB thread pool configuration, n => no threads\n"); + printf("-Y Run initial sync in UE\n"); exit (-1); break; } @@ -709,6 +741,7 @@ int main(int argc, char **argv) get_softmodem_params()->phy_test = 1; get_softmodem_params()->do_ra = 0; + set_softmodem_optmask(SOFTMODEM_DLSIM_BIT); if (snr1set==0) snr1 = snr0+10; @@ -736,6 +769,8 @@ int main(int argc, char **argv) gNB_RRC_INST rrc; memset((void*)&rrc,0,sizeof(rrc)); + gNB_mac->dl_bler.harq_round_max = num_rounds; + /* // read in SCGroupConfig AssertFatal(scg_fd != NULL,"no reconfig.raw file\n"); @@ -831,16 +866,15 @@ int main(int argc, char **argv) gNB->if_inst->NR_PHY_config_req = nr_phy_config_request; // common configuration - rrc_mac_config_req_gNB(0,0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, NULL, 0, 0, NULL); + rrc_mac_config_req_gNB(0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, NULL, 0, 0, NULL); // UE dedicated configuration - rrc_mac_config_req_gNB(0,0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, NULL, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup); + rrc_mac_config_req_gNB(0, pdsch_AntennaPorts, n_tx, 0, 6, scc, NULL, NULL, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup); // reset preprocessor to the one of DLSIM after it has been set during // rrc_mac_config_req_gNB gNB_mac->pre_processor_dl = nr_dlsim_preprocessor; phy_init_nr_gNB(gNB,0,1); N_RB_DL = gNB->frame_parms.N_RB_DL; - NR_UE_info_t *UE_info = &RC.nrmac[0]->UE_info; - UE_info->num_UEs=1; + NR_UE_info_t *UE_info = RC.nrmac[0]->UE_info.list[0]; // stub to configure frame_parms // nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions); @@ -855,10 +889,14 @@ int main(int argc, char **argv) double fs,bw; - if (mu == 1 && N_RB_DL == 217) { + if (mu == 0 && N_RB_DL == 25) { + fs = 7.68e6; + bw = 5e6; + } + else if (mu == 1 && N_RB_DL == 217) { fs = 122.88e6; bw = 80e6; - } + } else if (mu == 1 && N_RB_DL == 245) { fs = 122.88e6; bw = 90e6; @@ -871,14 +909,18 @@ int main(int argc, char **argv) fs = 61.44e6; bw = 40e6; } - else if (mu == 1 && N_RB_DL == 133) { + else if (mu == 1 && N_RB_DL == 133) { fs = 61.44e6; bw = 50e6; } - else if (mu == 1 && N_RB_DL == 162) { + else if (mu == 1 && N_RB_DL == 162) { fs = 61.44e6; bw = 60e6; } + else if (mu == 1 && N_RB_DL == 24) { + fs = 15.36e6; + bw = 10e6; + } else if (mu == 3 && N_RB_DL == 66) { fs = 122.88e6; bw = 100e6; @@ -944,11 +986,10 @@ int main(int argc, char **argv) PHY_vars_UE_g[0][0] = UE; memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS)); UE->frame_parms.nb_antennas_rx = n_rx; + UE->max_ldpc_iterations = max_ldpc_iterations; if (run_initial_sync==1) UE->is_synchronized = 0; else {UE->is_synchronized = 1; UE->UE_mode[0]=PUSCH;} - - UE->perfect_ce = 0; if (init_nr_ue_signal(UE, 1) != 0) { @@ -978,8 +1019,8 @@ int main(int argc, char **argv) UE->if_inst->phy_config_request = nr_ue_phy_config_request; UE->if_inst->dl_indication = nr_ue_dl_indication; UE->if_inst->ul_indication = dummy_nr_ue_ul_indication; - UE->prb_interpolation = prb_inter; - + UE->chest_freq = chest_type[0]; + UE->chest_time = chest_type[1]; UE_mac->if_module = nr_ue_if_module_init(0); @@ -987,7 +1028,6 @@ int main(int argc, char **argv) unsigned char *estimated_output_bit; unsigned char *test_input_bit; unsigned int errors_bit = 0; - uint32_t errors_scrambling = 0; initTpool("N", &(nrUE_params.Tpool), false); @@ -1028,6 +1068,7 @@ int main(int argc, char **argv) nr_ue_phy_config_request(&UE_mac->phy_config); //NR_COMMON_channels_t *cc = RC.nrmac[0]->common_channels; snrRun = 0; + int n_errs = 0; gNB->threadPool = (tpool_t*)malloc(sizeof(tpool_t)); initTpool(gNBthreads, gNB->threadPool, true); @@ -1061,11 +1102,9 @@ int main(int argc, char **argv) clear_pdsch_stats(gNB); - n_errors = 0; effRate = 0; //n_errors2 = 0; //n_alamouti = 0; - errors_scrambling=0; n_false_positive = 0; if (n_trials== 1) num_rounds = 1; @@ -1097,16 +1136,12 @@ int main(int argc, char **argv) UE_harq_process->first_rx = 1; while ((round<num_rounds) && (UE_harq_process->ack==0)) { + round_trials[round][snrRun]++; clear_nr_nfapi_information(RC.nrmac[0], 0, frame, slot); + UE_info->UE_sched_ctrl.harq_processes[harq_pid].ndi = !(trial&1); + UE_info->UE_sched_ctrl.harq_processes[harq_pid].round = round; - UE_info->UE_sched_ctrl[0].harq_processes[harq_pid].ndi = !(trial&1); - - - UE_info->UE_sched_ctrl[0].harq_processes[harq_pid].round = round; - for (int i=0; i<MAX_NUM_CORESET; i++) - gNB_mac->pdcch_cand[i] = 0; - if (css_flag == 0) { nr_schedule_ue_spec(0, frame, slot); } else { @@ -1117,7 +1152,7 @@ int main(int argc, char **argv) Sched_INFO.frame = frame; Sched_INFO.slot = slot; Sched_INFO.DL_req = &gNB_mac->DL_req[0]; - Sched_INFO.UL_tti_req = gNB_mac->UL_tti_req_ahead[slot]; + Sched_INFO.UL_tti_req = gNB_mac->UL_tti_req_ahead[0]; Sched_INFO.UL_dci_req = NULL; Sched_INFO.TX_req = &gNB_mac->TX_req[0]; pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx); @@ -1269,49 +1304,45 @@ int main(int argc, char **argv) &phy_pdcch_config, NULL); - //printf("dlsim round %d ends\n",round); - round++; - } // round + //---------------------------------------------------------- + //---------------------- count errors ---------------------- + //---------------------------------------------------------- - //---------------------------------------------------------- - //---------------------- count errors ---------------------- - //---------------------------------------------------------- + if (UE->dlsch[UE_proc.thread_id][0][0]->last_iteration_cnt >= + UE->dlsch[UE_proc.thread_id][0][0]->max_ldpc_iterations+1) + n_errors[round][snrRun]++; - if (UE->dlsch[UE_proc.thread_id][0][0]->last_iteration_cnt >= - UE->dlsch[UE_proc.thread_id][0][0]->max_ldpc_iterations+1) - n_errors++; + NR_UE_PDSCH **pdsch_vars = UE->pdsch_vars[UE_proc.thread_id]; + int16_t *UE_llr = pdsch_vars[0]->llr[0]; - //NR_UE_PDSCH **pdsch_vars = UE->pdsch_vars[UE_proc.thread_id]; - //int16_t *UE_llr = pdsch_vars[0]->llr[0]; + TBS = UE_harq_process->TBS;//rel15->TBSize[0]; + uint16_t length_dmrs = get_num_dmrs(rel15->dlDmrsSymbPos); + uint16_t nb_rb = rel15->rbSize; + uint8_t nb_re_dmrs = rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6*UE_harq_process->n_dmrs_cdm_groups : 4*UE_harq_process->n_dmrs_cdm_groups; + uint8_t mod_order = rel15->qamModOrder[0]; + uint8_t nb_symb_sch = rel15->NrOfSymbols; - TBS = UE_harq_process->TBS;//rel15->TBSize[0]; - uint16_t length_dmrs = get_num_dmrs(rel15->dlDmrsSymbPos); - uint16_t nb_rb = rel15->rbSize; - uint8_t nb_re_dmrs = rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6*UE_harq_process->n_dmrs_cdm_groups : 4*UE_harq_process->n_dmrs_cdm_groups; - uint8_t mod_order = rel15->qamModOrder[0]; - uint8_t nb_symb_sch = rel15->NrOfSymbols; + available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, rel15->nrOfLayers); + if(pdu_bit_map & 0x1) { + available_bits-= (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2); + printf("[DLSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5u \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2) ); + } - available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, rel15->nrOfLayers); - if(pdu_bit_map & 0x1) { - available_bits-= (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2); - LOG_D(PHY,"[DLSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5u \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2) ); - } + for (i = 0; i < available_bits; i++) { + if(((gNB_dlsch->harq_process.f[i] == 0) && (UE_llr[i] <= 0)) || + ((gNB_dlsch->harq_process.f[i] == 1) && (UE_llr[i] >= 0))) + { + if(errors_scrambling[round][snrRun] == 0) { + LOG_D(PHY,"First bit in error in unscrambling = %d\n",i); + } + errors_scrambling[round][snrRun]++; + } + } - /* - for (i = 0; i < available_bits; i++) { - - if(((gNB_dlsch->harq_process.f[i] == 0) && (UE_llr[i] <= 0)) || - ((gNB_dlsch->harq_process.f[i] == 1) && (UE_llr[i] >= 0))) - { - if(errors_scrambling == 0) { - LOG_D(PHY,"\n"); - LOG_D(PHY,"First bit in error in unscrambling = %d\n",i); - } - errors_scrambling++; - } + //printf("dlsim round %d ends\n",round); + round++; + } // round - } - */ for (i = 0; i < TBS; i++) { estimated_output_bit[i] = (UE_harq_process->b[i/8] & (1 << (i & 7))) >> (i & 7); @@ -1319,19 +1350,14 @@ int main(int argc, char **argv) if (estimated_output_bit[i] != test_input_bit[i]) { if(errors_bit == 0) - LOG_D(PHY,"First bit in error in decoding = %d (errors scrambling %d)\n",i,errors_scrambling); + LOG_D(PHY,"First bit in error in decoding = %d\n",i); errors_bit++; } } //////////////////////////////////////////////////////////// - - if (errors_scrambling > 0) { - if (n_trials == 1) - printf("errors_scrambling = %u/%u (trial %d)\n", errors_scrambling, available_bits,trial); - } - + if (errors_bit > 0) { n_false_positive++; if (n_trials == 1) @@ -1341,18 +1367,48 @@ int main(int argc, char **argv) if (UE_harq_process->ack==1) effRate += ((float)TBS)/round; } // noise trials - blerStats[snrRun] = (float) n_errors / (float) n_trials; roundStats[snrRun]/=((float)n_trials); - berStats[snrRun] = (double)errors_scrambling/available_bits/n_trials; + + blerStats[0][snrRun] = (double)n_errors[0][snrRun]/round_trials[0][snrRun]; + blerStats[1][snrRun] = (double)n_errors[1][snrRun]/round_trials[1][snrRun]; + blerStats[2][snrRun] = (double)n_errors[2][snrRun]/round_trials[2][snrRun]; + blerStats[3][snrRun] = (double)n_errors[3][snrRun]/round_trials[3][snrRun]; + + berStats[0][snrRun] = (double)errors_scrambling[0][snrRun]/available_bits/round_trials[0][snrRun]; + berStats[1][snrRun] = (double)errors_scrambling[1][snrRun]/available_bits/round_trials[1][snrRun]; + berStats[2][snrRun] = (double)errors_scrambling[2][snrRun]/available_bits/round_trials[2][snrRun]; + berStats[3][snrRun] = (double)errors_scrambling[3][snrRun]/available_bits/round_trials[3][snrRun]; + effRate /= n_trials; printf("*****************************************\n"); - printf("SNR %f, (false positive %f)\n", SNR, - (float) n_errors / (float) n_trials); - printf("*****************************************\n"); + printf("SNR %f: n_errors (%d/%d,%d/%d,%d/%d,%d/%d) (negative CRC), false_positive %d/%d, errors_scrambling (%u/%u,%u/%u,%u/%u,%u/%u\n", + SNR, + n_errors[0][snrRun], round_trials[0][snrRun], + n_errors[1][snrRun], round_trials[1][snrRun], + n_errors[2][snrRun], round_trials[2][snrRun], + n_errors[3][snrRun], round_trials[3][snrRun], + n_false_positive, n_trials, + errors_scrambling[0][snrRun], available_bits*round_trials[0][snrRun], + errors_scrambling[1][snrRun], available_bits*round_trials[1][snrRun], + errors_scrambling[2][snrRun], available_bits*round_trials[2][snrRun], + errors_scrambling[3][snrRun], available_bits*round_trials[3][snrRun]); printf("\n"); dump_pdsch_stats(stdout,gNB); - printf("SNR %f : n_errors (negative CRC) = %d/%d, Avg round %.2f, Channel BER %e, BLER %.2f, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %u bits/slot\n", - SNR, n_errors, n_trials,roundStats[snrRun],berStats[snrRun],blerStats[snrRun],effRate,effRate/TBS*100,TBS); + printf("SNR %f: Channel BLER (%e,%e,%e,%e), Channel BER (%e,%e,%e,%e) Avg round %.2f, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %u bits/slot\n", + SNR, + blerStats[0][snrRun], + blerStats[1][snrRun], + blerStats[2][snrRun], + blerStats[3][snrRun], + berStats[0][snrRun], + berStats[1][snrRun], + berStats[2][snrRun], + berStats[3][snrRun], + roundStats[snrRun], + effRate, + effRate/TBS*100, + TBS); + printf("*****************************************\n"); printf("\n"); if (print_perf==1) { @@ -1412,6 +1468,7 @@ int main(int argc, char **argv) LOG_M("rxsig0.m","rxs0", UE->common_vars.rxdata[0], frame_length_complex_samples, 1, 1); if (UE->frame_parms.nb_antennas_rx>1) LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1], frame_length_complex_samples, 1, 1); + LOG_M("rxF0.m","rxF0", UE->common_vars.common_vars_rx_data_per_thread[UE_proc.thread_id].rxdataF[0], frame_parms->samples_per_slot_wCP, 1, 1); LOG_M("chestF0.m","chF0",&UE->pdsch_vars[0][0]->dl_ch_estimates_ext[0][0],g_rbSize*12*14,1,1); write_output("rxF_comp.m","rxFc",&UE->pdsch_vars[0][0]->rxdataF_comp0[0][0],N_RB_DL*12*14,1,1); LOG_M("rxF_llr.m","rxFllr",UE->pdsch_vars[UE_proc.thread_id][0]->llr[0],available_bits,1,0); @@ -1425,6 +1482,7 @@ int main(int argc, char **argv) snrStats[snrRun] = SNR; snrRun++; + n_errs = n_errors[0][snrRun]; } // NSR LOG_M("dlsimStats.m","SNR",snrStats,snrRun,1,7); @@ -1468,8 +1526,8 @@ int main(int argc, char **argv) if (scg_fd) fclose(scg_fd); - return(n_errors); - + + return n_errs; } diff --git a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c index 2d1fc597557..75e3d998ff9 100644 --- a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c +++ b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c @@ -21,6 +21,8 @@ nfapi_mode_t nfapi_mod; nfapi_mode_t nfapi_getmode(void) { return nfapi_mod; } +void nfapi_setmode(nfapi_mode_t nfapi_mode) {} + int dummy_nr_ue_dl_indication(nr_downlink_indication_t *dl_info) { return(0); } int dummy_nr_ue_ul_indication(nr_uplink_indication_t *ul_info) { return(0); } void nr_fill_dl_indication(nr_downlink_indication_t *dl_ind, @@ -38,4 +40,4 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, NR_UE_DLSCH_t *dlsch1, uint16_t n_pdus, UE_nr_rxtx_proc_t *proc, - void * typeSpecific ) {} + void *typeSpecific ) {} diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 41ed64ae5f0..2670b789171 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -67,7 +67,10 @@ openair0_config_t openair0_cfg[MAX_CARDS]; uint8_t const nr_rv_round_map[4] = {0, 2, 3, 1}; uint64_t get_softmodem_optmask(void) {return 0;} -softmodem_params_t *get_softmodem_params(void) {return 0;} +static softmodem_params_t softmodem_params; +softmodem_params_t *get_softmodem_params(void) { + return &softmodem_params; +} void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {} @@ -172,8 +175,10 @@ int main(int argc, char **argv) uint8_t transmission_mode = 1,n_tx=1,n_rx=1; uint16_t Nid_cell=0; uint64_t SSB_positions=0x01; + int ssb_subcarrier_offset = 0; channel_desc_t *gNB2UE; + get_softmodem_params()->sa = 1; //uint8_t extended_prefix_flag=0; //int8_t interf1=-21,interf2=-21; @@ -215,7 +220,7 @@ int main(int argc, char **argv) exit_fun("[NR_PBCHSIM] Error, configuration module init failed\n"); } - while ((c = getopt (argc, argv, "F:g:hIL:m:M:n:N:o:P:r:R:s:S:x:y:z:")) != -1) { + while ((c = getopt (argc, argv, "F:g:hIL:m:M:n:N:o:O:P:r:R:s:S:x:y:z:")) != -1) { switch (c) { /*case 'f': write_output_file=1; @@ -328,6 +333,10 @@ int main(int argc, char **argv) Nid_cell = atoi(optarg); break; + case 'O': + ssb_subcarrier_offset = atoi(optarg); + break; + case 'o': cfo = atof(optarg); #ifdef DEBUG_NR_PBCHSIM @@ -430,6 +439,7 @@ int main(int argc, char **argv) printf("-n Number of frames to simulate\n"); printf("-N Nid_cell\n"); printf("-o Carrier frequency offset in Hz\n"); + printf("-O SSB subcarrier offset\n"); //printf("-O oversampling factor (1,2,4,8,16)\n"); //printf("-p Use extended prefix mode\n"); printf("-P PBCH phase, allowed values 0-3\n"); @@ -470,10 +480,11 @@ int main(int argc, char **argv) frame_parms->Nid_cell = Nid_cell; frame_parms->nushift = Nid_cell%4; frame_parms->ssb_type = nr_ssb_type_C; + frame_parms->freq_range = mu<2 ? nr_FR1 : nr_FR2; nr_phy_config_request_sim_pbchsim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions); phy_init_nr_gNB(gNB,0,1); - nr_set_ssb_first_subcarrier(&gNB->gNB_config,frame_parms); + frame_parms->ssb_start_subcarrier = 12 * gNB->gNB_config.ssb_table.ssb_offset_point_a.value + ssb_subcarrier_offset; uint8_t n_hf = 0; int cyclic_prefix_type = NFAPI_CP_NORMAL; @@ -575,8 +586,6 @@ int main(int argc, char **argv) if (run_initial_sync==1) UE->is_synchronized = 0; else UE->is_synchronized = 1; - UE->perfect_ce = 0; - if(eps!=0.0) UE->UE_fo_compensation = 1; // if a frequency offset is set then perform fo estimation and compensation @@ -594,8 +603,12 @@ int main(int argc, char **argv) for (i=0; i<frame_parms->Lmax; i++) { if((SSB_positions >> i) & 0x01) { + const int sc_offset = frame_parms->freq_range == nr_FR1 ? ssb_subcarrier_offset<<mu : ssb_subcarrier_offset; + const int prb_offset = frame_parms->freq_range == nr_FR1 ? gNB->gNB_config.ssb_table.ssb_offset_point_a.value<<mu : gNB->gNB_config.ssb_table.ssb_offset_point_a.value << (mu - 2); msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.bchPayload = 0x55dd33; msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.SsbBlockIndex = i; + msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset = sc_offset; + msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA = prb_offset; start_symbol = nr_get_ssb_start_symbol(frame_parms,i); int slot = start_symbol/14; @@ -762,8 +775,8 @@ int main(int argc, char **argv) if (ret<0) n_errors++; } else { - UE_nr_rxtx_proc_t proc={0}; - NR_UE_PDCCH_CONFIG phy_pdcch_config={0}; + UE_nr_rxtx_proc_t proc={0}; + NR_UE_PDCCH_CONFIG phy_pdcch_config={0}; UE->rx_offset=0; uint8_t ssb_index = 0; diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c index 325cbb1eccf..76776ce1101 100644 --- a/openair1/SIMULATION/NR_PHY/prachsim.c +++ b/openair1/SIMULATION/NR_PHY/prachsim.c @@ -92,9 +92,17 @@ int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind) { return(0); //Fixme: Uniq dirty DU instance, by global var, datamodel need better management instance_t DUuniqInstance=0; instance_t CUuniqInstance=0; -teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer_id, int outgoing_bearer_id, teid_t outgoing_teid, - transport_layer_addr_t remoteAddr, int port, gtpCallback callBack) { -return 0; +teid_t newGtpuCreateTunnel(instance_t instance, + rnti_t rnti, + int incoming_bearer_id, + int outgoing_bearer_id, + teid_t outgoing_teid, + int qfi, + transport_layer_addr_t remoteAddr, + int port, + gtpCallback callBack, + gtpCallbackSDAP callBackSDAP) { + return 0; } int newGtpuDeleteAllTunnels(instance_t instance, rnti_t rnti) { @@ -240,7 +248,7 @@ int main(int argc, char **argv){ int i, l, aa, aarx, **txdata, trial, n_frames = 1, prach_start, rx_prach_start; //, ntrials=1; int N_RB_UL = 106, delay = 0, NCS_config = 13, rootSequenceIndex = 1, threequarter_fs = 0, mu = 1, fd_occasion = 0, loglvl = OAILOG_INFO, numRA = 0, prachStartSymbol = 0; uint8_t snr1set = 0, ue_speed1set = 0, transmission_mode = 1, n_tx = 1, n_rx = 1, awgn_flag = 0, msg1_frequencystart = 0, num_prach_fd_occasions = 1, prach_format=0; - uint8_t frame = 1, slot=19, slot_gNB=19, config_index = 98, prach_sequence_length = 1, restrictedSetConfig = 0, N_dur, N_t_slot, start_symbol; + uint8_t config_index = 98, prach_sequence_length = 1, restrictedSetConfig = 0, N_dur, N_t_slot, start_symbol; uint16_t Nid_cell = 0, preamble_tx = 0, preamble_delay, format, format0, format1; uint32_t tx_lev = 10000, prach_errors = 0; //,tx_lev_dB; uint64_t SSB_positions = 0x01; @@ -536,7 +544,7 @@ int main(int argc, char **argv){ frame_parms->N_RB_UL = N_RB_UL; frame_parms->threequarter_fs = threequarter_fs; frame_parms->frame_type = TDD; - frame_parms->freq_range = (mu==1 ? nr_FR1 : nr_FR2); + frame_parms->freq_range = (mu != 3 ? nr_FR1 : nr_FR2); frame_parms->numerology_index = mu; nr_phy_config_request_sim(gNB, N_RB_UL, N_RB_UL, mu, Nid_cell, SSB_positions); @@ -546,9 +554,11 @@ int main(int argc, char **argv){ frame_parms->numerology_index, frame_parms->N_RB_UL*(180e3)*(1 << frame_parms->numerology_index)); - uint8_t subframe = slot/frame_parms->slots_per_subframe; + uint8_t frame = 1; + uint8_t subframe = 9; + uint8_t slot = 10 * frame_parms->slots_per_subframe - 1; - if (config_index<67 && mu==1) { prach_sequence_length=0; slot = subframe*2; slot_gNB = 1+(subframe*2); } + if (config_index<67 && mu != 3) { prach_sequence_length=0; slot = subframe * frame_parms->slots_per_subframe; } uint16_t N_ZC = prach_sequence_length == 0 ? 839 : 139; printf("Config_index %d, prach_sequence_length %d\n",config_index,prach_sequence_length); @@ -569,9 +579,11 @@ int main(int argc, char **argv){ ru->gNB_list[0] = gNB; gNB->gNB_config.carrier_config.num_tx_ant.value = 1; gNB->gNB_config.carrier_config.num_rx_ant.value = 1; - if (mu==1) + if (mu == 0) + gNB->gNB_config.tdd_table.tdd_period.value = 7; + else if (mu == 1) gNB->gNB_config.tdd_table.tdd_period.value = 6; - else if (mu==3) + else if (mu == 3) gNB->gNB_config.tdd_table.tdd_period.value = 3; else { printf("unsupported numerology %d\n",mu); @@ -585,7 +597,7 @@ int main(int argc, char **argv){ int ret = get_nr_prach_info_from_index(config_index, (int)frame, - (int)slot_gNB, + (int)slot, absoluteFrequencyPointA, mu, frame_parms->frame_type, @@ -717,12 +729,7 @@ int main(int argc, char **argv){ bw = N_RB_UL*(180e3)*(1 << frame_parms->numerology_index); AssertFatal(bw<=122.88e6,"Illegal channel bandwidth %f (mu %d,N_RB_UL %d)\n", bw, frame_parms->numerology_index, N_RB_UL); - if (bw <= 30.72e6) - fs = 30.72e6; - else if (bw <= 61.44e6) - fs = 61.44e6; - else if (bw <= 122.88e6) - fs = 122.88e6; + fs = frame_parms->samples_per_subframe * 1e3; LOG_I(PHY,"Running with bandwidth %f Hz, fs %f samp/s, FRAME_LENGTH_COMPLEX_SAMPLES %d\n",bw,fs,FRAME_LENGTH_COMPLEX_SAMPLES); diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c index b6dc3d8f11e..80a638db73e 100644 --- a/openair1/SIMULATION/NR_PHY/pucchsim.c +++ b/openair1/SIMULATION/NR_PHY/pucchsim.c @@ -47,12 +47,13 @@ #include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h" #include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c" - +THREAD_STRUCT thread_struct; PHY_VARS_gNB *gNB; PHY_VARS_NR_UE *UE; RAN_CONTEXT_t RC; openair0_config_t openair0_cfg[MAX_CARDS]; int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; +uint64_t downlink_frequency[MAX_NUM_CCs][4]; double cpuf; //uint8_t nfapi_mode = 0; @@ -475,7 +476,6 @@ int main(int argc, char **argv) UE = calloc(1,sizeof(PHY_VARS_NR_UE)); memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS)); UE->frame_parms.nb_antennas_rx=1; - UE->perfect_ce = 0; if(eps!=0.0) UE->UE_fo_compensation = 1; // if a frequency offset is set then perform fo estimation and compensation @@ -640,6 +640,7 @@ int main(int argc, char **argv) pucch_pdu.initial_cyclic_shift = 0; pucch_pdu.start_symbol_index = startingSymbolIndex; pucch_pdu.prb_start = startingPRB; + pucch_pdu.prb_size = 1; pucch_pdu.bwp_start = 0; pucch_pdu.bwp_size = N_RB_DL; if (nrofSymbols>1) { diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c index f6227e17697..53924242857 100644 --- a/openair1/SIMULATION/NR_PHY/ulschsim.c +++ b/openair1/SIMULATION/NR_PHY/ulschsim.c @@ -47,13 +47,16 @@ #include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h" #include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c" #include "common/utils/threadPool/thread-pool.h" +#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h" //#define DEBUG_NR_ULSCHSIM +THREAD_STRUCT thread_struct; PHY_VARS_gNB *gNB; PHY_VARS_NR_UE *UE; RAN_CONTEXT_t RC; int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; +uint64_t downlink_frequency[MAX_NUM_CCs][4]; void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {} @@ -137,6 +140,8 @@ int main(int argc, char **argv) uint16_t nb_symb_sch = 12; uint16_t nb_rb = 50; uint8_t Imcs = 9; + uint8_t Nl = 1; + uint8_t max_ldpc_iterations = 5; double DS_TDL = .03; @@ -150,7 +155,7 @@ int main(int argc, char **argv) randominit(0); //while ((c = getopt(argc, argv, "df:hpg:i:j:n:l:m:r:s:S:y:z:M:N:F:R:P:")) != -1) { - while ((c = getopt(argc, argv, "hg:n:s:S:py:z:M:N:R:F:m:l:r:")) != -1) { + while ((c = getopt(argc, argv, "hg:n:s:S:py:z:M:N:R:F:m:l:r:W:")) != -1) { switch (c) { /*case 'f': write_output_file = 1; @@ -251,7 +256,7 @@ int main(int argc, char **argv) case 'y': n_tx = atoi(optarg); - if ((n_tx == 0) || (n_tx > 2)) { + if ((n_tx == 0) || (n_tx > 4)) { printf("Unsupported number of TX antennas %d. Exiting.\n", n_tx); exit(-1); } @@ -261,7 +266,7 @@ int main(int argc, char **argv) case 'z': n_rx = atoi(optarg); - if ((n_rx == 0) || (n_rx > 2)) { + if ((n_rx == 0) || (n_rx > 4)) { printf("Unsupported number of RX antennas %d. Exiting.\n", n_rx); exit(-1); } @@ -299,6 +304,10 @@ int main(int argc, char **argv) printf("Illegal PBCH phase (0-3) got %d\n", pbch_phase); break;*/ + case 'W': + Nl = atoi(optarg); + break; + case 'm': Imcs = atoi(optarg); #ifdef DEBUG_NR_ULSCHSIM @@ -335,13 +344,14 @@ int main(int argc, char **argv) printf("-z Number of RX antennas used in UE\n"); //printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n"); //printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n"); + printf("-W number of layer\n"); printf("-M Multiple SSB positions in burst\n"); printf("-N Nid_cell\n"); printf("-R N_RB_UL\n"); printf("-F Input filename (.txt format) for RX conformance testing\n"); - printf("-m\n"); - printf("-l\n"); - printf("-r\n"); + printf("-m MCS\n"); + printf("-l number of symbol\n"); + printf("-r number of RB\n"); //printf("-O oversampling factor (1,2,4,8,16)\n"); //printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n"); //printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n"); @@ -359,8 +369,8 @@ int main(int argc, char **argv) snr1 = snr0 + 10; gNB2UE = new_channel_desc_scm(n_tx, - n_rx, - channel_model, + n_rx, + channel_model, 61.44e6, //N_RB2sampling_rate(N_RB_DL), 40e6, //N_RB2channel_bandwidth(N_RB_DL), DS_TDL, @@ -383,15 +393,18 @@ int main(int argc, char **argv) initTpool(tp_param, gNB->threadPool, true); initNotifiedFIFO(gNB->respDecode); frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH) - frame_parms->nb_antennas_tx = n_tx; - frame_parms->nb_antennas_rx = n_rx; frame_parms->N_RB_DL = N_RB_DL; frame_parms->N_RB_UL = N_RB_UL; frame_parms->Ncp = extended_prefix_flag ? EXTENDED : NORMAL; + gNB->max_ldpc_iterations = max_ldpc_iterations; + crcTableInit(); memcpy(&gNB->frame_parms, frame_parms, sizeof(NR_DL_FRAME_PARMS)); + gNB->frame_parms.nb_antennas_tx = 1; + gNB->frame_parms.nb_antennas_rx = n_rx; + nr_phy_config_request_sim(gNB, N_RB_UL, N_RB_UL, mu, Nid_cell, SSB_positions); phy_init_nr_gNB(gNB, 0, 1); //lowmem @@ -400,6 +413,9 @@ int main(int argc, char **argv) UE = malloc(sizeof(PHY_VARS_NR_UE)); memcpy(&UE->frame_parms, frame_parms, sizeof(NR_DL_FRAME_PARMS)); + UE->frame_parms.nb_antennas_tx = n_tx; + UE->frame_parms.nb_antennas_rx = 1; + //phy_init_nr_top(frame_parms); if (init_nr_ue_signal(UE, 1) != 0) { printf("Error at UE NR initialisation.\n"); @@ -407,7 +423,7 @@ int main(int argc, char **argv) } for (sf = 0; sf < 2; sf++) { - UE->ulsch[sf][0] = new_nr_ue_ulsch(N_RB_UL, 8); + UE->ulsch[sf][0] = new_nr_ue_ulsch(N_RB_UL, 8, frame_parms); if (!UE->ulsch[sf][0]) { printf("Can't get ue ulsch structures.\n"); exit(-1); @@ -421,8 +437,7 @@ int main(int argc, char **argv) uint8_t length_dmrs = 1; uint8_t N_PRB_oh; uint16_t N_RE_prime,code_rate; - unsigned char mod_order; - uint8_t Nl = 1; + unsigned char mod_order; uint8_t rvidx = 0; uint8_t UE_id = 0; @@ -432,9 +447,12 @@ int main(int argc, char **argv) NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[0][0]; + if ((Nl==4)||(Nl==3)) + nb_re_dmrs = nb_re_dmrs*2; + mod_order = nr_get_Qm_ul(Imcs, 0); code_rate = nr_get_code_rate_ul(Imcs, 0); - available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1); + available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, Nl); TBS = nr_compute_tbs(mod_order,code_rate, nb_rb, nb_symb_sch, nb_re_dmrs*length_dmrs, 0, 0, Nl); printf("\nAvailable bits %u TBS %u mod_order %d\n", available_bits, TBS, mod_order); @@ -447,7 +465,7 @@ int main(int argc, char **argv) rel15_ul->pusch_data.rv_index = rvidx; rel15_ul->nrOfLayers = Nl; rel15_ul->target_code_rate = code_rate; - rel15_ul->pusch_data.tb_size = TBS/8; + rel15_ul->pusch_data.tb_size = TBS>>3; /////////////////////////////////////////////////// double modulated_input[16 * 68 * 384]; // [hna] 16 segments, 68*Zc @@ -474,7 +492,9 @@ int main(int argc, char **argv) harq_process_ul_ue->pusch_pdu.nr_of_symbols = nb_symb_sch; harq_process_ul_ue->num_of_mod_symbols = N_RE_prime*nb_rb*nb_codewords; harq_process_ul_ue->pusch_pdu.pusch_data.rv_index = rvidx; - harq_process_ul_ue->pusch_pdu.pusch_data.tb_size = TBS/8; + harq_process_ul_ue->pusch_pdu.pusch_data.tb_size = TBS>>3; + harq_process_ul_ue->pusch_pdu.target_code_rate = code_rate; + harq_process_ul_ue->pusch_pdu.qam_mod_order = mod_order; unsigned char *test_input = harq_process_ul_ue->a; /////////// @@ -610,7 +630,8 @@ int main(int argc, char **argv) } for (sf = 0; sf < 2; sf++) - free_nr_ue_ulsch(&UE->ulsch[sf][0], N_RB_UL); + free_nr_ue_ulsch(&UE->ulsch[sf][0], N_RB_UL, frame_parms); + term_nr_ue_signal(UE, 1); free(UE); diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index e70d08bdb3b..5df89283a80 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -91,14 +91,21 @@ double cpuf; uint64_t downlink_frequency[MAX_NUM_CCs][4]; THREAD_STRUCT thread_struct; nfapi_ue_release_request_body_t release_rntis; -uint32_t N_RB_DL = 106; //Fixme: Uniq dirty DU instance, by global var, datamodel need better management instance_t DUuniqInstance=0; instance_t CUuniqInstance=0; -teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer_id, int outgoing_bearer_id, teid_t outgoing_teid, - transport_layer_addr_t remoteAddr, int port, gtpCallback callBack) { -return 0; +teid_t newGtpuCreateTunnel(instance_t instance, + rnti_t rnti, + int incoming_bearer_id, + int outgoing_bearer_id, + teid_t outgoing_teid, + int qfi, + transport_layer_addr_t remoteAddr, + int port, + gtpCallback callBack, + gtpCallbackSDAP callBackSDAP) { + return 0; } int newGtpuDeleteAllTunnels(instance_t instance, rnti_t rnti) { @@ -303,10 +310,9 @@ int main(int argc, char **argv) int gNB_id = 0; int ap; int tx_offset; - int32_t txlev=0; + int32_t txlev_sum = 0, atxlev[4]; int start_rb = 0; int UE_id =0; // [hna] only works for UE_id = 0 because NUMBER_OF_NR_UE_MAX is set to 1 (phy_init_nr_gNB causes segmentation fault) - float target_error_rate = 0.01; int print_perf = 0; cpuf = get_cpu_freq_GHz(); int msg3_flag = 0; @@ -314,21 +320,20 @@ int main(int argc, char **argv) float roundStats[100]; double effRate[100]; double effTP[100]; - //float eff_tp_check = 0.7; + float eff_tp_check = 100; uint8_t snrRun; - int prb_inter = 0; + int chest_type[2] = {0}; int enable_ptrs = 0; int modify_dmrs = 0; /* L_PTRS = ptrs_arg[0], K_PTRS = ptrs_arg[1] */ int ptrs_arg[2] = {-1,-1};// Invalid values - /* DMRS TYPE = dmrs_arg[0], Add Pos = dmrs_arg[1] */ - int dmrs_arg[2] = {-1,-1};// Invalid values + int dmrs_arg[4] = {-1,-1,-1,-1};// Invalid values uint16_t ptrsSymPos = 0; uint16_t ptrsSymbPerSlot = 0; uint16_t ptrsRePerSymb = 0; - uint8_t transform_precoding = 1; // 0 - ENABLE, 1 - DISABLE + uint8_t transform_precoding = transformPrecoder_disabled; // 0 - ENABLE, 1 - DISABLE uint8_t num_dmrs_cdm_grps_no_data = 1; uint8_t mcs_table = 0; @@ -340,6 +345,8 @@ int main(int argc, char **argv) int ibwps=24; int ibwp_rboffset=41; int params_from_file = 0; + int threadCnt=0; + int max_ldpc_iterations = 5; if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0 ) { exit_fun("[NR_ULSIM] Error, configuration module init failed\n"); } @@ -350,7 +357,7 @@ int main(int argc, char **argv) /* initialize the sin-cos table */ InitSinLUT(); - while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:ikl:m:n:p:r:s:u:w:y:z:F:G:H:M:N:PR:S:T:U:L:Z")) != -1) { + while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:kl:m:n:p:q:r:s:t:u:w:y:z:C:F:G:H:I:M:N:PR:S:T:U:L:ZW:")) != -1) { printf("handling optarg %c\n",c); switch (c) { @@ -384,8 +391,8 @@ int main(int argc, char **argv) scg_fd = fopen(optarg, "r"); if (scg_fd == NULL) { - printf("Error opening %s\n", optarg); - exit(-1); + printf("Error opening %s\n", optarg); + exit(-1); } break; @@ -443,7 +450,9 @@ int main(int argc, char **argv) break; case 'i': - prb_inter=1; + for(i=0; i < atoi(optarg); i++){ + chest_type[i] = atoi(argv[optind++]); + } break; case 'k': @@ -458,7 +467,11 @@ int main(int argc, char **argv) case 'm': Imcs = atoi(optarg); break; - + + case 'W': + precod_nbr_layers = atoi(optarg); + break; + case 'n': n_trials = atoi(optarg); break; @@ -466,7 +479,11 @@ int main(int argc, char **argv) case 'p': extended_prefix_flag = 1; break; - + + case 'q': + mcs_table = atoi(optarg); + break; + case 'r': nb_rb = atoi(optarg); break; @@ -476,6 +493,10 @@ int main(int argc, char **argv) printf("Setting SNR0 to %f\n", snr0); break; + case 'C': + threadCnt = atoi(optarg); + break; + case 'u': mu = atoi(optarg); break; @@ -484,11 +505,10 @@ int main(int argc, char **argv) start_rb = atoi(optarg); break; -/* case 't': - eff_tp_check = (float)atoi(optarg)/100; + eff_tp_check = (float)atoi(optarg); break; -*/ + /* case 'r': ricean_factor = pow(10,-.1*atof(optarg)); @@ -505,32 +525,26 @@ int main(int argc, char **argv) case 'y': n_tx = atoi(optarg); - - if ((n_tx == 0) || (n_tx > 2)) { - printf("Unsupported number of tx antennas %d\n", n_tx); - exit(-1); + if ((n_tx == 0) || (n_tx > 4)) { + printf("Unsupported number of tx antennas %d\n", n_tx); + exit(-1); } - break; case 'z': n_rx = atoi(optarg); - if ((n_rx == 0) || (n_rx > 8)) { - printf("Unsupported number of rx antennas %d\n", n_rx); - exit(-1); + printf("Unsupported number of rx antennas %d\n", n_rx); + exit(-1); } - break; - + case 'F': input_fd = fopen(optarg, "r"); - if (input_fd == NULL) { - printf("Problem with filename %s\n", optarg); - exit(-1); + printf("Problem with filename %s\n", optarg); + exit(-1); } - break; case 'G': @@ -541,6 +555,10 @@ int main(int argc, char **argv) slot = atoi(optarg); break; + case 'I': + max_ldpc_iterations = atoi(optarg); + break; + case 'M': // SSB_positions = atoi(optarg); break; @@ -588,40 +606,39 @@ int main(int argc, char **argv) break; case 'Z': - - transform_precoding = 0; // enabled + transform_precoding = transformPrecoder_enabled; num_dmrs_cdm_grps_no_data = 2; mcs_table = 3; - - printf("NOTE: TRANSFORM PRECODING (SC-FDMA) is ENABLED in UPLINK (0 - ENABLE, 1 - DISABLE) : %d \n", transform_precoding); - + printf("NOTE: TRANSFORM PRECODING (SC-FDMA) is ENABLED in UPLINK (0 - ENABLE, 1 - DISABLE) : %d \n", transform_precoding); break; default: case 'h': - printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId -Z Enable SC-FDMA in Uplink \n", argv[0]); + printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -i Intefrence0 -j Interference1 -n n_frames -s snr0 -S snr1 -t Delayspread -x transmission_mode -y TXant -z RXant -A interpolation_file -C(alibration offset dB) -N CellId -Z Enable SC-FDMA in Uplink \n", argv[0]); //printf("-d Use TDD\n"); printf("-d Introduce delay in terms of number of samples\n"); printf("-f Number of frames to simulate\n"); printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n"); printf("-h This message\n"); - printf("-i Activate PRB based averaging for channel estimation. Frequncy domain interpolation by default.\n"); + printf("-i Change channel estimation technique. Arguments list: Number of arguments=2, Frequency domain {0:Linear interpolation, 1:PRB based averaging}, Time domain {0:Estimates of last DMRS symbol, 1:Average of DMRS symbols}. e.g. -i 2 1 0\n"); //printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n"); printf("-s Starting SNR, runs from SNR0 to SNR0 + 10 dB if ending SNR isn't given\n"); printf("-m MCS value\n"); printf("-n Number of trials to simulate\n"); printf("-p Use extended prefix mode\n"); + printf("-q MCS table\n"); printf("-t Delay spread for multipath channel\n"); printf("-u Set the numerology\n"); printf("-w Start PRB for PUSCH\n"); //printf("-x Transmission mode (1,2,6 for the moment)\n"); - printf("-y Number of TX antennas used in eNB\n"); - printf("-z Number of RX antennas used in UE\n"); + printf("-y Number of TX antennas used at UE\n"); + printf("-z Number of RX antennas used at gNB\n"); printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n"); //printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n"); printf("-F Input filename (.txt format) for RX conformance testing\n"); printf("-G Offset of samples to read from file (0 default)\n"); - printf("-L <log level, 0(errors), 1(warning), 2(info) 3(debug) 4 (trace)>\n"); + printf("-L <log level, 0(errors), 1(warning), 2(info) 3(debug) 4 (trace)>\n"); + printf("-I Maximum LDPC decoder iterations\n"); printf("-M Multiple SSB positions in burst\n"); printf("-N Nid_cell\n"); printf("-O oversampling factor (1,2,4,8,16)\n"); @@ -629,10 +646,11 @@ int main(int argc, char **argv) printf("-t Acceptable effective throughput (in percentage)\n"); printf("-S Ending SNR, runs from SNR0 to SNR1\n"); printf("-P Print ULSCH performances\n"); - printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n"); - printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:3}, e.g. -U 2 0 2 \n"); + printf("-T Enable PTRS, arguments list: Number of arguments=2 L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n"); + printf("-U Change DMRS Config, arguments list: Number of arguments=4, DMRS Mapping Type{0=A,1=B}, DMRS AddPos{0:3}, DMRS Config Type{1,2}, Number of CDM groups without data{1,2,3} e.g. -U 4 0 2 0 1 \n"); printf("-Q If -F used, read parameters from file\n"); printf("-Z If -Z is used, SC-FDMA or transform precoding is enabled in Uplink \n"); + printf("-W Num of layer for PUSCH\n"); exit(-1); break; @@ -653,16 +671,37 @@ int main(int argc, char **argv) double sampling_frequency; double bandwidth; - if (N_RB_UL >= 217) sampling_frequency = 122.88; - else if (N_RB_UL >= 106) sampling_frequency = 61.44; - else if (N_RB_UL >= 32) sampling_frequency = 32.72; - else { printf("Need at least 106 PRBs\b"); exit(-1); } - if (N_RB_UL == 273) bandwidth = 100; - else if (N_RB_UL == 217) bandwidth = 80; - else if (N_RB_UL == 106) bandwidth = 40; - else if (N_RB_UL == 32) bandwidth = 50; - else { printf("Add N_RB_UL %d\n",N_RB_UL); exit(-1); } + if (mu == 0 && N_RB_UL == 25 ) { + sampling_frequency = 7.68; + bandwidth = 5; + } + else if (mu == 1 && N_RB_UL == 273) { + sampling_frequency = 122.88; + bandwidth = 100; + } + else if (mu == 1 && N_RB_UL == 217) { + sampling_frequency = 122.88; + bandwidth = 80; + } + else if (mu == 1 && N_RB_UL == 106) { + sampling_frequency = 61.44; + bandwidth = 40; + } + else if (mu == 1 && N_RB_UL == 24) { + sampling_frequency = 15.36; + bandwidth = 10; + } + else if (mu == 3 && N_RB_UL == 32) { + sampling_frequency = 61.44; + bandwidth = 50; + } + else { + printf("Add N_RB_UL %d\n",N_RB_UL); + exit(-1); + } + LOG_I( PHY,"++++++++++++++++++++++++++++++++++++++++++++++%i+++++++++++++++++++++++++++++++++++++++++",loglvl); + if (openair0_cfg[0].threequarter_fs == 1) sampling_frequency*=.75; UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model, @@ -684,7 +723,18 @@ int main(int argc, char **argv) gNB->ofdm_offset_divisor = UINT_MAX; gNB->threadPool = (tpool_t*)malloc(sizeof(tpool_t)); gNB->respDecode = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t)); - char tp_param[] = "n"; + initNotifiedFIFO(gNB->respDecode); + char tp_param[80]; + if (threadCnt>0) + sprintf(tp_param,"-1"); + else + tp_param[0]='n'; + int s_offset = 0; + for (int icpu=1; icpu<threadCnt; icpu++) { + sprintf(tp_param+2+s_offset,",-1"); + s_offset += 3; + } + initTpool(tp_param, gNB->threadPool, false); initNotifiedFIFO(gNB->respDecode); gNB->L1_tx_free = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t)); @@ -703,7 +753,8 @@ int main(int argc, char **argv) gNB->UL_INFO.crc_ind.crc_list = (nfapi_nr_crc_t *)malloc(NB_UE_INST*sizeof(nfapi_nr_crc_t)); gNB->UL_INFO.rx_ind.number_of_pdus = 0; gNB->UL_INFO.crc_ind.number_crcs = 0; - gNB->prb_interpolation = prb_inter; + gNB->max_ldpc_iterations = max_ldpc_iterations; + gNB->pusch_thres = -20; frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH) frame_parms->N_RB_DL = N_RB_DL; @@ -739,7 +790,8 @@ int main(int argc, char **argv) // TODO do a UECAP for phy-sim const gNB_RrcConfigurationReq conf = { - .pdsch_AntennaPorts = { .N1 = n_tx, .N2 = 1, .XP = 1 }, + .pdsch_AntennaPorts = { .N1 = 1, .N2 = 1, .XP = 1 }, + .pusch_AntennaPorts = n_rx, .minRXTXTIME = 0, .do_CSIRS = 0, .do_SRS = 0, @@ -752,19 +804,22 @@ int main(int argc, char **argv) /* RRC parameter validation for secondaryCellGroup */ fix_scd(scd); - AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface"); + AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface"); - gNB->if_inst->NR_PHY_config_req = nr_phy_config_request; + gNB->if_inst->NR_PHY_config_req = nr_phy_config_request; // common configuration - rrc_mac_config_req_gNB(0,0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib, rrc.carrier.siblock1, 0, 0, NULL); + rrc_mac_config_req_gNB(0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib, rrc.carrier.siblock1, 0, 0, NULL); // UE dedicated configuration - rrc_mac_config_req_gNB(0,0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib, rrc.carrier.siblock1, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup); - frame_parms->nb_antennas_tx = n_tx; + rrc_mac_config_req_gNB(0, conf.pdsch_AntennaPorts, n_rx, 0, 6, scc, &rrc.carrier.mib, rrc.carrier.siblock1, 1, + secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity, secondaryCellGroup); + frame_parms->nb_antennas_tx = 1; frame_parms->nb_antennas_rx = n_rx; nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; - cfg->carrier_config.num_tx_ant.value = n_tx; + cfg->carrier_config.num_tx_ant.value = 1; cfg->carrier_config.num_rx_ant.value = n_rx; // nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,0,0x01); + gNB->chest_freq = chest_type[0]; + gNB->chest_time = chest_type[1]; phy_init_nr_gNB(gNB,0,1); N_RB_DL = gNB->frame_parms.N_RB_DL; @@ -779,6 +834,8 @@ int main(int argc, char **argv) PHY_vars_UE_g[0] = malloc(sizeof(PHY_VARS_NR_UE*)); PHY_vars_UE_g[0][0] = UE; memcpy(&UE->frame_parms, frame_parms, sizeof(NR_DL_FRAME_PARMS)); + UE->frame_parms.nb_antennas_tx = n_tx; + UE->frame_parms.nb_antennas_rx = 0; if (init_nr_ue_signal(UE, 1) != 0) { printf("Error at UE NR initialisation\n"); @@ -831,7 +888,7 @@ int main(int argc, char **argv) unsigned char *estimated_output_bit; unsigned char *test_input_bit; - uint32_t errors_decoding = 0; + uint32_t errors_decoding = 0; test_input_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384); @@ -864,23 +921,21 @@ int main(int argc, char **argv) /* validate parameters othwerwise default values are used */ /* -U flag can be used to set DMRS parameters*/ - if(modify_dmrs) - { + if(modify_dmrs) { if(dmrs_arg[0] == 0) - { mapping_type = typeA; - } else if (dmrs_arg[0] == 1) - { mapping_type = typeB; - } /* Additional DMRS positions */ if(dmrs_arg[1] >= 0 && dmrs_arg[1] <=3 ) - { add_pos = dmrs_arg[1]; - } + /* DMRS Conf Type 1 or 2 */ + if(dmrs_arg[2] == 1) + dmrs_config_type = pusch_dmrs_type1; + else if(dmrs_arg[2] == 2) + dmrs_config_type = pusch_dmrs_type2; + num_dmrs_cdm_grps_no_data = dmrs_arg[3]; } - printf("NOTE: DMRS config is modified with Mapping Type %d , Additional Position %d \n", mapping_type, add_pos ); uint8_t length_dmrs = pusch_len1; uint16_t l_prime_mask = get_l_prime(nb_symb_sch, mapping_type, add_pos, length_dmrs, start_symbol, NR_MIB__dmrs_TypeA_Position_pos2); @@ -888,22 +943,25 @@ int main(int argc, char **argv) printf("num dmrs sym %d\n",number_dmrs_symbols); uint8_t nb_re_dmrs = (dmrs_config_type == pusch_dmrs_type1) ? 6 : 4; - // if transform precoding is enabled - if (transform_precoding == 0) { + if ((UE->frame_parms.nb_antennas_tx==4)&&(precod_nbr_layers==4)) + num_dmrs_cdm_grps_no_data = 2; + + if (transform_precoding == transformPrecoder_enabled) { AssertFatal(enable_ptrs == 0, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n"); int8_t index = get_index_for_dmrs_lowpapr_seq((NR_NB_SC_PER_RB/2) * nb_rb); - AssertFatal(index >= 0, "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs cannot be multiple of any other primenumber other than 2,3,5\n"); + AssertFatal(index >= 0, "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs cannot be multiple of any other primenumber other than 2,3,5\n"); dmrs_config_type = pusch_dmrs_type1; + nb_re_dmrs = 6; printf("[ULSIM]: TRANSFORM PRECODING ENABLED. Num RBs: %d, index for DMRS_SEQ: %d\n", nb_rb, index); } - nb_re_dmrs = nb_re_dmrs * num_dmrs_cdm_grps_no_data; + nb_re_dmrs = nb_re_dmrs * num_dmrs_cdm_grps_no_data; - unsigned int available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, number_dmrs_symbols, mod_order, 1); + unsigned int available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, number_dmrs_symbols, mod_order, precod_nbr_layers); unsigned int TBS = nr_compute_tbs(mod_order, code_rate, nb_rb, nb_symb_sch, nb_re_dmrs * number_dmrs_symbols, 0, 0, precod_nbr_layers); @@ -928,17 +986,12 @@ int main(int argc, char **argv) double ts = 1.0/(frame_parms->subcarrier_spacing * frame_parms->ofdm_symbol_size); /* -T option enable PTRS */ - if(enable_ptrs) - { + if(enable_ptrs) { /* validate parameters othwerwise default values are used */ if(ptrs_arg[0] == 0 || ptrs_arg[0] == 1 || ptrs_arg[0] == 2 ) - { ptrs_time_density = ptrs_arg[0]; - } if(ptrs_arg[1] == 2 || ptrs_arg[1] == 4 ) - { ptrs_freq_density = ptrs_arg[1]; - } pdu_bit_map |= PUSCH_PDU_BITMAP_PUSCH_PTRS; printf("NOTE: PTRS Enabled with L %d, K %d \n", ptrs_time_density, ptrs_freq_density ); } @@ -970,7 +1023,6 @@ int main(int argc, char **argv) int slot_length = slot_offset - frame_parms->get_samples_slot_timestamp(slot-1,frame_parms,0); if (input_fd != NULL) { - AssertFatal(frame_parms->nb_antennas_rx == 1, "nb_ant != 1\n"); // 800 samples is N_TA_OFFSET for FR1 @ 30.72 Ms/s, AssertFatal(frame_parms->subcarrier_spacing==30000,"only 30 kHz for file input for now (%d)\n",frame_parms->subcarrier_spacing); @@ -998,18 +1050,21 @@ int main(int argc, char **argv) printf("harq_pid %d\n",harq_pid); } fseek(input_fd,file_offset*sizeof(int16_t)*2,SEEK_SET); - read_errors+=fread((void*)&gNB->common_vars.rxdata[0][slot_offset-delay], - sizeof(int16_t), - slot_length<<1, - input_fd); - if (read_errors==0) { - printf("error reading file\n"); - exit(1); + for (int irx=0; irx<frame_parms->nb_antennas_rx; irx++) { + fseek(input_fd,irx*(slot_length+15)*sizeof(int16_t)*2,SEEK_SET); // matlab adds samlples to the end to emulate channel delay + read_errors+=fread((void*)&gNB->common_vars.rxdata[irx][slot_offset-delay], + sizeof(int16_t), + slot_length<<1, + input_fd); + if (read_errors==0) { + printf("error reading file\n"); + exit(1); + } + for (int i=0;i<16;i+=2) printf("slot_offset %d : %d,%d\n", + slot_offset, + ((int16_t*)&gNB->common_vars.rxdata[irx][slot_offset])[i], + ((int16_t*)&gNB->common_vars.rxdata[irx][slot_offset])[1+i]); } - for (int i=0;i<16;i+=2) printf("slot_offset %d : %d,%d\n", - slot_offset, - ((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[i], - ((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[1+i]); mod_order = nr_get_Qm_ul(Imcs, mcs_table); code_rate = nr_get_code_rate_ul(Imcs, mcs_table); @@ -1054,7 +1109,7 @@ int main(int argc, char **argv) uint8_t round = 0; crc_status = 1; - errors_decoding = 0; + errors_decoding = 0; memset((void*)roundStats,0,50*sizeof(roundStats[0])); while (round<max_rounds && crc_status) { round_trials[round][snrRun]++; @@ -1101,12 +1156,12 @@ int main(int argc, char **argv) pusch_pdu->qam_mod_order = mod_order; pusch_pdu->transform_precoding = transform_precoding; pusch_pdu->data_scrambling_id = *scc->physCellId; - pusch_pdu->nrOfLayers = 1; + pusch_pdu->nrOfLayers = precod_nbr_layers; pusch_pdu->ul_dmrs_symb_pos = l_prime_mask; pusch_pdu->dmrs_config_type = dmrs_config_type; pusch_pdu->ul_dmrs_scrambling_id = *scc->physCellId; pusch_pdu->scid = 0; - pusch_pdu->dmrs_ports = 1; + pusch_pdu->dmrs_ports = ((1<<precod_nbr_layers)-1); pusch_pdu->num_dmrs_cdm_grps_no_data = num_dmrs_cdm_grps_no_data; pusch_pdu->resource_alloc = 1; pusch_pdu->rb_start = start_rb; @@ -1126,7 +1181,7 @@ int main(int argc, char **argv) pusch_pdu->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset = 0; // if transform precoding is enabled - if (transform_precoding == 0) { + if (transform_precoding == transformPrecoder_enabled) { pusch_pdu->dfts_ofdm.low_papr_group_number = *scc->physCellId % 30; // U as defined in 38.211 section 6.4.1.1.1.2 pusch_pdu->dfts_ofdm.low_papr_sequence_number = 0; // V as defined in 38.211 section 6.4.1.1.1.2 @@ -1173,7 +1228,9 @@ int main(int argc, char **argv) ul_config.ul_config_list[0].pusch_config_pdu.mcs_table = mcs_table; ul_config.ul_config_list[0].pusch_config_pdu.num_dmrs_cdm_grps_no_data = num_dmrs_cdm_grps_no_data; ul_config.ul_config_list[0].pusch_config_pdu.nrOfLayers = precod_nbr_layers; + ul_config.ul_config_list[0].pusch_config_pdu.dmrs_ports = ((1<<precod_nbr_layers)-1); ul_config.ul_config_list[0].pusch_config_pdu.absolute_delta_PUSCH = 0; + ul_config.ul_config_list[0].pusch_config_pdu.target_code_rate = code_rate; ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.tb_size = TBS/8; ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.new_data_indicator = trial & 0x1; @@ -1182,13 +1239,13 @@ int main(int argc, char **argv) ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_time_density = ptrs_time_density; ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_freq_density = ptrs_freq_density; - ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_ports_list = (nfapi_nr_ue_ptrs_ports_t *) malloc(2*sizeof(nfapi_nr_ue_ptrs_ports_t)); + ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_ports_list = (nfapi_nr_ue_ptrs_ports_t *) malloc(2*sizeof(nfapi_nr_ue_ptrs_ports_t)); ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset = 0; ul_config.ul_config_list[0].pusch_config_pdu.transform_precoding = transform_precoding; // if transform precoding is enabled - if (transform_precoding == 0) { + if (transform_precoding == transformPrecoder_enabled) { ul_config.ul_config_list[0].pusch_config_pdu.dfts_ofdm.low_papr_group_number = *scc->physCellId % 30;// U as defined in 38.211 section 6.4.1.1.1.2 ul_config.ul_config_list[0].pusch_config_pdu.dfts_ofdm.low_papr_sequence_number = 0;// V as defined in 38.211 section 6.4.1.1.1.2 @@ -1216,43 +1273,83 @@ int main(int argc, char **argv) LOG_D(PHY, "Sending Uplink data \n"); nr_ue_pusch_common_procedures(UE, slot, - &UE->frame_parms,1); + &UE->frame_parms, + UE->frame_parms.nb_antennas_tx); + if (n_trials==1) { - LOG_M("txsig0.m","txs0", UE->common_vars.txdata[0],frame_parms->samples_per_subframe*10,1,1); + LOG_M("txsig0.m","txs0", &UE->common_vars.txdata[0][slot_offset],slot_length,1,1); LOG_M("txsig0F.m","txs0F", UE->common_vars.txdataF[0],frame_parms->ofdm_symbol_size*14,1,1); + if (precod_nbr_layers > 1) { + LOG_M("txsig1.m","txs1", &UE->common_vars.txdata[1][slot_offset],slot_length,1,1); + LOG_M("txsig1F.m","txs1F", UE->common_vars.txdataF[1],frame_parms->ofdm_symbol_size*14,1,1); + if (precod_nbr_layers==4) { + LOG_M("txsig2.m","txs2", &UE->common_vars.txdata[2][slot_offset],slot_length,1,1); + LOG_M("txsig3.m","txs3", &UE->common_vars.txdata[3][slot_offset],slot_length,1,1); + LOG_M("txsig2F.m","txs2F", UE->common_vars.txdataF[2],frame_parms->ofdm_symbol_size*14,1,1); + LOG_M("txsig3F.m","txs3F", UE->common_vars.txdataF[3],frame_parms->ofdm_symbol_size*14,1,1); + } + } } /////////// //////////////////////////////////////////////////// tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0); - - txlev = signal_energy(&UE->common_vars.txdata[0][tx_offset + 5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0], + txlev_sum = 0; + for (int aa=0; aa<UE->frame_parms.nb_antennas_tx; aa++) { + atxlev[aa] = signal_energy(&UE->common_vars.txdata[aa][tx_offset + 5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0], frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples); - } - else n_trials = 1; - if (input_fd == NULL ) { + txlev_sum += atxlev[aa]; - sigma_dB = 10 * log10((double)txlev * ((double)frame_parms->ofdm_symbol_size/(12*nb_rb))) - SNR;; + if (n_trials==1) printf("txlev[%d] = %d (%f dB) txlev_sum %d\n",aa,atxlev[aa],10*log10((double)atxlev[aa]),txlev_sum); + } + } + else + n_trials = 1; + + if (input_fd == NULL) { + // Justification of division by precod_nbr_layers: + // When the channel is the identity matrix, the results in terms of SNR should be almost equal for 2x2 and 4x4. + sigma_dB = 10 * log10((double)txlev_sum/precod_nbr_layers * ((double)frame_parms->ofdm_symbol_size/(12*nb_rb))) - SNR;; sigma = pow(10,sigma_dB/10); - if(n_trials==1) printf("sigma %f (%f dB), txlev %f (factor %f)\n",sigma,sigma_dB,10*log10((double)txlev),(double)(double) - frame_parms->ofdm_symbol_size/(12*nb_rb)); + if(n_trials==1) printf("sigma %f (%f dB), txlev_sum %f (factor %f)\n",sigma,sigma_dB,10*log10((double)txlev_sum),(double)(double) + frame_parms->ofdm_symbol_size/(12*nb_rb)); for (i=0; i<slot_length; i++) { - for (int aa=0; aa<frame_parms->nb_antennas_tx; aa++) { + for (int aa=0; aa<UE->frame_parms.nb_antennas_tx; aa++) { s_re[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)]); s_im[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)+1]); } } - - if (UE2gNB->max_Doppler == 0) { - multipath_channel(UE2gNB, s_re, s_im, r_re, r_im, slot_length, 0, (n_trials==1)?1:0); + // The multipath_channel() function calculates a channel matrix with only 1's. So the channel rank is 1, and we + // cannot use multi-layer. To solve this issue, for now we use the H_awgn_mimo matrix for multi-layer. + if (precod_nbr_layers == 1) { + if (UE2gNB->max_Doppler == 0) { + multipath_channel(UE2gNB, s_re, s_im, r_re, r_im, slot_length, 0, (n_trials==1)?1:0); + } else { + multipath_tv_channel(UE2gNB, s_re, s_im, r_re, r_im, 2*slot_length, 0); + } } else { - multipath_tv_channel(UE2gNB, s_re, s_im, r_re, r_im, 2*slot_length, 0); + double H_awgn_mimo[4][4] ={{1.0, 0.2, 0.1, 0.05}, //rx 0 + {0.2, 1.0, 0.2, 0.1}, //rx 1 + {0.1, 0.2, 1.0, 0.2}, //rx 2 + {0.05, 0.1, 0.2, 1.0}}; //rx 3 + for (i=0; i<slot_length; i++) { + for (ap = 0; ap < frame_parms->nb_antennas_rx; ap++) { + // sum up signals from different Tx antennas + r_re[ap][i] = 0; + r_im[ap][i] = 0; + for (int aa=0; aa<n_tx; aa++) { + r_re[ap][i] += s_re[aa][i]*H_awgn_mimo[ap][aa]; + r_im[ap][i] += s_im[aa][i]*H_awgn_mimo[ap][aa]; + } + } + } } + for (i=0; i<slot_length; i++) { for (ap=0; ap<frame_parms->nb_antennas_rx; ap++) { ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)] = (int16_t)((r_re[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point @@ -1276,7 +1373,7 @@ int main(int argc, char **argv) pusch_pdu->ul_dmrs_symb_pos); ptrsSymbPerSlot = get_ptrs_symbols_in_slot(ptrsSymPos, pusch_pdu->start_symbol_index, pusch_pdu->nr_of_symbols); ptrsRePerSymb = ((pusch_pdu->rb_size + ptrs_freq_density - 1)/ptrs_freq_density); - printf("[ULSIM] PTRS Symbols in a slot: %2u, RE per Symbol: %3u, RE in a slot %4d\n", ptrsSymbPerSlot,ptrsRePerSymb, ptrsSymbPerSlot*ptrsRePerSymb ); + LOG_D(PHY,"[ULSIM] PTRS Symbols in a slot: %2u, RE per Symbol: %3u, RE in a slot %4d\n", ptrsSymbPerSlot,ptrsRePerSymb, ptrsSymbPerSlot*ptrsRePerSymb ); } //////////////////////////////////////////////////////////// @@ -1286,130 +1383,152 @@ int main(int argc, char **argv) gNB->UL_INFO.rx_ind.number_of_pdus = 0; gNB->UL_INFO.crc_ind.number_crcs = 0; - phy_procedures_gNB_common_RX(gNB, frame, slot); - - ul_proc_error = phy_procedures_gNB_uespec_RX(gNB, frame, slot); - - if (n_trials==1 && round==0) { - LOG_M("rxsig0.m","rx0",&gNB->common_vars.rxdata[0][slot_offset],slot_length,1,1); - - LOG_M("rxsigF0.m","rxsF0",gNB->common_vars.rxdataF[0]+start_symbol*frame_parms->ofdm_symbol_size,nb_symb_sch*frame_parms->ofdm_symbol_size,1,1); - - } + phy_procedures_gNB_common_RX(gNB, frame, slot); + + ul_proc_error = phy_procedures_gNB_uespec_RX(gNB, frame, slot); + + if (n_trials==1 && round==0) { + LOG_M("rxsig0.m","rx0",&gNB->common_vars.rxdata[0][slot_offset],slot_length,1,1); + LOG_M("rxsigF0.m","rxsF0",gNB->common_vars.rxdataF[0],14*frame_parms->ofdm_symbol_size,1,1); + if (precod_nbr_layers > 1) { + LOG_M("rxsig1.m","rx1",&gNB->common_vars.rxdata[1][slot_offset],slot_length,1,1); + LOG_M("rxsigF1.m","rxsF1",gNB->common_vars.rxdataF[1],14*frame_parms->ofdm_symbol_size,1,1); + if (precod_nbr_layers==4) { + LOG_M("rxsig2.m","rx2",&gNB->common_vars.rxdata[2][slot_offset],slot_length,1,1); + LOG_M("rxsig3.m","rx3",&gNB->common_vars.rxdata[3][slot_offset],slot_length,1,1); + LOG_M("rxsigF2.m","rxsF2",gNB->common_vars.rxdataF[2],14*frame_parms->ofdm_symbol_size,1,1); + LOG_M("rxsigF3.m","rxsF3",gNB->common_vars.rxdataF[3],14*frame_parms->ofdm_symbol_size,1,1); + } + } + } - if (n_trials == 1 && round==0) { + if (n_trials == 1 && round==0) { #ifdef __AVX2__ - __attribute__((unused)) - int off = ((nb_rb&1) == 1)? 4:0; + __attribute__((unused)) + int off = ((nb_rb&1) == 1)? 4:0; #else - __attribute__((unused)) - int off = 0; + __attribute__((unused)) + int off = 0; #endif - LOG_M("rxsigF0_ext.m","rxsF0_ext", - &gNB->pusch_vars[0]->rxdataF_ext[0][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_M("chestF0.m","chF0", - &gNB->pusch_vars[0]->ul_ch_estimates[0][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1); - LOG_M("chestT0.m","chT0", - &gNB->pusch_vars[0]->ul_ch_estimates_time[0][0],frame_parms->ofdm_symbol_size,1,1); - LOG_M("chestF0_ext.m","chF0_ext", - &gNB->pusch_vars[0]->ul_ch_estimates_ext[0][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))], - (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_M("rxsigF0_comp.m","rxsF0_comp", - &gNB->pusch_vars[0]->rxdataF_comp[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_M("chmagF0.m","chmF0", - &gNB->pusch_vars[0]->ul_ch_mag[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_M("chmagbF0.m","chmbF0", - &gNB->pusch_vars[0]->ul_ch_magb[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - if (n_rx == 2) { - LOG_MM("rxsigF0_comp.m","rxsF1_comp", - &gNB->pusch_vars[0]->rxdataF_comp[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("rxsigF0_ext.m","rxsF1_ext", - &gNB->pusch_vars[0]->rxdataF_ext[1][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("chestF0_ext.m","chF1_ext", - &gNB->pusch_vars[0]->ul_ch_estimates_ext[1][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))], - (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("chmagF0.m","chmF1", - &gNB->pusch_vars[0]->ul_ch_mag[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("chmagbF0.m","chmbF1", - &gNB->pusch_vars[0]->ul_ch_magb[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - } else if (n_rx == 4) { - LOG_MM("rxsigF0_comp.m","rxsF1_comp", - &gNB->pusch_vars[0]->rxdataF_comp[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("rxsigF0_comp.m","rxsF2_comp", - &gNB->pusch_vars[0]->rxdataF_comp[2][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("rxsigF0_comp.m","rxsF3_comp", - &gNB->pusch_vars[0]->rxdataF_comp[3][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("rxsigF0_ext.m","rxsF1_ext", - &gNB->pusch_vars[0]->rxdataF_ext[1][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("rxsigF0_ext.m","rxsF2_ext", - &gNB->pusch_vars[0]->rxdataF_ext[2][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("rxsigF0_ext.m","rxsF3_ext", - &gNB->pusch_vars[0]->rxdataF_ext[3][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("chestF0_ext.m","chF1_ext", - &gNB->pusch_vars[0]->ul_ch_estimates_ext[1][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))], - (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("chestF0_ext.m","chF2_ext", - &gNB->pusch_vars[0]->ul_ch_estimates_ext[2][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))], - (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("chestF0_ext.m","chF3_ext", - &gNB->pusch_vars[0]->ul_ch_estimates_ext[3][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))], - (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("chmagF0.m","chmF1", - &gNB->pusch_vars[0]->ul_ch_mag[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("chmagF0.m","chmF2", - &gNB->pusch_vars[0]->ul_ch_mag[2][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("chmagF0.m","chmF3", - &gNB->pusch_vars[0]->ul_ch_mag[3][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("chmagbF0.m","chmbF1", - &gNB->pusch_vars[0]->ul_ch_magb[1][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("chmagbF0.m","chmbF2", - &gNB->pusch_vars[0]->ul_ch_magb[2][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - LOG_MM("chmagbF0.m","chmbF3", - &gNB->pusch_vars[0]->ul_ch_magb[3][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); - } + LOG_M("rxsigF0_ext.m","rxsF0_ext", + &gNB->pusch_vars[0]->rxdataF_ext[0][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + LOG_M("chestF0.m","chF0", + &gNB->pusch_vars[0]->ul_ch_estimates[0][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1); + LOG_M("chestT0.m","chT0", + &gNB->pusch_vars[0]->ul_ch_estimates_time[0][0],frame_parms->ofdm_symbol_size,1,1); + LOG_M("chestF0_ext.m","chF0_ext", + &gNB->pusch_vars[0]->ul_ch_estimates_ext[0][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))], + (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + LOG_M("rxsigF0_comp.m","rxsF0_comp", + &gNB->pusch_vars[0]->rxdataF_comp[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + LOG_M("chmagF0.m","chmF0", + &gNB->pusch_vars[0]->ul_ch_mag[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + LOG_M("chmagbF0.m","chmbF0", + &gNB->pusch_vars[0]->ul_ch_magb[0][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + LOG_M("rxsigF0_llrlayers0.m","rxsF0_llrlayers0", + &gNB->pusch_vars[0]->llr_layers[0][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0); + + if (precod_nbr_layers==2) { + LOG_M("rxsigF1_ext.m","rxsF1_ext", + &gNB->pusch_vars[0]->rxdataF_ext[1][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + + LOG_M("chestF3.m","chF3", + &gNB->pusch_vars[0]->ul_ch_estimates[3][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1); + + LOG_M("chestF3_ext.m","chF3_ext", + &gNB->pusch_vars[0]->ul_ch_estimates_ext[3][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))], + (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + + LOG_M("rxsigF2_comp.m","rxsF2_comp", + &gNB->pusch_vars[0]->rxdataF_comp[2][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + + LOG_M("rxsigF0_llrlayers1.m","rxsF0_llrlayers1", + &gNB->pusch_vars[0]->llr_layers[1][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0); - LOG_M("rxsigF0_llr.m","rxsF0_llr", - &gNB->pusch_vars[0]->llr[0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0); - } + } + + if (precod_nbr_layers==4) { + LOG_M("rxsigF1_ext.m","rxsF1_ext", + &gNB->pusch_vars[0]->rxdataF_ext[1][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + LOG_M("rxsigF2_ext.m","rxsF2_ext", + &gNB->pusch_vars[0]->rxdataF_ext[2][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + LOG_M("rxsigF3_ext.m","rxsF3_ext", + &gNB->pusch_vars[0]->rxdataF_ext[3][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + + LOG_M("chestF5.m","chF5", + &gNB->pusch_vars[0]->ul_ch_estimates[5][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1); + LOG_M("chestF10.m","chF10", + &gNB->pusch_vars[0]->ul_ch_estimates[10][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1); + LOG_M("chestF15.m","chF15", + &gNB->pusch_vars[0]->ul_ch_estimates[15][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1); + + + LOG_M("chestF5_ext.m","chF5_ext", + &gNB->pusch_vars[0]->ul_ch_estimates_ext[5][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))], + (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + LOG_M("chestF10_ext.m","chF10_ext", + &gNB->pusch_vars[0]->ul_ch_estimates_ext[10][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))], + (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + LOG_M("chestF15_ext.m","chF15_ext", + &gNB->pusch_vars[0]->ul_ch_estimates_ext[15][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))], + (nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + + + LOG_M("rxsigF4_comp.m","rxsF4_comp", + &gNB->pusch_vars[0]->rxdataF_comp[4][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + LOG_M("rxsigF8_comp.m","rxsF8_comp", + &gNB->pusch_vars[0]->rxdataF_comp[8][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + LOG_M("rxsigF12_comp.m","rxsF12_comp", + &gNB->pusch_vars[0]->rxdataF_comp[12][start_symbol*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1); + LOG_M("rxsigF0_llrlayers1.m","rxsF0_llrlayers1", + &gNB->pusch_vars[0]->llr_layers[1][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0); + LOG_M("rxsigF0_llrlayers2.m","rxsF0_llrlayers2", + &gNB->pusch_vars[0]->llr_layers[2][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0); + LOG_M("rxsigF0_llrlayers3.m","rxsF0_llrlayers3", + &gNB->pusch_vars[0]->llr_layers[3][0],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0); + } + + LOG_M("rxsigF0_llr.m","rxsF0_llr", + &gNB->pusch_vars[0]->llr[0],precod_nbr_layers*(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size * mod_order,1,0); + } //////////////////////////////////////////////////////////// - if ((gNB->ulsch[0]->last_iteration_cnt >= - gNB->ulsch[0]->max_ldpc_iterations+1) || ul_proc_error == 1) { - error_flag = 1; - n_errors[round][snrRun]++; - crc_status = 1; - } else { - crc_status = 0; - } - if(n_trials==1) printf("end of round %d rv_index %d\n",round, rv_index); + if ((gNB->ulsch[0]->last_iteration_cnt >= + gNB->ulsch[0]->max_ldpc_iterations+1) || ul_proc_error == 1) { + error_flag = 1; + n_errors[round][snrRun]++; + crc_status = 1; + } else + crc_status = 0; + if(n_trials==1) printf("end of round %d rv_index %d\n",round, rv_index); + + //---------------------------------------------------------- + //----------------- count and print errors ----------------- + //---------------------------------------------------------- + + if ((pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) && (SNR==snr0) && (trial==0) && (round==0)) { + ptrs_symbols = 0; + for (int i = pusch_pdu->start_symbol_index; i < pusch_pdu->start_symbol_index + pusch_pdu->nr_of_symbols; i++) + ptrs_symbols += ((gNB->pusch_vars[UE_id]->ptrs_symbols) >> i) & 1; + + /* 2*5*(50/2), for RB = 50,K = 2 for 5 OFDM PTRS symbols */ + available_bits -= 2 * ptrs_symbols * ((nb_rb + ptrs_freq_density - 1) /ptrs_freq_density); + printf("[ULSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5d \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb * 2) ); + } - //---------------------------------------------------------- - //----------------- count and print errors ----------------- - //---------------------------------------------------------- + for (i = 0; i < available_bits; i++) { - if ((pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) && (SNR==snr0) && (trial==0) && (round==0)) { - ptrs_symbols = 0; - for (int i = pusch_pdu->start_symbol_index; i < pusch_pdu->start_symbol_index + pusch_pdu->nr_of_symbols; i++){ - ptrs_symbols += ((gNB->pusch_vars[UE_id]->ptrs_symbols) >> i) & 1; - } - /* 2*5*(50/2), for RB = 50,K = 2 for 5 OFDM PTRS symbols */ - available_bits -= 2 * ptrs_symbols * ((nb_rb + ptrs_freq_density - 1) /ptrs_freq_density); - printf("[ULSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5d \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb * 2) ); - } + if(((ulsch_ue->harq_processes[harq_pid]->f[i] == 0) && (gNB->pusch_vars[UE_id]->llr[i] <= 0)) || + ((ulsch_ue->harq_processes[harq_pid]->f[i] == 1) && (gNB->pusch_vars[UE_id]->llr[i] >= 0))) { - for (i = 0; i < available_bits; i++) { - - if(((ulsch_ue->harq_processes[harq_pid]->f[i] == 0) && (gNB->pusch_vars[UE_id]->llr[i] <= 0)) || - ((ulsch_ue->harq_processes[harq_pid]->f[i] == 1) && (gNB->pusch_vars[UE_id]->llr[i] >= 0))) - { - /*if(errors_scrambling == 0) - printf("\x1B[34m" "[frame %d][trial %d]\t1st bit in error in unscrambling = %d\n" "\x1B[0m", frame, trial, i);*/ - errors_scrambling[round][snrRun]++; - } - } - round++; + /*if(errors_scrambling == 0) + printf("\x1B[34m" "[frame %d][trial %d]\t1st bit in error in unscrambling = %d\n" "\x1B[0m", frame, trial, i);*/ + errors_scrambling[round][snrRun]++; + } + } + round++; } // round @@ -1476,7 +1595,12 @@ int main(int argc, char **argv) roundStats[snrRun],effRate[snrRun],effTP[snrRun],TBS); FILE *fd=fopen("nr_ulsim.log","w"); + if (fd == NULL) { + printf("Problem with filename %s\n", "nr_ulsim.log"); + exit(-1); + } dump_pusch_stats(fd,gNB); + fclose(fd); printf("*****************************************\n"); printf("\n"); @@ -1506,7 +1630,7 @@ int main(int argc, char **argv) if(n_trials==1) break; - if ((float)n_errors[0][snrRun]/(float)n_trials <= target_error_rate) { + if ((float)effTP[snrRun] >= eff_tp_check) { printf("*************\n"); printf("PUSCH test OK\n"); printf("*************\n"); @@ -1536,17 +1660,19 @@ int main(int argc, char **argv) length_dmrs, num_dmrs_cdm_grps_no_data); - LOG_M("ulsimStats.m","SNR",snrStats,snrRun,1,7); - LOG_MM("ulsimStats.m","BLER_round0",blerStats[0],snrRun,1,7); - LOG_MM("ulsimStats.m","BLER_round1",blerStats[1],snrRun,1,7); - LOG_MM("ulsimStats.m","BLER_round2",blerStats[2],snrRun,1,7); - LOG_MM("ulsimStats.m","BLER_round3",blerStats[3],snrRun,1,7); - LOG_MM("ulsimStats.m","BER_round0",berStats[0],snrRun,1,7); - LOG_MM("ulsimStats.m","BER_round1",berStats[1],snrRun,1,7); - LOG_MM("ulsimStats.m","BER_round2",berStats[2],snrRun,1,7); - LOG_MM("ulsimStats.m","BER_round3",berStats[3],snrRun,1,7); - LOG_MM("ulsimStats.m","EffRate",effRate,snrRun,1,7); - LOG_MM("ulsimStats.m","EffTP",effTP,snrRun,1,7); + char opStatsFile[50]; + sprintf(opStatsFile, "ulsimStats_z%d.m", n_rx); + LOG_M(opStatsFile,"SNR",snrStats,snrRun,1,7); + LOG_MM(opStatsFile,"BLER_round0",blerStats[0],snrRun,1,7); + LOG_MM(opStatsFile,"BLER_round1",blerStats[1],snrRun,1,7); + LOG_MM(opStatsFile,"BLER_round2",blerStats[2],snrRun,1,7); + LOG_MM(opStatsFile,"BLER_round3",blerStats[3],snrRun,1,7); + LOG_MM(opStatsFile,"BER_round0",berStats[0],snrRun,1,7); + LOG_MM(opStatsFile,"BER_round1",berStats[1],snrRun,1,7); + LOG_MM(opStatsFile,"BER_round2",berStats[2],snrRun,1,7); + LOG_MM(opStatsFile,"BER_round3",berStats[3],snrRun,1,7); + LOG_MM(opStatsFile,"EffRate",effRate,snrRun,1,7); + LOG_MM(opStatsFile,"EffTP",effTP,snrRun,1,7); free(test_input_bit); free(estimated_output_bit); diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeCache.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeCache.txt new file mode 100644 index 00000000000..b9bfc668ed5 --- /dev/null +++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeCache.txt @@ -0,0 +1,313 @@ +# This is the CMakeCache file. +# For build in directory: /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or +// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. +CMAKE_BUILD_TYPE:STRING= + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler. +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release minsize builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds (/MD /Ob1 /Oi +// /Ot /Oy /Gs will produce slightly less optimized but smaller +// files). +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during Release with Debug Info builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//C compiler. +CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release minsize builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds (/MD /Ob1 /Oi +// /Ot /Oy /Gs will produce slightly less optimized but smaller +// files). +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during Release with Debug Info builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING=' ' + +//Flags used by the linker during debug builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/gmake + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING=' ' + +//Flags used by the linker during debug builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=Project + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING=' ' + +//Flags used by the linker during debug builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//If true, cmake will use relative paths in makefiles and projects. +CMAKE_USE_RELATIVE_PATHS:BOOL=OFF + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +Project_BINARY_DIR:STATIC=/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build + +//Value Computed by CMake +Project_SOURCE_DIR:STATIC=/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_BUILD_TOOL +CMAKE_BUILD_TOOL-ADVANCED:INTERNAL=1 +//What is the target build tool cmake is generating for. +CMAKE_BUILD_TOOL:INTERNAL=/usr/bin/gmake +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=2 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=8 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=12 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/usr/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Start directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_LOCAL_GENERATORS:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_USE_RELATIVE_PATHS +CMAKE_USE_RELATIVE_PATHS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 + diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake new file mode 100644 index 00000000000..20619f82ead --- /dev/null +++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake @@ -0,0 +1,56 @@ +set(CMAKE_C_COMPILER "/usr/bin/cc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "GNU") +set(CMAKE_C_COMPILER_VERSION "4.8.5") +set(CMAKE_C_PLATFORM_ID "Linux") + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCC 1) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_LIBRARY_ARCHITECTURE "") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + + + + +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "c") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-redhat-linux/4.8.5;/usr/lib64;/lib64;/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") + + + diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake new file mode 100644 index 00000000000..5ae76367c40 --- /dev/null +++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake @@ -0,0 +1,57 @@ +set(CMAKE_CXX_COMPILER "/usr/bin/c++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "GNU") +set(CMAKE_CXX_COMPILER_VERSION "4.8.5") +set(CMAKE_CXX_PLATFORM_ID "Linux") + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCXX 1) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;CPP) +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + + + + +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;c") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-redhat-linux/4.8.5;/usr/lib64;/lib64;/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") + + + diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000000000000000000000000000000000000..db27e43a893d3972ef50962e2f14ebc0bfcc4215 GIT binary patch literal 8392 zcmeHMZERE589ui2Nx(5I&BDjP+dvIn<Ay-86jW*_akwc7u#j|2G+dn6A*PO<+1G7g zY(z^z^Ex_Ku?<yfho(*9M>X|VNB7lGx@JFGiEf3lwVfD@iqDOz3`G;I_q^wxH@?0x z8rrmf9P8Zoyw7=`^L_6*=k?xTXS>tk5FDIhtsw1sv0p;wQwVLoR29}N%7tGn7M~F% zK#CFlGKZv@VmYOXW?81}T#!YG%}x_&cKT(4<suUnEV+dwslHtBtE4G!sR~#M;g$Ks zqqch7Qia?u6D$|0c6gO!9;w8uRlHioV|h|Fj3xJv`bM!wmDl6+LnGZ!LbS<ePLeH! zO&5$XrQa!)Dx_Z~SgtZ*!IF7j0*~5xr@^BPyH$O+8<*><e=L<M9*9Nzn^rv#3)jV> z@$_ijXme9t(<)yo;cJlnrt-;l-G*LS6OW@88nw9!k=6j^|KQDV?cUSR|MBlta~}Kl zDOdHpd;dB}c@&99LvheERwh1MT~St4H0N7I!cTeB-#Lga!Bbavmbae%<@sm#%wGM& ziWk?PpZN1z=U-^(fA`v%uWnhibMJF|UODigdv?{i7mn2wAG`90f2i36*%m6G&$D5q zb|ZQzVGC=adqj=6-?Ke0C#djR8$KrS`JuLJHyId=OH@VTN=98v3l=X(VBJoMhH z@CbAY>k$d(_g8{=>_ha3`7_#CqwL==@gpU~8u=7rH{?7~A&#i;fP(SHo8=!=^{VA9 z>VQ)_UsCuzig2&AcZ)*`SFjLRKLfN}nuM-XT2C3Fq@fRoqH#tBQfYlK8jp%-d@!M> zqPruBK|MTTB!wOchl~*HNSI70JBAZ+Rg5n5j*Uo%qj5c*iiE92qC^8F#0l(Ar4)T# zXGcq`-r#HSHBuX?Uyj@UIFH8E4Cw{Ya$<c?=~I>4Ws24)j}ZYiYTjv0)BC}}Yr(Dd z+W6Hn?djsKSze*-n=pzmegO<^{PnUECNtaEf~@SaHashr_>m%gh%zso%_1yYO*&O| z=_J$@*E%w9Z__g8wDG@P-_+AFIYBe2O&+I(q)krJI=J|A7~UAHT+$}Qu`i-wy;>cu zS8aUCtz|Ae>Fhgkj4Gf8-ROIjva)9@my8j1j5M}CKIMYFmU&G(e)(a|aZ-DGDh={4 z$WYt&dyuuv8z%pp;*UM_{c^7m>AAgNUi=0c()UL3Hvu_5Izj!@#vd9gg@Lhnx(QXi zuX^!ShJE&A-=(jCQn^H2N<mT?nXg~fGU>CE!CO@8)4{9S;mViCXqi_2X2KD?#mH|h z$gMuq^%U8Qz?TD=Y~az3%*{Y=N9I(Zr}MzFGbLVh@jxBP&7I3Htaw*D{;`W@>SEU? z*{rtjnz5Mqotev>nVW4WBU|;JHh#jPJ$NO3nI>>+U*NGoUtn86KXGu-$Mzp#Ugeyt zDR$(o9w9n5v~OH(c@?(SH}{!fs6V<Dn|UAB)k4>rdbGV5@#@Ff>>kKPXjms?IfmsY zke!gPL;ebKHdY6Hk105IcMHd;$FXpBY1u(XsfTddgMWu|?jr*g3fl{@6!~O71bb?O zaC_R_HIGzQJXtm-9$v8KzLiTqM=;s6A@-qN@|zQId-gk9=af8wid9}1at!$qNYUc< zeAgLt*F572y1fUAg6`Vy6l?DK{Uw^adAzjC?T@*e1Md2OySBycZE@GYzQtW8`}HE| zM^TRTy`m!ThPxwhcLeT^z}*qZjlfGKeyJQ(l5_a1!g99C;PWA!!zu7NkFSe-zglQ! z3;MQGSYQfKgPofK?FSS%|DT^^6Qmz@`bo&WjO1vMpM*U7lbmw;Nr+kUDa7+iRw!Ac zB%eo>D(@CDjpGUh-W%ke1)cXdI;T<iv?;_$v0tVb-=cJGH`j;5pbV^I`;q-=R`%F- zrOxAdUFp>-U(x^Xg72~RicYI`d|+wMy4Kd!-dfz)mU~zEnthGlhWZta^-T>cy|vwu zuvZHiCSJGl!R7Yy3h6GKfSaBE8CfpOMo&T9C5(c2(eyg87UsgLnJQ>sGQE!S?Mp?W z@poZW^1S8SmkXZ%e0<jQI?2ap-lr(vC1#5W%Q!Q~Rp1_H+84M_$#Qb{L@vX$_e}c{ z^6|N%tjuqPWZH$BAHTQOOqcl7^!u8RR|z_S+k;Eo1HVZjyjt-6$jWiiTc+N}e0=7; znDSi(?z1M&Uzc1d^qv)o53@PMOwo7Dfw$e>e)@hnG5%iLcaXkggm1FpK84%An{BfE z+`XIM_stTYIi7Uyrt<ka3{{5xcsdHq%TIw9>enmMzEaS&h5|c0ZZ{6E!N!3b{FH4y zoRs*?@u4yc)%zZ0pq>0(mnt6D5FPLj998XM{9h8ExlUYipk}VaYKhNW&&z>3;6JhZ zRT?Eeb6u?mPJR-*AL9`4LVlR7zzg{|V!#Xee|mw>!>IFq$o)-8oVA>MR+VG-|NIEJ zH)l4T`Wf&-exY9jFXR`x2qyV|?BjD-+1vd^ZvijlFZz?RxBH7GC0^kBHjp$@MtX42 zHvo6bBdy(fXUFCqT^Hd<GO{C@G9pRc7}f`3iFhOhi*Q2U5li%kVtUv}BvX1QJt_tg z!y~bX5efU6RyH;kHj<7aJ(Ns_cEPn{BzK9yWN0{|httEuyFjsMIyr#yOk2A`k4IWt zQB5=!Nd{Uv&{*kn!krr2_U=GeP!DcsL$l33a5}Ff@+XB;34JIO562=xZ~MxIKvzdA zP>Y%Lask3Fss}YywAR)QsHdxyD_PgMu_e%{Z)|Vh9PH710xg|Es#^NV?!YT%^QZa! zR_E6L;xx1P%cP@D_)@!ujZi<Nku>EHr=oGp?TGNj6Gp^`F|9K~JCwE~p7!;pqi`Na z!@@_}P$)GdeBoVjlxIqK`DD%$kz^{Gi03If@{*BQhzKe*5;KHPdiH!qWE5%XIP@hG z(oyJ(45<|`6b6?ylVL6elfmho129ABq2cHNs!pIlJbbbivqX3fg%2xp7^`jit^Ds3 zw6EY5!nfZHd@kbuNBDfKvZXDjNq!!&6p{ISe&YWhyvVbLBCCS*3PdZP&sl~laH-AS z&Zm9uCeE;2|6!+JG7c+XyVP>$cs?&HSZqLo&g{(RbK8^x#%OR5$e&6{=GPF2@F*hv zC%}BZCyc6w^1Xm;DX8L11<!4WbS7s$p98ClO%tyvrtcwa$MSLH(;1(2J})-g`1baz zVx_;Gn#z1WS8h>!?x#{`^#3VviQl3M<a^49BJjP2RJzO9$L|?nG$zzO3Vg3SqWJa` zl^Ryl7|#r%mCxtd30wV4@TdgKLpDC|N7ohq$F>P$9+&r=jnDh;AzIW3d>=D4bF4T` z@(3bT!Q+3V)DI1~;;)oi?qRS0D6*{lcNCxh$6J-7%9MTlUbgZ1TwbOo>V}Qa^T+T6 z5_HC+cYp$)-}!$%yFKeH-vp-;k@<Xnt5F9>wxhBsu+H)fFzP?^z3SZW{SSO9i^BVe zwDy?K_XhsomH%Jm^~v?}JbVDIwSK-|Oi`y0*xuA~I^$Q6VdYQXLsSK|OjMG2ENOnM zd_Kq3D!zTb$<`X^986_#|M~yK`|prX7aJ<G9?=?@UuOl8=K8IY*S^(syQ-f*473l? mUcvq5?-IRV-1a<vwW<AuD^i&@6=&JP{I#lrG8@6Bihl#BeP7rB literal 0 HcmV?d00001 diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_CXX.bin b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000000000000000000000000000000000000..edbf852aaf9f3b4dd83d1265da0c8264729e0437 GIT binary patch literal 8408 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 Hj%EJ>1mJ)l literal 0 HcmV?d00001 diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake new file mode 100644 index 00000000000..3980da44fcc --- /dev/null +++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Linux-3.10.0-957.21.3.rt56.935.el7.x86_64") +set(CMAKE_HOST_SYSTEM_NAME "Linux") +set(CMAKE_HOST_SYSTEM_VERSION "3.10.0-957.21.3.rt56.935.el7.x86_64") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + + + +set(CMAKE_SYSTEM "Linux-3.10.0-957.21.3.rt56.935.el7.x86_64") +set(CMAKE_SYSTEM_NAME "Linux") +set(CMAKE_SYSTEM_VERSION "3.10.0-957.21.3.rt56.935.el7.x86_64") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 00000000000..cba81d4a6b5 --- /dev/null +++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,389 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" + /* __INTEL_COMPILER = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# 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(__clang__) +# define COMPILER_ID "Clang" +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) + +#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 HEX(__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__) +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__WATCOMC__ % 100) + +#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_C = 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__) +# if defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" +# else +# if __IBMC__ >= 800 +# define COMPILER_ID "XL" +# else +# define COMPILER_ID "VisualAge" +# endif + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) +# 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(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE) +# 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(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# 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 + +/* Analog VisualDSP++ >= 4.5.6 */ +#elif defined(__VISUALDSPVERSION__) +# define COMPILER_ID "ADSP" + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) + +/* Analog VisualDSP++ < 4.5.6 */ +#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" + +/* IAR Systems compiler for embedded systems. + http://www.iar.com */ +#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" + +/* sdcc, the small devices C compiler for embedded systems, + http://sdcc.sourceforge.net */ +#elif defined(SDCC) +# define COMPILER_ID "SDCC" + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + +/* This compiler is either not known or is too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#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 "]"; + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#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(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#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" + +#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_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM) +# define ARCHITECTURE_ID "ARM" + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# 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 components. */ +#ifdef 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 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 "]"; + + + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif + (void)argv; + return require; +} +#endif diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out new file mode 100755 index 0000000000000000000000000000000000000000..a13b3e1e728a1fd34cf225e49ce4edc30866eab3 GIT binary patch literal 8488 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 literal 0 HcmV?d00001 diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/CMakeCXXCompilerId.cpp b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 00000000000..e8220b26e50 --- /dev/null +++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,377 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__COMO__) +# define COMPILER_ID "Comeau" + /* __COMO_VERSION__ = VRR */ +# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100) +# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100) + +#elif defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" + /* __INTEL_COMPILER = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# 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(__clang__) +# define COMPILER_ID "Clang" +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) + +#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 HEX(__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__) +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__WATCOMC__ % 100) + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) +# if defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" +# else +# if __IBMCPP__ >= 800 +# define COMPILER_ID "XL" +# else +# define COMPILER_ID "VisualAge" +# endif + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) +# 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(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE) +# 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(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# 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 + +/* Analog VisualDSP++ >= 4.5.6 */ +#elif defined(__VISUALDSPVERSION__) +# define COMPILER_ID "ADSP" + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) + +/* Analog VisualDSP++ < 4.5.6 */ +#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" + +/* IAR Systems compiler for embedded systems. + http://www.iar.com */ +#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + +/* This compiler is either not known or is too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#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 "]"; + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#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(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#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" + +#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_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM) +# define ARCHITECTURE_ID "ARM" + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# 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 components. */ +#ifdef 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 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 "]"; + + + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif + (void)argv; + return require; +} diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out new file mode 100755 index 0000000000000000000000000000000000000000..7634d1e447d96093b8e2714fbd8fb1b7baa34ed5 GIT binary patch literal 8496 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 F;@^krSiArL literal 0 HcmV?d00001 diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeOutput.log b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeOutput.log new file mode 100644 index 00000000000..c922ff62300 --- /dev/null +++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeOutput.log @@ -0,0 +1,247 @@ +The system is: Linux - 3.10.0-957.21.3.rt56.935.el7.x86_64 - x86_64 +Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. +Compiler: /usr/bin/cc +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" + +The C compiler identification is GNU, found in "/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out" + +Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. +Compiler: /usr/bin/c++ +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" + +The CXX compiler identification is GNU, found in "/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out" + +Determining if the C compiler works passed with the following output: +Change Dir: /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/gmake "cmTryCompileExec2388936454/fast" +/usr/bin/gmake -f CMakeFiles/cmTryCompileExec2388936454.dir/build.make CMakeFiles/cmTryCompileExec2388936454.dir/build +gmake[1]: Entering directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building C object CMakeFiles/cmTryCompileExec2388936454.dir/testCCompiler.c.o +/usr/bin/cc -o CMakeFiles/cmTryCompileExec2388936454.dir/testCCompiler.c.o -c /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/testCCompiler.c +Linking C executable cmTryCompileExec2388936454 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec2388936454.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTryCompileExec2388936454.dir/testCCompiler.c.o -o cmTryCompileExec2388936454 -rdynamic +gmake[1]: Leaving directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp' + + +Detecting C compiler ABI info compiled with the following output: +Change Dir: /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/gmake "cmTryCompileExec602265197/fast" +/usr/bin/gmake -f CMakeFiles/cmTryCompileExec602265197.dir/build.make CMakeFiles/cmTryCompileExec602265197.dir/build +gmake[1]: Entering directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building C object CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o +/usr/bin/cc -o CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake/Modules/CMakeCCompilerABI.c +Linking C executable cmTryCompileExec602265197 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec602265197.dir/link.txt --verbose=1 +/usr/bin/cc -v CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o -o cmTryCompileExec602265197 -rdynamic +Using built-in specs. +COLLECT_GCC=/usr/bin/cc +COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper +Target: x86_64-redhat-linux +Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux +Thread model: posix +gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) +COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec602265197' '-rdynamic' '-mtune=generic' '-march=x86-64' + /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o cmTryCompileExec602265197 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o +gmake[1]: Leaving directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp' + + +Parsed C implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:/usr/bin/gmake "cmTryCompileExec602265197/fast"] + ignore line: [/usr/bin/gmake -f CMakeFiles/cmTryCompileExec602265197.dir/build.make CMakeFiles/cmTryCompileExec602265197.dir/build] + ignore line: [gmake[1]: Entering directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp'] + ignore line: [/usr/bin/cmake -E cmake_progress_report /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/CMakeFiles 1] + ignore line: [Building C object CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o] + ignore line: [/usr/bin/cc -o CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake/Modules/CMakeCCompilerABI.c] + ignore line: [Linking C executable cmTryCompileExec602265197] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec602265197.dir/link.txt --verbose=1] + ignore line: [/usr/bin/cc -v CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o -o cmTryCompileExec602265197 -rdynamic ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper] + ignore line: [Target: x86_64-redhat-linux] + ignore line: [Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux] + ignore line: [Thread model: posix] + ignore line: [gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ] + ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec602265197' '-rdynamic' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o cmTryCompileExec602265197 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o] + arg [/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2] ==> ignore + arg [--build-id] ==> ignore + arg [--no-add-needed] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-o] ==> ignore + arg [cmTryCompileExec602265197] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.8.5] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5] + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64] + arg [-L/lib/../lib64] ==> dir [/lib/../lib64] + arg [-L/usr/lib/../lib64] ==> dir [/usr/lib/../lib64] + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../..] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../..] + arg [CMakeFiles/cmTryCompileExec602265197.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [-lgcc] ==> lib [gcc] + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--no-as-needed] ==> ignore + arg [-lc] ==> lib [c] + arg [-lgcc] ==> lib [gcc] + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--no-as-needed] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o] ==> ignore + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + collapse library dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5] ==> [/usr/lib/gcc/x86_64-redhat-linux/4.8.5] + collapse library dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64] ==> [/usr/lib64] + collapse library dir [/lib/../lib64] ==> [/lib64] + collapse library dir [/usr/lib/../lib64] ==> [/usr/lib64] + collapse library dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../..] ==> [/usr/lib] + implicit libs: [c] + implicit dirs: [/usr/lib/gcc/x86_64-redhat-linux/4.8.5;/usr/lib64;/lib64;/usr/lib] + implicit fwks: [] + + +Determining if the CXX compiler works passed with the following output: +Change Dir: /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/gmake "cmTryCompileExec3828041398/fast" +/usr/bin/gmake -f CMakeFiles/cmTryCompileExec3828041398.dir/build.make CMakeFiles/cmTryCompileExec3828041398.dir/build +gmake[1]: Entering directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building CXX object CMakeFiles/cmTryCompileExec3828041398.dir/testCXXCompiler.cxx.o +/usr/bin/c++ -o CMakeFiles/cmTryCompileExec3828041398.dir/testCXXCompiler.cxx.o -c /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/testCXXCompiler.cxx +Linking CXX executable cmTryCompileExec3828041398 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec3828041398.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTryCompileExec3828041398.dir/testCXXCompiler.cxx.o -o cmTryCompileExec3828041398 -rdynamic +gmake[1]: Leaving directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp' + + +Detecting CXX compiler ABI info compiled with the following output: +Change Dir: /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/gmake "cmTryCompileExec1700914889/fast" +/usr/bin/gmake -f CMakeFiles/cmTryCompileExec1700914889.dir/build.make CMakeFiles/cmTryCompileExec1700914889.dir/build +gmake[1]: Entering directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building CXX object CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o +/usr/bin/c++ -o CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp +Linking CXX executable cmTryCompileExec1700914889 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec1700914889.dir/link.txt --verbose=1 +/usr/bin/c++ -v CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o -o cmTryCompileExec1700914889 -rdynamic +Using built-in specs. +COLLECT_GCC=/usr/bin/c++ +COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper +Target: x86_64-redhat-linux +Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux +Thread model: posix +gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) +COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec1700914889' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64' + /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o cmTryCompileExec1700914889 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o +gmake[1]: Leaving directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp' + + +Parsed CXX implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:/usr/bin/gmake "cmTryCompileExec1700914889/fast"] + ignore line: [/usr/bin/gmake -f CMakeFiles/cmTryCompileExec1700914889.dir/build.make CMakeFiles/cmTryCompileExec1700914889.dir/build] + ignore line: [gmake[1]: Entering directory `/home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp'] + ignore line: [/usr/bin/cmake -E cmake_progress_report /home/sy/openairinterface5g/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeTmp/CMakeFiles 1] + ignore line: [Building CXX object CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/usr/bin/c++ -o CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Linking CXX executable cmTryCompileExec1700914889] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec1700914889.dir/link.txt --verbose=1] + ignore line: [/usr/bin/c++ -v CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o -o cmTryCompileExec1700914889 -rdynamic ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper] + ignore line: [Target: x86_64-redhat-linux] + ignore line: [Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux] + ignore line: [Thread model: posix] + ignore line: [gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ] + ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec1700914889' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o cmTryCompileExec1700914889 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o] + arg [/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2] ==> ignore + arg [--build-id] ==> ignore + arg [--no-add-needed] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-o] ==> ignore + arg [cmTryCompileExec1700914889] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.8.5] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5] + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64] + arg [-L/lib/../lib64] ==> dir [/lib/../lib64] + arg [-L/usr/lib/../lib64] ==> dir [/usr/lib/../lib64] + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../..] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../..] + arg [CMakeFiles/cmTryCompileExec1700914889.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lm] ==> lib [m] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-lc] ==> lib [c] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o] ==> ignore + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + collapse library dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5] ==> [/usr/lib/gcc/x86_64-redhat-linux/4.8.5] + collapse library dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64] ==> [/usr/lib64] + collapse library dir [/lib/../lib64] ==> [/lib64] + collapse library dir [/usr/lib/../lib64] ==> [/usr/lib64] + collapse library dir [/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../..] ==> [/usr/lib] + implicit libs: [stdc++;m;c] + implicit dirs: [/usr/lib/gcc/x86_64-redhat-linux/4.8.5;/usr/lib64;/lib64;/usr/lib] + implicit fwks: [] + + diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/cmake.check_cache b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/cmake.check_cache new file mode 100644 index 00000000000..3dccd731726 --- /dev/null +++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/frame_config_test.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/frame_config_test.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/harq_test.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/harq_test.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pbch_test.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pbch_test.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pss_test.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pss_test.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pucch_uci_test.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pucch_uci_test.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/srs_test.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/srs_test.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/sss_test.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/sss_test.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c index 31fe15a6de8..12d50065fa8 100644 --- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c +++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c @@ -165,7 +165,7 @@ void common_pucch_configuration(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int pucch_in int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc) { int v_return = 0; - bool reset_harq = FALSE; + bool reset_harq = false; printf("%s", tst_separator); @@ -175,7 +175,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr common_pucch_configuration(ue, gNB_id, TST_PUCCH_COMMON_CONFIG_INDEX_KO); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) { v_return = -1; } @@ -186,7 +186,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr printf("\n => Test : Error due to acknownlegment not set \n"); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) { v_return = -1; } @@ -194,7 +194,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr printf("\n => Test : Error due to DAI not set \n"); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) { v_return = -1; } @@ -202,7 +202,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr harq_status->vDAI_DL = NR_DL_MAX_DAI + 1; - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) { v_return = -1; } @@ -210,7 +210,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr harq_status->vDAI_DL = 0; - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) { v_return = -1; } @@ -218,7 +218,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr harq_status->send_harq_status = 1; /* ack ready to be send */ - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) { v_return = -1; } @@ -228,7 +228,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr harq_status->vDAI_DL = 1; - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) { v_return = -1; } @@ -236,7 +236,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr printf("\n => Test : Error due to PUCCH format with multiple cells not already implemented \n"); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) { v_return = -1; } @@ -260,7 +260,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc) { int v_return = 0; - bool reset_harq = FALSE; + bool reset_harq = false; printf("%s", tst_separator); @@ -273,7 +273,7 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_ printf("\n => Test : PUCCH format from common config in prach mode: one positive downlink ACKnowledgment \n"); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { v_return = -1; } @@ -281,7 +281,7 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_ printf("\n => Test : PUCCH format from common config in prach mode: one negative downlink ACKnowledgment \n"); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { v_return = -1; } @@ -304,7 +304,7 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_ printf("\n => Test : PUCCH format from common config in dedicated mode: two positive downlink ACKnowledgments \n"); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { v_return = -1; } @@ -312,7 +312,7 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_ printf("\n => Test : PUCCH format from common config in dedicated mode: one positive and one negative downlink ACKnowledgments \n"); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { v_return = -1; } @@ -320,22 +320,22 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_ printf("\n => Test : PUCCH format from common config in dedicated mode: two negative downlink ACKnowledgments \n"); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { v_return = -1; } harq_status->ack = DL_ACK; - reset_harq = TRUE; + reset_harq = true; printf("\n => Test : PUCCH format from common config in dedicated mode: no resource is found \n"); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) { v_return = -1; } printf("\n => Test : PUCCH format from common config in dedicated mode: no PUCCH after reset of pending harq ACKnowledgments \n"); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) { v_return = -1; } @@ -362,7 +362,7 @@ void init_pucch_dedicated_configuration(PHY_VARS_NR_UE *ue, uint8_t gNB_id) int i,j; /* set cell group parameters which are supported */ - ue->cell_group_config.physicalCellGroupConfig.harq_ACK_SpatialBundlingPUCCH = FALSE; + ue->cell_group_config.physicalCellGroupConfig.harq_ACK_SpatialBundlingPUCCH = false; ue->cell_group_config.physicalCellGroupConfig.pdsch_HARQ_ACK_Codebook = dynamic; ue->PDSCH_ServingCellConfig.codeBlockGroupTransmission = NULL; @@ -554,7 +554,7 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id, #define TST_NB_STEP_SINGLE_TRANSPORT_BLOCK (4) int v_return = 0; - int reset_harq = FALSE; + int reset_harq = false; int dl_harq_pid[TST_NB_STEP_SINGLE_TRANSPORT_BLOCK] = {TST_DL_HARQ_PID_FIRST, TST_DL_HARQ_PID_SECOND, TST_DL_HARQ_PID_THIRD, TST_DL_HARQ_PID_FOURTH }; int pucch_resource_indicator[TST_NB_STEP_SINGLE_TRANSPORT_BLOCK][2] = { { 0, 4 }, { 1, 0 } , { 1, 3 } , { 5, 7 } }; NR_UE_HARQ_STATUS_t *harq_status; @@ -575,7 +575,7 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id, printf("\n => Test : PUCCH format from dedicated config : pucch resource indicator is invalid \n"); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) { v_return = -1; } @@ -595,14 +595,14 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id, /* reset ack context on last test */ if ((i == (TST_NB_STEP_SINGLE_TRANSPORT_BLOCK-1)) && (j == 1)) { - reset_harq = TRUE; + reset_harq = true; } harq_status->pucch_resource_indicator = pucch_resource_indicator[i][j]; printf("\n => Test : PUCCH format from dedicated config with 1 transport block : with %d downlink ACKnowledgments and pucch resource indicator %d \n", i+1, pucch_resource_indicator[i][j]); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { v_return = -1; } } @@ -627,11 +627,11 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id, harq_status->pucch_resource_indicator = pucch_resource_indicator[i][0]; } - reset_harq = TRUE; + reset_harq = true; printf("\n => Test : PUCCH format from dedicated config with 1 transport block and missed PDSCH : with %d downlink ACKnowledgments and pucch resource indicator %d \n", i+1, pucch_resource_indicator[3][0]); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { v_return = -1; } @@ -659,7 +659,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE #define TST_NB_STEP_TWO_TRANSPORT_BLOCKS (4) int v_return = 0; - int reset_harq = FALSE; + int reset_harq = false; int dl_harq_pid[TST_NB_STEP_TWO_TRANSPORT_BLOCKS] = {TST_DL_HARQ_PID_FIRST, TST_DL_HARQ_PID_SECOND, TST_DL_HARQ_PID_THIRD, TST_DL_HARQ_PID_FOURTH }; int pucch_resource_indicator[TST_NB_STEP_TWO_TRANSPORT_BLOCKS][2] = { { 0, 1 }, { 3, 7 } , { 2 , 4 } , { 4 , 6 } }; NR_UE_HARQ_STATUS_t *harq_status; @@ -694,7 +694,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE /* reset ack context on last test */ if ((i == (TST_NB_STEP_TWO_TRANSPORT_BLOCKS-1)) && (j == 1)) { - reset_harq = TRUE; + reset_harq = true; } harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack; @@ -703,7 +703,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE printf("\n => Test : PUCCH format from dedicated config with 2 transport blocks : with %d downlink ACKnowledgments and pucch resource indicator %d \n", i+1, pucch_resource_indicator[i][j]); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } @@ -714,7 +714,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE /* some transport blocks have been missed and they need to be nack by UE in order to be retransmitted by the network */ /* here first and third block receptions have been missed */ - reset_harq = TRUE; + reset_harq = true; for (int i = 1; i < TST_NB_STEP_TWO_TRANSPORT_BLOCKS; i = i + 1) { @@ -743,7 +743,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE printf("\n => Test : PUCCH format from dedicated config with 2 transport blocks and 1 missed PDSCH : with %d downlink ACKnowledgments and pucch resource indicator %d \n", 4, pucch_resource_indicator[3][0]); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } @@ -775,7 +775,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE } } - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } @@ -907,7 +907,7 @@ int test_sr_alone_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *p tst_scheduling_request_payload = 0; - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != FALSE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != false) { printf("Test fail \n"); v_return = -1; } @@ -916,7 +916,7 @@ int test_sr_alone_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *p tst_scheduling_request_payload = 1; - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } @@ -929,7 +929,7 @@ int test_sr_alone_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *p tst_scheduling_request_payload = 1; - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } @@ -958,7 +958,7 @@ int test_sr_alone_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *p int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc) { int v_return = 0; - int reset_harq = 0; + bool reset_harq = false; int sr_config_id = 0; int sr_resource_id = 0; int sr_offset = 0; @@ -988,7 +988,7 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro tst_scheduling_request_payload = 0; /* set sr payload */ - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } @@ -997,7 +997,7 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro tst_scheduling_request_payload = 1; /* set sr payload */ - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } @@ -1006,7 +1006,7 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro harq_status->pucch_resource_indicator = pucch_resource_indicator[1]; - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } @@ -1027,7 +1027,7 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro tst_scheduling_request_payload = 1; /* set sr payload */ - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } @@ -1035,9 +1035,9 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro printf("\n => Test : PUCCH format from dedicated config with a positive scheduling request and two positive acks \n"); harq_status->pucch_resource_indicator = pucch_resource_indicator[1]; - reset_harq = TRUE; + reset_harq = true; - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } @@ -1065,7 +1065,7 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc) { int v_return = 0; - int reset_harq = FALSE; + int reset_harq = false; int sr_config_id = 0; int sr_resource_id = 0; int sr_offset = 0; @@ -1079,7 +1079,7 @@ int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc) printf("\n => Test : PUCCH format from dedicated config with CSI alone \n"); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } @@ -1102,7 +1102,7 @@ int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc) ue->pucch_config_dedicated_nr[gNB_id].formatConfig[2-1]->simultaneousHARQ_ACK_CSI = enable_feature; /* format 2 */ - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } @@ -1115,9 +1115,9 @@ int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc) tst_scheduling_request_payload = 0; /* set sr payload */ - reset_harq = TRUE; + reset_harq = true; - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } @@ -1126,7 +1126,7 @@ int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc) harq_status->pucch_resource_indicator = pucch_resource_indicator[4]; - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } @@ -1135,7 +1135,7 @@ int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc) printf("\n => Test : PUCCH format from dedicated config with positive SR and CSI \n"); - if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != TRUE) { + if (pucch_procedures_ue_nr(ue, gNB_id, proc, reset_harq) != true) { printf("Test fail \n"); v_return = -1; } diff --git a/openair1/SIMULATION/TOOLS/rangen_double.c b/openair1/SIMULATION/TOOLS/rangen_double.c index 82b1557a5bf..0ba9e196b13 100644 --- a/openair1/SIMULATION/TOOLS/rangen_double.c +++ b/openair1/SIMULATION/TOOLS/rangen_double.c @@ -42,7 +42,6 @@ void randominit(unsigned seed_init) { int i; // this need to be integrated with the existing rng, like taus: navid - printf("Initializing random number generator, seed %x\n",seed_init); if (seed_init == 0) { srand((unsigned)time(NULL)); @@ -51,6 +50,7 @@ void randominit(unsigned seed_init) } else { seed = seed_init; } + printf("Initializing random number generator, seed %x\n",seed); if (seed % 2 == 0) seed += 1; /* seed and mod are relative prime */ diff --git a/openair2/COMMON/commonDef.h b/openair2/COMMON/commonDef.h index b37230cdd45..e18db881f04 100644 --- a/openair2/COMMON/commonDef.h +++ b/openair2/COMMON/commonDef.h @@ -43,27 +43,6 @@ Description Contains global common definitions #include <stddef.h> #include <stdbool.h> -/* boolean_t is also defined in openair2/COMMON/platform_types.h - * let's protect potential redefinition - */ - -#ifndef _BOOLEAN_T_DEFINED_ -#define _BOOLEAN_T_DEFINED_ - -typedef signed char boolean_t; - -#if !defined(TRUE) -#define TRUE (boolean_t)0x01 -#endif - -#if !defined(FALSE) -#define FALSE (boolean_t)0x00 -#endif - -#define BOOL_NOT(b) (b^TRUE) - -#endif /* _BOOLEAN_T_DEFINED_ */ - #define NAS_UE_ID_FMT "0x%06x" /****************************************************************************/ diff --git a/openair2/COMMON/f1ap_messages_def.h b/openair2/COMMON/f1ap_messages_def.h index 0e857f3a83c..f28e0e5ddfc 100644 --- a/openair2/COMMON/f1ap_messages_def.h +++ b/openair2/COMMON/f1ap_messages_def.h @@ -46,6 +46,8 @@ MESSAGE_DEF(F1AP_DL_RRC_MESSAGE , MESSAGE_PRIORITY_MED, f1ap_dl_rrc //MESSAGE_DEF(F1AP_INITIAL_CONTEXT_SETUP_REQ , MESSAGE_PRIORITY_MED, f1ap_initial_context_setup_req_t , f1ap_initial_context_setup_req ) MESSAGE_DEF(F1AP_UE_CONTEXT_SETUP_REQ, MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_t, f1ap_ue_context_setup_req) MESSAGE_DEF(F1AP_UE_CONTEXT_SETUP_RESP, MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_t, f1ap_ue_context_setup_resp) +MESSAGE_DEF(F1AP_UE_CONTEXT_MODIFICATION_REQ, MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_t, f1ap_ue_context_modification_req) +MESSAGE_DEF(F1AP_UE_CONTEXT_MODIFICATION_RESP, MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_t, f1ap_ue_context_modification_resp) diff --git a/openair2/COMMON/f1ap_messages_types.h b/openair2/COMMON/f1ap_messages_types.h index cb1a8c95777..ae050e2bc2b 100644 --- a/openair2/COMMON/f1ap_messages_types.h +++ b/openair2/COMMON/f1ap_messages_types.h @@ -39,15 +39,15 @@ #define F1AP_INITIAL_UL_RRC_MESSAGE(mSGpTR) (mSGpTR)->ittiMsg.f1ap_initial_ul_rrc_message #define F1AP_UL_RRC_MESSAGE(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ul_rrc_message #define F1AP_UE_CONTEXT_SETUP_REQ(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_setup_req -#define F1AP_UE_CONTEXT_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_setup_resp +#define F1AP_UE_CONTEXT_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_setup_resp #define F1AP_UE_CONTEXT_RELEASE_RESP(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_release_resp +#define F1AP_UE_CONTEXT_MODIFICATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_req #define F1AP_UE_CONTEXT_MODIFICATION_RESP(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_resp #define F1AP_UE_CONTEXT_MODIFICATION_FAIL(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_fail #define F1AP_DL_RRC_MESSAGE(mSGpTR) (mSGpTR)->ittiMsg.f1ap_dl_rrc_message #define F1AP_UE_CONTEXT_RELEASE_REQ(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_release_req #define F1AP_UE_CONTEXT_RELEASE_CMD(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_release_req -#define F1AP_UE_CONTEXT_MODIFICATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_req /* Length of the transport layer address string * 160 bits / 8 bits by char. @@ -60,7 +60,9 @@ #define F1AP_MAX_NB_CELLS 2 #define F1AP_MAX_NO_OF_TNL_ASSOCIATIONS 32 -#define F1AP_MAX_NO_UE_ID 1024 +#define F1AP_MAX_NO_UE_ID 1024 +#define F1AP_MAX_DU2CU_RRC_LENGTH 1024 + typedef struct f1ap_net_ip_address_s { unsigned ipv4:1; unsigned ipv6:1; @@ -307,7 +309,7 @@ typedef struct f1ap_initial_ul_rrc_message_s { uint16_t crnti; uint8_t *rrc_container; int rrc_container_length; - char du2cu_rrc_container[200]; + char du2cu_rrc_container[F1AP_MAX_DU2CU_RRC_LENGTH]; int du2cu_rrc_container_length; } f1ap_initial_ul_rrc_message_t; @@ -343,6 +345,35 @@ typedef struct f1ap_rb_failed_to_be_setup_s { long rb_id; } f1ap_rb_failed_to_be_setup_t; +typedef struct cu_to_du_rrc_information_s { + uint8_t * cG_ConfigInfo; + uint32_t cG_ConfigInfo_length; + uint8_t * uE_CapabilityRAT_ContainerList; + uint32_t uE_CapabilityRAT_ContainerList_length; + uint8_t * measConfig; + uint32_t measConfig_length; +}cu_to_du_rrc_information_t; + +typedef struct du_to_du_rrc_information_s { + uint8_t * cellGroupConfig; + uint8_t cellGroupConfig_length; + uint8_t * measGapConfig; + uint8_t measGapConfig_length; + uint8_t * requestedP_MaxFR1; + uint8_t requestedP_MaxFR1_length; +}du_to_cu_rrc_information_t; + +typedef enum QoS_information_e { + NG_RAN_QoS = 0, + EUTRAN_QoS = 1, +} QoS_information_t; + +typedef enum ReconfigurationCompl_e { + RRCreconf_info_not_present = 0, + RRCreconf_failure = 1, + RRCreconf_success = 2, +} ReconfigurationCompl_t; + typedef struct f1ap_ue_context_setup_s { uint32_t gNB_CU_ue_id; // BK: need to replace by use from rnti uint32_t gNB_DU_ue_id; @@ -355,40 +386,27 @@ typedef struct f1ap_ue_context_setup_s { uint8_t servCellIndex; uint8_t *cellULConfigured; uint32_t servCellId; - uint8_t *cu_to_du_rrc_information; + cu_to_du_rrc_information_t *cu_to_du_rrc_information; uint8_t cu_to_du_rrc_information_length; - uint8_t *du_to_cu_rrc_information; - uint8_t du_to_cu_rrc_information_length; - f1ap_drb_to_be_setup_t *drbs_to_be_setup; // BK: need to replace by s1ap_initial_context_setup_req - uint8_t drbs_to_be_setup_length; // BK: need to replace by s1ap_initial_context_setup_req + //uint8_t *du_to_cu_rrc_information; + du_to_cu_rrc_information_t *du_to_cu_rrc_information; + uint32_t du_to_cu_rrc_information_length; + f1ap_drb_to_be_setup_t *drbs_to_be_setup; + uint8_t drbs_to_be_setup_length; + f1ap_drb_to_be_setup_t *drbs_to_be_modified; + uint8_t drbs_to_be_modified_length; + QoS_information_t QoS_information_type; uint8_t drbs_failed_to_be_setup_length; f1ap_rb_failed_to_be_setup_t *drbs_failed_to_be_setup; f1ap_srb_to_be_setup_t *srbs_to_be_setup; uint8_t srbs_to_be_setup_length; uint8_t srbs_failed_to_be_setup_length; f1ap_rb_failed_to_be_setup_t *srbs_failed_to_be_setup; - s1ap_initial_context_setup_req_t *s1ap_initial_context_setup_req; - // coniatner for the rrc_eNB_generate_SecurityModeCommand message + ReconfigurationCompl_t ReconfigComplOutcome; uint8_t *rrc_container; int rrc_container_length; } f1ap_ue_context_setup_t; -typedef struct f1ap_ue_context_setup_resp_s { - uint32_t gNB_CU_ue_id; // BK: need to replace by use from rnti - uint32_t gNB_DU_ue_id; - uint16_t rnti; - uint8_t du_to_cu_rrc_information[1024 /*Arbitrarily big enough*/]; - uint32_t du_to_cu_rrc_information_length; - f1ap_drb_to_be_setup_t *drbs_setup; // BK: need to replace by s1ap_initial_context_setup_req - uint8_t drbs_setup_length; // BK: need to replace by s1ap_initial_context_setup_req - f1ap_srb_to_be_setup_t *srbs_setup; - uint8_t srbs_setup_length; - uint8_t srbs_failed_to_be_setup_length; - f1ap_rb_failed_to_be_setup_t *srbs_failed_to_be_setup; - uint8_t drbs_failed_to_be_setup_length; - f1ap_rb_failed_to_be_setup_t *drbs_failed_to_be_setup; -} f1ap_ue_context_setup_resp_t; - typedef enum F1ap_Cause_e { F1AP_CAUSE_NOTHING, /* No components present */ F1AP_CAUSE_RADIO_NETWORK, diff --git a/openair2/COMMON/gtpv1_u_messages_def.h b/openair2/COMMON/gtpv1_u_messages_def.h index 44e9d4fbdf2..e0e5db5b7f7 100644 --- a/openair2/COMMON/gtpv1_u_messages_def.h +++ b/openair2/COMMON/gtpv1_u_messages_def.h @@ -27,4 +27,5 @@ MESSAGE_DEF(GTPV1U_ENB_END_MARKER_REQ, MESSAGE_PRIORITY_MED, gtpv1u_enb_end MESSAGE_DEF(GTPV1U_ENB_END_MARKER_IND, MESSAGE_PRIORITY_MED, gtpv1u_enb_end_marker_ind_t, Gtpv1uEndMarkerInd) MESSAGE_DEF(GTPV1U_REQ, MESSAGE_PRIORITY_MED, Gtpv1uReq, gtpv1uReq) -MESSAGE_DEF(GTPV1U_GNB_TUNNEL_DATA_REQ, MESSAGE_PRIORITY_MED, gtpv1u_gnb_tunnel_data_req_t, NRGtpv1uTunnelDataReq) +MESSAGE_DEF(GTPV1U_GNB_TUNNEL_DATA_REQ, MESSAGE_PRIORITY_MED, gtpv1u_gnb_tunnel_data_req_t, NRGtpv1uTunnelDataReq) +MESSAGE_DEF(GTPV1U_DU_BUFFER_REPORT_REQ, MESSAGE_PRIORITY_MED, gtpv1u_DU_buffer_report_req_t, NRGtpv1uBufferReportReq) diff --git a/openair2/COMMON/gtpv1_u_messages_types.h b/openair2/COMMON/gtpv1_u_messages_types.h index 096f0f46972..7758395ee43 100644 --- a/openair2/COMMON/gtpv1_u_messages_types.h +++ b/openair2/COMMON/gtpv1_u_messages_types.h @@ -39,6 +39,8 @@ #define GTPV1U_GNB_TUNNEL_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.NRGtpv1uTunnelDataReq +#define GTPV1U_DU_BUFFER_REPORT_REQ(mSGpTR) (mSGpTR)->ittiMsg.NRGtpv1uBufferReportReq + #define GTPV1U_ALL_TUNNELS_TEID (teid_t)0xFFFFFFFF typedef struct gtpv1u_enb_create_x2u_tunnel_req_s { @@ -179,6 +181,7 @@ typedef struct gtpv1u_gnb_create_tunnel_req_s { int num_tunnels; //teid_t upf_NGu_teid[NR_GTPV1U_MAX_BEARERS_PER_UE]; ///< Tunnel Endpoint Identifier teid_t outgoing_teid[NR_GTPV1U_MAX_BEARERS_PER_UE]; + int outgoing_qfi[NR_GTPV1U_MAX_BEARERS_PER_UE]; pdusessionid_t pdusession_id[NR_GTPV1U_MAX_BEARERS_PER_UE]; ebi_t incoming_rb_id[NR_GTPV1U_MAX_BEARERS_PER_UE]; //ebi_t outgoing_rb_id[NR_GTPV1U_MAX_BEARERS_PER_UE]; @@ -213,4 +216,10 @@ typedef struct gtpv1u_gnb_tunnel_data_req_s { pdusessionid_t pdusession_id; } gtpv1u_gnb_tunnel_data_req_t; +typedef struct gtpv1u_DU_buffer_report_req_s { + uint32_t buffer_availability; + rnti_t rnti; + pdusessionid_t pdusession_id; +} gtpv1u_DU_buffer_report_req_t; + #endif /* GTPV1_U_MESSAGES_TYPES_H_ */ diff --git a/openair2/COMMON/mac_messages_types.h b/openair2/COMMON/mac_messages_types.h index cad7b9f172b..e43d0007e73 100644 --- a/openair2/COMMON/mac_messages_types.h +++ b/openair2/COMMON/mac_messages_types.h @@ -58,7 +58,7 @@ // Some constants from "LAYER2/MAC/defs.h" #define BCCH_SDU_SIZE (512) #define BCCH_SDU_MBMS_SIZE (512) -#define CCCH_SDU_SIZE (512) +#define CCCH_SDU_SIZE (1024) #define MCCH_SDU_SIZE (512) #define PCCH_SDU_SIZE (512) diff --git a/openair2/COMMON/mac_rlc_primitives.h b/openair2/COMMON/mac_rlc_primitives.h index 4e3e22781c5..3d6dcc81003 100644 --- a/openair2/COMMON/mac_rlc_primitives.h +++ b/openair2/COMMON/mac_rlc_primitives.h @@ -145,7 +145,7 @@ struct mac_tx_tb_management { struct mac_rx_tb_management { unsigned char *data_ptr; tb_size_t tb_size; // in bits - boolean_t valid_checksum; + bool valid_checksum; unsigned char first_bit; // 0 if data starts on byte boundary(b7), 1 if b6, 2 if b5, etc }; diff --git a/openair2/COMMON/platform_types.h b/openair2/COMMON/platform_types.h index 67300da308b..f2297219936 100644 --- a/openair2/COMMON/platform_types.h +++ b/openair2/COMMON/platform_types.h @@ -32,35 +32,12 @@ #if !defined(NAS_NETLINK) #include <stdint.h> +#include <stdbool.h> #else #include <linux/types.h> typedef void * intptr_t; #endif -//----------------------------------------------------------------------------- -// GENERIC TYPES -//----------------------------------------------------------------------------- - -/* boolean_t is also defined in openair2/COMMON/commonDef.h, - * let's protect potential redefinition - */ -#ifndef _BOOLEAN_T_DEFINED_ - #define _BOOLEAN_T_DEFINED_ - - typedef signed char boolean_t; - - #if !defined(TRUE) - #define TRUE (boolean_t)0x01 - #endif - - #if !defined(FALSE) - #define FALSE (boolean_t)0x00 - #endif - - #define BOOL_NOT(b) (b^TRUE) - -#endif /* _BOOLEAN_T_DEFINED_ */ - //----------------------------------------------------------------------------- // GENERIC ACCESS STRATUM TYPES //----------------------------------------------------------------------------- @@ -77,25 +54,25 @@ typedef int16_t smodule_id_t; typedef long rb_id_t; typedef long srb_id_t; -typedef boolean_t MBMS_flag_t; -#define MBMS_FLAG_NO FALSE -#define MBMS_FLAG_YES TRUE +typedef bool MBMS_flag_t; +#define MBMS_FLAG_NO false +#define MBMS_FLAG_YES true -typedef boolean_t eNB_flag_t; -#define ENB_FLAG_NO FALSE -#define ENB_FLAG_YES TRUE +typedef bool eNB_flag_t; +#define ENB_FLAG_NO false +#define ENB_FLAG_YES true -typedef boolean_t gNB_flag_t; -#define GNB_FLAG_NO FALSE -#define GNB_FLAG_YES TRUE +typedef bool gNB_flag_t; +#define GNB_FLAG_NO false +#define GNB_FLAG_YES true -typedef boolean_t srb_flag_t; -#define SRB_FLAG_NO FALSE -#define SRB_FLAG_YES TRUE +typedef bool srb_flag_t; +#define SRB_FLAG_NO false +#define SRB_FLAG_YES true -typedef boolean_t sl_discovery_flag_t; -#define SL_DISCOVERY_FLAG_NO FALSE -#define SL_DISCOVERY_FLAG_YES TRUE +typedef bool sl_discovery_flag_t; +#define SL_DISCOVERY_FLAG_NO false +#define SL_DISCOVERY_FLAG_YES true typedef enum link_direction_e { UNKNOWN_DIR = 0, @@ -152,8 +129,8 @@ typedef uint16_t rlc_usn_t; typedef int32_t rlc_buffer_occupancy_t; typedef signed int rlc_op_status_t; -#define SDU_CONFIRM_NO FALSE -#define SDU_CONFIRM_YES TRUE +#define SDU_CONFIRM_NO false +#define SDU_CONFIRM_YES true //----------------------------------------------------------------------------- // PDCP TYPES //----------------------------------------------------------------------------- @@ -242,7 +219,7 @@ typedef struct protocol_ctxt_s { frame_t frame; /*!< \brief LTE frame number.*/ sub_frame_t subframe; /*!< \brief LTE sub frame number.*/ eNB_index_t eNB_index; /*!< \brief valid for UE indicating the index of connected eNB(s) */ - boolean_t brOption; + bool brOption; } protocol_ctxt_t; // warning time hardcoded #define PROTOCOL_CTXT_TIME_MILLI_SECONDS(CtXt_h) ((CtXt_h)->frame*10+(CtXt_h)->subframe) diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h index 5b214cf95a9..18e7c4bd18b 100644 --- a/openair2/COMMON/rrc_messages_types.h +++ b/openair2/COMMON/rrc_messages_types.h @@ -167,7 +167,7 @@ typedef struct RadioResourceConfig_s { long ue_TransmissionMode; long ue_multiple_max; //SIB2 BR Options - long *preambleTransMax_CE_r13; + long preambleTransMax_CE_r13; BOOLEAN_t prach_ConfigCommon_v1310; BOOLEAN_t *mpdcch_startSF_CSS_RA_r13; long mpdcch_startSF_CSS_RA_r13_val; @@ -417,7 +417,6 @@ typedef struct NRRrcConfigurationReq_s { uint8_t num_plmn; NR_ServingCellConfigCommon_t *scc; NR_ServingCellConfig_t *scd; - int ssb_SubcarrierOffset; int sib1_tda; rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts; int pusch_AntennaPorts; diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index f4550f63a15..00ffd4cc134 100644 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -583,9 +583,9 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n", RC.config_file_name, i, ENB_CONFIG_STRING_PRACH_HIGH_SPEED); else if (strcmp(ccparams_lte.prach_high_speed, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].prach_high_speed = TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].prach_high_speed = true; } else if (strcmp(ccparams_lte.prach_high_speed, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].prach_high_speed = FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].prach_high_speed = false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for prach_config choice: ENABLE,DISABLE !\n", @@ -689,9 +689,9 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n", RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_ENABLE64QAM); else if (strcmp(ccparams_lte.pusch_enable64QAM, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_enable64QAM = TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_enable64QAM = true; } else if (strcmp(ccparams_lte.pusch_enable64QAM, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_enable64QAM = FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_enable64QAM = false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_enable64QAM choice: ENABLE,DISABLE!\n", @@ -702,9 +702,9 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n", RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN); else if (strcmp(ccparams_lte.pusch_groupHoppingEnabled, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_groupHoppingEnabled = TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_groupHoppingEnabled = true; } else if (strcmp(ccparams_lte.pusch_groupHoppingEnabled, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_groupHoppingEnabled= FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_groupHoppingEnabled= false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_groupHoppingEnabled choice: ENABLE,DISABLE!\n", @@ -723,9 +723,9 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { "Failed to parse eNB configuration file %s, enb %u define %s: ENABLE,DISABLE!\n", RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN); else if (strcmp(ccparams_lte.pusch_sequenceHoppingEnabled, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_sequenceHoppingEnabled = TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_sequenceHoppingEnabled = true; } else if (strcmp(ccparams_lte.pusch_sequenceHoppingEnabled, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_sequenceHoppingEnabled = FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].pusch_sequenceHoppingEnabled = false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for pusch_sequenceHoppingEnabled choice: ENABLE,DISABLE!\n", @@ -766,15 +766,15 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].phich_duration,ccparams_lte.phich_duration); if (strcmp(ccparams_lte.srs_enable, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_enable= TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_enable= true; } else if (strcmp(ccparams_lte.srs_enable, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_enable= FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_enable= false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", RC.config_file_name, i, ccparams_lte.srs_enable); - if (RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_enable== TRUE) { + if (RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_enable== true) { RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_BandwidthConfig= ccparams_lte.srs_BandwidthConfig; if ((ccparams_lte.srs_BandwidthConfig < 0) || @@ -791,18 +791,18 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { RC.config_file_name, i, ccparams_lte.srs_SubframeConfig); if (strcmp(ccparams_lte.srs_ackNackST, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_ackNackST= TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_ackNackST= true; } else if (strcmp(ccparams_lte.srs_ackNackST, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_ackNackST= FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_ackNackST= false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", RC.config_file_name, i, ccparams_lte.srs_ackNackST); if (strcmp(ccparams_lte.srs_MaxUpPts, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_MaxUpPts= TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_MaxUpPts= true; } else if (strcmp(ccparams_lte.srs_MaxUpPts, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_MaxUpPts= FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].srs_MaxUpPts= false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for srs_MaxUpPts choice: ENABLE,DISABLE !\n", @@ -921,7 +921,7 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { RC.config_file_name, i, ccparams_lte.rach_numberOfRA_Preambles); if (strcmp(ccparams_lte.rach_preamblesGroupAConfig, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].rach_preamblesGroupAConfig= TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].rach_preamblesGroupAConfig= true; RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].rach_sizeOfRA_PreamblesGroupA= (ccparams_lte.rach_sizeOfRA_PreamblesGroupA/4)-1; if ((ccparams_lte.rach_numberOfRA_Preambles <4) || @@ -976,7 +976,7 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for rach_messagePowerOffsetGroupB choice: minusinfinity,dB0,dB5,dB8,dB10,dB12,dB15,dB18!\n", RC.config_file_name, i, ccparams_lte.rach_messagePowerOffsetGroupB); } else if (strcmp(ccparams_lte.rach_preamblesGroupAConfig, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].rach_preamblesGroupAConfig= FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].rach_preamblesGroupAConfig= false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for rach_preamblesGroupAConfig choice: ENABLE,DISABLE !\n", @@ -1254,9 +1254,9 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { "Failed to parse eNB configuration file %s, enb %u define %s: TRUE,FALSE!\n", RC.config_file_name, i, ENB_CONFIG_STRING_MBMS_DEDICATED_SERVING_CELL); else if (strcmp(ccparams_lte.mbms_dedicated_serving_cell, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].mbms_dedicated_serving_cell = TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].mbms_dedicated_serving_cell = true; } else if (strcmp(ccparams_lte.mbms_dedicated_serving_cell, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].mbms_dedicated_serving_cell = FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig[j].mbms_dedicated_serving_cell = false; } else { AssertFatal (0, "Failed to parse eNB configuration file %s, enb %u unknown value \"%s\" for mbms_dedicated_serving_cell choice: TRUE or FALSE !\n", diff --git a/openair2/ENB_APP/enb_config_eMTC.c b/openair2/ENB_APP/enb_config_eMTC.c index cfd057bad8d..e4ff458886b 100644 --- a/openair2/ENB_APP/enb_config_eMTC.c +++ b/openair2/ENB_APP/enb_config_eMTC.c @@ -61,18 +61,18 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in if (!strcmp(eMTCconfig->cellSelectionInfoCE_r13, "ENABLE")) { - RRC_CONFIGURATION_REQ(msg_p).cellSelectionInfoCE_r13[cc_idx] = TRUE; + RRC_CONFIGURATION_REQ(msg_p).cellSelectionInfoCE_r13[cc_idx] = true; RRC_CONFIGURATION_REQ(msg_p).q_RxLevMinCE_r13[cc_idx]= eMTCconfig->q_RxLevMinCE_r13; // RRC_CONFIGURATION_REQ(msg_p).q_QualMinRSRQ_CE_r13[cc_idx]= calloc(1, sizeof(long)); // *RRC_CONFIGURATION_REQ(msg_p).q_QualMinRSRQ_CE_r13[cc_idx]= q_QualMinRSRQ_CE_r13; } else { - RRC_CONFIGURATION_REQ(msg_p).cellSelectionInfoCE_r13[cc_idx] = FALSE; + RRC_CONFIGURATION_REQ(msg_p).cellSelectionInfoCE_r13[cc_idx] = false; } if (!strcmp(eMTCconfig->bandwidthReducedAccessRelatedInfo_r13, "ENABLE")) { - RRC_CONFIGURATION_REQ(msg_p).bandwidthReducedAccessRelatedInfo_r13[cc_idx] = TRUE; + RRC_CONFIGURATION_REQ(msg_p).bandwidthReducedAccessRelatedInfo_r13[cc_idx] = true; @@ -106,7 +106,7 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in } } else { - RRC_CONFIGURATION_REQ(msg_p).bandwidthReducedAccessRelatedInfo_r13[cc_idx] = FALSE; + RRC_CONFIGURATION_REQ(msg_p).bandwidthReducedAccessRelatedInfo_r13[cc_idx] = false; } char schedulingInfoBrPath[MAX_OPTNAME_SIZE * 2]; @@ -127,10 +127,10 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in RRC_CONFIGURATION_REQ(msg_p).fdd_DownlinkOrTddSubframeBitmapBR_r13[cc_idx] = CALLOC(1, sizeof(BOOLEAN_t)); if (!strcmp(eMTCconfig->fdd_DownlinkOrTddSubframeBitmapBR_r13, "subframePattern40-r13")) { - *RRC_CONFIGURATION_REQ(msg_p).fdd_DownlinkOrTddSubframeBitmapBR_r13[cc_idx] = FALSE; + *RRC_CONFIGURATION_REQ(msg_p).fdd_DownlinkOrTddSubframeBitmapBR_r13[cc_idx] = false; RRC_CONFIGURATION_REQ(msg_p).fdd_DownlinkOrTddSubframeBitmapBR_val_r13[cc_idx] = eMTCconfig->fdd_DownlinkOrTddSubframeBitmapBR_val_r13; } else { - *RRC_CONFIGURATION_REQ(msg_p).fdd_DownlinkOrTddSubframeBitmapBR_r13[cc_idx] = TRUE; + *RRC_CONFIGURATION_REQ(msg_p).fdd_DownlinkOrTddSubframeBitmapBR_r13[cc_idx] = true; RRC_CONFIGURATION_REQ(msg_p).fdd_DownlinkOrTddSubframeBitmapBR_val_r13[cc_idx] = eMTCconfig->fdd_DownlinkOrTddSubframeBitmapBR_val_r13; } @@ -156,18 +156,18 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in if (!strcmp(eMTCconfig->freqHoppingParametersDL_r13, "ENABLE")) { - RRC_CONFIGURATION_REQ(msg_p).freqHoppingParametersDL_r13[cc_idx] = TRUE; + RRC_CONFIGURATION_REQ(msg_p).freqHoppingParametersDL_r13[cc_idx] = true; if (!strcmp(eMTCconfig->interval_DLHoppingConfigCommonModeA_r13, "interval-TDD-r13")) - RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeA_r13[cc_idx] = FALSE; + RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeA_r13[cc_idx] = false; else - RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeA_r13[cc_idx] = TRUE; + RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeA_r13[cc_idx] = true; RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeA_r13_val[cc_idx] = eMTCconfig->interval_DLHoppingConfigCommonModeA_r13_val; if (!strcmp(eMTCconfig->interval_DLHoppingConfigCommonModeB_r13, "interval-TDD-r13")) - RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeB_r13[cc_idx] = FALSE; + RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeB_r13[cc_idx] = false; else - RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeB_r13[cc_idx] = TRUE; + RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeB_r13[cc_idx] = true; RRC_CONFIGURATION_REQ(msg_p).interval_DLHoppingConfigCommonModeB_r13_val[cc_idx] = eMTCconfig->interval_DLHoppingConfigCommonModeB_r13_val; RRC_CONFIGURATION_REQ(msg_p).mpdcch_pdsch_HoppingNB_r13[cc_idx] = calloc(1, sizeof(long)); @@ -188,7 +188,7 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in } else { - RRC_CONFIGURATION_REQ(msg_p).freqHoppingParametersDL_r13[cc_idx] = FALSE; + RRC_CONFIGURATION_REQ(msg_p).freqHoppingParametersDL_r13[cc_idx] = false; } /** ------------------------------SIB2/3 BR------------------------------------------ */ @@ -213,9 +213,9 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", config_fname, cell_idx,ENB_CONFIG_STRING_PRACH_HIGH_SPEED); else if (strcmp(eMTCconfig->ccparams.prach_high_speed, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].prach_high_speed = TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].prach_high_speed = true; } else if (strcmp(eMTCconfig->ccparams.prach_high_speed, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].prach_high_speed = FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].prach_high_speed = false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prach_config choice: ENABLE,DISABLE !\n", @@ -310,9 +310,9 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", config_fname, cell_idx,ENB_CONFIG_STRING_PUSCH_ENABLE64QAM); else if (strcmp(eMTCconfig->ccparams.pusch_enable64QAM, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_enable64QAM = TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_enable64QAM = true; } else if (strcmp(eMTCconfig->ccparams.pusch_enable64QAM, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_enable64QAM = FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_enable64QAM = false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_enable64QAM choice: ENABLE,DISABLE!\n", @@ -323,9 +323,9 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", config_fname, cell_idx,ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN); else if (strcmp(eMTCconfig->ccparams.pusch_groupHoppingEnabled, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_groupHoppingEnabled = TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_groupHoppingEnabled = true; } else if (strcmp(eMTCconfig->ccparams.pusch_groupHoppingEnabled, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_groupHoppingEnabled= FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_groupHoppingEnabled= false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_groupHoppingEnabled choice: ENABLE,DISABLE!\n", @@ -343,9 +343,9 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", config_fname, cell_idx,ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN); else if (strcmp(eMTCconfig->ccparams.pusch_sequenceHoppingEnabled, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_sequenceHoppingEnabled = TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_sequenceHoppingEnabled = true; } else if (strcmp(eMTCconfig->ccparams.pusch_sequenceHoppingEnabled, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_sequenceHoppingEnabled = FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pusch_sequenceHoppingEnabled = false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_sequenceHoppingEnabled choice: ENABLE,DISABLE!\n", @@ -385,15 +385,15 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].phich_duration,eMTCconfig->ccparams.phich_duration); if (strcmp(eMTCconfig->ccparams.srs_enable, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_enable= TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_enable= true; } else if (strcmp(eMTCconfig->ccparams.srs_enable, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_enable= FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_enable= false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", config_fname, cell_idx,eMTCconfig->ccparams.srs_enable); - if (RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_enable== TRUE) { + if (RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_enable== true) { RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_BandwidthConfig= eMTCconfig->ccparams.srs_BandwidthConfig; if ((eMTCconfig->ccparams.srs_BandwidthConfig < 0) || (eMTCconfig->ccparams.srs_BandwidthConfig >7)) @@ -408,18 +408,18 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in config_fname, cell_idx,eMTCconfig->ccparams.srs_SubframeConfig); if (strcmp(eMTCconfig->ccparams.srs_ackNackST, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_ackNackST= TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_ackNackST= true; } else if (strcmp(eMTCconfig->ccparams.srs_ackNackST, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_ackNackST= FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_ackNackST= false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", config_fname, cell_idx,eMTCconfig->ccparams.srs_ackNackST); if (strcmp(eMTCconfig->ccparams.srs_MaxUpPts, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_MaxUpPts= TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_MaxUpPts= true; } else if (strcmp(eMTCconfig->ccparams.srs_MaxUpPts, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_MaxUpPts= FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].srs_MaxUpPts= false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_MaxUpPts choice: ENABLE,DISABLE !\n", @@ -535,7 +535,7 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in config_fname, cell_idx,eMTCconfig->ccparams.rach_numberOfRA_Preambles); if (strcmp(eMTCconfig->ccparams.rach_preamblesGroupAConfig, "ENABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].rach_preamblesGroupAConfig= TRUE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].rach_preamblesGroupAConfig= true; RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].rach_sizeOfRA_PreamblesGroupA= (eMTCconfig->ccparams.rach_sizeOfRA_PreamblesGroupA/4)-1; if ((eMTCconfig->ccparams.rach_numberOfRA_Preambles <4) || (eMTCconfig->ccparams.rach_numberOfRA_Preambles>60) || ((eMTCconfig->ccparams.rach_numberOfRA_Preambles&3)!=0)) @@ -588,7 +588,7 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_messagePowerOffsetGroupB choice: minusinfinity,dB0,dB5,dB8,dB10,dB12,dB15,dB18!\n", config_fname, cell_idx,eMTCconfig->ccparams.rach_messagePowerOffsetGroupB); } else if (strcmp(eMTCconfig->ccparams.rach_preamblesGroupAConfig, "DISABLE") == 0) { - RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].rach_preamblesGroupAConfig= FALSE; + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].rach_preamblesGroupAConfig= false; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_preamblesGroupAConfig choice: ENABLE,DISABLE !\n", @@ -681,6 +681,58 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_maxHARQ_Msg3Tx choice: 1..8!\n", config_fname, cell_idx,eMTCconfig->ccparams.rach_maxHARQ_Msg3Tx); + switch (eMTCconfig->preambleTransMax_CE_r13) { + case 3: + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n3; + break; + + case 4: + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n4; + break; + + case 5: + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n5; + break; + + case 6: + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n6; + break; + + case 7: + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n7; + break; + + case 8: + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n8; + break; + + case 10: + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n10; + break; + + case 20: + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n20; + break; + + case 50: + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n50; + break; + + case 100: + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n100; + break; + + case 200: + RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].preambleTransMax_CE_r13= LTE_PreambleTransMax_n200; + break; + + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleTransMax_CE_r13 choice: 3,4,5,6,7,8,10,20,50,100,200!\n", + config_fname, cell_idx,eMTCconfig->preambleTransMax_CE_r13); + break; + } + switch (eMTCconfig->ccparams.pcch_defaultPagingCycle) { case 32: RRC_CONFIGURATION_REQ (msg_p).radioresourceconfig_BR[cc_idx].pcch_defaultPagingCycle= LTE_PCCH_Config__defaultPagingCycle_rf32; @@ -795,14 +847,14 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in if (!strcmp(eMTCconfig->prach_ConfigCommon_v1310, "ENABLE")) { - RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].prach_ConfigCommon_v1310 = TRUE; + RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].prach_ConfigCommon_v1310 = true; RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].mpdcch_startSF_CSS_RA_r13 = calloc(1, sizeof(BOOLEAN_t)); if (!strcmp(eMTCconfig->mpdcch_startSF_CSS_RA_r13, "tdd-r13")) { - *RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].mpdcch_startSF_CSS_RA_r13 = FALSE; + *RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].mpdcch_startSF_CSS_RA_r13 = false; } else { - *RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].mpdcch_startSF_CSS_RA_r13 = TRUE; + *RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].mpdcch_startSF_CSS_RA_r13 = true; } if (!strcmp(eMTCconfig->mpdcch_startSF_CSS_RA_r13_val, "v1")) { @@ -830,7 +882,7 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].prach_HoppingOffset_r13 = calloc(1, sizeof(long)); *RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].prach_HoppingOffset_r13 = eMTCconfig->prach_HoppingOffset_r13; } else { - RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].prach_ConfigCommon_v1310 = FALSE; + RRC_CONFIGURATION_REQ(msg_p).radioresourceconfig_BR[cc_idx].prach_ConfigCommon_v1310 = false; } @@ -1117,7 +1169,7 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in /** PCCH CONFIG V1310 */ - RRC_CONFIGURATION_REQ(msg_p).pcch_config_v1310[cc_idx] = TRUE; + RRC_CONFIGURATION_REQ(msg_p).pcch_config_v1310[cc_idx] = true; RRC_CONFIGURATION_REQ(msg_p).paging_narrowbands_r13[cc_idx] = eMTCconfig->paging_narrowbands_r13; RRC_CONFIGURATION_REQ(msg_p).mpdcch_numrepetition_paging_r13[cc_idx] = eMTCconfig->mpdcch_numrepetition_paging_r13; @@ -1168,7 +1220,7 @@ void fill_eMTC_configuration(MessageDef *msg_p, ccparams_eMTC_t *eMTCconfig, in /** SIB2 FREQ HOPPING PARAMETERS R13 */ - RRC_CONFIGURATION_REQ(msg_p).sib2_freq_hoppingParameters_r13_exists[cc_idx] = TRUE; + RRC_CONFIGURATION_REQ(msg_p).sib2_freq_hoppingParameters_r13_exists[cc_idx] = true; char sib2FreqHoppingParametersR13Path[MAX_OPTNAME_SIZE*2 + 16]; sprintf(sib2FreqHoppingParametersR13Path, "%s.%s", brparamspath, ENB_CONFIG_STRING_SIB2_FREQ_HOPPINGPARAMETERS_R13); diff --git a/openair2/ENB_APP/enb_paramdef_emtc.h b/openair2/ENB_APP/enb_paramdef_emtc.h index de774c4ea69..928c9d22e30 100644 --- a/openair2/ENB_APP/enb_paramdef_emtc.h +++ b/openair2/ENB_APP/enb_paramdef_emtc.h @@ -147,7 +147,7 @@ typedef struct ccparams_eMTC_s { int interval_DLHoppingConfigCommonModeA_r13_val; int interval_DLHoppingConfigCommonModeB_r13_val; int mpdcch_pdsch_HoppingOffset_r13; - char *preambleTransMax_CE_r13; + int preambleTransMax_CE_r13; int prach_HoppingOffset_r13; int schedulingInfoSIB1_BR_r13; int64_t fdd_DownlinkOrTddSubframeBitmapBR_val_r13; @@ -253,7 +253,7 @@ typedef struct ccparams_eMTC_s { {ENB_CONFIG_STRING_INTERVAL_DL_HOPPING_CONFIG_COMMON_MODE_B_R13, NULL, 0, strptr:&eMTCconfig->interval_DLHoppingConfigCommonModeB_r13, defstrval:"interval-FDD-r13", TYPE_STRING, 0}, \ {ENB_CONFIG_STRING_INTERVAL_DL_HOPPING_CONFIG_COMMON_MODE_B_R13_VAL, NULL, 0, iptr:&eMTCconfig->interval_DLHoppingConfigCommonModeB_r13_val, defintval:0, TYPE_UINT, 0}, \ {ENB_CONFIG_STRING_MPDCCH_PDSCH_HOPPING_OFFSET_R13, NULL, 0, iptr:&eMTCconfig->mpdcch_pdsch_HoppingOffset_r13, defintval:1, TYPE_UINT, 0}, \ -{ENB_CONFIG_STRING_PREAMBLE_TRANSMAX_CE_R13, NULL, 0, strptr:&eMTCconfig->preambleTransMax_CE_r13, defstrval:"n10", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_PREAMBLE_TRANSMAX_CE_R13, NULL, 0, iptr:&eMTCconfig->preambleTransMax_CE_r13, defintval:10, TYPE_UINT, 0}, \ {ENB_CONFIG_STRING_PUCCH_NUM_REPETITION_CE_MSG4_LEVEL0, NULL, 0, strptr:&eMTCconfig->pucch_NumRepetitionCE_Msg4_Level0_r13, defstrval:"n1", TYPE_STRING, 0}, \ {ENB_CONFIG_STRING_PUCCH_NUM_REPETITION_CE_MSG4_LEVEL1, NULL, 0, strptr:&eMTCconfig->pucch_NumRepetitionCE_Msg4_Level1_r13, defstrval:"", TYPE_STRING, 0}, \ {ENB_CONFIG_STRING_PUCCH_NUM_REPETITION_CE_MSG4_LEVEL2, NULL, 0, strptr:&eMTCconfig->pucch_NumRepetitionCE_Msg4_Level2_r13, defstrval:"", TYPE_STRING, 0}, \ diff --git a/openair2/ENB_APP/flexran_agent_ran_api.c b/openair2/ENB_APP/flexran_agent_ran_api.c index 9926ec9e206..3113c077981 100644 --- a/openair2/ENB_APP/flexran_agent_ran_api.c +++ b/openair2/ENB_APP/flexran_agent_ran_api.c @@ -127,7 +127,7 @@ int flexran_get_mac_ue_id_rnti(mid_t mod_id, rnti_t rnti) { /* get the (active) UE with RNTI i */ for (n = 0; n < MAX_MOBILES_PER_ENB; ++n) { - if (RC.mac[mod_id]->UE_info.active[n] == TRUE + if (RC.mac[mod_id]->UE_info.active[n] == true && rnti == UE_RNTI(mod_id, n)) { return n; } @@ -143,7 +143,7 @@ int flexran_get_mac_ue_id(mid_t mod_id, int i) { /* get the (i+1)'th active UE */ for (n = 0; n < MAX_MOBILES_PER_ENB; ++n) { - if (RC.mac[mod_id]->UE_info.active[n] == TRUE) { + if (RC.mac[mod_id]->UE_info.active[n] == true) { if (i == 0) return n; @@ -580,7 +580,7 @@ uint8_t flexran_get_n_SB(mid_t mod_id, uint8_t cc_id) { Protocol__FlexQam flexran_get_enable64QAM(mid_t mod_id, uint8_t cc_id) { if (!phy_is_present(mod_id, cc_id)) return 0; - if (RC.eNB[mod_id][cc_id]->frame_parms.pusch_config_common.enable64QAM == TRUE) + if (RC.eNB[mod_id][cc_id]->frame_parms.pusch_config_common.enable64QAM == true) return PROTOCOL__FLEX_QAM__FLEQ_MOD_64QAM; else return PROTOCOL__FLEX_QAM__FLEQ_MOD_16QAM; @@ -3585,7 +3585,7 @@ int flexran_set_new_plmn_id(mid_t mod_id, int CC_id, size_t n_plmn, Protocol__Fl int CC_id, BOOLEAN_t brOption, RrcConfigurationReq *configuration); - carrier->sizeof_SIB1 = do_SIB1(carrier, mod_id, CC_id, FALSE, conf); + carrier->sizeof_SIB1 = do_SIB1(carrier, mod_id, CC_id, false, conf); if (carrier->sizeof_SIB1 < 0) return -1337; /* SIB1 encoding failed, hell will probably break loose */ diff --git a/openair2/F1AP/dummy_enb.c b/openair2/F1AP/dummy_enb.c index 9085fdb57cd..8e185c951df 100644 --- a/openair2/F1AP/dummy_enb.c +++ b/openair2/F1AP/dummy_enb.c @@ -32,18 +32,18 @@ void apply_macrlc_config(gNB_RRC_INST *rrc, abort(); } -boolean_t sdap_data_req(protocol_ctxt_t *ctxt_p, - const srb_flag_t srb_flag, - const rb_id_t rb_id, - const mui_t mui, - const confirm_t confirm, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer, - const pdcp_transmission_mode_t pt_mode, - const uint32_t *sourceL2Id, - const uint32_t *destinationL2Id, - const uint8_t qfi, - const boolean_t rqi, - const int pdusession_id) { +bool sdap_data_req(protocol_ctxt_t *ctxt_p, + const srb_flag_t srb_flag, + const rb_id_t rb_id, + const mui_t mui, + const confirm_t confirm, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t pt_mode, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id, + const uint8_t qfi, + const bool rqi, + const int pdusession_id) { abort(); } diff --git a/openair2/F1AP/f1ap_common.h b/openair2/F1AP/f1ap_common.h index 66451530a61..6b64e1b59e7 100644 --- a/openair2/F1AP/f1ap_common.h +++ b/openair2/F1AP/f1ap_common.h @@ -363,13 +363,6 @@ # error "You are compiling f1ap with the wrong version of ASN1C" #endif -#ifndef FALSE - #define FALSE (0) -#endif -#ifndef TRUE - #define TRUE (!FALSE) -#endif - #define F1AP_UE_ID_FMT "0x%06"PRIX32 #include "assertions.h" diff --git a/openair2/F1AP/f1ap_cu_task.c b/openair2/F1AP/f1ap_cu_task.c index b3c7363ca4a..efbc9f2c8b9 100644 --- a/openair2/F1AP/f1ap_cu_task.c +++ b/openair2/F1AP/f1ap_cu_task.c @@ -180,6 +180,12 @@ void *F1AP_CU_task(void *arg) { &F1AP_UE_CONTEXT_SETUP_REQ(received_msg)); break; + case F1AP_UE_CONTEXT_MODIFICATION_REQ: + LOG_I(F1AP, "CU Task received F1AP_UE_CONTEXT_MODIFICATION_REQ\n"); + CU_send_UE_CONTEXT_MODIFICATION_REQUEST(ITTI_MSG_DESTINATION_INSTANCE(received_msg), + &F1AP_UE_CONTEXT_MODIFICATION_REQ(received_msg)); + break; + case F1AP_UE_CONTEXT_RELEASE_CMD: // from rrc LOG_I(F1AP, "CU Task Received F1AP_UE_CONTEXT_RELEASE_CMD\n"); CU_send_UE_CONTEXT_RELEASE_COMMAND(ITTI_MSG_DESTINATION_INSTANCE(received_msg), diff --git a/openair2/F1AP/f1ap_cu_ue_context_management.c b/openair2/F1AP/f1ap_cu_ue_context_management.c index c68bfb3852f..0f3959d4ad5 100644 --- a/openair2/F1AP/f1ap_cu_ue_context_management.c +++ b/openair2/F1AP/f1ap_cu_ue_context_management.c @@ -131,21 +131,30 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance, ie6->criticality = F1AP_Criticality_reject; ie6->value.present = F1AP_UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation; - /* optional */ - /* 6.1 cG_ConfigInfo */ - if (0) { - const char cG_ConfigInfoStr[]="asdsa1d32sa1d31asd31as"; - asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.cG_ConfigInfo, cG_ConfigInfo); - OCTET_STRING_fromBuf(cG_ConfigInfo, cG_ConfigInfoStr, strlen( cG_ConfigInfoStr )) ; + if (f1ap_ue_context_setup_req->cu_to_du_rrc_information!=NULL) { + /* optional */ + /* 6.1 cG_ConfigInfo */ + if(f1ap_ue_context_setup_req->cu_to_du_rrc_information->cG_ConfigInfo!=NULL){ + asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.cG_ConfigInfo, cG_ConfigInfo); + OCTET_STRING_fromBuf(cG_ConfigInfo, (const char *)f1ap_ue_context_setup_req->cu_to_du_rrc_information->cG_ConfigInfo, + f1ap_ue_context_setup_req->cu_to_du_rrc_information->cG_ConfigInfo_length); + } /* optional */ /* 6.2 uE_CapabilityRAT_ContainerList */ - asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList, uE_CapabilityRAT_ContainerList ); - OCTET_STRING_fromBuf(uE_CapabilityRAT_ContainerList, cG_ConfigInfoStr, strlen( cG_ConfigInfoStr )) ; + if(f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList!=NULL){ + asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList, uE_CapabilityRAT_ContainerList ); + OCTET_STRING_fromBuf(uE_CapabilityRAT_ContainerList, (const char *)f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList, + f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length); + } /* optional */ /* 6.3 measConfig */ - asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.measConfig, measConfig); - OCTET_STRING_fromBuf(measConfig, cG_ConfigInfoStr, strlen( cG_ConfigInfoStr )) ; + if(f1ap_ue_context_setup_req->cu_to_du_rrc_information->measConfig!=NULL){ + asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.measConfig, measConfig); + OCTET_STRING_fromBuf(measConfig, (const char*)f1ap_ue_context_setup_req->cu_to_du_rrc_information->measConfig, + f1ap_ue_context_setup_req->cu_to_du_rrc_information->measConfig_length); + } } + /* mandatory */ /* c7. Candidate_SpCell_List */ @@ -238,199 +247,96 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance, /* mandatory */ /* c11. SRBs_ToBeSetup_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie11); - ie11->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_List; - ie11->criticality = F1AP_Criticality_reject; // ? - ie11->value.present = F1AP_UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List; - - for (int i=0; i<f1ap_ue_context_setup_req->srbs_to_be_setup_length; i++) { - // - asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetup_List.list, F1AP_SRBs_ToBeSetup_ItemIEs_t, srbs_toBeSetup_item_ies); - srbs_toBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_Item; // 73 - srbs_toBeSetup_item_ies->criticality = F1AP_Criticality_ignore; - srbs_toBeSetup_item_ies->value.present = F1AP_SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item; - /* 11.1 SRBs_ToBeSetup_Item */ - F1AP_SRBs_ToBeSetup_Item_t *srbs_toBeSetup_item=&srbs_toBeSetup_item_ies->value.choice.SRBs_ToBeSetup_Item; - /* 11.1.1 sRBID */ - srbs_toBeSetup_item->sRBID = f1ap_ue_context_setup_req->srbs_to_be_setup[i].srb_id; - /* OPTIONAL */ - /* 11.1.2 duplicationIndication */ - //if (0) { - asn1cCallocOne(srbs_toBeSetup_item->duplicationIndication, + if(f1ap_ue_context_setup_req->srbs_to_be_setup_length > 0){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie11); + ie11->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_List; + ie11->criticality = F1AP_Criticality_reject; // ? + ie11->value.present = F1AP_UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List; + + for (int i=0; i<f1ap_ue_context_setup_req->srbs_to_be_setup_length; i++) { + asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetup_List.list, F1AP_SRBs_ToBeSetup_ItemIEs_t, srbs_toBeSetup_item_ies); + srbs_toBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_Item; // 73 + srbs_toBeSetup_item_ies->criticality = F1AP_Criticality_ignore; + srbs_toBeSetup_item_ies->value.present = F1AP_SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item; + /* 11.1 SRBs_ToBeSetup_Item */ + F1AP_SRBs_ToBeSetup_Item_t *srbs_toBeSetup_item=&srbs_toBeSetup_item_ies->value.choice.SRBs_ToBeSetup_Item; + /* 11.1.1 sRBID */ + srbs_toBeSetup_item->sRBID = f1ap_ue_context_setup_req->srbs_to_be_setup[i].srb_id; + /* OPTIONAL */ + /* 11.1.2 duplicationIndication */ + asn1cCallocOne(srbs_toBeSetup_item->duplicationIndication, F1AP_DuplicationIndication_true); // enum - //} + } } /* mandatory */ /* c12. DRBs_ToBeSetup_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie12); - ie12->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_List; - ie12->criticality = F1AP_Criticality_reject; - ie12->value.present = F1AP_UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List; - LOG_I(F1AP, "Length of drbs_to_be_setup: %d \n", f1ap_ue_context_setup_req->drbs_to_be_setup_length); - - for (int i = 0; i < f1ap_ue_context_setup_req->drbs_to_be_setup_length; i++) { - // - asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetup_List.list, F1AP_DRBs_ToBeSetup_ItemIEs_t, drbs_toBeSetup_item_ies); - drbs_toBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_Item; - drbs_toBeSetup_item_ies->criticality = F1AP_Criticality_reject; - drbs_toBeSetup_item_ies->value.present = F1AP_DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item; - /* 12.1 DRBs_ToBeSetup_Item */ - F1AP_DRBs_ToBeSetup_Item_t *drbs_toBeSetup_item=&drbs_toBeSetup_item_ies->value.choice.DRBs_ToBeSetup_Item; - /* 12.1.1 dRBID */ - drbs_toBeSetup_item->dRBID = f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id; // 9 - /* 12.1.2 qoSInformation */ - int some_decide_qos = 0; // BK: Need Check - - if (some_decide_qos) { - drbs_toBeSetup_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS; - /* 12.1.2.1 eUTRANQoS */ - asn1cCalloc(drbs_toBeSetup_item->qoSInformation.choice.eUTRANQoS, eUTRANQoS); - /* 12.1.2.1.1 qCI */ - eUTRANQoS->qCI = 254L; - /* 12.1.2.1.2 allocationAndRetentionPriority */ - { - /* 12.1.2.1.2.1 priorityLevel */ - eUTRANQoS->allocationAndRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum - /* 12.1.2.1.2.2 pre_emptionCapability */ - eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_may_trigger_pre_emption; // enum - /* 12.1.2.1.2.2 pre_emptionVulnerability */ - eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum - } - - /* OPTIONAL */ - /* 12.1.2.1.3 gbrQosInformation */ - if (0) { - eUTRANQoS->gbrQosInformation = (F1AP_GBR_QosInformation_t *)calloc(1, sizeof(F1AP_GBR_QosInformation_t)); - asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_MaximumBitrateDL, 1L); - asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_MaximumBitrateUL, 1L); - asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_GuaranteedBitrateDL, 1L); - asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_GuaranteedBitrateUL, 1L); - } - } else { - /* 12.1.2 DRB_Information */ - drbs_toBeSetup_item->qoSInformation.present = F1AP_QoSInformation_PR_choice_extension; - F1AP_QoSInformation_ExtIEs_t *ie = (F1AP_QoSInformation_ExtIEs_t *)calloc(1, sizeof(*ie)); - ie->id = F1AP_ProtocolIE_ID_id_DRB_Information; - ie->criticality = F1AP_Criticality_reject; - ie->value.present = F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information; - F1AP_DRB_Information_t *DRB_Information = &ie->value.choice.DRB_Information; - drbs_toBeSetup_item->qoSInformation.choice.choice_extension = (struct F1AP_ProtocolIE_SingleContainer *)ie; - /* 12.1.2.1 dRB_QoS */ - { - /* qoS_Characteristics */ - { - int some_decide_qoS_characteristics = 0; // BK: Need Check - - if (some_decide_qoS_characteristics) { - DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI; - setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI); - } else { - DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI; - asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, tmp); - /* qoSPriorityLevel */ - tmp->qoSPriorityLevel = 1L; - /* packetDelayBudget */ - tmp->packetDelayBudget = 1L; - /* packetErrorRate */ - tmp->packetErrorRate.pER_Scalar = 1L; - tmp->packetErrorRate.pER_Exponent = 6L; - - /* OPTIONAL */ - /* delayCritical */ - if (0) { - asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical, 1L); - } - - /* OPTIONAL */ - /* averagingWindow */ - if (0) { - asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow, 1L); - } - - /* OPTIONAL */ - /* maxDataBurstVolume */ - if (0) { - asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume, 1L); - } - } // if some_decide_qoS_characteristics - } // qoS_Characteristics - /* nGRANallocationRetentionPriority */ + if(f1ap_ue_context_setup_req->drbs_to_be_setup_length){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie12); + ie12->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_List; + ie12->criticality = F1AP_Criticality_reject; + ie12->value.present = F1AP_UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List; + LOG_I(F1AP, "Length of drbs_to_be_setup: %d \n", f1ap_ue_context_setup_req->drbs_to_be_setup_length); + + for (int i = 0; i < f1ap_ue_context_setup_req->drbs_to_be_setup_length; i++) { + // + asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetup_List.list, F1AP_DRBs_ToBeSetup_ItemIEs_t, drbs_toBeSetup_item_ies); + drbs_toBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_Item; + drbs_toBeSetup_item_ies->criticality = F1AP_Criticality_reject; + drbs_toBeSetup_item_ies->value.present = F1AP_DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item; + /* 12.1 DRBs_ToBeSetup_Item */ + F1AP_DRBs_ToBeSetup_Item_t *drbs_toBeSetup_item=&drbs_toBeSetup_item_ies->value.choice.DRBs_ToBeSetup_Item; + /* 12.1.1 dRBID */ + drbs_toBeSetup_item->dRBID = f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id; // 9 + /* 12.1.2 qoSInformation */ + int some_decide_qos = 0; // BK: Need Check + + if (some_decide_qos) { + drbs_toBeSetup_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS; + /* 12.1.2.1 eUTRANQoS */ + asn1cCalloc(drbs_toBeSetup_item->qoSInformation.choice.eUTRANQoS, eUTRANQoS); + /* 12.1.2.1.1 qCI */ + eUTRANQoS->qCI = 254L; + /* 12.1.2.1.2 allocationAndRetentionPriority */ { - DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum - DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum - DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum - } // nGRANallocationRetentionPriority - - /* OPTIONAL */ - /* gBR_QoS_Flow_Information */ - if (0) { - asn1cCalloc(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information, tmp); - asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L); - asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L); - asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L); - asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L); - - /* OPTIONAL */ - /* maxPacketLossRateDownlink */ - if (0) { - asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L); - } - - /* OPTIONAL */ - /* maxPacketLossRateUplink */ - if (0) { - asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L); - } + /* 12.1.2.1.2.1 priorityLevel */ + eUTRANQoS->allocationAndRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum + /* 12.1.2.1.2.2 pre_emptionCapability */ + eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_may_trigger_pre_emption; // enum + /* 12.1.2.1.2.2 pre_emptionVulnerability */ + eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum } /* OPTIONAL */ - /* reflective_QoS_Attribute */ + /* 12.1.2.1.3 gbrQosInformation */ if (0) { - asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute, 1L); + eUTRANQoS->gbrQosInformation = (F1AP_GBR_QosInformation_t *)calloc(1, sizeof(F1AP_GBR_QosInformation_t)); + asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_MaximumBitrateDL, 1L); + asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_MaximumBitrateUL, 1L); + asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_GuaranteedBitrateDL, 1L); + asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_GuaranteedBitrateUL, 1L); } - } // dRB_QoS - /* 12.1.2.2 sNSSAI */ - { - /* sST */ - OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1); - - /* OPTIONAL */ - /* sD */ - if (0) { - asn1cCalloc(DRB_Information->sNSSAI.sD, tmp); - OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as", - strlen("asdsa1d32sa1d31asd31as")); - } - } - - /* OPTIONAL */ - /* 12.1.2.3 notificationControl */ - if (0) { - asn1cCallocOne(DRB_Information->notificationControl, - F1AP_NotificationControl_active); // enum - } - - /* 12.1.2.4 flows_Mapped_To_DRB_List */ // BK: need verifiy - - for (int k = 0; k < 1; k ++) { - asn1cSequenceAdd(DRB_Information->flows_Mapped_To_DRB_List.list, - F1AP_Flows_Mapped_To_DRB_Item_t, flows_mapped_to_drb_item); - /* qoSFlowIndicator */ - flows_mapped_to_drb_item->qoSFlowIdentifier = 1L; - /* qoSFlowLevelQoSParameters */ + } else { + /* 12.1.2 DRB_Information */ + drbs_toBeSetup_item->qoSInformation.present = F1AP_QoSInformation_PR_choice_extension; + F1AP_QoSInformation_ExtIEs_t *ie = (F1AP_QoSInformation_ExtIEs_t *)calloc(1, sizeof(*ie)); + ie->id = F1AP_ProtocolIE_ID_id_DRB_Information; + ie->criticality = F1AP_Criticality_reject; + ie->value.present = F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information; + F1AP_DRB_Information_t *DRB_Information = &ie->value.choice.DRB_Information; + drbs_toBeSetup_item->qoSInformation.choice.choice_extension = (struct F1AP_ProtocolIE_SingleContainer *)ie; + /* 12.1.2.1 dRB_QoS */ { /* qoS_Characteristics */ { int some_decide_qoS_characteristics = 0; // BK: Need Check - F1AP_QoS_Characteristics_t *QosParams=&flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.qoS_Characteristics; if (some_decide_qoS_characteristics) { - QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI; - setQos(QosParams->choice.non_Dynamic_5QI); + DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI; + setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI); } else { - QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI; - asn1cCalloc(QosParams->choice.dynamic_5QI, tmp); + DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI; + asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, tmp); /* qoSPriorityLevel */ tmp->qoSPriorityLevel = 1L; /* packetDelayBudget */ @@ -442,36 +348,33 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance, /* OPTIONAL */ /* delayCritical */ if (0) { - asn1cCalloc(QosParams->choice.dynamic_5QI->delayCritical, tmp); - *tmp = 1L; + asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical, 1L); } /* OPTIONAL */ /* averagingWindow */ if (0) { - asn1cCalloc(QosParams->choice.dynamic_5QI->averagingWindow, tmp); - *tmp = 1L; + asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow, 1L); } /* OPTIONAL */ /* maxDataBurstVolume */ if (0) { - asn1cCalloc(QosParams->choice.dynamic_5QI->maxDataBurstVolume, tmp); - *tmp= 1L; + asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume, 1L); } } // if some_decide_qoS_characteristics } // qoS_Characteristics /* nGRANallocationRetentionPriority */ { - flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum - flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum - flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum + DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum + DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum + DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum } // nGRANallocationRetentionPriority /* OPTIONAL */ /* gBR_QoS_Flow_Information */ if (0) { - asn1cCalloc(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information, tmp); + asn1cCalloc(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information, tmp); asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L); asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L); asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L); @@ -480,80 +383,186 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance, /* OPTIONAL */ /* maxPacketLossRateDownlink */ if (0) { - asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L); + asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L); } /* OPTIONAL */ /* maxPacketLossRateUplink */ if (0) { - asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L); + asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L); } } /* OPTIONAL */ /* reflective_QoS_Attribute */ if (0) { - asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.reflective_QoS_Attribute, 1L); + asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute, 1L); } - } // qoSFlowLevelQoSParameters - } - } // if some_decide_qos - - /* 12.1.3 uLUPTNLInformation_ToBeSetup_List */ - for (int j = 0; j < f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) { - /* Here the callback function used as input is not the right one. Need to create a new one probably for F1-U, not sure - * if the kind of input parameters to the callback function are convenient though for gtp-u over F1-U.*/ - //Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU - transport_layer_addr_t addr; - int sz=sizeof(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address); - memcpy(addr.buffer,&f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz); - addr.length = sz*8; - f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid= - newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst, - f1ap_ue_context_setup_req->rnti, - f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id, - f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id, - 0xFFFF, // We will set the right value from DU answer - addr, - f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].port, - cu_f1u_data_req); - /* 12.3.1 ULTunnels_ToBeSetup_Item */ - asn1cSequenceAdd(drbs_toBeSetup_item->uLUPTNLInformation_ToBeSetup_List.list, - F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item); - uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel; - asn1cCalloc( uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel, - gTPTunnel); - /* 12.3.1.1.1 transportLayerAddress */ - TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address, + } // dRB_QoS + /* 12.1.2.2 sNSSAI */ + { + /* sST */ + OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1); + + /* OPTIONAL */ + /* sD */ + if (0) { + asn1cCalloc(DRB_Information->sNSSAI.sD, tmp); + OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as", + strlen("asdsa1d32sa1d31asd31as")); + } + } + + /* OPTIONAL */ + /* 12.1.2.3 notificationControl */ + if (0) { + asn1cCallocOne(DRB_Information->notificationControl, + F1AP_NotificationControl_active); // enum + } + + /* 12.1.2.4 flows_Mapped_To_DRB_List */ // BK: need verifiy + + for (int k = 0; k < 1; k ++) { + asn1cSequenceAdd(DRB_Information->flows_Mapped_To_DRB_List.list, + F1AP_Flows_Mapped_To_DRB_Item_t, flows_mapped_to_drb_item); + /* qoSFlowIndicator */ + flows_mapped_to_drb_item->qoSFlowIdentifier = 1L; + /* qoSFlowLevelQoSParameters */ + { + /* qoS_Characteristics */ + { + int some_decide_qoS_characteristics = 0; // BK: Need Check + F1AP_QoS_Characteristics_t *QosParams=&flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.qoS_Characteristics; + + if (some_decide_qoS_characteristics) { + QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI; + setQos(QosParams->choice.non_Dynamic_5QI); + } else { + QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI; + asn1cCalloc(QosParams->choice.dynamic_5QI, tmp); + /* qoSPriorityLevel */ + tmp->qoSPriorityLevel = 1L; + /* packetDelayBudget */ + tmp->packetDelayBudget = 1L; + /* packetErrorRate */ + tmp->packetErrorRate.pER_Scalar = 1L; + tmp->packetErrorRate.pER_Exponent = 6L; + + /* OPTIONAL */ + /* delayCritical */ + if (0) { + asn1cCalloc(QosParams->choice.dynamic_5QI->delayCritical, tmp); + *tmp = 1L; + } + + /* OPTIONAL */ + /* averagingWindow */ + if (0) { + asn1cCalloc(QosParams->choice.dynamic_5QI->averagingWindow, tmp); + *tmp = 1L; + } + + /* OPTIONAL */ + /* maxDataBurstVolume */ + if (0) { + asn1cCalloc(QosParams->choice.dynamic_5QI->maxDataBurstVolume, tmp); + *tmp= 1L; + } + } // if some_decide_qoS_characteristics + } // qoS_Characteristics + /* nGRANallocationRetentionPriority */ + { + flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum + flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum + flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum + } // nGRANallocationRetentionPriority + + /* OPTIONAL */ + /* gBR_QoS_Flow_Information */ + if (0) { + asn1cCalloc(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information, tmp); + asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L); + asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L); + asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L); + asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L); + + /* OPTIONAL */ + /* maxPacketLossRateDownlink */ + if (0) { + asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L); + } + + /* OPTIONAL */ + /* maxPacketLossRateUplink */ + if (0) { + asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L); + } + } + + /* OPTIONAL */ + /* reflective_QoS_Attribute */ + if (0) { + asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.reflective_QoS_Attribute, 1L); + } + } // qoSFlowLevelQoSParameters + } + } // if some_decide_qos + + /* 12.1.3 uLUPTNLInformation_ToBeSetup_List */ + for (int j = 0; j < f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) { + /*Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU*/ + transport_layer_addr_t addr; + int sz=sizeof(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address); + memcpy(addr.buffer,&f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz); + addr.length = sz*8; + f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid = newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst, + f1ap_ue_context_setup_req->rnti, + f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id, + f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id, + 0xFFFF, // We will set the right value from DU answer + -1, // no qfi + addr, + f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].port, + cu_f1u_data_req, + NULL); + /* 12.3.1 ULTunnels_ToBeSetup_Item */ + asn1cSequenceAdd(drbs_toBeSetup_item->uLUPTNLInformation_ToBeSetup_List.list, + F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item); + uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel; + asn1cCalloc( uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel, + gTPTunnel); + /* 12.3.1.1.1 transportLayerAddress */ + TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address, &gTPTunnel->transportLayerAddress); - /* 12.3.1.1.2 gTP_TEID */ - INT32_TO_OCTET_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid, - &gTPTunnel->gTP_TEID); - } + /* 12.3.1.1.2 gTP_TEID */ + INT32_TO_OCTET_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid, + &gTPTunnel->gTP_TEID); + } - /* 12.1.4 rLCMode */ - /* TODO use rlc_mode from f1ap_drb_to_be_setup */ - switch (f1ap_ue_context_setup_req->drbs_to_be_setup[i].rlc_mode) { - case RLC_MODE_AM: - drbs_toBeSetup_item->rLCMode = F1AP_RLCMode_rlc_am; - break; + /* 12.1.4 rLCMode */ + /* TODO use rlc_mode from f1ap_drb_to_be_setup */ + switch (f1ap_ue_context_setup_req->drbs_to_be_setup[i].rlc_mode) { + case RLC_MODE_AM: + drbs_toBeSetup_item->rLCMode = F1AP_RLCMode_rlc_am; + break; - default: - drbs_toBeSetup_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional; - } + default: + drbs_toBeSetup_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional; + } - /* OPTIONAL */ - /* 12.1.5 ULConfiguration */ - if (0) { - asn1cCalloc(drbs_toBeSetup_item->uLConfiguration, tmp); - tmp->uLUEConfiguration = F1AP_ULUEConfiguration_no_data; - } + /* OPTIONAL */ + /* 12.1.5 ULConfiguration */ + if (0) { + asn1cCalloc(drbs_toBeSetup_item->uLConfiguration, tmp); + tmp->uLUEConfiguration = F1AP_ULUEConfiguration_no_data; + } - /* OPTIONAL */ - /* 12.1.6 duplicationActivation */ - if (0) { - asn1cCalloc(drbs_toBeSetup_item->duplicationActivation, tmp); - *tmp = F1AP_DuplicationActivation_active; // enum + /* OPTIONAL */ + /* 12.1.6 duplicationActivation */ + if (0) { + asn1cCalloc(drbs_toBeSetup_item->duplicationActivation, tmp); + *tmp = F1AP_DuplicationActivation_active; // enum + } } } @@ -662,9 +671,10 @@ int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, return -1; } - f1ap_ue_context_setup_resp->du_to_cu_rrc_information = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size); - memcpy(f1ap_ue_context_setup_resp->du_to_cu_rrc_information, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size); - f1ap_ue_context_setup_resp->du_to_cu_rrc_information_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size; + f1ap_ue_context_setup_resp->du_to_cu_rrc_information = (du_to_cu_rrc_information_t *)calloc(1,sizeof(du_to_cu_rrc_information_t)); + f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size); + memcpy(f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size); + f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size; // DRBs_Setup_List F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container, F1AP_ProtocolIE_ID_id_DRBs_Setup_List, false); @@ -896,12 +906,14 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, /* optional */ /* c4. RRCContainer */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie4); - ie4->id = F1AP_ProtocolIE_ID_id_RRCContainer; - ie4->criticality = F1AP_Criticality_ignore; - ie4->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_RRCContainer; - OCTET_STRING_fromBuf(&ie4->value.choice.RRCContainer, (const char *)cmd->rrc_container, + if(cmd->rrc_container!=NULL){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie4); + ie4->id = F1AP_ProtocolIE_ID_id_RRCContainer; + ie4->criticality = F1AP_Criticality_ignore; + ie4->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_RRCContainer; + OCTET_STRING_fromBuf(&ie4->value.choice.RRCContainer, (const char *)cmd->rrc_container, cmd->rrc_container_length); + } /* encode */ if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) { @@ -1008,7 +1020,7 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, return 0; } //void CU_send_UE_CONTEXT_MODIFICATION_REQUEST(F1AP_UEContextModificationRequest_t *UEContextModificationRequest) { -int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) { +int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context_setup_t *f1ap_ue_context_modification_req) { F1AP_F1AP_PDU_t pdu= {0}; F1AP_UEContextModificationRequest_t *out; uint8_t *buffer=NULL; @@ -1029,14 +1041,14 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) { ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID; ie1->criticality = F1AP_Criticality_reject; ie1->value.present = F1AP_UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID; - ie1->value.choice.GNB_CU_UE_F1AP_ID = 126L; + ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, f1ap_ue_context_modification_req->rnti);; /* mandatory */ /* c2. GNB_DU_UE_F1AP_ID */ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie2); ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID; ie2->criticality = F1AP_Criticality_reject; ie2->value.present = F1AP_UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID; - ie2->value.choice.GNB_DU_UE_F1AP_ID = 651L; + ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, f1ap_ue_context_modification_req->rnti);; /* optional */ /* c3. NRCGI */ @@ -1049,13 +1061,15 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) { addnRCGI(ie3->value.choice.NRCGI, &hardCoded); } - /* mandatory */ + /* optional */ /* c4. ServCellIndex */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie4); - ie4->id = F1AP_ProtocolIE_ID_id_ServCellIndex; - ie4->criticality = F1AP_Criticality_reject; - ie4->value.present = F1AP_UEContextModificationRequestIEs__value_PR_ServCellIndex; - ie4->value.choice.ServCellIndex = 5L; + if(0){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie4); + ie4->id = F1AP_ProtocolIE_ID_id_ServCellIndex; + ie4->criticality = F1AP_Criticality_reject; + ie4->value.present = F1AP_UEContextModificationRequestIEs__value_PR_ServCellIndex; + ie4->value.choice.ServCellIndex = 5L; + } /* optional */ /* c5. DRXCycle */ @@ -1077,47 +1091,58 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) { } /* optional */ - /* c5. CUtoDURRCInformation */ - if (1) { - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie5); - ie5->id = F1AP_ProtocolIE_ID_id_CUtoDURRCInformation; - ie5->criticality = F1AP_Criticality_reject; - ie5->value.present = F1AP_UEContextModificationRequestIEs__value_PR_CUtoDURRCInformation; - asn1cCalloc(ie5->value.choice.CUtoDURRCInformation.cG_ConfigInfo, tmp); + /* c6. CUtoDURRCInformation */ + if (f1ap_ue_context_modification_req->cu_to_du_rrc_information!=NULL) { + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie6); + ie6->id = F1AP_ProtocolIE_ID_id_CUtoDURRCInformation; + ie6->criticality = F1AP_Criticality_reject; + ie6->value.present = F1AP_UEContextModificationRequestIEs__value_PR_CUtoDURRCInformation; + /* 6.1 cG_ConfigInfo */ + if(f1ap_ue_context_modification_req->cu_to_du_rrc_information->cG_ConfigInfo!=NULL){ + asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.cG_ConfigInfo, cG_ConfigInfo); + OCTET_STRING_fromBuf(cG_ConfigInfo, (const char *)f1ap_ue_context_modification_req->cu_to_du_rrc_information->cG_ConfigInfo, + f1ap_ue_context_modification_req->cu_to_du_rrc_information->cG_ConfigInfo_length); + } /* optional */ - OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as", - strlen("asdsa1d32sa1d31asd31as")); - asn1cCalloc(ie5->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList, - tmp2); + /* 6.2 uE_CapabilityRAT_ContainerList */ + if(f1ap_ue_context_modification_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList!=NULL){ + asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList, uE_CapabilityRAT_ContainerList ); + OCTET_STRING_fromBuf(uE_CapabilityRAT_ContainerList, (const char *)f1ap_ue_context_modification_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList, + f1ap_ue_context_modification_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length) ; + } /* optional */ - OCTET_STRING_fromBuf(tmp2, "asdsa1d32sa1d31asd31as", - strlen("asdsa1d32sa1d31asd31as")); + /* 6.3 measConfig */ + if(f1ap_ue_context_modification_req->cu_to_du_rrc_information->measConfig!=NULL){ + asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.measConfig, measConfig); + OCTET_STRING_fromBuf(measConfig, (const char *)f1ap_ue_context_modification_req->cu_to_du_rrc_information->measConfig, + f1ap_ue_context_modification_req->cu_to_du_rrc_information->measConfig_length); + } } /* optional */ - /* c6. TransmissionActionIndicator */ - if (1) { - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie6); - ie6->id = F1AP_ProtocolIE_ID_id_TransmissionActionIndicator; - ie6->criticality = F1AP_Criticality_ignore; - ie6->value.present = F1AP_UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator; - ie6->value.choice.TransmissionActionIndicator = F1AP_TransmissionActionIndicator_stop; + /* c7. TransmissionActionIndicator */ + if (0) { + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie7); + ie7->id = F1AP_ProtocolIE_ID_id_TransmissionActionIndicator; + ie7->criticality = F1AP_Criticality_ignore; + ie7->value.present = F1AP_UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator; + ie7->value.choice.TransmissionActionIndicator = F1AP_TransmissionActionIndicator_stop; } /* optional */ - /* c7. ResourceCoordinationTransferContainer */ + /* c8. ResourceCoordinationTransferContainer */ if (0) { - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie7); - ie7->id = F1AP_ProtocolIE_ID_id_ResourceCoordinationTransferContainer; - ie7->criticality = F1AP_Criticality_ignore; - ie7->value.present = F1AP_UEContextModificationRequestIEs__value_PR_ResourceCoordinationTransferContainer; - OCTET_STRING_fromBuf(&ie7->value.choice.ResourceCoordinationTransferContainer, "asdsa1d32sa1d31asd31as", + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie8); + ie8->id = F1AP_ProtocolIE_ID_id_ResourceCoordinationTransferContainer; + ie8->criticality = F1AP_Criticality_ignore; + ie8->value.present = F1AP_UEContextModificationRequestIEs__value_PR_ResourceCoordinationTransferContainer; + OCTET_STRING_fromBuf(&ie8->value.choice.ResourceCoordinationTransferContainer, "asdsa1d32sa1d31asd31as", strlen("asdsa1d32sa1d31asd31as")); } /* optional */ /* c7. RRCRconfigurationCompleteIndicator */ - if (1) { + if (f1ap_ue_context_modification_req->ReconfigComplOutcome == RRCreconf_success) { asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie71); ie71->id = F1AP_ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator; ie71->criticality = F1AP_Criticality_ignore; @@ -1127,218 +1152,488 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) { /* optional */ /* c8. RRCContainer */ - if (1) { - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie8); - ie8->id = F1AP_ProtocolIE_ID_id_RRCContainer; - ie8->criticality = F1AP_Criticality_ignore; - ie8->value.present = F1AP_UEContextModificationRequestIEs__value_PR_RRCContainer; - OCTET_STRING_fromBuf(&ie8->value.choice.RRCContainer, "asdsa1d32sa1d31asd31as", - strlen("asdsa1d32sa1d31asd31as")); + if (f1ap_ue_context_modification_req->rrc_container != NULL) { + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie81); + ie81->id = F1AP_ProtocolIE_ID_id_RRCContainer; + ie81->criticality = F1AP_Criticality_ignore; + ie81->value.present = F1AP_UEContextModificationRequestIEs__value_PR_RRCContainer; + OCTET_STRING_fromBuf(&ie81->value.choice.RRCContainer, (const char*)f1ap_ue_context_modification_req->rrc_container, + f1ap_ue_context_modification_req->rrc_container_length); } - /* mandatory */ + /* optional */ /* c9. SCell_ToBeSetupMod_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie9); - ie9->id = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_List; - ie9->criticality = F1AP_Criticality_ignore; - ie9->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeSetupMod_List; + if(0){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie9); + ie9->id = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_List; + ie9->criticality = F1AP_Criticality_ignore; + ie9->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeSetupMod_List; - for (int i=0; i<1; i++) { - // - asn1cSequenceAdd(ie9->value.choice.SCell_ToBeSetupMod_List.list, + for (int i=0; i<1; i++) { + // + asn1cSequenceAdd(ie9->value.choice.SCell_ToBeSetupMod_List.list, F1AP_SCell_ToBeSetupMod_ItemIEs_t, scell_toBeSetupMod_item_ies); - scell_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_Item; - scell_toBeSetupMod_item_ies->criticality = F1AP_Criticality_ignore; - scell_toBeSetupMod_item_ies->value.present = F1AP_SCell_ToBeSetupMod_ItemIEs__value_PR_SCell_ToBeSetupMod_Item; - /* 8.1 SCell_ToBeSetup_Item */ - F1AP_SCell_ToBeSetupMod_Item_t *scell_toBeSetupMod_item= - &scell_toBeSetupMod_item_ies->value.choice.SCell_ToBeSetupMod_Item; - // /* - sCell_ID */ - addnRCGI(scell_toBeSetupMod_item->sCell_ID, &hardCoded); - /* sCellIndex */ - scell_toBeSetupMod_item->sCellIndex = 6; // issue here + scell_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_Item; + scell_toBeSetupMod_item_ies->criticality = F1AP_Criticality_ignore; + scell_toBeSetupMod_item_ies->value.present = F1AP_SCell_ToBeSetupMod_ItemIEs__value_PR_SCell_ToBeSetupMod_Item; + /* 8.1 SCell_ToBeSetup_Item */ + F1AP_SCell_ToBeSetupMod_Item_t *scell_toBeSetupMod_item= + &scell_toBeSetupMod_item_ies->value.choice.SCell_ToBeSetupMod_Item; + // /* - sCell_ID */ + addnRCGI(scell_toBeSetupMod_item->sCell_ID, &hardCoded); + /* sCellIndex */ + scell_toBeSetupMod_item->sCellIndex = 6; // issue here + } } - /* mandatory */ + /* optional */ /* c10. SCell_ToBeRemoved_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie10); - ie10->id = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_List; - ie10->criticality = F1AP_Criticality_ignore; - ie10->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeRemoved_List; - - for (int i=0; i<1; i++) { - // - asn1cSequenceAdd(ie10->value.choice.SCell_ToBeRemoved_List.list, + if(0){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie10); + ie10->id = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_List; + ie10->criticality = F1AP_Criticality_ignore; + ie10->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeRemoved_List; + + for (int i=0; i<1; i++) { + // + asn1cSequenceAdd(ie10->value.choice.SCell_ToBeRemoved_List.list, F1AP_SCell_ToBeRemoved_ItemIEs_t, scell_toBeRemoved_item_ies); - scell_toBeRemoved_item_ies = (F1AP_SCell_ToBeRemoved_ItemIEs_t *)calloc(1, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t)); - //memset((void *)&scell_toBeRemoved_item_ies, 0, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t)); - scell_toBeRemoved_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_Item; - scell_toBeRemoved_item_ies->criticality = F1AP_Criticality_ignore; - scell_toBeRemoved_item_ies->value.present = F1AP_SCell_ToBeRemoved_ItemIEs__value_PR_SCell_ToBeRemoved_Item; - /* 10.1 SCell_ToBeRemoved_Item */ - F1AP_SCell_ToBeRemoved_Item_t *scell_toBeRemoved_item= - &scell_toBeRemoved_item_ies->value.choice.SCell_ToBeRemoved_Item; - /* - sCell_ID */ - addnRCGI(scell_toBeRemoved_item->sCell_ID, &hardCoded); + scell_toBeRemoved_item_ies = (F1AP_SCell_ToBeRemoved_ItemIEs_t *)calloc(1, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t)); + //memset((void *)&scell_toBeRemoved_item_ies, 0, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t)); + scell_toBeRemoved_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_Item; + scell_toBeRemoved_item_ies->criticality = F1AP_Criticality_ignore; + scell_toBeRemoved_item_ies->value.present = F1AP_SCell_ToBeRemoved_ItemIEs__value_PR_SCell_ToBeRemoved_Item; + /* 10.1 SCell_ToBeRemoved_Item */ + F1AP_SCell_ToBeRemoved_Item_t *scell_toBeRemoved_item= + &scell_toBeRemoved_item_ies->value.choice.SCell_ToBeRemoved_Item; + /* - sCell_ID */ + addnRCGI(scell_toBeRemoved_item->sCell_ID, &hardCoded); + } } /* mandatory */ /* c11. SRBs_ToBeSetupMod_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie11); - ie11->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_List; - ie11->criticality = F1AP_Criticality_reject; - ie11->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeSetupMod_List; - - for (int i=0; i<1; i++) { - // - asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetupMod_List.list, - F1AP_SRBs_ToBeSetupMod_ItemIEs_t, srbs_toBeSetupMod_item_ies); - srbs_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_Item; - srbs_toBeSetupMod_item_ies->criticality = F1AP_Criticality_ignore; - srbs_toBeSetupMod_item_ies->value.present = F1AP_SRBs_ToBeSetupMod_ItemIEs__value_PR_SRBs_ToBeSetupMod_Item; - /* 9.1 SRBs_ToBeSetupMod_Item */ - F1AP_SRBs_ToBeSetupMod_Item_t *srbs_toBeSetupMod_item= - &srbs_toBeSetupMod_item_ies->value.choice.SRBs_ToBeSetupMod_Item; - /* - sRBID */ - srbs_toBeSetupMod_item->sRBID = 3L; + if(f1ap_ue_context_modification_req->srbs_to_be_setup_length > 0){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie11); + ie11->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_List; + ie11->criticality = F1AP_Criticality_reject; + ie11->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeSetupMod_List; + + for (int i=0; i<f1ap_ue_context_modification_req->srbs_to_be_setup_length; i++) { + // + asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetupMod_List, F1AP_SRBs_ToBeSetupMod_ItemIEs_t, srbs_toBeSetupMod_item_ies); + srbs_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_Item; // 73 + srbs_toBeSetupMod_item_ies->criticality = F1AP_Criticality_reject; + srbs_toBeSetupMod_item_ies->value.present = F1AP_SRBs_ToBeSetupMod_ItemIEs__value_PR_SRBs_ToBeSetupMod_Item; + /* 11.1 SRBs_ToBeSetup_Item */ + F1AP_SRBs_ToBeSetupMod_Item_t *srbs_toBeSetupMod_item=&srbs_toBeSetupMod_item_ies->value.choice.SRBs_ToBeSetupMod_Item; + /* 11.1.1 sRBID */ + srbs_toBeSetupMod_item->sRBID = f1ap_ue_context_modification_req->srbs_to_be_setup[i].srb_id; + /* OPTIONAL */ + /* 11.1.2 duplicationIndication */ + asn1cCallocOne(srbs_toBeSetupMod_item->duplicationIndication, + F1AP_DuplicationIndication_true); // enum + } } /* mandatory */ /* c12. DRBs_ToBeSetupMod_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie12); - ie12->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_List; - ie12->criticality = F1AP_Criticality_reject; - ie12->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List; + if(f1ap_ue_context_modification_req->drbs_to_be_setup_length){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie12); + ie12->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_List; + ie12->criticality = F1AP_Criticality_reject; + ie12->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List; - for (int i=0; i<1; i++) { - // - asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetupMod_List.list, + for (int i = 0; i < f1ap_ue_context_modification_req->drbs_to_be_setup_length; i++) { + asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetupMod_List.list, F1AP_DRBs_ToBeSetupMod_ItemIEs_t, drbs_toBeSetupMod_item_ies); - drbs_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item; - drbs_toBeSetupMod_item_ies->criticality = F1AP_Criticality_reject; - drbs_toBeSetupMod_item_ies->value.present = F1AP_DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item; - /* 12.1 DRBs_ToBeSetupMod_Item */ - F1AP_DRBs_ToBeSetupMod_Item_t *drbs_toBeSetupMod_item= - &drbs_toBeSetupMod_item_ies->value.choice.DRBs_ToBeSetupMod_Item; - /* dRBID */ - drbs_toBeSetupMod_item->dRBID = 30L; - /* qoSInformation */ - drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS; - drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t)); - drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS->qCI = 253L; - /* uLUPTNLInformation_ToBeSetup_List */ - int maxnoofULTunnels = 1; // 2; - - for (int j=0; j<maxnoofULTunnels; j++) { - /* ULTunnels_ToBeSetup_Item */ - asn1cSequenceAdd( drbs_toBeSetupMod_item->uLUPTNLInformation_ToBeSetup_List.list, + drbs_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item; + drbs_toBeSetupMod_item_ies->criticality = F1AP_Criticality_reject; + drbs_toBeSetupMod_item_ies->value.present = F1AP_DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item; + /* 12.1 DRBs_ToBeSetupMod_Item */ + F1AP_DRBs_ToBeSetupMod_Item_t *drbs_toBeSetupMod_item= + &drbs_toBeSetupMod_item_ies->value.choice.DRBs_ToBeSetupMod_Item; + /* dRBID */ + drbs_toBeSetupMod_item->dRBID = f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id; + /* qoSInformation */ + + if(f1ap_ue_context_modification_req->QoS_information_type == EUTRAN_QoS){ + drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS; + drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t)); + drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS->qCI = 253L; + /* uLUPTNLInformation_ToBeSetup_List */ + int maxnoofULTunnels = 1; // 2; + + for (int j=0; j<maxnoofULTunnels; j++) { + /* ULTunnels_ToBeSetup_Item */ + asn1cSequenceAdd( drbs_toBeSetupMod_item->uLUPTNLInformation_ToBeSetup_List.list, F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item); - uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel; - asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel, + uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel; + asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel, gTPTunnel) - /* transportLayerAddress */ - TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress); - /* gTP_TEID */ - OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "4567", - strlen("4567")); - } + /* transportLayerAddress */ + TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress); + /* gTP_TEID */ + OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "4567", + strlen("4567")); + } - /* rLCMode */ - drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional; // enum + /* rLCMode */ + drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional; // enum - /* OPTIONAL */ - /* ULConfiguration */ - if (0) { - drbs_toBeSetupMod_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t)); + /* OPTIONAL */ + /* ULConfiguration */ + if (0) { + drbs_toBeSetupMod_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t)); + } + } //QoS information + + else{ + /* 12.1.2 DRB_Information */ + drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_choice_extension; + F1AP_QoSInformation_ExtIEs_t *ie = (F1AP_QoSInformation_ExtIEs_t *)calloc(1, sizeof(*ie)); + ie->id = F1AP_ProtocolIE_ID_id_DRB_Information; + ie->criticality = F1AP_Criticality_reject; + ie->value.present = F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information; + F1AP_DRB_Information_t *DRB_Information = &ie->value.choice.DRB_Information; + drbs_toBeSetupMod_item->qoSInformation.choice.choice_extension = (struct F1AP_ProtocolIE_SingleContainer *)ie; + /* 12.1.2.1 dRB_QoS */ + { + /* qoS_Characteristics */ + { + int some_decide_qoS_characteristics = 0; // BK: Need Check + + if (some_decide_qoS_characteristics) { + DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI; + setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI); + } else { + DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI; + asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, tmp); + /* qoSPriorityLevel */ + tmp->qoSPriorityLevel = 1L; + /* packetDelayBudget */ + tmp->packetDelayBudget = 1L; + /* packetErrorRate */ + tmp->packetErrorRate.pER_Scalar = 1L; + tmp->packetErrorRate.pER_Exponent = 6L; + + /* OPTIONAL */ + /* delayCritical */ + if (0) { + asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical, 1L); + } + + /* OPTIONAL */ + /* averagingWindow */ + if (0) { + asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow, 1L); + } + + /* OPTIONAL */ + /* maxDataBurstVolume */ + if (0) { + asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume, 1L); + } + } // if some_decide_qoS_characteristics + + } // qoS_Characteristics + /* nGRANallocationRetentionPriority */ + { + DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum + DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum + DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum + } // nGRANallocationRetentionPriority + + /* OPTIONAL */ + /* gBR_QoS_Flow_Information */ + if (0) { + asn1cCalloc(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information, tmp); + asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L); + asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L); + asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L); + asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L); + + /* OPTIONAL */ + /* maxPacketLossRateDownlink */ + if (0) { + asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L); + } + + /* OPTIONAL */ + /* maxPacketLossRateUplink */ + if (0) { + asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L); + } + } + + /* OPTIONAL */ + /* reflective_QoS_Attribute */ + if (0) { + asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute, 1L); + } + } // dRB_QoS + /* 12.1.2.2 sNSSAI */ + { + /* sST */ + + OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1); + + /* OPTIONAL */ + /* sD */ + if (0) { + asn1cCalloc(DRB_Information->sNSSAI.sD, tmp); + OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as", + strlen("asdsa1d32sa1d31asd31as")); + } + } + + /* OPTIONAL */ + /* 12.1.2.3 notificationControl */ + if (0) { + asn1cCallocOne(DRB_Information->notificationControl, + F1AP_NotificationControl_active); // enum + } + + /* 12.1.2.4 flows_Mapped_To_DRB_List */ // BK: need verifiy + + for (int k = 0; k < 1; k ++) { + asn1cSequenceAdd(DRB_Information->flows_Mapped_To_DRB_List.list, + F1AP_Flows_Mapped_To_DRB_Item_t, flows_mapped_to_drb_item); + /* qoSFlowIndicator */ + flows_mapped_to_drb_item->qoSFlowIdentifier = 1L; + /* qoSFlowLevelQoSParameters */ + { + /* qoS_Characteristics */ + { + int some_decide_qoS_characteristics = 0; // BK: Need Check + F1AP_QoS_Characteristics_t *QosParams=&flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.qoS_Characteristics; + + if (some_decide_qoS_characteristics) { + QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI; + setQos(QosParams->choice.non_Dynamic_5QI); + } else { + QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI; + asn1cCalloc(QosParams->choice.dynamic_5QI, tmp); + /* qoSPriorityLevel */ + tmp->qoSPriorityLevel = 1L; + /* packetDelayBudget */ + tmp->packetDelayBudget = 1L; + /* packetErrorRate */ + tmp->packetErrorRate.pER_Scalar = 1L; + tmp->packetErrorRate.pER_Exponent = 6L; + + /* OPTIONAL */ + /* delayCritical */ + if (0) { + asn1cCalloc(QosParams->choice.dynamic_5QI->delayCritical, tmp); + *tmp = 1L; + } + + /* OPTIONAL */ + /* averagingWindow */ + if (0) { + asn1cCalloc(QosParams->choice.dynamic_5QI->averagingWindow, tmp); + *tmp = 1L; + } + + /* OPTIONAL */ + /* maxDataBurstVolume */ + if (0) { + asn1cCalloc(QosParams->choice.dynamic_5QI->maxDataBurstVolume, tmp); + *tmp= 1L; + } + } // if some_decide_qoS_characteristics + + } // qoS_Characteristics + /* nGRANallocationRetentionPriority */ + { + flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum + flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum + flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum + } // nGRANallocationRetentionPriority + + /* OPTIONAL */ + /* gBR_QoS_Flow_Information */ + if (0) { + asn1cCalloc(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information, tmp); + asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L); + asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L); + asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L); + asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L); + + /* OPTIONAL */ + /* maxPacketLossRateDownlink */ + if (0) { + asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L); + } + + /* OPTIONAL */ + /* maxPacketLossRateUplink */ + if (0) { + asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L); + } + } + + /* OPTIONAL */ + /* reflective_QoS_Attribute */ + if (0) { + asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.reflective_QoS_Attribute, 1L); + } + } // qoSFlowLevelQoSParameters + } + + } //QoS information + + /* 12.1.3 uLUPTNLInformation_ToBeSetup_List */ + for (int j = 0; j < f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) { + /*Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU*/ + transport_layer_addr_t addr; + int sz=sizeof(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address); + memcpy(addr.buffer,&f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz); + addr.length = sz*8; + + f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].teid = newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst, + f1ap_ue_context_modification_req->rnti, + f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id, + f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id, + 0xFFFF, // We will set the right value from DU answer + -1, // no qfi + addr, + f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_dl_tnl[0].port, + cu_f1u_data_req, + NULL); + /* 12.3.1 ULTunnels_ToBeSetup_Item */ + asn1cSequenceAdd(drbs_toBeSetupMod_item->uLUPTNLInformation_ToBeSetup_List.list, + F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item); + uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel; + asn1cCalloc( uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel, + gTPTunnel); + /* 12.3.1.1.1 transportLayerAddress */ + TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address, + &gTPTunnel->transportLayerAddress); + /* 12.3.1.1.2 gTP_TEID */ + INT32_TO_OCTET_STRING(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].teid, + &gTPTunnel->gTP_TEID); + } + /* 12.1.4 rLCMode */ + /* TODO use rlc_mode from f1ap_drb_to_be_setup */ + switch (f1ap_ue_context_modification_req->drbs_to_be_setup[i].rlc_mode) { + case RLC_MODE_AM: + drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_am; + break; + + default: + drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional; + } + + /* OPTIONAL */ + /* 12.1.5 ULConfiguration */ + if (0) { + asn1cCalloc(drbs_toBeSetupMod_item->uLConfiguration, tmp); + tmp->uLUEConfiguration = F1AP_ULUEConfiguration_no_data; + } + + /* OPTIONAL */ + /* 12.1.6 duplicationActivation */ + if (0) { + asn1cCalloc(drbs_toBeSetupMod_item->duplicationActivation, tmp); + *tmp = F1AP_DuplicationActivation_active; // enum + } } } - /* mandatory */ - /* c13. DRBs_ToBeModified_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie13); - ie13->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_List; - ie13->criticality = F1AP_Criticality_reject; - ie13->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List; + /* optional */ + if(0){ + /* c13. DRBs_ToBeModified_List */ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie13); + ie13->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_List; + ie13->criticality = F1AP_Criticality_reject; + ie13->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List; - for (int i=0; i<1; i++) { - // - asn1cSequenceAdd( ie13->value.choice.DRBs_ToBeModified_List.list, + for (int i=0; i<1; i++) { + // + asn1cSequenceAdd( ie13->value.choice.DRBs_ToBeModified_List.list, F1AP_DRBs_ToBeModified_ItemIEs_t, drbs_toBeModified_item_ies); - drbs_toBeModified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_Item; - drbs_toBeModified_item_ies->criticality = F1AP_Criticality_reject; - drbs_toBeModified_item_ies->value.present = F1AP_DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item; - /* 13.1 SRBs_ToBeModified_Item */ - F1AP_DRBs_ToBeModified_Item_t *drbs_toBeModified_item= - &drbs_toBeModified_item_ies->value.choice.DRBs_ToBeModified_Item; - /* dRBID */ - drbs_toBeModified_item->dRBID = 30L; - /* qoSInformation */ - asn1cCalloc(drbs_toBeModified_item->qoSInformation, tmp); - tmp->present = F1AP_QoSInformation_PR_eUTRANQoS; - tmp->choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t)); - tmp->choice.eUTRANQoS->qCI = 254L; - /* ULTunnels_ToBeModified_List */ - int maxnoofULTunnels = 1; // 2; - - for (int j=0; j<maxnoofULTunnels; j++) { - /* ULTunnels_ToBeModified_Item */ - asn1cSequenceAdd(drbs_toBeModified_item->uLUPTNLInformation_ToBeSetup_List.list, + drbs_toBeModified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_Item; + drbs_toBeModified_item_ies->criticality = F1AP_Criticality_reject; + drbs_toBeModified_item_ies->value.present = F1AP_DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item; + /* 13.1 SRBs_ToBeModified_Item */ + F1AP_DRBs_ToBeModified_Item_t *drbs_toBeModified_item= + &drbs_toBeModified_item_ies->value.choice.DRBs_ToBeModified_Item; + /* dRBID */ + drbs_toBeModified_item->dRBID = 30L; + /* qoSInformation */ + asn1cCalloc(drbs_toBeModified_item->qoSInformation, tmp); + tmp->present = F1AP_QoSInformation_PR_eUTRANQoS; + tmp->choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t)); + tmp->choice.eUTRANQoS->qCI = 254L; + /* ULTunnels_ToBeModified_List */ + int maxnoofULTunnels = 1; // 2; + + for (int j=0; j<maxnoofULTunnels; j++) { + /* ULTunnels_ToBeModified_Item */ + asn1cSequenceAdd(drbs_toBeModified_item->uLUPTNLInformation_ToBeSetup_List.list, F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item); - uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel; - asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel, + uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel; + asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel, gTPTunnel); - TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress); - OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204", + TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress); + OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204", strlen("1204")); - } + } - /* OPTIONAL */ - /* ULConfiguration */ - if (0) { - drbs_toBeModified_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t)); + /* OPTIONAL */ + /* ULConfiguration */ + if (0) { + drbs_toBeModified_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t)); + } } } - /* mandatory */ - /* c14. SRBs_ToBeReleased_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie14); - ie14->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_List; - ie14->criticality = F1AP_Criticality_reject; - ie14->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeReleased_List; + /* optional */ + if(0){ + /* c14. SRBs_ToBeReleased_List */ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie14); + ie14->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_List; + ie14->criticality = F1AP_Criticality_reject; + ie14->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeReleased_List; - for (int i=0; i<1; i++) { - // - asn1cSequenceAdd(ie14->value.choice.SRBs_ToBeReleased_List.list, + for (int i=0; i<1; i++) { + // + asn1cSequenceAdd(ie14->value.choice.SRBs_ToBeReleased_List.list, F1AP_SRBs_ToBeReleased_ItemIEs_t, srbs_toBeReleased_item_ies); - srbs_toBeReleased_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_Item; - srbs_toBeReleased_item_ies->criticality = F1AP_Criticality_ignore; - srbs_toBeReleased_item_ies->value.present = F1AP_SRBs_ToBeReleased_ItemIEs__value_PR_SRBs_ToBeReleased_Item; - /* 9.1 SRBs_ToBeReleased_Item */ - F1AP_SRBs_ToBeReleased_Item_t *srbs_toBeReleased_item= - &srbs_toBeReleased_item_ies->value.choice.SRBs_ToBeReleased_Item; - /* - sRBID */ - srbs_toBeReleased_item->sRBID = 2L; + srbs_toBeReleased_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_Item; + srbs_toBeReleased_item_ies->criticality = F1AP_Criticality_ignore; + srbs_toBeReleased_item_ies->value.present = F1AP_SRBs_ToBeReleased_ItemIEs__value_PR_SRBs_ToBeReleased_Item; + /* 9.1 SRBs_ToBeReleased_Item */ + F1AP_SRBs_ToBeReleased_Item_t *srbs_toBeReleased_item= + &srbs_toBeReleased_item_ies->value.choice.SRBs_ToBeReleased_Item; + /* - sRBID */ + srbs_toBeReleased_item->sRBID = 2L; + } } - /* mandatory */ - /* c15. DRBs_ToBeReleased_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie15); - ie15->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_List; - ie15->criticality = F1AP_Criticality_reject; - ie15->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List; + /* optional */ + if(0){ + /* c15. DRBs_ToBeReleased_List */ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie15); + ie15->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_List; + ie15->criticality = F1AP_Criticality_reject; + ie15->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List; - for (int i=0; i<1; i++) { - // - asn1cSequenceAdd(ie15->value.choice.DRBs_ToBeReleased_List.list, + for (int i=0; i<1; i++) { + // + asn1cSequenceAdd(ie15->value.choice.DRBs_ToBeReleased_List.list, F1AP_DRBs_ToBeReleased_ItemIEs_t, drbs_toBeReleased_item_ies); - drbs_toBeReleased_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_Item; - drbs_toBeReleased_item_ies->criticality = F1AP_Criticality_reject; - drbs_toBeReleased_item_ies->value.present = F1AP_DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item; - /* 14.1 SRBs_ToBeReleased_Item */ - F1AP_DRBs_ToBeReleased_Item_t *drbs_toBeReleased_item= - &drbs_toBeReleased_item_ies->value.choice.DRBs_ToBeReleased_Item; - /* dRBID */ - drbs_toBeReleased_item->dRBID = 30L; + drbs_toBeReleased_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_Item; + drbs_toBeReleased_item_ies->criticality = F1AP_Criticality_reject; + drbs_toBeReleased_item_ies->value.present = F1AP_DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item; + /* 14.1 SRBs_ToBeReleased_Item */ + F1AP_DRBs_ToBeReleased_Item_t *drbs_toBeReleased_item= + &drbs_toBeReleased_item_ies->value.choice.DRBs_ToBeReleased_Item; + /* dRBID */ + drbs_toBeReleased_item->dRBID = 30L; + } } /* encode */ @@ -1346,7 +1641,7 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) { LOG_E(F1AP, "Failed to encode F1 UE CONTEXT_MODIFICATION REQUEST\n"); return -1; } - + f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/); return 0; } @@ -1354,7 +1649,130 @@ int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, uint32_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu) { - AssertFatal(1==0,"Not implemented yet\n"); + + MessageDef *msg_p; + F1AP_UEContextModificationResponse_t *container; + F1AP_UEContextModificationResponseIEs_t *ie; + DevAssert(pdu); + msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_UE_CONTEXT_MODIFICATION_RESP); + f1ap_ue_context_setup_t *f1ap_ue_context_modification_resp = &F1AP_UE_CONTEXT_MODIFICATION_RESP(msg_p); + container = &pdu->choice.successfulOutcome->value.choice.UEContextModificationResponse; + int i; + + /* GNB_CU_UE_F1AP_ID */ + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container, + F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true); + f1ap_ue_context_modification_resp->gNB_CU_ue_id = ie->value.choice.GNB_CU_UE_F1AP_ID; + + LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_CU_ue_id is: %d \n", f1ap_ue_context_modification_resp->gNB_CU_ue_id); + + /* GNB_DU_UE_F1AP_ID */ + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container, + F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true); + f1ap_ue_context_modification_resp->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID; + + LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_DU_ue_id is: %d \n", f1ap_ue_context_modification_resp->gNB_DU_ue_id); + + f1ap_ue_context_modification_resp->rnti = + f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_modification_resp->gNB_DU_ue_id); + + // DUtoCURRCInformation + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container, + F1AP_ProtocolIE_ID_id_DUtoCURRCInformation, false); + if(ie!=NULL){ + f1ap_ue_context_modification_resp->du_to_cu_rrc_information = (du_to_cu_rrc_information_t *)calloc(1, sizeof(du_to_cu_rrc_information_t)); + f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size); + + memcpy(f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size); + f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size; + } + + // DRBs_SetupMod_List + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container, + F1AP_ProtocolIE_ID_id_DRBs_SetupMod_List, false); + if(ie!=NULL){ + f1ap_ue_context_modification_resp->drbs_to_be_setup_length = ie->value.choice.DRBs_SetupMod_List.list.count; + f1ap_ue_context_modification_resp->drbs_to_be_setup = calloc(f1ap_ue_context_modification_resp->drbs_to_be_setup_length, + sizeof(f1ap_drb_to_be_setup_t)); + AssertFatal(f1ap_ue_context_modification_resp->drbs_to_be_setup, + "could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n"); + for (i = 0; i < f1ap_ue_context_modification_resp->drbs_to_be_setup_length; ++i) { + f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_modification_resp->drbs_to_be_setup[i]; + F1AP_DRBs_SetupMod_Item_t *drbs_setupmod_item_p; + drbs_setupmod_item_p = &((F1AP_DRBs_SetupMod_ItemIEs_t *)ie->value.choice.DRBs_SetupMod_List.list.array[i])->value.choice.DRBs_SetupMod_Item; + drb_p->drb_id = drbs_setupmod_item_p->dRBID; + // TODO in the following, assume only one UP UL TNL is present. + // this matches/assumes OAI CU/DU implementation, can be up to 2! + drb_p->up_dl_tnl_length = 1; + AssertFatal(drbs_setupmod_item_p->dLUPTNLInformation_ToBeSetup_List.list.count > 0, + "no DL UP TNL Information in DRBs to be Setup list\n"); + F1AP_DLUPTNLInformation_ToBeSetup_Item_t *dl_up_tnl_info_p = (F1AP_DLUPTNLInformation_ToBeSetup_Item_t *)drbs_setupmod_item_p->dLUPTNLInformation_ToBeSetup_List.list.array[0]; + F1AP_GTPTunnel_t *dl_up_tnl0 = dl_up_tnl_info_p->dLUPTNLInformation.choice.gTPTunnel; + BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&dl_up_tnl0->transportLayerAddress, drb_p->up_dl_tnl[0].tl_address); + OCTET_STRING_TO_INT32(&dl_up_tnl0->gTP_TEID, drb_p->up_dl_tnl[0].teid); + GtpuUpdateTunnelOutgoingTeid(getCxt(CUtype, instance)->gtpInst, + f1ap_ue_context_modification_resp->rnti, + (ebi_t)drbs_setupmod_item_p->dRBID, + drb_p->up_dl_tnl[0].teid); + } + } + // SRBs_FailedToBeSetupMod_List + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container, + F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_List, false); + if(ie!=NULL){ + f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length = ie->value.choice.SRBs_FailedToBeSetupMod_List.list.count; + f1ap_ue_context_modification_resp->srbs_failed_to_be_setup = calloc(f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length, + sizeof(f1ap_rb_failed_to_be_setup_t)); + AssertFatal(f1ap_ue_context_modification_resp->srbs_failed_to_be_setup, + "could not allocate memory for f1ap_ue_context_setup_resp->srbs_failed_to_be_setup\n"); + for (i = 0; i < f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length; ++i) { + f1ap_rb_failed_to_be_setup_t *srb_p = &f1ap_ue_context_modification_resp->srbs_failed_to_be_setup[i]; + srb_p->rb_id = ((F1AP_SRBs_FailedToBeSetupMod_Item_t *)ie->value.choice.SRBs_FailedToBeSetupMod_List.list.array[i])->sRBID; + } + + } + // DRBs_FailedToBeSetupMod_List + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container, + F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_List, false); + if(ie!=NULL){ + f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length = ie->value.choice.DRBs_FailedToBeSetupMod_List.list.count; + f1ap_ue_context_modification_resp->drbs_failed_to_be_setup = calloc(f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length, + sizeof(f1ap_rb_failed_to_be_setup_t)); + AssertFatal(f1ap_ue_context_modification_resp->drbs_failed_to_be_setup, + "could not allocate memory for f1ap_ue_context_setup_resp->drbs_failed_to_be_setup\n"); + for (i = 0; i < f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length; ++i) { + f1ap_rb_failed_to_be_setup_t *drb_p = &f1ap_ue_context_modification_resp->drbs_failed_to_be_setup[i]; + drb_p->rb_id = ((F1AP_DRBs_FailedToBeSetupMod_Item_t *)ie->value.choice.DRBs_FailedToBeSetupMod_List.list.array[i])->dRBID; + } + } + + // SCell_FailedtoSetupMod_List + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container, + F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_List, false); + if(ie!=NULL){ + LOG_E (F1AP, "Not supporting handling of SCell_FailedtoSetupMod_List \n"); + } + + // SRBs_Setup_List + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container, + F1AP_ProtocolIE_ID_id_SRBs_SetupMod_List, false); + if(ie!=NULL){ + f1ap_ue_context_modification_resp->srbs_to_be_setup_length = ie->value.choice.SRBs_SetupMod_List.list.count; + f1ap_ue_context_modification_resp->srbs_to_be_setup = calloc(f1ap_ue_context_modification_resp->srbs_to_be_setup_length, + sizeof(f1ap_srb_to_be_setup_t)); + AssertFatal(f1ap_ue_context_modification_resp->srbs_to_be_setup, + "could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n"); + for (i = 0; i < f1ap_ue_context_modification_resp->srbs_to_be_setup_length; ++i) { + f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_modification_resp->srbs_to_be_setup[i]; + F1AP_SRBs_SetupMod_Item_t *srbs_setup_item_p; + srbs_setup_item_p = &((F1AP_SRBs_SetupMod_ItemIEs_t *)ie->value.choice.SRBs_SetupMod_List.list.array[i])->value.choice.SRBs_SetupMod_Item; + srb_p->srb_id = srbs_setup_item_p->sRBID; + srb_p->lcid = srbs_setup_item_p->lCID; + } + } + + itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p); + return 0; } int CU_handle_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance, diff --git a/openair2/F1AP/f1ap_cu_ue_context_management.h b/openair2/F1AP/f1ap_cu_ue_context_management.h index 09af51ec54c..87563e97b1d 100644 --- a/openair2/F1AP/f1ap_cu_ue_context_management.h +++ b/openair2/F1AP/f1ap_cu_ue_context_management.h @@ -72,7 +72,8 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, /* * UE Context Modification (gNB-CU initiated) */ -int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance); +int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, + f1ap_ue_context_setup_t *f1ap_ue_context_modification_req); int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, uint32_t assoc_id, uint32_t stream, diff --git a/openair2/F1AP/f1ap_decoder.c b/openair2/F1AP/f1ap_decoder.c index 6ebf1cc16d4..60b3f94310e 100644 --- a/openair2/F1AP/f1ap_decoder.c +++ b/openair2/F1AP/f1ap_decoder.c @@ -78,6 +78,10 @@ static int f1ap_decode_initiating_message(F1AP_F1AP_PDU_t *pdu) { case F1AP_ProcedureCode_id_UEContextSetup: LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextSetup\n", __func__); break; + + case F1AP_ProcedureCode_id_UEContextModification: + LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextModification\n", __func__); + break; // case F1AP_ProcedureCode_id_InitialContextSetup: // res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu); @@ -123,6 +127,10 @@ static int f1ap_decode_successful_outcome(F1AP_F1AP_PDU_t *pdu) { LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextSetup\n", __func__); break; + case F1AP_ProcedureCode_id_UEContextModification: + LOG_I(F1AP, "%s(): F1AP_ProcedureCode_id_UEContextModification\n", __func__); + break; + default: LOG_E(F1AP,"Unknown procedure ID (%d) for successfull outcome message\n", (int)pdu->choice.successfulOutcome->procedureCode); diff --git a/openair2/F1AP/f1ap_default_values.h b/openair2/F1AP/f1ap_default_values.h index 91a11796240..7c64614f50a 100644 --- a/openair2/F1AP/f1ap_default_values.h +++ b/openair2/F1AP/f1ap_default_values.h @@ -40,7 +40,7 @@ #define ENB_NAME "Eurecom ENB" #define ENB_NAME_FORMAT (ENB_NAME" %u") -#define F1AP_PORT_NUMBER (30923) +#define F1AP_PORT_NUMBER (38472) #define F1AP_SCTP_PPID (62) #endif /* F1AP_DEFAULT_VALUES_H_ */ diff --git a/openair2/F1AP/f1ap_du_interface_management.c b/openair2/F1AP/f1ap_du_interface_management.c index 6d4757be6f6..367b71fed5f 100644 --- a/openair2/F1AP/f1ap_du_interface_management.c +++ b/openair2/F1AP/f1ap_du_interface_management.c @@ -172,7 +172,20 @@ int DU_send_F1_SETUP_REQUEST(instance_t instance) { MCC_MNC_TO_PLMNID(cell->mcc, cell->mnc, cell->mnc_digit_length, &servedPLMN_item->pLMN_Identity); // // /* - CHOICE NR-MODE-Info */ F1AP_NR_Mode_Info_t *nR_Mode_Info= &served_cell_information->nR_Mode_Info; - + F1AP_ProtocolExtensionContainer_154P34_t *p_154P34=calloc(1,sizeof(* p_154P34)); + servedPLMN_item->iE_Extensions = (struct F1AP_ProtocolExtensionContainer *)p_154P34; + asn1cSequenceAdd(p_154P34->list, F1AP_ServedPLMNs_ItemExtIEs_t , served_plmns_itemExtIEs); + served_plmns_itemExtIEs->criticality = F1AP_Criticality_ignore; + served_plmns_itemExtIEs->id = F1AP_ProtocolIE_ID_id_TAISliceSupportList; + served_plmns_itemExtIEs->extensionValue.present = F1AP_ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList; + F1AP_SliceSupportList_t *slice_support_list = &served_plmns_itemExtIEs->extensionValue.choice.SliceSupportList; + + asn1cSequenceAdd(slice_support_list->list, F1AP_SliceSupportItem_t, SliceSupport_item); + INT8_TO_OCTET_STRING(1,&SliceSupport_item->sNSSAI.sST); + asn1cCalloc(SliceSupport_item->sNSSAI.sD, tmp); + INT24_TO_OCTET_STRING(10203,tmp); + //INT24_TO_OCTET_STRING(1,tmp); + if (f1ap_req(false, instance)->fdd_flag) { // FDD nR_Mode_Info->present = F1AP_NR_Mode_Info_PR_fDD; asn1cCalloc(nR_Mode_Info->choice.fDD, fDD_Info); diff --git a/openair2/F1AP/f1ap_du_rrc_message_transfer.c b/openair2/F1AP/f1ap_du_rrc_message_transfer.c index 90ea324a282..e158e9519a9 100644 --- a/openair2/F1AP/f1ap_du_rrc_message_transfer.c +++ b/openair2/F1AP/f1ap_du_rrc_message_transfer.c @@ -509,7 +509,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance, LOG_I(F1AP, "Received DL RRC Transfer on srb_id %ld\n", srb_id); rlc_op_status_t rlc_status; - boolean_t ret = TRUE; + bool ret = true; mem_block_t *pdcp_pdu_p = NULL; pdcp_pdu_p = get_free_mem_block(rrc_dl_sdu_len, __func__); @@ -539,27 +539,27 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance, switch (rlc_status) { case RLC_OP_STATUS_OK: //LOG_I(F1AP, "Data sending request over RLC succeeded!\n"); - ret=TRUE; + ret=true; break; case RLC_OP_STATUS_BAD_PARAMETER: LOG_W(F1AP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n"); - ret= FALSE; + ret= false; break; case RLC_OP_STATUS_INTERNAL_ERROR: LOG_W(F1AP, "Data sending request over RLC failed with 'Internal Error' reason!\n"); - ret= FALSE; + ret= false; break; case RLC_OP_STATUS_OUT_OF_RESSOURCES: LOG_W(F1AP, "Data sending request over RLC failed with 'Out of Resources' reason!\n"); - ret= FALSE; + ret= false; break; default: LOG_W(F1AP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status); - ret= FALSE; + ret= false; break; } // switch case @@ -667,9 +667,9 @@ int DU_send_UL_RRC_MESSAGE_TRANSFER(instance_t instance, UE_sched_ctrl_t *UE_scheduling_control = &(RC.mac[instance]->UE_info.UE_sched_ctrl[UE_id_mac]); - if (UE_scheduling_control->cdrx_waiting_ack == TRUE) { - UE_scheduling_control->cdrx_waiting_ack = FALSE; - UE_scheduling_control->cdrx_configured = TRUE; // Set to TRUE when RRC Connection Reconfiguration Complete is received + if (UE_scheduling_control->cdrx_waiting_ack == true) { + UE_scheduling_control->cdrx_waiting_ack = false; + UE_scheduling_control->cdrx_configured = true; // Set to TRUE when RRC Connection Reconfiguration Complete is received LOG_I(F1AP, "CDRX configuration activated after RRC Connection Reconfiguration Complete reception\n"); } @@ -810,6 +810,13 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP, sdu2P, sdu2_lenP); } + /* mandatory */ + /* c6. Transaction ID (integer value) */ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_InitialULRRCMessageTransferIEs_t, ie6); + ie6->id = F1AP_ProtocolIE_ID_id_TransactionID; + ie6->criticality = F1AP_Criticality_ignore; + ie6->value.present = F1AP_F1SetupRequestIEs__value_PR_TransactionID; + ie6->value.choice.TransactionID = F1AP_get_next_transaction_identifier(f1ap_req(false, instanceP)->gNB_DU_id, f1ap_req(false, instanceP)->gNB_DU_id); /* encode */ if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) { diff --git a/openair2/F1AP/f1ap_du_task.c b/openair2/F1AP/f1ap_du_task.c index c8cfadb9990..f8cf2162201 100644 --- a/openair2/F1AP/f1ap_du_task.c +++ b/openair2/F1AP/f1ap_du_task.c @@ -126,7 +126,7 @@ void *F1AP_DU_task(void *arg) { LOG_I(F1AP, "DU Task Received F1AP_SETUP_REQ\n"); f1ap_setup_req_t *msgSetup=&F1AP_SETUP_REQ(msg); createF1inst(false, myInstance, msgSetup); - getCxt(DUtype, myInstance)->gtpInst=du_create_gtpu_instance_to_cu(msgSetup->CU_f1_ip_address.ipv4_address, + getCxt(DUtype, myInstance)->gtpInst=du_create_gtpu_instance_to_cu(msgSetup->CU_f1_ip_address.ipv4_address, //"172.21.6.9", //"172.21.10.9",//"172.21.9.5", //msgSetup->CU_f1_ip_address.ipv4_address, //"192.168.18.91" msgSetup->CUport, msgSetup->DU_f1_ip_address.ipv4_address, msgSetup->DUport); @@ -175,7 +175,7 @@ void *F1AP_DU_task(void *arg) { break; case F1AP_UL_RRC_MESSAGE: // to rrc - LOG_I(F1AP, "DU Task Received F1AP_UL_RRC_MESSAGE\n"); + LOG_D(F1AP, "DU Task Received F1AP_UL_RRC_MESSAGE\n"); if (RC.nrrrc && RC.nrrrc[0]->node_type == ngran_gNB_DU) { DU_send_UL_NR_RRC_MESSAGE_TRANSFER(myInstance, @@ -191,6 +191,11 @@ void *F1AP_DU_task(void *arg) { DU_send_UE_CONTEXT_SETUP_RESPONSE(myInstance, &F1AP_UE_CONTEXT_SETUP_RESP(msg)); break; + case F1AP_UE_CONTEXT_MODIFICATION_RESP: + LOG_I(F1AP, "DU task received itti message from RRC for F1AP_UE_CONTEXT_MODIFICATION_RESP message generation \n"); + DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(myInstance, &F1AP_UE_CONTEXT_MODIFICATION_RESP(msg)); + break; + case F1AP_UE_CONTEXT_RELEASE_REQ: // from MAC LOG_I(F1AP, "DU Task Received F1AP_UE_CONTEXT_RELEASE_REQ\n"); DU_send_UE_CONTEXT_RELEASE_REQUEST(myInstance, diff --git a/openair2/F1AP/f1ap_du_ue_context_management.c b/openair2/F1AP/f1ap_du_ue_context_management.c index 7b20bfb2aa5..cb158629214 100644 --- a/openair2/F1AP/f1ap_du_ue_context_management.c +++ b/openair2/F1AP/f1ap_du_ue_context_management.c @@ -42,16 +42,16 @@ #include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h" #include <openair3/ocp-gtpu/gtp_itf.h> -boolean_t lteDURecvCb( protocol_ctxt_t *ctxt_pP, - const srb_flag_t srb_flagP, - const rb_id_t rb_idP, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_buffer_sizeP, - unsigned char *const sdu_buffer_pP, - const pdcp_transmission_mode_t modeP, - const uint32_t *sourceL2Id, - const uint32_t *destinationL2Id) { +bool lteDURecvCb(protocol_ctxt_t *ctxt_pP, + const srb_flag_t srb_flagP, + const rb_id_t rb_idP, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_buffer_sizeP, + unsigned char *const sdu_buffer_pP, + const pdcp_transmission_mode_t modeP, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id) { // The buffer comes from the stack in gtp-u thread, we have a make a separate buffer to enqueue in a inter-thread message queue mem_block_t *sdu=get_free_mem_block(sdu_buffer_sizeP, __func__); memcpy(sdu->data, sdu_buffer_pP, sdu_buffer_sizeP); @@ -131,6 +131,19 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance, f1ap_ue_context_setup_req->cellULConfigured = NULL; } + F1AP_UEContextSetupRequestIEs_t *ieCuRrcInfo; + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ieCuRrcInfo, container, + F1AP_ProtocolIE_ID_id_CUtoDURRCInformation, false); + if(ieCuRrcInfo!=NULL){ + f1ap_ue_context_setup_req->cu_to_du_rrc_information = (cu_to_du_rrc_information_t *)calloc(1,sizeof(cu_to_du_rrc_information_t)); + if(ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList!=NULL){ + f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList = (uint8_t *)calloc(1,ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList->size); + memcpy(f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList, ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList->buf, ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList->size); + f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length = ieCuRrcInfo->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList->size; + LOG_I(F1AP, "Size f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length: %d \n", f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length); + } + } + /* DRB */ F1AP_UEContextSetupRequestIEs_t *ieDrb; F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ieDrb, container, @@ -174,14 +187,16 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance, transport_layer_addr_t addr; memcpy(addr.buffer, &drb_p->up_ul_tnl[0].tl_address, sizeof(drb_p->up_ul_tnl[0].tl_address)); addr.length=sizeof(drb_p->up_ul_tnl[0].tl_address)*8; - drb_p->up_dl_tnl[0].teid=newGtpuCreateTunnel(INSTANCE_DEFAULT, - f1ap_ue_context_setup_req->rnti, - drb_p->drb_id, - drb_p->drb_id, - drb_p->up_ul_tnl[0].teid, - addr, - drb_p->up_ul_tnl[0].port, - lteDURecvCb); + drb_p->up_dl_tnl[0].teid = newGtpuCreateTunnel(INSTANCE_DEFAULT, + f1ap_ue_context_setup_req->rnti, + drb_p->drb_id, + drb_p->drb_id, + drb_p->up_ul_tnl[0].teid, + -1, // no qfi + addr, + drb_p->up_ul_tnl[0].port, + lteDURecvCb, + NULL); drb_p->up_dl_tnl_length++; } } @@ -218,17 +233,8 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance, f1ap_ue_context_setup_req->rrc_container = malloc(ieRRC->value.choice.RRCContainer.size); memcpy(f1ap_ue_context_setup_req->rrc_container, ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size); + f1ap_ue_context_setup_req->rrc_container_length = ieRRC->value.choice.RRCContainer.size; // AssertFatal(0, "check configuration, send to appropriate handler\n"); - protocol_ctxt_t ctxt; - // decode RRC Container and act on the message type - //FIXME - //rnti_t rnti = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id); - ctxt.instance = instance; - ctxt.instance = instance; - ctxt.enb_flag = 1; - mem_block_t *pdcp_pdu_p = get_free_mem_block(ieRRC->value.choice.RRCContainer.size, __func__); - memcpy(&pdcp_pdu_p->data[0], ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size); - du_rlc_data_req(&ctxt, 1, 0x00, 1, 1, 0, ieRRC->value.choice.RRCContainer.size, pdcp_pdu_p); } else { LOG_E(F1AP, " RRCContainer in UEContextSetupRequestIEs size id 0\n"); } @@ -245,7 +251,7 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance, return 0; } -int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *req) { +int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *resp) { F1AP_F1AP_PDU_t pdu= {0}; F1AP_UEContextSetupResponse_t *out; uint8_t *buffer=NULL; @@ -264,41 +270,42 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID; ie1->criticality = F1AP_Criticality_reject; ie1->value.present = F1AP_UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID; - ie1->value.choice.GNB_CU_UE_F1AP_ID = req->gNB_CU_ue_id; + ie1->value.choice.GNB_CU_UE_F1AP_ID = resp->gNB_CU_ue_id; /* mandatory */ /* c2. GNB_DU_UE_F1AP_ID */ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie2); ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID; ie2->criticality = F1AP_Criticality_reject; ie2->value.present = F1AP_UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID; - ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, req->rnti); + ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti); + /* mandatory */ /* c3. DUtoCURRCInformation */ - //if (0) { - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie3); - ie3->id = F1AP_ProtocolIE_ID_id_DUtoCURRCInformation; - ie3->criticality = F1AP_Criticality_reject; - ie3->value.present = F1AP_UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation; - { - /* cellGroupConfig */ - OCTET_STRING_fromBuf(&ie3->value.choice.DUtoCURRCInformation.cellGroupConfig, (const char *)req->du_to_cu_rrc_information, - req->du_to_cu_rrc_information_length); + if(resp->du_to_cu_rrc_information){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie3); + ie3->id = F1AP_ProtocolIE_ID_id_DUtoCURRCInformation; + ie3->criticality = F1AP_Criticality_reject; + ie3->value.present = F1AP_UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation; + if(resp->du_to_cu_rrc_information->cellGroupConfig!=NULL){ + /* cellGroupConfig */ + OCTET_STRING_fromBuf(&ie3->value.choice.DUtoCURRCInformation.cellGroupConfig, (const char *)resp->du_to_cu_rrc_information->cellGroupConfig, + resp->du_to_cu_rrc_information->cellGroupConfig_length); + } /* OPTIONAL */ /* measGapConfig */ - if (0) { - asn1cCalloc(ie3->value.choice.DUtoCURRCInformation.measGapConfig, tmp); - OCTET_STRING_fromBuf(tmp, "asdsa", strlen("asdsa")); + if (resp->du_to_cu_rrc_information->measGapConfig!=NULL) { + OCTET_STRING_fromBuf(ie3->value.choice.DUtoCURRCInformation.measGapConfig, (const char *)resp->du_to_cu_rrc_information->measGapConfig, + resp->du_to_cu_rrc_information->measGapConfig_length); } /* OPTIONAL */ /* requestedP_MaxFR1 */ - if (0) { - asn1cCalloc(ie3->value.choice.DUtoCURRCInformation.requestedP_MaxFR1, tmp); - OCTET_STRING_fromBuf(tmp, "asdsa", strlen("asdsa")); + if (resp->du_to_cu_rrc_information->requestedP_MaxFR1!=NULL) { + OCTET_STRING_fromBuf(ie3->value.choice.DUtoCURRCInformation.requestedP_MaxFR1, (const char *)resp->du_to_cu_rrc_information->requestedP_MaxFR1, + resp->du_to_cu_rrc_information->requestedP_MaxFR1_length); } } - //} /* optional */ /* c4. C_RNTI */ @@ -308,7 +315,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup ie4->criticality = F1AP_Criticality_ignore; ie4->value.present = F1AP_UEContextSetupResponseIEs__value_PR_C_RNTI; //C_RNTI_TO_BIT_STRING(rntiP, &ie->value.choice.C_RNTI); - ie4->value.choice.C_RNTI=req->rnti; + ie4->value.choice.C_RNTI=resp->rnti; LOG_E(F1AP,"RNTI to code!\n"); } @@ -335,46 +342,48 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup /* mandatory */ /* c7. DRBs_Setup_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie7); - ie7->id = F1AP_ProtocolIE_ID_id_DRBs_Setup_List; - ie7->criticality = F1AP_Criticality_ignore; - ie7->value.present = F1AP_UEContextSetupResponseIEs__value_PR_DRBs_Setup_List; - - for (int i=0; i< req->drbs_to_be_setup_length; i++) { - // - asn1cSequenceAdd(ie7->value.choice.DRBs_Setup_List.list, - F1AP_DRBs_Setup_ItemIEs_t, drbs_setup_item_ies); - drbs_setup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_Setup_Item; - drbs_setup_item_ies->criticality = F1AP_Criticality_ignore; - drbs_setup_item_ies->value.present = F1AP_SRBs_FailedToBeSetup_ItemIEs__value_PR_SRBs_FailedToBeSetup_Item; - /* 7.1 DRBs_Setup_Item */ - /* ADD */ - F1AP_DRBs_Setup_Item_t *drbs_setup_item=&drbs_setup_item_ies->value.choice.DRBs_Setup_Item; - /* dRBID */ - drbs_setup_item->dRBID = req->drbs_to_be_setup[i].drb_id; + if(resp->drbs_to_be_setup_length > 0){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie7); + ie7->id = F1AP_ProtocolIE_ID_id_DRBs_Setup_List; + ie7->criticality = F1AP_Criticality_ignore; + ie7->value.present = F1AP_UEContextSetupResponseIEs__value_PR_DRBs_Setup_List; + for (int i=0; i< resp->drbs_to_be_setup_length; i++) { + // + asn1cSequenceAdd(ie7->value.choice.DRBs_Setup_List.list, + F1AP_DRBs_Setup_ItemIEs_t, drbs_setup_item_ies); + drbs_setup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_Setup_Item; + drbs_setup_item_ies->criticality = F1AP_Criticality_ignore; + drbs_setup_item_ies->value.present = F1AP_DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item; + /* 7.1 DRBs_Setup_Item */ + /* ADD */ + F1AP_DRBs_Setup_Item_t *drbs_setup_item=&drbs_setup_item_ies->value.choice.DRBs_Setup_Item; + /* dRBID */ + drbs_setup_item->dRBID = resp->drbs_to_be_setup[i].drb_id; - /* OPTIONAL */ - /* lCID */ - //drbs_setup_item.lCID = (F1AP_LCID_t *)calloc(1, sizeof(F1AP_LCID_t)); - //drbs_setup_item.lCID = 1L; + /* OPTIONAL */ + /* lCID */ + //drbs_setup_item.lCID = (F1AP_LCID_t *)calloc(1, sizeof(F1AP_LCID_t)); + //drbs_setup_item.lCID = 1L; - for (int j=0; j<req->drbs_to_be_setup[i].up_dl_tnl_length; j++) { - /* ADD */ - asn1cSequenceAdd(drbs_setup_item->dLUPTNLInformation_ToBeSetup_List.list, + for (int j=0; j<resp->drbs_to_be_setup[i].up_dl_tnl_length; j++) { + /* ADD */ + asn1cSequenceAdd(drbs_setup_item->dLUPTNLInformation_ToBeSetup_List.list, F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item); - dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel; - /* gTPTunnel */ - asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,gTPTunnel); - /* transportLayerAddress */ - struct sockaddr_in addr= {0}; - inet_pton(AF_INET, getCxt(false,instance)->setupReq.DU_f1_ip_address.ipv4_address, - &addr.sin_addr.s_addr); - TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(addr.sin_addr.s_addr, - &gTPTunnel->transportLayerAddress); - /* gTP_TEID */ - INT32_TO_OCTET_STRING(req->drbs_to_be_setup[i].up_dl_tnl[j].teid, &gTPTunnel->gTP_TEID); - } // for j - } // for i + dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel; + /* gTPTunnel */ + asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,gTPTunnel); + /* transportLayerAddress */ + struct sockaddr_in addr= {0}; + inet_pton(AF_INET, getCxt(false,instance)->setupReq.DU_f1_ip_address.ipv4_address, + &addr.sin_addr.s_addr); + TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(addr.sin_addr.s_addr, + &gTPTunnel->transportLayerAddress); + /* gTP_TEID */ + INT32_TO_OCTET_STRING(resp->drbs_to_be_setup[i].up_dl_tnl[j].teid, &gTPTunnel->gTP_TEID); + } // for j + } // for i + + } /* mandatory */ /* c8. SRBs_FailedToBeSetup_List */ @@ -387,7 +396,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup for (int i=0; i<1; i++) { // asn1cSequenceAdd(ie8->value.choice.SRBs_FailedToBeSetup_List.list, - F1AP_SRBs_FailedToBeSetup_ItemIEs_t, srbs_failedToBeSetup_item_ies); + F1AP_SRBs_FailedToBeSetup_ItemIEs_t, srbs_failedToBeSetup_item_ies); srbs_failedToBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_Item; srbs_failedToBeSetup_item_ies->criticality = F1AP_Criticality_ignore; srbs_failedToBeSetup_item_ies->value.present = F1AP_SRBs_FailedToBeSetup_ItemIEs__value_PR_SRBs_FailedToBeSetup_Item; @@ -524,12 +533,13 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup /* mandatory */ /* c11. SRBs_Setup_List */ + if(resp->srbs_to_be_setup_length > 0){ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie11); ie11->id = F1AP_ProtocolIE_ID_id_SRBs_Setup_List; ie11->criticality = F1AP_Criticality_ignore; ie11->value.present = F1AP_UEContextSetupResponseIEs__value_PR_SRBs_Setup_List; - for (int i=0; i< req->srbs_to_be_setup_length; i++) {// + for (int i=0; i< resp->srbs_to_be_setup_length; i++) {// asn1cSequenceAdd(ie11->value.choice.SRBs_Setup_List.list, F1AP_SRBs_Setup_ItemIEs_t, srbs_setup_item_ies); srbs_setup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_Setup_Item; @@ -539,7 +549,8 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup /* ADD */ F1AP_SRBs_Setup_Item_t *srbs_setup_item=&srbs_setup_item_ies->value.choice.SRBs_Setup_Item; /* sRBID */ - srbs_setup_item->sRBID = req->srbs_to_be_setup[i].srb_id; + srbs_setup_item->sRBID = resp->srbs_to_be_setup[i].srb_id; + } } /* Optional */ @@ -581,6 +592,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup getCxt(false, instance)->default_sctp_stream_id); return 0; } + int DU_send_UE_CONTEXT_SETUP_FAILURE(instance_t instance) { AssertFatal(1==0,"Not implemented yet\n"); } @@ -658,7 +670,7 @@ int DU_send_UE_CONTEXT_RELEASE_REQUEST(instance_t instance, getCxt(false, instance)->default_sctp_stream_id); return 0; } -int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, +/*int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, uint32_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu) { @@ -667,14 +679,14 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, protocol_ctxt_t ctxt; DevAssert(pdu); container = &pdu->choice.initiatingMessage->value.choice.UEContextReleaseCommand; - /* GNB_CU_UE_F1AP_ID */ + // GNB_CU_UE_F1AP_ID F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container, F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true); ctxt.rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID); ctxt.instance = instance; ctxt.module_id = instance; ctxt.enb_flag = 1; - /* GNB_DU_UE_F1AP_ID */ + // GNB_DU_UE_F1AP_ID F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container, F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true); const rnti_t rnti = f1ap_get_rnti_by_du_id(DUtype, instance, @@ -683,18 +695,18 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n", rnti, ctxt.rnti); int UE_out_of_sync = 0; - if (RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) { - for (int n = 0; n < MAX_MOBILES_PER_GNB; ++n) { - if (RC.nrmac[instance]->UE_info.active[n] == TRUE - && rnti == RC.nrmac[instance]->UE_info.rnti[n]) { + UE_iterator(RC.nrmac[instance]->UE_info.list, UE) { + if (UE->rnti == rnti) { UE_out_of_sync = 0; break; } } + if (!UE) + LOG_E(F1AP,"Not found rnti: %x\n", rnti); } else { for (int n = 0; n < MAX_MOBILES_PER_ENB; ++n) { - if (RC.mac[instance]->UE_info.active[n] == TRUE + if (RC.mac[instance]->UE_info.active[n] == true && rnti == UE_RNTI(instance, n)) { UE_out_of_sync = RC.mac[instance]->UE_info.UE_sched_ctrl[n].ul_out_of_sync; break; @@ -702,13 +714,13 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, } } - /* We don't need the Cause */ - /* Optional RRC Container: if present, send to UE */ + // We don't need the Cause + // Optional RRC Container: if present, send to UE F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container, F1AP_ProtocolIE_ID_id_RRCContainer, false); if (ie && !UE_out_of_sync) { - /* RRC message and UE is reachable, send message */ + // RRC message and UE is reachable, send message const sdu_size_t sdu_len = ie->value.choice.RRCContainer.size; mem_block_t *pdu_p = NULL; pdu_p = get_free_mem_block(sdu_len, __func__); @@ -759,8 +771,8 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt.instance], ctxt.rnti); if (ue_context_p && !UE_out_of_sync) { - /* UE exists and is in sync so we start a timer before releasing the - * connection */ + // UE exists and is in sync so we start a timer before releasing the + // connection pthread_mutex_lock(&rrc_release_freelist); for (uint16_t release_num = 0; release_num < NUMBER_OF_UE_MAX; release_num++) { @@ -784,19 +796,198 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, pthread_mutex_unlock(&rrc_release_freelist); ue_context_p->ue_context.ue_release_timer_s1 = 0; } else if (ue_context_p && UE_out_of_sync) { - /* UE exists and is out of sync, drop the connection */ + // UE exists and is out of sync, drop the connection mac_eNB_rrc_ul_failure(instance, 0, 0, 0, rnti); } else { LOG_E(F1AP, "no ue_context for RNTI %x, acknowledging release\n", rnti); } - /* TODO send this once the connection has really been released */ + // TODO send this once the connection has really been released + f1ap_ue_context_release_cplt_t cplt; + cplt.rnti = ctxt.rnti; + DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance, &cplt); + return 0; + } +}*/ + + +int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, + uint32_t assoc_id, + uint32_t stream, + F1AP_F1AP_PDU_t *pdu) { + F1AP_UEContextReleaseCommand_t *container; + F1AP_UEContextReleaseCommandIEs_t *ie; + protocol_ctxt_t ctxt; + + /* ITTI message to NR-RRC for the case of gNB-DU */ + MessageDef *msg_p; // message to NR-RRC + msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_UE_CONTEXT_RELEASE_CMD); + f1ap_ue_context_release_req_t *f1ap_ue_context_release_cmd = &F1AP_UE_CONTEXT_RELEASE_CMD(msg_p); + + + DevAssert(pdu); + container = &pdu->choice.initiatingMessage->value.choice.UEContextReleaseCommand; + // GNB_CU_UE_F1AP_ID + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container, + F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true); + if(RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU){ + f1ap_ue_context_release_cmd->rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID); + } + else{ + ctxt.rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID); + ctxt.instance = instance; + ctxt.module_id = instance; + ctxt.enb_flag = 1; + } + // GNB_DU_UE_F1AP_ID + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container, + F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true); + const rnti_t rnti = f1ap_get_rnti_by_du_id(DUtype, instance, + ie->value.choice.GNB_DU_UE_F1AP_ID); + if(RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU){ + AssertFatal(f1ap_ue_context_release_cmd->rnti == rnti, + "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n", + rnti, f1ap_ue_context_release_cmd->rnti); + } + else{ + AssertFatal(ctxt.rnti == rnti, + "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n", + rnti, ctxt.rnti); + } + int UE_out_of_sync = 0; + + if(RC.rrc && RC.rrc[instance]->node_type == ngran_eNB_DU){ + for (int n = 0; n < MAX_MOBILES_PER_ENB; ++n) { + if (RC.mac[instance]->UE_info.active[n] == true + && rnti == UE_RNTI(instance, n)) { + UE_out_of_sync = RC.mac[instance]->UE_info.UE_sched_ctrl[n].ul_out_of_sync; + break; + } + } + } + + // We don't need the Cause + // Optional RRC Container: if present, send to UE + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container, + F1AP_ProtocolIE_ID_id_RRCContainer, false); + + if (ie && !UE_out_of_sync && RC.rrc && RC.rrc[instance]->node_type == ngran_eNB_DU) { + // RRC message and UE is reachable, send message + const sdu_size_t sdu_len = ie->value.choice.RRCContainer.size; + mem_block_t *pdu_p = NULL; + pdu_p = get_free_mem_block(sdu_len, __func__); + memcpy(&pdu_p->data[0], ie->value.choice.RRCContainer.buf, sdu_len); + rlc_op_status_t rlc_status = rlc_data_req(&ctxt + , 1 + , MBMS_FLAG_NO + , 1 // SRB 1 correct? + , 0 + , 0 + , sdu_len + , pdu_p + ,NULL + ,NULL + ); + + switch (rlc_status) { + case RLC_OP_STATUS_OK: + break; + + case RLC_OP_STATUS_BAD_PARAMETER: + LOG_W(F1AP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n"); + break; + + case RLC_OP_STATUS_INTERNAL_ERROR: + LOG_W(F1AP, "Data sending request over RLC failed with 'Internal Error' reason!\n"); + break; + + case RLC_OP_STATUS_OUT_OF_RESSOURCES: + LOG_W(F1AP, "Data sending request over RLC failed with 'Out of Resources' reason!\n"); + break; + + default: + LOG_W(F1AP, "RLC returned an unknown status code after F1AP placed " + "the order to send some data (Status Code:%d)\n", rlc_status); + break; + } + } + else if(ie && RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) { + f1ap_ue_context_release_cmd->rrc_container = malloc(ie->value.choice.RRCContainer.size); + memcpy(f1ap_ue_context_release_cmd->rrc_container, + ie->value.choice.RRCContainer.buf, ie->value.choice.RRCContainer.size); + } + + if (RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) { + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container, + F1AP_ProtocolIE_ID_id_Cause, true); + switch (ie->value.choice.Cause.present){ + case F1AP_Cause_PR_radioNetwork: + LOG_W (F1AP, "UE context release command cause is due to radioNetwork with specific code: %ld\n",ie->value.choice.Cause.choice.radioNetwork); + f1ap_ue_context_release_cmd->cause = F1AP_CAUSE_RADIO_NETWORK; + break; + case F1AP_Cause_PR_transport: + LOG_W (F1AP, "UE context release command cause is due to transport with specific code: %ld\n",ie->value.choice.Cause.choice.transport); + f1ap_ue_context_release_cmd->cause = F1AP_CAUSE_TRANSPORT; + break; + case F1AP_Cause_PR_protocol: + LOG_W (F1AP, "UE context release command cause is due to protocol with specific code: %ld\n",ie->value.choice.Cause.choice.protocol); + f1ap_ue_context_release_cmd->cause = F1AP_CAUSE_PROTOCOL; + break; + case F1AP_Cause_PR_misc: + LOG_W (F1AP, "UE context release command cause is misc with specific code: %ld \n",ie->value.choice.Cause.choice.misc); + f1ap_ue_context_release_cmd->cause = F1AP_CAUSE_MISC; + break; + default: + LOG_W(F1AP, "Unknown cause for UE context release command\n"); + break; + + } + itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p); + return 0; + } else { + struct rrc_eNB_ue_context_s *ue_context_p; + ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt.instance], ctxt.rnti); + + if (ue_context_p && !UE_out_of_sync) { + // UE exists and is in sync so we start a timer before releasing the + // connection + pthread_mutex_lock(&rrc_release_freelist); + + for (uint16_t release_num = 0; release_num < NUMBER_OF_UE_MAX; release_num++) { + if (rrc_release_info.RRC_release_ctrl[release_num].flag == 0) { + if (ue_context_p->ue_context.ue_release_timer_s1 > 0) + rrc_release_info.RRC_release_ctrl[release_num].flag = 1; + else + rrc_release_info.RRC_release_ctrl[release_num].flag = 2; + + rrc_release_info.RRC_release_ctrl[release_num].rnti = ctxt.rnti; + LOG_D(F1AP, "add rrc_release_info RNTI %x\n", ctxt.rnti); + // TODO: how to provide the correct MUI? + rrc_release_info.RRC_release_ctrl[release_num].rrc_eNB_mui = 0; + rrc_release_info.num_UEs++; + LOG_D(RRC,"Generate DLSCH Release send: index %d rnti %x mui %d flag %d \n",release_num, + ctxt.rnti, 0, rrc_release_info.RRC_release_ctrl[release_num].flag); + break; + } + } + + pthread_mutex_unlock(&rrc_release_freelist); + ue_context_p->ue_context.ue_release_timer_s1 = 0; + } else if (ue_context_p && UE_out_of_sync) { + // UE exists and is out of sync, drop the connection + mac_eNB_rrc_ul_failure(instance, 0, 0, 0, rnti); + } else { + LOG_E(F1AP, "no ue_context for RNTI %x, acknowledging release\n", rnti); + } + + // TODO send this once the connection has really been released f1ap_ue_context_release_cplt_t cplt; cplt.rnti = ctxt.rnti; DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance, &cplt); return 0; } } + int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, f1ap_ue_context_release_cplt_t *cplt) { F1AP_F1AP_PDU_t pdu= {0}; @@ -891,10 +1082,162 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, uint32_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu) { - AssertFatal(1==0,"Not implemented yet\n"); + + MessageDef *msg_p; // message to RRC + F1AP_UEContextModificationRequest_t *container; + int i; + DevAssert(pdu); + msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_UE_CONTEXT_MODIFICATION_REQ); + f1ap_ue_context_setup_t *f1ap_ue_context_modification_req = &F1AP_UE_CONTEXT_MODIFICATION_REQ(msg_p); + container = &pdu->choice.initiatingMessage->value.choice.UEContextModificationRequest; + + /* mandatory */ + /* GNB_CU_UE_F1AP_ID */ + F1AP_UEContextModificationRequestIEs_t *ieCU; + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieCU, container, + F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true); + f1ap_ue_context_modification_req->gNB_CU_ue_id = ieCU->value.choice.GNB_CU_UE_F1AP_ID; + + /* mandatory */ + /* GNB_DU_UE_F1AP_ID */ + F1AP_UEContextModificationRequestIEs_t *ieDU_UE; + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieDU_UE, container, + F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true); + f1ap_ue_context_modification_req->gNB_DU_ue_id = ieDU_UE->value.choice.GNB_DU_UE_F1AP_ID; + f1ap_ue_context_modification_req->rnti = f1ap_get_rnti_by_du_id(DUtype, instance, f1ap_ue_context_modification_req->gNB_DU_ue_id); + + if(f1ap_ue_context_modification_req->rnti<0) + LOG_E(F1AP, "Could not retrieve UE rnti based on the DU UE id \n"); + else + LOG_I(F1AP, "Retrieved rnti is: %d \n", f1ap_ue_context_modification_req->rnti); + + /* SRB */ + F1AP_UEContextModificationRequestIEs_t *ieSrb; + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieSrb, container, + F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_List, false); + + if(ieSrb != NULL) { + f1ap_ue_context_modification_req->srbs_to_be_setup_length = ieSrb->value.choice.SRBs_ToBeSetupMod_List.list.count; + f1ap_ue_context_modification_req->srbs_to_be_setup = calloc(f1ap_ue_context_modification_req->srbs_to_be_setup_length, + sizeof(f1ap_srb_to_be_setup_t)); + AssertFatal(f1ap_ue_context_modification_req->srbs_to_be_setup, + "could not allocate memory for f1ap_ue_context_setup_req->srbs_to_be_setup\n"); + + for (i = 0; i < f1ap_ue_context_modification_req->srbs_to_be_setup_length; ++i) { + f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_modification_req->srbs_to_be_setup[i]; + F1AP_SRBs_ToBeSetupMod_Item_t *srbs_tobesetupmod_item_p; + srbs_tobesetupmod_item_p = &((F1AP_SRBs_ToBeSetupMod_ItemIEs_t *)ieSrb->value.choice.SRBs_ToBeSetupMod_List.list.array[i])->value.choice.SRBs_ToBeSetupMod_Item; + srb_p->srb_id = srbs_tobesetupmod_item_p->sRBID; + } + } + + /* DRB */ + F1AP_UEContextModificationRequestIEs_t *ieDrb; + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieDrb, container, + F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_List, false); + + if(ieDrb!=NULL) { + f1ap_ue_context_modification_req->drbs_to_be_setup_length = ieDrb->value.choice.DRBs_ToBeSetupMod_List.list.count; + f1ap_ue_context_modification_req->drbs_to_be_setup = calloc(f1ap_ue_context_modification_req->drbs_to_be_setup_length, + sizeof(f1ap_drb_to_be_setup_t)); + AssertFatal(f1ap_ue_context_modification_req->drbs_to_be_setup, + "could not allocate memory for f1ap_ue_context_setup_req->drbs_to_be_setup\n"); + + for (i = 0; i < f1ap_ue_context_modification_req->drbs_to_be_setup_length; ++i) { + f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_modification_req->drbs_to_be_setup[i]; + F1AP_DRBs_ToBeSetupMod_Item_t *drbs_tobesetupmod_item_p = + &((F1AP_DRBs_ToBeSetupMod_ItemIEs_t *)ieDrb->value.choice.DRBs_ToBeSetupMod_List.list.array[i])->value.choice.DRBs_ToBeSetupMod_Item; + drb_p->drb_id = drbs_tobesetupmod_item_p->dRBID; + /* TODO in the following, assume only one UP UL TNL is present. + * this matches/assumes OAI CU implementation, can be up to 2! */ + drb_p->up_ul_tnl_length = 1; + AssertFatal(drbs_tobesetupmod_item_p->uLUPTNLInformation_ToBeSetup_List.list.count > 0, + "no UL UP TNL Information in DRBs to be Setup list\n"); + F1AP_ULUPTNLInformation_ToBeSetup_Item_t *ul_up_tnl_info_p = (F1AP_ULUPTNLInformation_ToBeSetup_Item_t *)drbs_tobesetupmod_item_p->uLUPTNLInformation_ToBeSetup_List.list.array[0]; + F1AP_GTPTunnel_t *ul_up_tnl0 = ul_up_tnl_info_p->uLUPTNLInformation.choice.gTPTunnel; + BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&ul_up_tnl0->transportLayerAddress, drb_p->up_ul_tnl[0].tl_address); + OCTET_STRING_TO_INT32(&ul_up_tnl0->gTP_TEID, drb_p->up_ul_tnl[0].teid); + // 3GPP assumes GTP-U is on port 2152, but OAI is configurable + drb_p->up_ul_tnl[0].port=getCxt(false,instance)->setupReq.CUport; + + switch (drbs_tobesetupmod_item_p->rLCMode) { + case F1AP_RLCMode_rlc_am: + drb_p->rlc_mode = RLC_MODE_AM; + break; + + default: + drb_p->rlc_mode = RLC_MODE_TM; + break; + } + if (!(RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU)) { + transport_layer_addr_t addr; + memcpy(addr.buffer, &drb_p->up_ul_tnl[0].tl_address, sizeof(drb_p->up_ul_tnl[0].tl_address)); + addr.length=sizeof(drb_p->up_ul_tnl[0].tl_address)*8; + drb_p->up_dl_tnl[0].teid = newGtpuCreateTunnel(INSTANCE_DEFAULT, + f1ap_ue_context_modification_req->rnti, + drb_p->drb_id, + drb_p->drb_id, + drb_p->up_ul_tnl[0].teid, + -1, // no qfi + addr, + drb_p->up_ul_tnl[0].port, + lteDURecvCb, + NULL); + drb_p->up_dl_tnl_length++; + } + } + } + /* RRC Reconfiguration Complete indicator */ + F1AP_UEContextModificationRequestIEs_t *ieReconf; + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieReconf, container, + F1AP_ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator, false); + + if(ieReconf) { + switch(ieReconf->value.choice.RRCReconfigurationCompleteIndicator){ + case F1AP_RRCReconfigurationCompleteIndicator_true: + f1ap_ue_context_modification_req->ReconfigComplOutcome = RRCreconf_success; + break; + + case F1AP_RRCReconfigurationCompleteIndicator_failure: + f1ap_ue_context_modification_req->ReconfigComplOutcome = RRCreconf_failure; + break; + } + } + + /* RRCContainer */ + F1AP_UEContextModificationRequestIEs_t *ieRRC; + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieRRC, container, + F1AP_ProtocolIE_ID_id_RRCContainer, false); + + if (ieRRC) { + /* correct here */ + if ( ieRRC->value.choice.RRCContainer.size ) { + f1ap_ue_context_modification_req->rrc_container = malloc(ieRRC->value.choice.RRCContainer.size); + memcpy(f1ap_ue_context_modification_req->rrc_container, + ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size); + protocol_ctxt_t ctxt; + // decode RRC Container and act on the message type + ctxt.rnti = f1ap_ue_context_modification_req->rnti; + ctxt.instance = instance; + ctxt.module_id = instance; + ctxt.enb_flag = 1; + ctxt.eNB_index = instance; + mem_block_t *pdcp_pdu_p = get_free_mem_block(ieRRC->value.choice.RRCContainer.size, __func__); + memcpy(&pdcp_pdu_p->data[0], ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size); + du_rlc_data_req(&ctxt, 1, 0x00, 1, 1, 0, ieRRC->value.choice.RRCContainer.size, pdcp_pdu_p); + } else { + LOG_E(F1AP, " RRCContainer in UEContextModificationRequestIEs size id 0\n"); + } + } else { + LOG_W(F1AP, "can't find RRCContainer in UEContextModificationRequestIEs by id %ld \n", F1AP_ProtocolIE_ID_id_RRCContainer); + } + + itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p); + return 0; } + //void DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(F1AP_UEContextModificationResponse_t *UEContextModificationResponse) { -int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) { +int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *resp) { F1AP_F1AP_PDU_t pdu= {0}; F1AP_UEContextModificationResponse_t *out; uint8_t *buffer=NULL; @@ -913,14 +1256,14 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) { ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID; ie1->criticality = F1AP_Criticality_reject; ie1->value.present = F1AP_UEContextModificationResponseIEs__value_PR_GNB_CU_UE_F1AP_ID; - ie1->value.choice.GNB_CU_UE_F1AP_ID = 126L; + ie1->value.choice.GNB_CU_UE_F1AP_ID = resp->gNB_CU_ue_id; /* mandatory */ /* c2. GNB_DU_UE_F1AP_ID */ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie2); ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID; ie2->criticality = F1AP_Criticality_reject; ie2->value.present = F1AP_UEContextModificationResponseIEs__value_PR_GNB_DU_UE_F1AP_ID; - ie2->value.choice.GNB_DU_UE_F1AP_ID = 651L; + ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti); /* optional */ /* c3. ResourceCoordinationTransferContainer */ @@ -935,184 +1278,205 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) { /* optional */ /* c4. DUtoCURRCInformation */ - if (0) { + if(resp->du_to_cu_rrc_information!=NULL){ asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie4); ie4->id = F1AP_ProtocolIE_ID_id_DUtoCURRCInformation; ie4->criticality = F1AP_Criticality_reject; ie4->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DUtoCURRCInformation; - OCTET_STRING_fromBuf(&ie4->value.choice.DUtoCURRCInformation.cellGroupConfig, "asdsa1d32sa1d31asd31as", - strlen("asdsa1d32sa1d31asd31as")); + if(resp->du_to_cu_rrc_information->cellGroupConfig!=NULL){ + /* cellGroupConfig */ + OCTET_STRING_fromBuf(&ie4->value.choice.DUtoCURRCInformation.cellGroupConfig, (const char *)resp->du_to_cu_rrc_information->cellGroupConfig, + resp->du_to_cu_rrc_information->cellGroupConfig_length); + } /* OPTIONAL */ - if (1) { - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie41); - ie41->value.choice.DUtoCURRCInformation.measGapConfig = (F1AP_MeasGapConfig_t *)calloc(1, sizeof(F1AP_MeasGapConfig_t)); - OCTET_STRING_fromBuf( ie41->value.choice.DUtoCURRCInformation.measGapConfig, "asdsa1d32sa1d31asd31as", - strlen("asdsa1d32sa1d31asd31as")); + /* measGapConfig */ + if (resp->du_to_cu_rrc_information->measGapConfig!=NULL) { + OCTET_STRING_fromBuf(ie4->value.choice.DUtoCURRCInformation.measGapConfig, (const char *)resp->du_to_cu_rrc_information->measGapConfig, + resp->du_to_cu_rrc_information->measGapConfig_length); } - } - /* mandatory */ - /* c5. DRBs_SetupMod_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie5); - ie5->id = F1AP_ProtocolIE_ID_id_DRBs_SetupMod_List; - ie5->criticality = F1AP_Criticality_reject; - ie5->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List; - - for (int i=0; i<1; i++) { - // - asn1cSequenceAdd(ie5->value.choice.DRBs_SetupMod_List.list, - F1AP_DRBs_SetupMod_ItemIEs_t, drbs_setupMod_item_ies); - drbs_setupMod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_SetupMod_Item; - drbs_setupMod_item_ies->criticality = F1AP_Criticality_reject; - drbs_setupMod_item_ies->value.present = F1AP_DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item; - /* 10.1 DRBs_SetupMod_Item */ - F1AP_DRBs_SetupMod_Item_t *drbs_setupMod_item=&drbs_setupMod_item_ies->value.choice.DRBs_SetupMod_Item; - /* dRBID */ - drbs_setupMod_item->dRBID = 30L; - /* DLTunnels_SetupMod_List */ - int maxnoofDLUPTNLInformation = 1; // 2; - - for (int j=0; j<maxnoofDLUPTNLInformation; j++) { - /* DLTunnels_ToBeSetup_Item */ - asn1cSequenceAdd(ie5->value.choice.DRBs_SetupMod_List.list, - F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item); - dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel; - asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel, - gTPTunnel); - TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress); - OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204", - strlen("1204")); + /* OPTIONAL */ + /* requestedP_MaxFR1 */ + if (resp->du_to_cu_rrc_information->requestedP_MaxFR1!=NULL) { + OCTET_STRING_fromBuf(ie4->value.choice.DUtoCURRCInformation.requestedP_MaxFR1, (const char *)resp->du_to_cu_rrc_information->requestedP_MaxFR1, + resp->du_to_cu_rrc_information->requestedP_MaxFR1_length); } } - /* mandatory */ + + /* optional */ + /* c5. DRBs_Setup_List */ + if(resp->drbs_to_be_setup_length > 0) { + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie5); + ie5->id = F1AP_ProtocolIE_ID_id_DRBs_SetupMod_List; + ie5->criticality = F1AP_Criticality_ignore; + ie5->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List; + for (int i=0; i< resp->drbs_to_be_setup_length; i++) { + asn1cSequenceAdd(ie5->value.choice.DRBs_SetupMod_List.list, F1AP_DRBs_SetupMod_ItemIEs_t, drbs_setupmod_item_ies); + drbs_setupmod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_SetupMod_Item; + drbs_setupmod_item_ies->criticality = F1AP_Criticality_ignore; + drbs_setupmod_item_ies->value.present = F1AP_DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item; + /* 7.1 DRBs_Setup_Item */ + /* ADD */ + F1AP_DRBs_SetupMod_Item_t *drbs_setupmod_item=&drbs_setupmod_item_ies->value.choice.DRBs_SetupMod_Item; + /* dRBID */ + drbs_setupmod_item->dRBID = resp->drbs_to_be_setup[i].drb_id; + + for (int j=0; j<resp->drbs_to_be_setup[i].up_dl_tnl_length; j++) { + /* ADD */ + asn1cSequenceAdd(drbs_setupmod_item->dLUPTNLInformation_ToBeSetup_List.list, + F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item); + dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel; + /* gTPTunnel */ + asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,gTPTunnel); + /* transportLayerAddress */ + struct sockaddr_in addr= {0}; + inet_pton(AF_INET, getCxt(false,instance)->setupReq.DU_f1_ip_address.ipv4_address, + &addr.sin_addr.s_addr); + TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(addr.sin_addr.s_addr, + &gTPTunnel->transportLayerAddress); + /* gTP_TEID */ + INT32_TO_OCTET_STRING(resp->drbs_to_be_setup[i].up_dl_tnl[j].teid, &gTPTunnel->gTP_TEID); + } // for j + } // for i + } + + /* optional */ /* c6. DRBs_Modified_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie6); - ie6->id = F1AP_ProtocolIE_ID_id_DRBs_Modified_List; - ie6->criticality = F1AP_Criticality_reject; - ie6->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_Modified_List; - - for (int i=0; i<1; i++) { - // - asn1cSequenceAdd(ie6->value.choice.DRBs_Modified_List.list, - F1AP_DRBs_Modified_ItemIEs_t, drbs_modified_item_ies); - drbs_modified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_Modified_Item; - drbs_modified_item_ies->criticality = F1AP_Criticality_reject; - drbs_modified_item_ies->value.present = F1AP_DRBs_Modified_ItemIEs__value_PR_DRBs_Modified_Item; - /* 13.1 SRBs_modified_Item */ - F1AP_DRBs_Modified_Item_t *drbs_modified_item= - &drbs_modified_item_ies->value.choice.DRBs_Modified_Item; - /* dRBID */ - drbs_modified_item->dRBID = 25L; - /* ULTunnels_Modified_List */ - int maxnoofULTunnels = 1; // 2; - - for (int j=0; j<maxnoofULTunnels; j++) { - /* DLTunnels_Modified_Item */ - asn1cSequenceAdd(drbs_modified_item->dLUPTNLInformation_ToBeSetup_List.list, - F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item); - asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item, tmp); - tmp->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel; - asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel, gTPTunnel); - TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress); - OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204", strlen("1204")); + if(resp->drbs_to_be_modified_length > 0){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie6); + ie6->id = F1AP_ProtocolIE_ID_id_DRBs_Modified_List; + ie6->criticality = F1AP_Criticality_ignore; + ie6->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_Modified_List; + + for (int i=0; i<resp->drbs_to_be_modified_length; i++) { + asn1cSequenceAdd(ie6->value.choice.DRBs_Modified_List.list, + F1AP_DRBs_Modified_ItemIEs_t, drbs_modified_item_ies); + drbs_modified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_Modified_Item; + drbs_modified_item_ies->criticality = F1AP_Criticality_ignore; + drbs_modified_item_ies->value.present = F1AP_DRBs_Modified_ItemIEs__value_PR_DRBs_Modified_Item; + /* DRBs_modified_Item */ + F1AP_DRBs_Modified_Item_t *drbs_modified_item= &drbs_modified_item_ies->value.choice.DRBs_Modified_Item; + /* dRBID */ + drbs_modified_item->dRBID = resp->drbs_to_be_modified[i].drb_id; + + /* ULTunnels_Modified_List */ + for (int j=0; j<resp->drbs_to_be_modified[i].up_dl_tnl_length; j++) { + /* DLTunnels_Modified_Item */ + asn1cSequenceAdd(drbs_modified_item->dLUPTNLInformation_ToBeSetup_List.list, + F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item); + asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item, tmp); + tmp->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel; + asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel, gTPTunnel); + /* transportLayerAddress */ + struct sockaddr_in addr= {0}; + inet_pton(AF_INET, getCxt(false,instance)->setupReq.DU_f1_ip_address.ipv4_address, + &addr.sin_addr.s_addr); + TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(addr.sin_addr.s_addr, &gTPTunnel->transportLayerAddress); + /* gTP_TEID */ + INT32_TO_OCTET_STRING(resp->drbs_to_be_modified[i].up_dl_tnl[j].teid, &gTPTunnel->gTP_TEID); + } } } - /* mandatory */ + /* optional */ /* c7. SRBs_FailedToBeSetupMod_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie7); - ie7->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_List; - ie7->criticality = F1AP_Criticality_reject; - ie7->value.present = F1AP_UEContextModificationResponseIEs__value_PR_SRBs_FailedToBeSetupMod_List; - - for (int i=0; i<1; i++) { - // - asn1cSequenceAdd(ie7->value.choice.SRBs_FailedToBeSetupMod_List.list, - F1AP_SRBs_FailedToBeSetupMod_ItemIEs_t, srbs_failedToBeSetupMod_item_ies); - srbs_failedToBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_Item; - srbs_failedToBeSetupMod_item_ies->criticality = F1AP_Criticality_ignore; - srbs_failedToBeSetupMod_item_ies->value.present = F1AP_SRBs_FailedToBeSetupMod_ItemIEs__value_PR_SRBs_FailedToBeSetupMod_Item; - /* 9.1 SRBs_FailedToBeSetupMod_Item */ - F1AP_SRBs_FailedToBeSetupMod_Item_t *srbs_failedToBeSetupMod_item= - &srbs_failedToBeSetupMod_item_ies->value.choice.SRBs_FailedToBeSetupMod_Item; - /* - sRBID */ - srbs_failedToBeSetupMod_item->sRBID = 50L; - asn1cCalloc(srbs_failedToBeSetupMod_item->cause, tmp) - tmp->present = F1AP_Cause_PR_radioNetwork; - tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id; + if(resp->srbs_failed_to_be_setup_length > 0){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie7); + ie7->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_List; + ie7->criticality = F1AP_Criticality_reject; + ie7->value.present = F1AP_UEContextModificationResponseIEs__value_PR_SRBs_FailedToBeSetupMod_List; + + for (int i=0; i<resp->srbs_to_be_setup_length; i++) { + asn1cSequenceAdd(ie7->value.choice.SRBs_FailedToBeSetupMod_List.list, + F1AP_SRBs_FailedToBeSetupMod_ItemIEs_t, srbs_failedToBeSetupMod_item_ies); + srbs_failedToBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_Item; + srbs_failedToBeSetupMod_item_ies->criticality = F1AP_Criticality_ignore; + srbs_failedToBeSetupMod_item_ies->value.present = F1AP_SRBs_FailedToBeSetupMod_ItemIEs__value_PR_SRBs_FailedToBeSetupMod_Item; + /* 9.1 SRBs_FailedToBeSetupMod_Item */ + F1AP_SRBs_FailedToBeSetupMod_Item_t *srbs_failedToBeSetupMod_item= + &srbs_failedToBeSetupMod_item_ies->value.choice.SRBs_FailedToBeSetupMod_Item; + /* - sRBID */ + srbs_failedToBeSetupMod_item->sRBID = resp->srbs_failed_to_be_setup[i].rb_id; + asn1cCalloc(srbs_failedToBeSetupMod_item->cause, tmp) + tmp->present = F1AP_Cause_PR_radioNetwork; + tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id; + } } - /* mandatory */ + /* optional */ /* c8. DRBs_FailedToBeSetupMod_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie8); - ie8->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_List; - ie8->criticality = F1AP_Criticality_reject; - ie8->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_FailedToBeSetupMod_List; - - for (int i=0; i<1; i++) { - // - asn1cSequenceAdd(ie8->value.choice.DRBs_FailedToBeSetupMod_List.list, - F1AP_DRBs_FailedToBeSetupMod_ItemIEs_t, drbs_failedToBeSetupMod_item_ies); - drbs_failedToBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_Item; - drbs_failedToBeSetupMod_item_ies->criticality = F1AP_Criticality_reject; - drbs_failedToBeSetupMod_item_ies->value.present = F1AP_DRBs_FailedToBeSetupMod_ItemIEs__value_PR_DRBs_FailedToBeSetupMod_Item; - /* 10.1 DRBs_ToBeSetupMod_Item */ - F1AP_DRBs_FailedToBeSetupMod_Item_t *drbs_failedToBeSetupMod_item= - &drbs_failedToBeSetupMod_item_ies->value.choice.DRBs_FailedToBeSetupMod_Item; - /* dRBID */ - drbs_failedToBeSetupMod_item->dRBID = 30L; - drbs_failedToBeSetupMod_item->cause = (F1AP_Cause_t *)calloc(1, sizeof(F1AP_Cause_t)); - drbs_failedToBeSetupMod_item->cause->present = F1AP_Cause_PR_radioNetwork; - drbs_failedToBeSetupMod_item->cause->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id; + if(resp->drbs_failed_to_be_setup_length > 0){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie8); + ie8->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_List; + ie8->criticality = F1AP_Criticality_reject; + ie8->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_FailedToBeSetupMod_List; + + for (int i=0; i<resp->drbs_failed_to_be_setup_length; i++) { + asn1cSequenceAdd(ie8->value.choice.DRBs_FailedToBeSetupMod_List.list, + F1AP_DRBs_FailedToBeSetupMod_ItemIEs_t, drbs_failedToBeSetupMod_item_ies); + drbs_failedToBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_Item; + drbs_failedToBeSetupMod_item_ies->criticality = F1AP_Criticality_reject; + drbs_failedToBeSetupMod_item_ies->value.present = F1AP_DRBs_FailedToBeSetupMod_ItemIEs__value_PR_DRBs_FailedToBeSetupMod_Item; + /* DRBs_FailedToBeSetupMod_Item */ + F1AP_DRBs_FailedToBeSetupMod_Item_t *drbs_failedToBeSetupMod_item= + &drbs_failedToBeSetupMod_item_ies->value.choice.DRBs_FailedToBeSetupMod_Item; + /* dRBID */ + drbs_failedToBeSetupMod_item->dRBID = resp->drbs_failed_to_be_setup[i].rb_id; + drbs_failedToBeSetupMod_item->cause = (F1AP_Cause_t *)calloc(1, sizeof(F1AP_Cause_t)); + drbs_failedToBeSetupMod_item->cause->present = F1AP_Cause_PR_radioNetwork; + drbs_failedToBeSetupMod_item->cause->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id; + } } - /* mandatory */ + /* optional */ /* c9. SCell_FailedtoSetupMod_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie9); - ie9->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_List; - ie9->criticality = F1AP_Criticality_ignore; - ie9->value.present = F1AP_UEContextModificationResponseIEs__value_PR_SCell_FailedtoSetupMod_List; - - for (int i=0; i<1; i++) { - // - asn1cSequenceAdd(ie9->value.choice.SCell_FailedtoSetupMod_List.list, - F1AP_SCell_FailedtoSetupMod_ItemIEs_t, scell_failedtoSetupMod_item_ies); - scell_failedtoSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_Item; - scell_failedtoSetupMod_item_ies->criticality = F1AP_Criticality_ignore; - scell_failedtoSetupMod_item_ies->value.present = F1AP_SCell_FailedtoSetupMod_ItemIEs__value_PR_SCell_FailedtoSetupMod_Item; - /* 8.1 SCell_ToBeSetup_Item */ - F1AP_SCell_FailedtoSetupMod_Item_t *scell_failedtoSetupMod_item=&scell_failedtoSetupMod_item_ies->value.choice.SCell_FailedtoSetupMod_Item; - /* - sCell_ID */ - addnRCGI(scell_failedtoSetupMod_item->sCell_ID, &f1ap_req(false, instance)->cell[i]); - asn1cCalloc(scell_failedtoSetupMod_item->cause, tmp); - tmp->present = F1AP_Cause_PR_radioNetwork; - tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id; + if(0){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie9); + ie9->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_List; + ie9->criticality = F1AP_Criticality_ignore; + ie9->value.present = F1AP_UEContextModificationResponseIEs__value_PR_SCell_FailedtoSetupMod_List; + + for (int i=0; i<1; i++) { + asn1cSequenceAdd(ie9->value.choice.SCell_FailedtoSetupMod_List.list, + F1AP_SCell_FailedtoSetupMod_ItemIEs_t, scell_failedtoSetupMod_item_ies); + scell_failedtoSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_Item; + scell_failedtoSetupMod_item_ies->criticality = F1AP_Criticality_ignore; + scell_failedtoSetupMod_item_ies->value.present = F1AP_SCell_FailedtoSetupMod_ItemIEs__value_PR_SCell_FailedtoSetupMod_Item; + /* 8.1 SCell_ToBeSetup_Item */ + F1AP_SCell_FailedtoSetupMod_Item_t *scell_failedtoSetupMod_item=&scell_failedtoSetupMod_item_ies->value.choice.SCell_FailedtoSetupMod_Item; + /* - sCell_ID */ + addnRCGI(scell_failedtoSetupMod_item->sCell_ID, &f1ap_req(false, instance)->cell[i]); + asn1cCalloc(scell_failedtoSetupMod_item->cause, tmp); + tmp->present = F1AP_Cause_PR_radioNetwork; + tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id; + } } - /* mandatory */ + /* optional */ /* c10. DRBs_FailedToBeModified_List */ - asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie10); - ie10->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeModified_List; - ie10->criticality = F1AP_Criticality_reject; - ie10->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_FailedToBeModified_List; - - for (int i=0; i<1; i++) { - // - asn1cSequenceAdd(ie10->value.choice.DRBs_FailedToBeModified_List.list, - F1AP_DRBs_FailedToBeModified_ItemIEs_t, drbs_failedToBeModified_item_ies); - drbs_failedToBeModified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeModified_Item; - drbs_failedToBeModified_item_ies->criticality = F1AP_Criticality_reject; - drbs_failedToBeModified_item_ies->value.present = F1AP_DRBs_FailedToBeModified_ItemIEs__value_PR_DRBs_FailedToBeModified_Item; - /* 13.1 DRBs_FailedToBeModified_Item */ - F1AP_DRBs_FailedToBeModified_Item_t *drbs_failedToBeModified_item= - &drbs_failedToBeModified_item_ies->value.choice.DRBs_FailedToBeModified_Item ; - /* dRBID */ - drbs_failedToBeModified_item->dRBID = 30L; - asn1cCalloc(drbs_failedToBeModified_item->cause, tmp); - tmp->present = F1AP_Cause_PR_radioNetwork; - tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id; + if(0){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie10); + ie10->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeModified_List; + ie10->criticality = F1AP_Criticality_reject; + ie10->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_FailedToBeModified_List; + + for (int i=0; i<1; i++) { + asn1cSequenceAdd(ie10->value.choice.DRBs_FailedToBeModified_List.list, + F1AP_DRBs_FailedToBeModified_ItemIEs_t, drbs_failedToBeModified_item_ies); + drbs_failedToBeModified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeModified_Item; + drbs_failedToBeModified_item_ies->criticality = F1AP_Criticality_reject; + drbs_failedToBeModified_item_ies->value.present = F1AP_DRBs_FailedToBeModified_ItemIEs__value_PR_DRBs_FailedToBeModified_Item; + /* 13.1 DRBs_FailedToBeModified_Item */ + F1AP_DRBs_FailedToBeModified_Item_t *drbs_failedToBeModified_item= + &drbs_failedToBeModified_item_ies->value.choice.DRBs_FailedToBeModified_Item ; + /* dRBID */ + drbs_failedToBeModified_item->dRBID = 30L; + asn1cCalloc(drbs_failedToBeModified_item->cause, tmp); + tmp->present = F1AP_Cause_PR_radioNetwork; + tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id; + } } // /* */ @@ -1163,6 +1527,28 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) { } } } + /* optional */ + /* c12. SRBs_Setup_List */ + if(resp->srbs_to_be_setup_length > 0){ + asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie12); + ie12->id = F1AP_ProtocolIE_ID_id_SRBs_SetupMod_List; + ie12->criticality = F1AP_Criticality_ignore; + ie12->value.present = F1AP_UEContextModificationResponseIEs__value_PR_SRBs_SetupMod_List; + + for (int i=0; i< resp->srbs_to_be_setup_length; i++) {// + asn1cSequenceAdd(ie12->value.choice.SRBs_SetupMod_List.list, + F1AP_SRBs_SetupMod_ItemIEs_t, srbs_setupmod_item_ies); + srbs_setupmod_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_SetupMod_Item; + srbs_setupmod_item_ies->criticality = F1AP_Criticality_ignore; + srbs_setupmod_item_ies->value.present = F1AP_SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item; + /* 11.1 SRBs_Setup_Item */ + /* ADD */ + F1AP_SRBs_SetupMod_Item_t *srbs_setupmod_item=&srbs_setupmod_item_ies->value.choice.SRBs_SetupMod_Item; + /* sRBID */ + srbs_setupmod_item->sRBID = resp->srbs_to_be_setup[i].srb_id; + srbs_setupmod_item->lCID = resp->srbs_to_be_setup[i].srb_id; + } + } /* encode */ if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) { @@ -1170,9 +1556,10 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) { return -1; } - //f1ap_itti_send_sctp_data_req(false, instance, buffer, len, 0); + f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(false, instance)->default_sctp_stream_id); return 0; } + int DU_send_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance) { AssertFatal(1==0,"Not implemented yet\n"); } diff --git a/openair2/F1AP/f1ap_du_ue_context_management.h b/openair2/F1AP/f1ap_du_ue_context_management.h index 82643fa933c..acf74f69d72 100644 --- a/openair2/F1AP/f1ap_du_ue_context_management.h +++ b/openair2/F1AP/f1ap_du_ue_context_management.h @@ -74,7 +74,7 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, uint32_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu); -int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance); +int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *resp); int DU_send_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance); diff --git a/openair2/F1AP/f1ap_encoder.c b/openair2/F1AP/f1ap_encoder.c index e623e665362..b249f23cfec 100644 --- a/openair2/F1AP/f1ap_encoder.c +++ b/openair2/F1AP/f1ap_encoder.c @@ -33,7 +33,7 @@ #include "f1ap_common.h" #include "f1ap_encoder.h" -int asn1_encoder_xer_print = 1; +int asn1_encoder_xer_print = 0; int f1ap_encode_pdu(F1AP_F1AP_PDU_t *pdu, uint8_t **buffer, uint32_t *length) { ssize_t encoded; diff --git a/openair2/F1AP/f1ap_handlers.c b/openair2/F1AP/f1ap_handlers.c index fec03bb0b90..0812a976f63 100644 --- a/openair2/F1AP/f1ap_handlers.c +++ b/openair2/F1AP/f1ap_handlers.c @@ -50,7 +50,7 @@ f1ap_message_processing_t f1ap_messages_processing[][3] = { { DU_handle_gNB_CU_CONFIGURATION_UPDATE, CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE, CU_handle_gNB_CU_CONFIGURATION_UPDATE_FAILURE }, /* gNBCUConfigurationUpdate */ { DU_handle_UE_CONTEXT_SETUP_REQUEST, CU_handle_UE_CONTEXT_SETUP_RESPONSE, 0 }, /* UEContextSetup */ { DU_handle_UE_CONTEXT_RELEASE_COMMAND, CU_handle_UE_CONTEXT_RELEASE_COMPLETE, 0 }, /* UEContextRelease */ - { 0, 0, 0 }, /* UEContextModification */ + { DU_handle_UE_CONTEXT_MODIFICATION_REQUEST, CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE, 0 }, /* UEContextModification */ { 0, 0, 0 }, /* UEContextModificationRequired */ { 0, 0, 0 }, /* UEMobilityCommand */ { CU_handle_UE_CONTEXT_RELEASE_REQUEST, 0, 0 }, /* UEContextReleaseRequest */ diff --git a/openair2/F1AP/f1ap_itti_messaging.c b/openair2/F1AP/f1ap_itti_messaging.c index 21096a65188..e45edcc3a3b 100644 --- a/openair2/F1AP/f1ap_itti_messaging.c +++ b/openair2/F1AP/f1ap_itti_messaging.c @@ -32,7 +32,7 @@ void f1ap_itti_send_sctp_data_req(bool isCu, instance_t instance, uint8_t *buffe sctp_data_req->buffer = buffer; sctp_data_req->buffer_length = buffer_length; sctp_data_req->stream = stream; - LOG_I(F1AP, "Sending ITTI message to SCTP Task\n"); + LOG_D(F1AP, "Sending ITTI message to SCTP Task\n"); itti_send_msg_to_task(TASK_SCTP, instance, message_p); } diff --git a/openair2/GNB_APP/L1_nr_paramdef.h b/openair2/GNB_APP/L1_nr_paramdef.h index 90cd9aae290..1e5122956e0 100644 --- a/openair2/GNB_APP/L1_nr_paramdef.h +++ b/openair2/GNB_APP/L1_nr_paramdef.h @@ -51,6 +51,7 @@ #define CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD "pucch0_dtx_threshold" #define CONFIG_STRING_L1_PRACH_DTX_THRESHOLD "prach_dtx_threshold" #define CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD "pusch_dtx_threshold" +#define CONFIG_STRING_L1_MAX_LDPC_ITERATIONS "max_ldpc_iterations" /*----------------------------------------------------------------------------------------------------------------------------------------------------*/ /* L1 configuration parameters */ /* optname helpstr paramflags XXXptr defXXXval type numelt */ @@ -69,7 +70,8 @@ {CONFIG_STRING_L1_OFDM_OFFSET_DIVISOR, NULL, 0, uptr:NULL, defuintval:8, TYPE_UINT, 0}, \ {CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD, NULL, 0, uptr:NULL, defintval:100, TYPE_UINT, 0}, \ {CONFIG_STRING_L1_PRACH_DTX_THRESHOLD, NULL, 0, uptr:NULL, defintval:150, TYPE_UINT, 0}, \ -{CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD, NULL, 0, uptr:NULL, defintval:50, TYPE_UINT, 0} \ +{CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD, NULL, 0, uptr:NULL, defintval:50, TYPE_UINT, 0}, \ +{CONFIG_STRING_L1_MAX_LDPC_ITERATIONS, NULL, 0, uptr:NULL, defintval:5, TYPE_UINT, 0}, \ } #define L1_CC_IDX 0 #define L1_TRANSPORT_N_PREFERENCE_IDX 1 @@ -85,6 +87,7 @@ #define L1_PUCCH0_DTX_THRESHOLD 11 #define L1_PRACH_DTX_THRESHOLD 12 #define L1_PUSCH_DTX_THRESHOLD 13 +#define L1_MAX_LDPC_ITERATIONS 14 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/ #endif diff --git a/openair2/GNB_APP/MACRLC_nr_paramdef.h b/openair2/GNB_APP/MACRLC_nr_paramdef.h index e634f077e26..0a50d19e139 100644 --- a/openair2/GNB_APP/MACRLC_nr_paramdef.h +++ b/openair2/GNB_APP/MACRLC_nr_paramdef.h @@ -58,16 +58,21 @@ #define CONFIG_STRING_MACRLC_ULSCH_MAX_FRAME_INACTIVITY "ulsch_max_frame_inactivity" #define CONFIG_STRING_MACRLC_PUSCHTARGETSNRX10 "pusch_TargetSNRx10" #define CONFIG_STRING_MACRLC_PUCCHTARGETSNRX10 "pucch_TargetSNRx10" +#define CONFIG_STRING_MACRLC_UL_PRBBLACK_SNR_THRESHOLD "ul_prbblack_SNR_threshold" #define CONFIG_STRING_MACRLC_PUCCHFAILURETHRES "pucch_FailureThres" #define CONFIG_STRING_MACRLC_PUSCHFAILURETHRES "pusch_FailureThres" #define CONFIG_STRING_MACRLC_DL_BLER_TARGET_UPPER "dl_bler_target_upper" #define CONFIG_STRING_MACRLC_DL_BLER_TARGET_LOWER "dl_bler_target_lower" -#define CONFIG_STRING_MACRLC_DL_RD2_BLER_THRESHOLD "dl_rd2_bler_threshold" #define CONFIG_STRING_MACRLC_DL_MAX_MCS "dl_max_mcs" -#define CONFIG_STRING_MACRLC_HARQ_ROUND_MAX "harq_round_max" +#define CONFIG_STRING_MACRLC_UL_BLER_TARGET_UPPER "ul_bler_target_upper" +#define CONFIG_STRING_MACRLC_UL_BLER_TARGET_LOWER "ul_bler_target_lower" +#define CONFIG_STRING_MACRLC_UL_MAX_MCS "ul_max_mcs" +#define CONFIG_STRING_MACRLC_DL_HARQ_ROUND_MAX "dl_harq_round_max" +#define CONFIG_STRING_MACRLC_UL_HARQ_ROUND_MAX "ul_harq_round_max" #define CONFIG_STRING_MACRLC_MIN_GRANT_PRB "min_grant_prb" #define CONFIG_STRING_MACRLC_MIN_GRANT_MCS "min_grant_mcs" + /*-------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* MacRLC configuration parameters */ /* optname helpstr paramflags XXXptr defXXXval type numelt */ @@ -93,15 +98,19 @@ {CONFIG_STRING_MACRLC_ULSCH_MAX_FRAME_INACTIVITY, NULL, 0, uptr:NULL, defintval:10, TYPE_UINT, 0}, \ {CONFIG_STRING_MACRLC_PUSCHTARGETSNRX10, NULL, 0, iptr:NULL, defintval:200, TYPE_INT, 0}, \ {CONFIG_STRING_MACRLC_PUCCHTARGETSNRX10, NULL, 0, iptr:NULL, defintval:150, TYPE_INT, 0}, \ +{CONFIG_STRING_MACRLC_UL_PRBBLACK_SNR_THRESHOLD, "SNR threshold to decide whether a PRB will be blacklisted or not", 0, iptr:NULL, defintval:10, TYPE_INT, 0}, \ {CONFIG_STRING_MACRLC_PUCCHFAILURETHRES, NULL, 0, iptr:NULL, defintval:10, TYPE_INT, 0}, \ {CONFIG_STRING_MACRLC_PUSCHFAILURETHRES, NULL, 0, iptr:NULL, defintval:10, TYPE_INT, 0}, \ {CONFIG_STRING_MACRLC_DL_BLER_TARGET_UPPER, "Upper threshold of BLER to decrease DL MCS", 0, dblptr:NULL, defdblval:0.15, TYPE_DOUBLE, 0}, \ {CONFIG_STRING_MACRLC_DL_BLER_TARGET_LOWER, "Lower threshold of BLER to increase DL MCS", 0, dblptr:NULL, defdblval:0.05, TYPE_DOUBLE, 0}, \ -{CONFIG_STRING_MACRLC_DL_RD2_BLER_THRESHOLD, "Threshold of RD2/RETX2 BLER to decrease DL MCS", 0, dblptr:NULL, defdblval:0.01, TYPE_DOUBLE, 0}, \ {CONFIG_STRING_MACRLC_DL_MAX_MCS, "Maximum DL MCS that should be used", 0, u8ptr:NULL, defintval:28, TYPE_UINT8, 0}, \ -{CONFIG_STRING_MACRLC_HARQ_ROUND_MAX, "Maximum number of HARQ rounds", 0, u8ptr:NULL, defintval:4, TYPE_UINT8, 0}, \ +{CONFIG_STRING_MACRLC_UL_BLER_TARGET_UPPER, "Upper threshold of BLER to decrease UL MCS", 0, dblptr:NULL, defdblval:0.15, TYPE_DOUBLE, 0}, \ +{CONFIG_STRING_MACRLC_UL_BLER_TARGET_LOWER, "Lower threshold of BLER to increase UL MCS", 0, dblptr:NULL, defdblval:0.05, TYPE_DOUBLE, 0}, \ +{CONFIG_STRING_MACRLC_UL_MAX_MCS, "Maximum UL MCS that should be used", 0, u8ptr:NULL, defintval:9, TYPE_UINT8, 0}, \ +{CONFIG_STRING_MACRLC_DL_HARQ_ROUND_MAX, "Maximum number of DL HARQ rounds", 0, u8ptr:NULL, defintval:4, TYPE_UINT8, 0}, \ +{CONFIG_STRING_MACRLC_UL_HARQ_ROUND_MAX, "Maximum number of UL HARQ rounds", 0, u8ptr:NULL, defintval:4, TYPE_UINT8, 0}, \ {CONFIG_STRING_MACRLC_MIN_GRANT_PRB, "Minimal Periodic ULSCH Grant PRBs", 0, u8ptr:NULL, defintval:5, TYPE_UINT8, 0}, \ -{CONFIG_STRING_MACRLC_MIN_GRANT_MCS, "Minimal Periodic ULSCH Grant MCS", 0, u8ptr:NULL, defintval:9, TYPE_UINT8, 0} \ +{CONFIG_STRING_MACRLC_MIN_GRANT_MCS, "Minimal Periodic ULSCH Grant MCS", 0, u8ptr:NULL, defintval:9, TYPE_UINT8, 0}, \ } #define MACRLC_CC_IDX 0 #define MACRLC_TRANSPORT_N_PREFERENCE_IDX 1 @@ -123,14 +132,55 @@ #define MACRLC_ULSCH_MAX_FRAME_INACTIVITY 17 #define MACRLC_PUSCHTARGETSNRX10_IDX 18 #define MACRLC_PUCCHTARGETSNRX10_IDX 19 -#define MACRLC_PUCCHFAILURETHRES_IDX 20 -#define MACRLC_PUSCHFAILURETHRES_IDX 21 -#define MACRLC_DL_BLER_TARGET_UPPER_IDX 22 -#define MACRLC_DL_BLER_TARGET_LOWER_IDX 23 -#define MACRLC_DL_RD2_BLER_THRESHOLD_IDX 24 +#define MACRLC_UL_PRBBLACK_SNR_THRESHOLD_IDX 20 +#define MACRLC_PUCCHFAILURETHRES_IDX 21 +#define MACRLC_PUSCHFAILURETHRES_IDX 22 +#define MACRLC_DL_BLER_TARGET_UPPER_IDX 23 +#define MACRLC_DL_BLER_TARGET_LOWER_IDX 24 #define MACRLC_DL_MAX_MCS_IDX 25 -#define MACRLC_HARQ_ROUND_MAX_IDX 26 -#define MACRLC_MIN_GRANT_PRB_IDX 27 -#define MACRLC_MIN_GRANT_MCS_IDX 28 +#define MACRLC_UL_BLER_TARGET_UPPER_IDX 26 +#define MACRLC_UL_BLER_TARGET_LOWER_IDX 27 +#define MACRLC_UL_MAX_MCS_IDX 28 +#define MACRLC_DL_HARQ_ROUND_MAX_IDX 29 +#define MACRLC_UL_HARQ_ROUND_MAX_IDX 30 +#define MACRLC_MIN_GRANT_PRB_IDX 31 +#define MACRLC_MIN_GRANT_MCS_IDX 32 + +#define MACRLCPARAMS_CHECK { \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ + { .s2 = { config_check_intrange, {1, 8} } }, /* DL max HARQ rounds */ \ + { .s2 = { config_check_intrange, {1, 8} } }, /* UL max HARQ rounds */ \ + { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ +} + /*---------------------------------------------------------------------------------------------------------------------------------------------------------*/ #endif diff --git a/openair2/GNB_APP/RRC_nr_paramsvalues.h b/openair2/GNB_APP/RRC_nr_paramsvalues.h index 8a7ce64d91c..089569f84e6 100644 --- a/openair2/GNB_APP/RRC_nr_paramsvalues.h +++ b/openair2/GNB_APP/RRC_nr_paramsvalues.h @@ -132,6 +132,34 @@ #define GNB_CONFIG_STRING_ULPTRSMAXPORTS_0 "ul_ptrsMaxPorts_0" #define GNB_CONFIG_STRING_ULPTRSPOWER_0 "ul_ptrsPower_0" +#define GNB_CONFIG_STRING_DLBWP1_ID "dl_bwp-Id_1" +#define GNB_CONFIG_STRING_DLBWP2_ID "dl_bwp-Id_2" +#define GNB_CONFIG_STRING_DLBWP3_ID "dl_bwp-Id_3" +#define GNB_CONFIG_STRING_DLBWP4_ID "dl_bwp-Id_4" +#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP1 "dl_bwp1_locationAndBandwidth" +#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP2 "dl_bwp2_locationAndBandwidth" +#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP3 "dl_bwp3_locationAndBandwidth" +#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP4 "dl_bwp4_locationAndBandwidth" +#define GNB_CONFIG_STRING_SCS_DLBWP1 "dl_bwp1_subcarrierSpacing" +#define GNB_CONFIG_STRING_SCS_DLBWP2 "dl_bwp2_subcarrierSpacing" +#define GNB_CONFIG_STRING_SCS_DLBWP3 "dl_bwp3_subcarrierSpacing" +#define GNB_CONFIG_STRING_SCS_DLBWP4 "dl_bwp4_subcarrierSpacing" +#define GNB_CONFIG_STRING_FIRSTACTIVEDLBWP_ID "firstActiveDownlinkBWP-Id" +#define GNB_CONFIG_STRING_DEFAULTDLBWP_ID "defaultDownlinkBWP-Id" +#define GNB_CONFIG_STRING_ULBWP1_ID "ul_bwp-Id_1" +#define GNB_CONFIG_STRING_ULBWP2_ID "ul_bwp-Id_2" +#define GNB_CONFIG_STRING_ULBWP3_ID "ul_bwp-Id_3" +#define GNB_CONFIG_STRING_ULBWP4_ID "ul_bwp-Id_4" +#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP1 "ul_bwp1_locationAndBandwidth" +#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP2 "ul_bwp2_locationAndBandwidth" +#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP3 "ul_bwp3_locationAndBandwidth" +#define GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP4 "ul_bwp4_locationAndBandwidth" +#define GNB_CONFIG_STRING_SCS_ULBWP1 "ul_bwp1_subcarrierSpacing" +#define GNB_CONFIG_STRING_SCS_ULBWP2 "ul_bwp2_subcarrierSpacing" +#define GNB_CONFIG_STRING_SCS_ULBWP3 "ul_bwp3_subcarrierSpacing" +#define GNB_CONFIG_STRING_SCS_ULBWP4 "ul_bwp4_subcarrierSpacing" +#define GNB_CONFIG_STRING_FIRSTACTIVEULBWP_ID "firstActiveUplinkBWP-Id" + /*--------------------------------------------------------------------------------------------------------------------*/ /* pdcch_ConfigSIB1 parameters */ /*--------------------------------------------------------------------------------------------------------------------*/ @@ -240,10 +268,33 @@ {GNB_CONFIG_STRING_ULPTRSTIMEDENSITY2_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[2],defint64val:-1,TYPE_INT64,0}, \ {GNB_CONFIG_STRING_ULPTRSREOFFSET_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset,defint64val:-1,TYPE_INT64,0}, \ {GNB_CONFIG_STRING_ULPTRSMAXPORTS_0,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->maxNrofPorts,defint64val:0,TYPE_INT64,0}, \ -{GNB_CONFIG_STRING_ULPTRSPOWER_0,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->ptrs_Power,defint64val:0,TYPE_INT64,0}} - - - - +{GNB_CONFIG_STRING_ULPTRSPOWER_0,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->ptrs_Power,defint64val:0,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_FIRSTACTIVEDLBWP_ID,NULL,0,i64ptr:scd->firstActiveDownlinkBWP_Id,defint64val:1,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_FIRSTACTIVEULBWP_ID,NULL,0,i64ptr:scd->uplinkConfig->firstActiveUplinkBWP_Id,defint64val:1,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_DLBWP1_ID,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Id,defint64val:1,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_DLBWP2_ID,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[1]->bwp_Id,defint64val:2,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_DLBWP3_ID,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[2]->bwp_Id,defint64val:3,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_DLBWP4_ID,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[3]->bwp_Id,defint64val:4,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_SCS_DLBWP1,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_SCS_DLBWP2,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[1]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_SCS_DLBWP3,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[2]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_SCS_DLBWP4,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[3]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP1,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP2,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[1]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP3,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[2]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_DLBWP4,NULL,0,i64ptr:&scd->downlinkBWP_ToAddModList->list.array[3]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_ULBWP1_ID,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Id,defint64val:1,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_ULBWP2_ID,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[1]->bwp_Id,defint64val:2,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_ULBWP3_ID,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[2]->bwp_Id,defint64val:3,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_ULBWP4_ID,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[3]->bwp_Id,defint64val:4,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_SCS_ULBWP1,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_SCS_ULBWP2,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[1]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_SCS_ULBWP3,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[2]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_SCS_ULBWP4,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[3]->bwp_Common->genericParameters.subcarrierSpacing,defint64val:1,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP1,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP2,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[1]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP3,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[2]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_LOCATIONANDBANDWIDTH_ULBWP4,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[3]->bwp_Common->genericParameters.locationAndBandwidth,defint64val:0,TYPE_INT64,0}, \ +{GNB_CONFIG_STRING_DEFAULTDLBWP_ID,NULL,0,i64ptr:scd->defaultDownlinkBWP_Id,defint64val:0,TYPE_INT64,0}} #endif diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 8ea0cfe5d99..2dce0f315d4 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -214,15 +214,20 @@ void fill_scc_sim(NR_ServingCellConfigCommon_t *scc,uint64_t *ssb_bitmap,int N_R // *scc->n_TimingAdvanceOffset=NR_ServingCellConfigCommon__n_TimingAdvanceOffset_n0; *scc->ssb_periodicityServingCell=NR_ServingCellConfigCommon__ssb_periodicityServingCell_ms20; scc->dmrs_TypeA_Position=NR_ServingCellConfigCommon__dmrs_TypeA_Position_pos2; - *scc->ssbSubcarrierSpacing=NR_SubcarrierSpacing_kHz30; - *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB=641032; - *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]=78; - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA=640000; + *scc->ssbSubcarrierSpacing=mu_dl; + if (mu_dl == 0) { + *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB=520432; + *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]=38; + scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA=520000; + } else { + *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB=641032; + *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]=78; + scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA=640000; + } scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier=0; - scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing=NR_SubcarrierSpacing_kHz30; - + scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing=mu_dl; scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth=N_RB_DL; - scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth=13036; + scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth=275*(N_RB_DL-1); scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing=mu_dl;//NR_SubcarrierSpacing_kHz30; *scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->controlResourceSetZero=12; *scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceZero=0; @@ -236,13 +241,13 @@ void fill_scc_sim(NR_ServingCellConfigCommon_t *scc,uint64_t *ssb_bitmap,int N_R timedomainresourceallocation1->startSymbolAndLength=57; ASN_SEQUENCE_ADD(&scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list, timedomainresourceallocation1); - *scc->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0]=78; + *scc->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0]=mu_ul?78:38; *scc->uplinkConfigCommon->frequencyInfoUL->absoluteFrequencyPointA=-1; scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier=0; - scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing=NR_SubcarrierSpacing_kHz30; + scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing=mu_ul; scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth=N_RB_UL; *scc->uplinkConfigCommon->frequencyInfoUL->p_Max=20; - scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth=13036; + scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth=275*(N_RB_UL-1); scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing=mu_ul;//NR_SubcarrierSpacing_kHz30; scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.prach_ConfigurationIndex=98; scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM=NR_RACH_ConfigGeneric__msg1_FDM_one; @@ -278,8 +283,11 @@ void fill_scc_sim(NR_ServingCellConfigCommon_t *scc,uint64_t *ssb_bitmap,int N_R *scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->p0_nominal=-90; scc->ssb_PositionsInBurst->present=NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_mediumBitmap; *ssb_bitmap=0xff; - scc->tdd_UL_DL_ConfigurationCommon->referenceSubcarrierSpacing=NR_SubcarrierSpacing_kHz30; - scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity=NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms5; + scc->tdd_UL_DL_ConfigurationCommon->referenceSubcarrierSpacing=mu_dl; + if (mu_dl == 0) + scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity=NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms10; + else + scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity=NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms5; scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots=7; scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols=6; scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots=2; @@ -344,8 +352,10 @@ void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap) { if (*scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder!=0) scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder = NULL; - // prepare DL Allocation lists - nr_rrc_config_dl_tda(scc); + // Prepare PDSCH-TimeDomainResourceAllocation list + nr_rrc_config_dl_tda(scc, + scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList, + scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth); frame_type_t frame_type = get_frame_type((int)*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing); if (frame_type == FDD) { @@ -372,157 +382,204 @@ void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap) { /* Function to allocate dedicated serving cell config strutures */ void prepare_scd(NR_ServingCellConfig_t *scd) { // Allocate downlink structures - scd->downlinkBWP_ToAddModList = CALLOC(1, sizeof(*scd->downlinkBWP_ToAddModList)); - - // Downlink bandwidth part - NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp)); - bwp->bwp_Id = 1; - - // Allocate downlink dedicated bandwidth part and PDSCH structures - bwp->bwp_Dedicated = calloc(1, sizeof(*bwp->bwp_Dedicated)); - bwp->bwp_Dedicated->pdsch_Config = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config)); - bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup; - bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup)); - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA)); - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present = NR_SetupRelease_DMRS_DownlinkConfig_PR_setup; - - // Allocate DL DMRS and PTRS configuration - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup)); - NR_DMRS_DownlinkConfig_t *NR_DMRS_DownlinkCfg = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup; - NR_DMRS_DownlinkCfg->phaseTrackingRS=CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS)); - NR_DMRS_DownlinkCfg->phaseTrackingRS->present = NR_SetupRelease_PTRS_DownlinkConfig_PR_setup; - NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup)); - NR_PTRS_DownlinkConfig_t *NR_PTRS_DownlinkCfg = NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup; - NR_PTRS_DownlinkCfg->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->frequencyDensity)); - long *dl_rbs = CALLOC(2, sizeof(long)); - for (int i=0;i<2;i++) { - ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->frequencyDensity->list, &dl_rbs[i]); - } - NR_PTRS_DownlinkCfg->timeDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->timeDensity)); - long *dl_mcs = CALLOC(3, sizeof(long)); - for (int i=0;i<3;i++) { - ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->timeDensity->list, &dl_mcs[i]); - } - NR_PTRS_DownlinkCfg->epre_Ratio = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->epre_Ratio)); - NR_PTRS_DownlinkCfg->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->resourceElementOffset)); - *NR_PTRS_DownlinkCfg->resourceElementOffset = 0; - ASN_SEQUENCE_ADD(&scd->downlinkBWP_ToAddModList->list,bwp); - - // Allocate uplink structures - scd->uplinkConfig = CALLOC(1, sizeof(*scd->uplinkConfig)); scd->uplinkConfig->uplinkBWP_ToAddModList = CALLOC(1, sizeof(*scd->uplinkConfig->uplinkBWP_ToAddModList)); + scd->bwp_InactivityTimer = CALLOC(1, sizeof(*scd->bwp_InactivityTimer)); + scd->uplinkConfig->firstActiveUplinkBWP_Id = CALLOC(1, sizeof(*scd->uplinkConfig->firstActiveUplinkBWP_Id)); + scd->firstActiveDownlinkBWP_Id = CALLOC(1, sizeof(*scd->firstActiveDownlinkBWP_Id)); + *scd->firstActiveDownlinkBWP_Id = 1; + *scd->uplinkConfig->firstActiveUplinkBWP_Id = 1; + scd->defaultDownlinkBWP_Id = CALLOC(1, sizeof(*scd->defaultDownlinkBWP_Id)); + *scd->defaultDownlinkBWP_Id = 0; + + for (int j = 0; j < NR_MAX_NUM_BWP; j++) { + + // Downlink bandwidth part + NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp)); + bwp->bwp_Id = j+1; + + // Allocate downlink dedicated bandwidth part and PDSCH structures + bwp->bwp_Common = calloc(1, sizeof(*bwp->bwp_Common)); + bwp->bwp_Common->pdcch_ConfigCommon = calloc(1, sizeof(*bwp->bwp_Common->pdcch_ConfigCommon)); + bwp->bwp_Common->pdsch_ConfigCommon = calloc(1, sizeof(*bwp->bwp_Common->pdsch_ConfigCommon)); + bwp->bwp_Dedicated = calloc(1, sizeof(*bwp->bwp_Dedicated)); + bwp->bwp_Dedicated->pdsch_Config = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config)); + bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup; + bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup)); + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA)); + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present = NR_SetupRelease_DMRS_DownlinkConfig_PR_setup; + + // Allocate DL DMRS and PTRS configuration + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup)); + NR_DMRS_DownlinkConfig_t *NR_DMRS_DownlinkCfg = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup; + NR_DMRS_DownlinkCfg->phaseTrackingRS=CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS)); + NR_DMRS_DownlinkCfg->phaseTrackingRS->present = NR_SetupRelease_PTRS_DownlinkConfig_PR_setup; + NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup)); + NR_PTRS_DownlinkConfig_t *NR_PTRS_DownlinkCfg = NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup; + NR_PTRS_DownlinkCfg->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->frequencyDensity)); + long *dl_rbs = CALLOC(2, sizeof(long)); + for (int i=0;i<2;i++) { + ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->frequencyDensity->list, &dl_rbs[i]); + } + NR_PTRS_DownlinkCfg->timeDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->timeDensity)); + long *dl_mcs = CALLOC(3, sizeof(long)); + for (int i=0;i<3;i++) { + ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->timeDensity->list, &dl_mcs[i]); + } + NR_PTRS_DownlinkCfg->epre_Ratio = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->epre_Ratio)); + NR_PTRS_DownlinkCfg->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->resourceElementOffset)); + *NR_PTRS_DownlinkCfg->resourceElementOffset = 0; + ASN_SEQUENCE_ADD(&scd->downlinkBWP_ToAddModList->list,bwp); + + // Allocate uplink structures + + NR_PUSCH_Config_t *pusch_Config = CALLOC(1, sizeof(*pusch_Config)); + + // Allocate UL DMRS and PTRS structures + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB)); + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup; + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup)); + NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup; + NR_DMRS_UplinkConfig->phaseTrackingRS = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS)); + NR_DMRS_UplinkConfig->phaseTrackingRS->present = NR_SetupRelease_PTRS_UplinkConfig_PR_setup; + NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup)); + NR_PTRS_UplinkConfig_t *NR_PTRS_UplinkConfig = NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup; + NR_PTRS_UplinkConfig->transformPrecoderDisabled = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled)); + NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity)); + long *n_rbs = CALLOC(2, sizeof(long)); + for (int i=0;i<2;i++) { + ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity->list, &n_rbs[i]); + } + NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity)); + long *ptrs_mcs = CALLOC(3, sizeof(long)); + for (int i = 0; i < 3; i++) { + ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity->list, &ptrs_mcs[i]); + } + NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset)); + *NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = 0; - NR_PUSCH_Config_t *pusch_Config = CALLOC(1, sizeof(*pusch_Config)); - - // Allocate UL DMRS and PTRS structures - pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB)); - pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup; - pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup)); - NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup; - NR_DMRS_UplinkConfig->phaseTrackingRS = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS)); - NR_DMRS_UplinkConfig->phaseTrackingRS->present = NR_SetupRelease_PTRS_UplinkConfig_PR_setup; - NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup)); - NR_PTRS_UplinkConfig_t *NR_PTRS_UplinkConfig = NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup; - NR_PTRS_UplinkConfig->transformPrecoderDisabled = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled)); - NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity)); - long *n_rbs = CALLOC(2, sizeof(long)); - for (int i=0;i<2;i++) { - ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity->list, &n_rbs[i]); - } - NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity)); - long *ptrs_mcs = CALLOC(3, sizeof(long)); - for (int i = 0; i < 3; i++) { - ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity->list, &ptrs_mcs[i]); - } - NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset)); - *NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = 0; - - // UL bandwidth part - NR_BWP_Uplink_t *ubwp = CALLOC(1, sizeof(*ubwp)); - ubwp->bwp_Id = 1; - ubwp->bwp_Dedicated = CALLOC(1, sizeof(*ubwp->bwp_Dedicated)); + // UL bandwidth part + NR_BWP_Uplink_t *ubwp = CALLOC(1, sizeof(*ubwp)); + ubwp->bwp_Id = j+1; + ubwp->bwp_Common = CALLOC(1, sizeof(*ubwp->bwp_Common)); + ubwp->bwp_Dedicated = CALLOC(1, sizeof(*ubwp->bwp_Dedicated)); - ubwp->bwp_Dedicated->pusch_Config = CALLOC(1, sizeof(*ubwp->bwp_Dedicated->pusch_Config)); - ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup; - ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config; + ubwp->bwp_Dedicated->pusch_Config = CALLOC(1, sizeof(*ubwp->bwp_Dedicated->pusch_Config)); + ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup; + ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config; - ASN_SEQUENCE_ADD(&scd->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp); + ASN_SEQUENCE_ADD(&scd->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp); + } } -/* This function checks dedicated serving cell configuration and performs fixes as needed */ +/* This function checks dedicated serving cell configuration and performs fixes as needed */ void fix_scd(NR_ServingCellConfig_t *scd) { - // Check for DL PTRS parameters validity - if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) { - // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present - for (int i = scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.count-1; i >= 0; i--) { - if ((*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] < 1) - || (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] > 276)) { - LOG_I(NR_RRC, "DL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i); - free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS); - scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS = NULL; - break; - } + + // Remove unused BWPs + int b = 0; + while (b<scd->downlinkBWP_ToAddModList->list.count) { + if (scd->downlinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == 0) { + asn_sequence_del(&scd->downlinkBWP_ToAddModList->list,b,1); + } else { + b++; } } - if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) { - // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present - for (int i = scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.count-1; i >= 0; i--) { - if ((*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[i] < 0) - || (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[i] > 29)) { - LOG_I(RRC, "DL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i); - free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS); - scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS = NULL; - break; - } + + b = 0; + while (b<scd->uplinkConfig->uplinkBWP_ToAddModList->list.count) { + if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == 0) { + asn_sequence_del(&scd->uplinkConfig->uplinkBWP_ToAddModList->list,b,1); + } else { + b++; } } - if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) { - if (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset > 2) { - LOG_I(RRC, "Freeing DL PTRS resourceElementOffset \n"); - free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset); - scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset = NULL; + + // Check for DL PTRS parameters validity + for (int bwp_i = 0 ; bwp_i<scd->downlinkBWP_ToAddModList->list.count; bwp_i++) { + + NR_DMRS_DownlinkConfig_t *dmrs_dl_config = scd->downlinkBWP_ToAddModList->list.array[bwp_i]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup; + + if (dmrs_dl_config->phaseTrackingRS) { + // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present + for (int i = dmrs_dl_config->phaseTrackingRS->choice.setup->frequencyDensity->list.count - 1; i >= 0; i--) { + if ((*dmrs_dl_config->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] < 1) + || (*dmrs_dl_config->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] > 276)) { + LOG_I(GNB_APP, "DL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i); + free(dmrs_dl_config->phaseTrackingRS); + dmrs_dl_config->phaseTrackingRS = NULL; + break; + } + } } - if (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio > 1) { - LOG_I(RRC, "Freeing DL PTRS epre_Ratio \n"); - free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio); - scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio = NULL; + + if (dmrs_dl_config->phaseTrackingRS) { + // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present + for (int i = dmrs_dl_config->phaseTrackingRS->choice.setup->timeDensity->list.count - 1; i >= 0; i--) { + if ((*dmrs_dl_config->phaseTrackingRS->choice.setup->timeDensity->list.array[i] < 0) + || (*dmrs_dl_config->phaseTrackingRS->choice.setup->timeDensity->list.array[i] > 29)) { + LOG_I(GNB_APP, "DL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i); + free(dmrs_dl_config->phaseTrackingRS); + dmrs_dl_config->phaseTrackingRS = NULL; + break; + } + } } - } - if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) { - // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present - for (int i = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.count-1; i >= 0; i--) { - if ((*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] < 1) - || (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] > 276)) { - LOG_I(RRC, "UL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i); - free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS); - scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS = NULL; - break; + if (dmrs_dl_config->phaseTrackingRS) { + if (*dmrs_dl_config->phaseTrackingRS->choice.setup->resourceElementOffset > 2) { + LOG_I(GNB_APP, "Freeing DL PTRS resourceElementOffset \n"); + free(dmrs_dl_config->phaseTrackingRS->choice.setup->resourceElementOffset); + dmrs_dl_config->phaseTrackingRS->choice.setup->resourceElementOffset = NULL; + } + if (*dmrs_dl_config->phaseTrackingRS->choice.setup->epre_Ratio > 1) { + LOG_I(GNB_APP, "Freeing DL PTRS epre_Ratio \n"); + free(dmrs_dl_config->phaseTrackingRS->choice.setup->epre_Ratio); + dmrs_dl_config->phaseTrackingRS->choice.setup->epre_Ratio = NULL; } } } - if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) { - // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present - for (int i = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.count-1; i >= 0; i--) { - if ((*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] < 0) - || (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] > 29)) { - LOG_I(RRC, "UL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i); - free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS); - scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS = NULL; - break; + // Check for UL PTRS parameters validity + for (int bwp_i = 0 ; bwp_i<scd->uplinkConfig->uplinkBWP_ToAddModList->list.count; bwp_i++) { + + NR_DMRS_UplinkConfig_t *dmrs_ul_config = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_i]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup; + + if (dmrs_ul_config->phaseTrackingRS) { + // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present + for (int i = dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.count-1; i >= 0; i--) { + if ((*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] < 1) + || (*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] > 276)) { + LOG_I(GNB_APP, "UL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i); + free(dmrs_ul_config->phaseTrackingRS); + dmrs_ul_config->phaseTrackingRS = NULL; + break; + } } } - } - if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) { - // Check for UL PTRS parameters validity - if (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset > 2) { - LOG_I(RRC, "Freeing UL PTRS resourceElementOffset \n"); - free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset); - scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset = NULL; + + if (dmrs_ul_config->phaseTrackingRS) { + // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present + for (int i = dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.count-1; i >= 0; i--) { + if ((*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] < 0) + || (*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] > 29)) { + LOG_I(GNB_APP, "UL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i); + free(dmrs_ul_config->phaseTrackingRS); + dmrs_ul_config->phaseTrackingRS = NULL; + break; + } + } } + + if (dmrs_ul_config->phaseTrackingRS) { + // Check for UL PTRS parameters validity + if (*dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset > 2) { + LOG_I(GNB_APP, "Freeing UL PTRS resourceElementOffset \n"); + free(dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset); + dmrs_ul_config->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset = NULL; + } + } + } } @@ -770,6 +827,7 @@ void RCconfig_NR_L1(void) { RC.gNB[j]->pucch0_thres = *(L1_ParamList.paramarray[j][L1_PUCCH0_DTX_THRESHOLD].uptr); RC.gNB[j]->prach_thres = *(L1_ParamList.paramarray[j][L1_PRACH_DTX_THRESHOLD].uptr); RC.gNB[j]->pusch_thres = *(L1_ParamList.paramarray[j][L1_PUSCH_DTX_THRESHOLD].uptr); + RC.gNB[j]->max_ldpc_iterations = *(L1_ParamList.paramarray[j][L1_MAX_LDPC_ITERATIONS].uptr); RC.gNB[j]->num_ulprbbl = num_prbbl; RC.gNB[j]->ap_N1 = N1; RC.gNB[j]->ap_N2 = N2; @@ -858,6 +916,10 @@ void RCconfig_nr_macrlc() { } paramdef_t MacRLC_Params[] = MACRLCPARAMS_DESC; paramlist_def_t MacRLC_ParamList = {CONFIG_STRING_MACRLC_LIST,NULL,0}; + /* map parameter checking array instances to parameter definition array instances */ + checkedparam_t config_check_MacRLCParams [] = MACRLCPARAMS_CHECK; + for (int i = 0; i < sizeof(MacRLC_Params) / sizeof(paramdef_t); ++i) + MacRLC_Params[i].chkPptr = &(config_check_MacRLCParams[i]); config_getlist( &MacRLC_ParamList,MacRLC_Params,sizeof(MacRLC_Params)/sizeof(paramdef_t), NULL); if ( MacRLC_ParamList.numelt > 0) { @@ -870,6 +932,7 @@ void RCconfig_nr_macrlc() { RC.nb_nr_mac_CC[j] = *(MacRLC_ParamList.paramarray[j][MACRLC_CC_IDX].iptr); RC.nrmac[j]->pusch_target_snrx10 = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCHTARGETSNRX10_IDX].iptr); RC.nrmac[j]->pucch_target_snrx10 = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCHTARGETSNRX10_IDX].iptr); + RC.nrmac[j]->ul_prbblack_SNR_threshold = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_PRBBLACK_SNR_THRESHOLD_IDX].iptr); RC.nrmac[j]->pucch_failure_thres = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCHFAILURETHRES_IDX].iptr); RC.nrmac[j]->pusch_failure_thres = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCHFAILURETHRES_IDX].iptr); @@ -924,11 +987,16 @@ void RCconfig_nr_macrlc() { AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr)); } RC.nrmac[j]->ulsch_max_frame_inactivity = *(MacRLC_ParamList.paramarray[j][MACRLC_ULSCH_MAX_FRAME_INACTIVITY].uptr); - RC.nrmac[j]->dl_bler_target_upper = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_BLER_TARGET_UPPER_IDX].dblptr); - RC.nrmac[j]->dl_bler_target_lower = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_BLER_TARGET_LOWER_IDX].dblptr); - RC.nrmac[j]->dl_rd2_bler_threshold = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_RD2_BLER_THRESHOLD_IDX].dblptr); - RC.nrmac[j]->dl_max_mcs = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_MAX_MCS_IDX].u8ptr); - RC.nrmac[j]->harq_round_max = *(MacRLC_ParamList.paramarray[j][MACRLC_HARQ_ROUND_MAX_IDX].u8ptr); + NR_bler_options_t *dl_bler_options = &RC.nrmac[j]->dl_bler; + dl_bler_options->upper = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_BLER_TARGET_UPPER_IDX].dblptr); + dl_bler_options->lower = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_BLER_TARGET_LOWER_IDX].dblptr); + dl_bler_options->max_mcs = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_MAX_MCS_IDX].u8ptr); + dl_bler_options->harq_round_max = *(MacRLC_ParamList.paramarray[j][MACRLC_DL_HARQ_ROUND_MAX_IDX].u8ptr); + NR_bler_options_t *ul_bler_options = &RC.nrmac[j]->ul_bler; + ul_bler_options->upper = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_BLER_TARGET_UPPER_IDX].dblptr); + ul_bler_options->lower = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_BLER_TARGET_LOWER_IDX].dblptr); + ul_bler_options->max_mcs = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_MAX_MCS_IDX].u8ptr); + ul_bler_options->harq_round_max = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_HARQ_ROUND_MAX_IDX].u8ptr); RC.nrmac[j]->min_grant_prb = *(MacRLC_ParamList.paramarray[j][MACRLC_MIN_GRANT_PRB_IDX].u8ptr); RC.nrmac[j]->min_grant_mcs = *(MacRLC_ParamList.paramarray[j][MACRLC_MIN_GRANT_MCS_IDX].u8ptr); RC.nrmac[j]->num_ulprbbl = num_prbbl; @@ -1084,8 +1152,8 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) { prepare_scd(scd); paramdef_t SCDsParams[] = SCDPARAMS_DESC(scd); paramlist_def_t SCDsParamList = {GNB_CONFIG_STRING_SERVINGCELLCONFIGDEDICATED, NULL, 0}; - ////////// Physical parameters + ////////// Physical parameters /* get global parameters, defined outside any section in the config file */ @@ -1162,13 +1230,17 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) { if (SCDsParamList.numelt > 0) { sprintf(aprefix, "%s.[%i].%s.[%i]", GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_SERVINGCELLCONFIGDEDICATED, 0); config_get( SCDsParams,sizeof(SCDsParams)/sizeof(paramdef_t),aprefix); - LOG_I(RRC,"Read in ServingCellConfigDedicated UL (FreqDensity_0 %d, FreqDensity_1 %d, TimeDensity_0 %d, TimeDensity_1 %d, TimeDensity_2 %d, RE offset %d \n", + LOG_I(RRC,"Read in ServingCellConfigDedicated UL (FreqDensity_0 %d, FreqDensity_1 %d, TimeDensity_0 %d, TimeDensity_1 %d, TimeDensity_2 %d, RE offset %d, First_active_BWP_ID %d SCS %d, LocationandBW %d \n", (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[0], (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[1], (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[0], (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[1], (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[2], - (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset); + (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset, + (int)*scd->firstActiveDownlinkBWP_Id, + (int)scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.subcarrierSpacing, + (int)scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Common->genericParameters.locationAndBandwidth + ); } fix_scd(scd); @@ -1269,31 +1341,29 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) { (NRRRC_CONFIGURATION_REQ (msg_p).mnc_digit_length[l] == 3),"BAD MNC DIGIT LENGTH %d", NRRRC_CONFIGURATION_REQ (msg_p).mnc_digit_length[l]); } - LOG_I(GNB_APP,"SSB SCO %d\n",*GNBParamList.paramarray[i][GNB_SSB_SUBCARRIEROFFSET_IDX].iptr); - NRRRC_CONFIGURATION_REQ (msg_p).ssb_SubcarrierOffset = *GNBParamList.paramarray[i][GNB_SSB_SUBCARRIEROFFSET_IDX].iptr; - LOG_I(RRC,"pdsch_AntennaPorts N1 %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N1_IDX].iptr); + LOG_I(GNB_APP,"pdsch_AntennaPorts N1 %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N1_IDX].iptr); NRRRC_CONFIGURATION_REQ (msg_p).pdsch_AntennaPorts.N1 = *GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N1_IDX].iptr; - LOG_I(RRC,"pdsch_AntennaPorts N2 %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N2_IDX].iptr); + LOG_I(GNB_APP,"pdsch_AntennaPorts N2 %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N2_IDX].iptr); NRRRC_CONFIGURATION_REQ (msg_p).pdsch_AntennaPorts.N2 = *GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_N2_IDX].iptr; - LOG_I(RRC,"pdsch_AntennaPorts XP %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_XP_IDX].iptr); + LOG_I(GNB_APP,"pdsch_AntennaPorts XP %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_XP_IDX].iptr); NRRRC_CONFIGURATION_REQ (msg_p).pdsch_AntennaPorts.XP = *GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_XP_IDX].iptr; - LOG_I(RRC,"pusch_AntennaPorts %d\n",*GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr); + LOG_I(GNB_APP,"pusch_AntennaPorts %d\n",*GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr); NRRRC_CONFIGURATION_REQ (msg_p).pusch_AntennaPorts = *GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr; LOG_I(GNB_APP,"minTXRXTIME %d\n",*GNBParamList.paramarray[i][GNB_MINRXTXTIME_IDX].iptr); NRRRC_CONFIGURATION_REQ (msg_p).minRXTXTIME = *GNBParamList.paramarray[i][GNB_MINRXTXTIME_IDX].iptr; - LOG_I(RRC,"SIB1 TDA %d\n",*GNBParamList.paramarray[i][GNB_SIB1_TDA_IDX].iptr); + LOG_I(GNB_APP,"SIB1 TDA %d\n",*GNBParamList.paramarray[i][GNB_SIB1_TDA_IDX].iptr); NRRRC_CONFIGURATION_REQ (msg_p).sib1_tda = *GNBParamList.paramarray[i][GNB_SIB1_TDA_IDX].iptr; LOG_I(GNB_APP,"Do CSI-RS %d\n",*GNBParamList.paramarray[i][GNB_DO_CSIRS_IDX].iptr); NRRRC_CONFIGURATION_REQ (msg_p).do_CSIRS = *GNBParamList.paramarray[i][GNB_DO_CSIRS_IDX].iptr; - LOG_I(RRC, "Do SRS %d\n",*GNBParamList.paramarray[i][GNB_DO_SRS_IDX].iptr); + LOG_I(GNB_APP, "Do SRS %d\n",*GNBParamList.paramarray[i][GNB_DO_SRS_IDX].iptr); NRRRC_CONFIGURATION_REQ (msg_p).do_SRS = *GNBParamList.paramarray[i][GNB_DO_SRS_IDX].iptr; NRRRC_CONFIGURATION_REQ (msg_p).force_256qam_off = *GNBParamList.paramarray[i][GNB_FORCE256QAMOFF_IDX].iptr; - LOG_I(RRC, "256 QAM: %s\n", NRRRC_CONFIGURATION_REQ (msg_p).force_256qam_off ? "force off" : "may be on"); + LOG_I(GNB_APP, "256 QAM: %s\n", NRRRC_CONFIGURATION_REQ (msg_p).force_256qam_off ? "force off" : "may be on"); NRRRC_CONFIGURATION_REQ (msg_p).scc = scc; NRRRC_CONFIGURATION_REQ (msg_p).scd = scd; - NRRRC_CONFIGURATION_REQ (msg_p).enable_sdap = *GNBParamList.paramarray[i][GNB_ENABLE_SDAP_IDX].iptr; + NRRRC_CONFIGURATION_REQ (msg_p).enable_sdap = *GNBParamList.paramarray[i][GNB_ENABLE_SDAP_IDX].iptr; LOG_I(GNB_APP, "SDAP layer is %s\n", NRRRC_CONFIGURATION_REQ (msg_p).enable_sdap ? "enabled" : "disabled"); - + }// }//End for (k=0; k <num_gnbs ; k++) memcpy(&rrc->configuration, &NRRRC_CONFIGURATION_REQ(msg_p), sizeof(NRRRC_CONFIGURATION_REQ(msg_p))); @@ -1991,9 +2061,38 @@ int RCconfig_NR_DU_F1(MessageDef *msg_p, uint32_t i) { f1Setup->measurement_timing_information[k] = "0"; f1Setup->ranac[k] = 0; f1Setup->mib[k] = rrc->carrier.MIB; - f1Setup->sib1[k] = rrc->carrier.SIB1; f1Setup->mib_length[k] = rrc->carrier.sizeof_MIB; - f1Setup->sib1_length[k] = rrc->carrier.sizeof_SIB1; + + NR_BCCH_DL_SCH_Message_t *bcch_message = NULL; + + asn_dec_rval_t dec_rval = uper_decode_complete( NULL, + &asn_DEF_NR_BCCH_DL_SCH_Message, + (void **)&bcch_message, + (const void *)rrc->carrier.SIB1, + rrc->carrier.sizeof_SIB1); + + if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) { + LOG_E(RRC,"SIB1 decode error\n"); + // free the memory + SEQUENCE_free( &asn_DEF_NR_BCCH_DL_SCH_Message, bcch_message, 1 ); + exit(1); + } + + NR_SIB1_t *bcch_SIB1 = bcch_message->message.choice.c1->choice.systemInformationBlockType1; + f1Setup->sib1[k] = calloc(1,rrc->carrier.sizeof_SIB1); + asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_SIB1, + NULL, + (void *)bcch_SIB1, + f1Setup->sib1[k], + NR_MAX_SIB_LENGTH/8); + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", + enc_rval.failed_type->name, enc_rval.encoded); + + //if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + LOG_I(NR_RRC, "SIB1 container to be integrated in F1 Setup request:\n"); + xer_fprint(stdout, &asn_DEF_NR_SIB1,(void *)bcch_message->message.choice.c1->choice.systemInformationBlockType1 ); + //} + f1Setup->sib1_length[k] = (enc_rval.encoded+7)/8; break; } } @@ -2155,7 +2254,6 @@ void configure_gnb_du_mac(int inst) { // LOG_I(GNB_APP,"Configuring MAC/L1 %d, carrier->sib2 %p\n", inst, &carrier->sib2->radioResourceConfigCommon); LOG_I(GNB_APP,"Configuring gNB DU MAC/L1 %d \n", inst); rrc_mac_config_req_gNB(rrc->module_id, - rrc->configuration.ssb_SubcarrierOffset, rrc->configuration.pdsch_AntennaPorts, rrc->configuration.pusch_AntennaPorts, rrc->configuration.sib1_tda, diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h index 4f6c9e1a68d..ef28dea80fd 100644 --- a/openair2/GNB_APP/gnb_paramdef.h +++ b/openair2/GNB_APP/gnb_paramdef.h @@ -113,7 +113,6 @@ typedef enum { #define GNB_CONFIG_STRING_REMOTE_S_PORTC "remote_s_portc" #define GNB_CONFIG_STRING_LOCAL_S_PORTD "local_s_portd" #define GNB_CONFIG_STRING_REMOTE_S_PORTD "remote_s_portd" -#define GNB_CONFIG_STRING_SSBSUBCARRIEROFFSET "ssb_SubcarrierOffset" #define GNB_CONFIG_STRING_PDSCHANTENNAPORTS_N1 "pdsch_AntennaPorts_N1" #define GNB_CONFIG_STRING_PDSCHANTENNAPORTS_N2 "pdsch_AntennaPorts_N2" #define GNB_CONFIG_STRING_PDSCHANTENNAPORTS_XP "pdsch_AntennaPorts_XP" @@ -149,7 +148,6 @@ typedef enum { {GNB_CONFIG_STRING_REMOTE_S_PORTC, NULL, 0, uptr:NULL, defuintval:50000, TYPE_UINT, 0}, \ {GNB_CONFIG_STRING_LOCAL_S_PORTD, NULL, 0, uptr:NULL, defuintval:50001, TYPE_UINT, 0}, \ {GNB_CONFIG_STRING_REMOTE_S_PORTD, NULL, 0, uptr:NULL, defuintval:50001, TYPE_UINT, 0}, \ -{GNB_CONFIG_STRING_SSBSUBCARRIEROFFSET, NULL, 0, iptr:NULL, defintval:31, TYPE_INT, 0}, \ {GNB_CONFIG_STRING_PDSCHANTENNAPORTS_N1, "horiz. log. antenna ports", 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \ {GNB_CONFIG_STRING_PDSCHANTENNAPORTS_N2, "vert. log. antenna ports", 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \ {GNB_CONFIG_STRING_PDSCHANTENNAPORTS_XP, "XP log. antenna ports", 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \ @@ -160,9 +158,9 @@ typedef enum { {GNB_CONFIG_STRING_NRCELLID, NULL, 0, u64ptr:NULL, defint64val:1, TYPE_UINT64, 0}, \ {GNB_CONFIG_STRING_MINRXTXTIME, NULL, 0, iptr:NULL, defintval:2, TYPE_INT, 0}, \ {GNB_CONFIG_STRING_ULPRBBLACKLIST, NULL, 0, strptr:NULL, defstrval:"", TYPE_STRING, 0}, \ -{GNB_CONFIG_STRING_UMONDEFAULTDRB, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{GNB_CONFIG_STRING_UMONDEFAULTDRB, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ {GNB_CONFIG_STRING_FORCE256QAMOFF, GNB_CONFIG_HLP_FORCE256QAMOFF, PARAMFLAG_BOOL, iptr:NULL, defintval:0, TYPE_INT, 0}, \ -{GNB_CONFIG_STRING_ENABLE_SDAP, GNB_CONFIG_HLP_STRING_ENABLE_SDAP, PARAMFLAG_BOOL, iptr:NULL, defintval:0, TYPE_INT, 0} \ +{GNB_CONFIG_STRING_ENABLE_SDAP, GNB_CONFIG_HLP_STRING_ENABLE_SDAP, PARAMFLAG_BOOL, iptr:NULL, defintval:0, TYPE_INT, 0}, \ } #define GNB_GNB_ID_IDX 0 @@ -179,20 +177,19 @@ typedef enum { #define GNB_REMOTE_S_PORTC_IDX 11 #define GNB_LOCAL_S_PORTD_IDX 12 #define GNB_REMOTE_S_PORTD_IDX 13 -#define GNB_SSB_SUBCARRIEROFFSET_IDX 14 -#define GNB_PDSCH_ANTENNAPORTS_N1_IDX 15 -#define GNB_PDSCH_ANTENNAPORTS_N2_IDX 16 -#define GNB_PDSCH_ANTENNAPORTS_XP_IDX 17 -#define GNB_PUSCH_ANTENNAPORTS_IDX 18 -#define GNB_SIB1_TDA_IDX 19 -#define GNB_DO_CSIRS_IDX 20 -#define GNB_DO_SRS_IDX 21 -#define GNB_NRCELLID_IDX 22 -#define GNB_MINRXTXTIME_IDX 23 -#define GNB_ULPRBBLACKLIST_IDX 24 -#define GNB_UMONDEFAULTDRB_IDX 25 -#define GNB_FORCE256QAMOFF_IDX 26 -#define GNB_ENABLE_SDAP_IDX 27 +#define GNB_PDSCH_ANTENNAPORTS_N1_IDX 14 +#define GNB_PDSCH_ANTENNAPORTS_N2_IDX 15 +#define GNB_PDSCH_ANTENNAPORTS_XP_IDX 16 +#define GNB_PUSCH_ANTENNAPORTS_IDX 17 +#define GNB_SIB1_TDA_IDX 18 +#define GNB_DO_CSIRS_IDX 19 +#define GNB_DO_SRS_IDX 20 +#define GNB_NRCELLID_IDX 21 +#define GNB_MINRXTXTIME_IDX 22 +#define GNB_ULPRBBLACKLIST_IDX 23 +#define GNB_UMONDEFAULTDRB_IDX 24 +#define GNB_FORCE256QAMOFF_IDX 25 +#define GNB_ENABLE_SDAP_IDX 26 #define TRACKING_AREA_CODE_OKRANGE {0x0001,0xFFFD} #define GNBPARAMS_CHECK { \ diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index d22485d23f2..52a9048cd07 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -1104,7 +1104,7 @@ void eNB_Config_Local_DRX(instance_t Mod_id, /* Get struct to modify */ UE_scheduling_control = &(UE_info_mac->UE_sched_ctrl[UE_id]); - UE_scheduling_control->cdrx_configured = FALSE; // will be set to true when no error + UE_scheduling_control->cdrx_configured = false; // will be set to true when no error /* Check drx_Configuration */ if (drx_Configuration == NULL) { @@ -1119,9 +1119,9 @@ void eNB_Config_Local_DRX(instance_t Mod_id, } /* Modify scheduling control structure according to DRX configuration: doesn't support every configurations! */ - UE_scheduling_control->cdrx_configured = FALSE; // will be set to true when receiving RRC Reconfiguration Complete - UE_scheduling_control->cdrx_waiting_ack = TRUE; // waiting for RRC Reconfiguration Complete message - UE_scheduling_control->in_active_time = FALSE; + UE_scheduling_control->cdrx_configured = false; // will be set to true when receiving RRC Reconfiguration Complete + UE_scheduling_control->cdrx_waiting_ack = true; // waiting for RRC Reconfiguration Complete message + UE_scheduling_control->in_active_time = false; UE_scheduling_control->dci0_ongoing_timer = 0; UE_scheduling_control->on_duration_timer = 0; struct LTE_DRX_Config__setup *choiceSetup = &drx_Configuration->choice.setup; @@ -1297,13 +1297,13 @@ void eNB_Config_Local_DRX(instance_t Mod_id, } if (choiceSetup->shortDRX == NULL) { - UE_scheduling_control->in_short_drx_cycle = FALSE; + UE_scheduling_control->in_short_drx_cycle = false; UE_scheduling_control->drx_shortCycle_timer_value = 0; UE_scheduling_control->short_drx_cycle_duration = 0; UE_scheduling_control->drx_shortCycle_timer = 0; UE_scheduling_control->drx_shortCycle_timer_thres = -1; } else { - UE_scheduling_control->in_short_drx_cycle = FALSE; + UE_scheduling_control->in_short_drx_cycle = false; UE_scheduling_control->drx_shortCycle_timer_value = (uint8_t) choiceSetup->shortDRX->drxShortCycleTimer; switch (choiceSetup->shortDRX->shortDRX_Cycle) { @@ -1380,7 +1380,7 @@ void eNB_Config_Local_DRX(instance_t Mod_id, UE_scheduling_control->drx_shortCycle_timer_thres = UE_scheduling_control->drx_shortCycle_timer_value * UE_scheduling_control->short_drx_cycle_duration; } - UE_scheduling_control->in_long_drx_cycle = FALSE; + UE_scheduling_control->in_long_drx_cycle = false; UE_scheduling_control->drx_longCycle_timer = 0; switch (choiceSetup->longDRX_CycleStartOffset.present) { diff --git a/openair2/LAYER2/MAC/defs_NB_IoT.h b/openair2/LAYER2/MAC/defs_NB_IoT.h index d4945f0182d..abe780741c0 100644 --- a/openair2/LAYER2/MAC/defs_NB_IoT.h +++ b/openair2/LAYER2/MAC/defs_NB_IoT.h @@ -243,7 +243,6 @@ typedef struct { // -1:No UE in list int tail; int num_UEs; - //boolean_t active[MAX_MAX_MOBILES_PER_ENB_NB_IoT]; } UE_list_NB_IoT_t; @@ -403,7 +402,7 @@ typedef struct schedule_result{ // pointer to DCI void *DCI_pdu; // when all the procedure related to this DCI, enable this flag - boolean_t DCI_release; + bool DCI_release; // Indicate the channel which to transmit channel_NB_IoT_t channel; // rnti @@ -452,7 +451,7 @@ typedef enum ce_level_e{ /*! \brief eNB template for the Random access information */ typedef struct RA_TEMPLATE_NB_IoT_s{ - boolean_t active; + bool active; uint32_t msg3_retransmit_count; uint32_t msg4_retransmit_count; uint16_t ta; @@ -461,8 +460,8 @@ typedef struct RA_TEMPLATE_NB_IoT_s{ rnti_t ue_rnti; rnti_t ra_rnti; struct RA_TEMPLATE_NB_IoT_s *next, *prev; - boolean_t wait_msg4_ack; - boolean_t wait_msg3_ack; + bool wait_msg4_ack; + bool wait_msg3_ack; uint8_t rar_buffer[7]; } RA_TEMPLATE_NB_IoT; @@ -530,7 +529,7 @@ typedef struct { uint32_t pdus_in_buffer; /*!< \brief Number of PDUs buffered in RLC protocol instance (OBSOLETE). */ uint32_t head_sdu_creation_time; /*!< \brief Head SDU creation time. */ uint32_t head_sdu_remaining_size_to_send; /*!< \brief remaining size of sdu: could be the total size or the remaining size of already segmented sdu */ - boolean_t head_sdu_is_segmented; /*!< \brief 0 if head SDU has not been segmented, 1 if already segmented */ + bool head_sdu_is_segmented; /*!< \brief 0 if head SDU has not been segmented, 1 if already segmented */ } mac_rlc_status_resp_NB_IoT_t; // global variables diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index d647eff7cbe..53ab98a33fb 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -135,7 +135,7 @@ void schedule_SRS(module_id_t module_idP, UE_scheduling_control = &(UE_info->UE_sched_ctrl[UE_id]); /* Test if Active Time not running since 6+ subframes */ - if (UE_scheduling_control->cdrx_configured == TRUE && UE_scheduling_control->in_active_time == FALSE) { + if (UE_scheduling_control->cdrx_configured == true && UE_scheduling_control->in_active_time == false) { /* * TODO: 6+ subframes condition not checked here */ @@ -204,7 +204,7 @@ void schedule_CSI(module_id_t module_idP, cc = &eNB->common_channels[CC_id]; for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { - if (UE_info->active[UE_id] == FALSE) { + if (UE_info->active[UE_id] == false) { continue; } @@ -223,9 +223,9 @@ void schedule_CSI(module_id_t module_idP, */ UE_scheduling_control = &(UE_info->UE_sched_ctrl[UE_id]); - if (UE_scheduling_control->cdrx_configured == TRUE) { + if (UE_scheduling_control->cdrx_configured == true) { /* Test if CQI masking activated */ - if (UE_scheduling_control->cqi_mask_boolean == TRUE) { + if (UE_scheduling_control->cqi_mask_boolean == true) { // CQI masking => test if onDurationTime not running since 6+ subframe if (UE_scheduling_control->on_duration_timer == 0) { /* @@ -234,7 +234,7 @@ void schedule_CSI(module_id_t module_idP, continue; } } else { // No CQI masking => test if Active Time not running since 6+ subframe - if (UE_scheduling_control->in_active_time == FALSE) { + if (UE_scheduling_control->in_active_time == false) { /* * TODO: 6+ subframes condition not checked here */ @@ -677,8 +677,8 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, } /* Set and increment CDRX related timers */ - if (UE_scheduling_control->cdrx_configured == TRUE) { - boolean_t harq_active_time_condition = FALSE; + if (UE_scheduling_control->cdrx_configured == true) { + bool harq_active_time_condition = false; UE_TEMPLATE *UE_template = NULL; unsigned long active_time_condition = 0; // variable used only for tracing purpose @@ -721,7 +721,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, UE_scheduling_control->ul_synchronous_harq_timer[CC_id][harq_process_id]++; if (UE_scheduling_control->ul_synchronous_harq_timer[CC_id][harq_process_id] > 5) { - harq_active_time_condition = TRUE; + harq_active_time_condition = true; UE_scheduling_control->ul_synchronous_harq_timer[CC_id][harq_process_id] = 0; active_time_condition = 5; // for tracing purpose } @@ -747,24 +747,24 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, /* When timer expires switch into short or long DRX cycle */ if (UE_scheduling_control->drx_shortCycle_timer_thres > 0) { - UE_scheduling_control->in_short_drx_cycle = TRUE; + UE_scheduling_control->in_short_drx_cycle = true; UE_scheduling_control->drx_shortCycle_timer = 0; - UE_scheduling_control->in_long_drx_cycle = FALSE; + UE_scheduling_control->in_long_drx_cycle = false; } else { - UE_scheduling_control->in_long_drx_cycle = TRUE; + UE_scheduling_control->in_long_drx_cycle = true; } } } /* Short DRX Cycle */ - if (UE_scheduling_control->in_short_drx_cycle == TRUE) { + if (UE_scheduling_control->in_short_drx_cycle == true) { UE_scheduling_control->drx_shortCycle_timer++; /* When the Short DRX cycles are over, switch to long DRX cycle */ if (UE_scheduling_control->drx_shortCycle_timer > UE_scheduling_control->drx_shortCycle_timer_thres) { UE_scheduling_control->drx_shortCycle_timer = 0; - UE_scheduling_control->in_short_drx_cycle = FALSE; - UE_scheduling_control->in_long_drx_cycle = TRUE; + UE_scheduling_control->in_short_drx_cycle = false; + UE_scheduling_control->in_long_drx_cycle = true; UE_scheduling_control->drx_longCycle_timer = 0; } } else { @@ -772,7 +772,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, } /* Long DRX Cycle */ - if (UE_scheduling_control->in_long_drx_cycle == TRUE) { + if (UE_scheduling_control->in_long_drx_cycle == true) { UE_scheduling_control->drx_longCycle_timer++; if (UE_scheduling_control->drx_longCycle_timer > UE_scheduling_control->drx_longCycle_timer_thres) { @@ -783,18 +783,18 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, } /* Check for error cases */ - if ((UE_scheduling_control->in_short_drx_cycle == TRUE) && (UE_scheduling_control->in_long_drx_cycle == TRUE)) { + if ((UE_scheduling_control->in_short_drx_cycle == true) && (UE_scheduling_control->in_long_drx_cycle == true)) { LOG_E(MAC, "Error in C-DRX: UE id %d is in both short and long DRX cycle. Should not happen. Back it to long cycle only\n", UE_id); - UE_scheduling_control->in_short_drx_cycle = FALSE; + UE_scheduling_control->in_short_drx_cycle = false; } /* Condition to start On Duration Timer */ - if (UE_scheduling_control->in_short_drx_cycle == TRUE && UE_scheduling_control->on_duration_timer == 0) { + if (UE_scheduling_control->in_short_drx_cycle == true && UE_scheduling_control->on_duration_timer == 0) { if (((frameP * 10) + subframeP) % (UE_scheduling_control->short_drx_cycle_duration) == (UE_scheduling_control->drx_start_offset) % (UE_scheduling_control->short_drx_cycle_duration)) { UE_scheduling_control->on_duration_timer = 1; } - } else if (UE_scheduling_control->in_long_drx_cycle == TRUE && UE_scheduling_control->on_duration_timer == 0) { + } else if (UE_scheduling_control->in_long_drx_cycle == true && UE_scheduling_control->on_duration_timer == 0) { if (((frameP * 10) + subframeP) % (UE_scheduling_control->drx_longCycle_timer_thres) == (UE_scheduling_control->drx_start_offset)) { UE_scheduling_control->on_duration_timer = 1; @@ -811,7 +811,7 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, /* (a)synchronous HARQ processes handling for Active Time */ for (int harq_process_id = 0; harq_process_id < 8; harq_process_id++) { if (UE_scheduling_control->drx_retransmission_timer[harq_process_id] > 0) { - harq_active_time_condition = TRUE; + harq_active_time_condition = true; active_time_condition = 2; // for tracing purpose break; } @@ -822,9 +822,9 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, UE_scheduling_control->drx_inactivity_timer > 1 || harq_active_time_condition || UE_template->ul_SR > 0) { - UE_scheduling_control->in_active_time = TRUE; + UE_scheduling_control->in_active_time = true; } else { - UE_scheduling_control->in_active_time = FALSE; + UE_scheduling_control->in_active_time = false; } /* BEGIN VCD */ diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index e5b95a7f470..c659df8d31a 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -1225,7 +1225,7 @@ check_Msg4_retransmission(module_id_t module_idP, int CC_idP, LOG_D(MAC,"[eNB %d][RAPROC] Frame %d, Subframe %d: state:IDLE\n", module_idP, frameP, subframeP); UE_id = find_UE_id(module_idP, ra->rnti); DevAssert(UE_id != -1); - mac->UE_info.UE_template[UE_PCCID(module_idP, UE_id)][UE_id].configured = TRUE; + mac->UE_info.UE_template[UE_PCCID(module_idP, UE_id)][UE_id].configured = true; mac->UE_info.UE_template[UE_PCCID(module_idP, UE_id)][UE_id].pusch_repetition_levels=ra->pusch_repetition_levels; cancel_ra_proc(module_idP, CC_idP, frameP, ra->rnti); } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 596d978a989..08986221154 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -2075,7 +2075,7 @@ schedule_PCH(module_id_t module_idP, for (uint16_t i = 0; i < MAX_MOBILES_PER_ENB; i++) { ue_pf_po = &UE_PF_PO[CC_id][i]; - if (ue_pf_po->enable_flag != TRUE) { + if (ue_pf_po->enable_flag != true) { continue; } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c index 6c9ffabd4f7..9836b643d41 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_fairRR.c @@ -69,7 +69,7 @@ int last_ulsch_ue_id_volte[MAX_NUM_CCs] = {-1}; uint16_t pre_nb_rbs_required[2][MAX_NUM_CCs][NUMBER_OF_UE_MAX]; uint8_t dlsch_ue_select_tbl_in_use; uint8_t new_dlsch_ue_select_tbl_in_use; - boolean_t pre_scd_activeUE[NUMBER_OF_UE_MAX]; + bool pre_scd_activeUE[NUMBER_OF_UE_MAX]; eNB_UE_STATS pre_scd_eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; #endif @@ -125,7 +125,7 @@ void pre_scd_nb_rbs_required( module_id_t module_idP, UE_info_t *UE_info = &RC.mac[module_idP]->UE_info; for (UE_id = 0; UE_id <NUMBER_OF_UE_MAX; UE_id++) { - if (pre_scd_activeUE[UE_id] != TRUE) + if (pre_scd_activeUE[UE_id] != true) continue; // store dlsch buffer @@ -210,7 +210,7 @@ void dlsch_scheduler_pre_ue_select_fairRR( DL_req = &eNB->DL_req[CC_id].dl_config_request_body; for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { - if (UE_info->active[UE_id] == FALSE) { + if (UE_info->active[UE_id] == false) { continue; } @@ -331,7 +331,7 @@ void dlsch_scheduler_pre_ue_select_fairRR( break; } - if (UE_info->active[UE_id] == FALSE) { + if (UE_info->active[UE_id] == false) { continue; } @@ -459,7 +459,7 @@ void dlsch_scheduler_pre_ue_select_fairRR( break; } - if (UE_info->active[UE_id] == FALSE) { + if (UE_info->active[UE_id] == false) { continue; } @@ -607,7 +607,7 @@ static void dlsch_scheduler_pre_processor_reset_fairRR( if (rnti == NOT_A_RNTI) continue; - if (UE_info->active[UE_id] != TRUE) + if (UE_info->active[UE_id] != true) continue; LOG_D(MAC, "Running preprocessor for UE %d (%x)\n", UE_id, rnti); @@ -755,7 +755,7 @@ static void assign_rbs_required_fairRR( // clear rb allocations across all CC_id for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { - if (UE_info->active[UE_id] != TRUE) + if (UE_info->active[UE_id] != true) continue; pCCid = UE_PCCID(Mod_id, UE_id); @@ -945,7 +945,7 @@ void dlsch_scheduler_pre_processor_fairRR (module_id_t Mod_id, min_rb_unit[CC_id] = get_min_rb_unit(Mod_id, CC_id); for (i = 0; i < NUMBER_OF_UE_MAX; i++) { - if (UE_info->active[i] != TRUE) + if (UE_info->active[i] != true) continue; UE_id = i; @@ -2241,7 +2241,7 @@ void ulsch_scheduler_pre_ue_select_fairRR( // UE round >0 for ( UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++ ) { - if (UE_info->active[UE_id] == FALSE) + if (UE_info->active[UE_id] == false) continue; rnti = UE_RNTI(module_idP,UE_id); @@ -2251,7 +2251,7 @@ void ulsch_scheduler_pre_ue_select_fairRR( CC_id = UE_PCCID(module_idP,UE_id); - if (UE_info->UE_template[CC_id][UE_id].configured == FALSE) + if (UE_info->UE_template[CC_id][UE_id].configured == false) continue; if (UE_info->UE_sched_ctrl[UE_id].ul_failure_timer > 0 @@ -2401,7 +2401,7 @@ void ulsch_scheduler_pre_ue_select_fairRR( } for ( UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++ ) { - if (UE_info->active[UE_id] == FALSE) + if (UE_info->active[UE_id] == false) continue; rnti = UE_RNTI(module_idP,UE_id); @@ -2414,7 +2414,7 @@ void ulsch_scheduler_pre_ue_select_fairRR( if (UE_id > last_ulsch_ue_id[CC_id]) continue; - if (UE_info->UE_template[CC_id][UE_id].configured == FALSE) + if (UE_info->UE_template[CC_id][UE_id].configured == false) continue; if (UE_info->UE_sched_ctrl[UE_id].ul_failure_timer > 0 diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index d53e0cadd3f..58abbd7a478 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -1989,7 +1989,7 @@ find_UE_id(module_id_t mod_idP, return -1; for (UE_id = 0; UE_id < MAX_MOBILES_PER_ENB; UE_id++) { - if (UE_info->active[UE_id] == TRUE) { + if (UE_info->active[UE_id] == true) { int CC_id = UE_PCCID(mod_idP, UE_id); if (CC_id>=0 && CC_id<NFAPI_CC_MAX && UE_info->UE_template[CC_id][UE_id].rnti == rntiP) { return UE_id; @@ -2063,7 +2063,7 @@ UE_RNTI(module_id_t mod_idP, } //------------------------------------------------------------------------------ -boolean_t +bool is_UE_active(module_id_t mod_idP, int ue_idP) //------------------------------------------------------------------------------ @@ -2187,20 +2187,20 @@ add_new_ue(module_id_t mod_idP, UE_info->num_UEs); for (i = 0; i < MAX_MOBILES_PER_ENB; i++) { - if (UE_info->active[i] == TRUE) + if (UE_info->active[i] == true) continue; UE_id = i; memset(&UE_info->UE_template[cc_idP][UE_id], 0, sizeof(UE_TEMPLATE)); UE_info->UE_template[cc_idP][UE_id].rnti = rntiP; - UE_info->UE_template[cc_idP][UE_id].configured = FALSE; + UE_info->UE_template[cc_idP][UE_id].configured = false; UE_info->numactiveCCs[UE_id] = 1; UE_info->numactiveULCCs[UE_id] = 1; UE_info->pCC_id[UE_id] = cc_idP; UE_info->ordered_CCids[0][UE_id] = cc_idP; UE_info->ordered_ULCCids[0][UE_id] = cc_idP; UE_info->num_UEs++; - UE_info->active[UE_id] = TRUE; + UE_info->active[UE_id] = true; add_ue_list(&UE_info->list, UE_id); dump_ue_list(&UE_info->list); pp_impl_param_t* dl = &RC.mac[mod_idP]->pre_processor_dl; @@ -2280,7 +2280,7 @@ rrc_mac_remove_ue(module_id_t mod_idP, UE_id, pCC_id, rntiP); - UE_info->active[UE_id] = FALSE; + UE_info->active[UE_id] = false; UE_info->num_UEs--; remove_ue_list(&UE_info->list, UE_id); @@ -2366,22 +2366,6 @@ rrc_mac_remove_ue(module_id_t mod_idP, return 0; } -//------------------------------------------------------------------------------ -/* - * Returns the previous UE_id in the scheduling list in UL or DL - */ -inline int prev(UE_list_t *listP, int nodeP) { - if (nodeP == listP->head) - return -1; /* there is no previous of the head */ - - for (int j = listP->head; j >= 0; j = listP->next[j]) - if (listP->next[j] == nodeP) - return j; - - LOG_E(MAC, "%s(): could not find previous to %d in UE_list\n", __func__, nodeP); - dump_ue_list(listP); - return -1; -} // This has to be updated to include BSR information //------------------------------------------------------------------------------ @@ -3488,7 +3472,7 @@ has_ul_grant(module_id_t module_idP, } //------------------------------------------------------------------------------ -boolean_t +bool CCE_allocation_infeasible(int module_idP, int CC_idP, int format_flag, @@ -3501,7 +3485,7 @@ CCE_allocation_infeasible(int module_idP, nfapi_dl_config_request_pdu_t *dl_config_pdu = &DL_req->dl_config_pdu_list[DL_req->number_pdu]; nfapi_hi_dci0_request_body_t *HI_DCI0_req = &RC.mac[module_idP]->HI_DCI0_req[CC_idP][subframe].hi_dci0_request_body; nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu = &HI_DCI0_req->hi_dci0_pdu_list[HI_DCI0_req->number_of_dci + HI_DCI0_req->number_of_hi]; - boolean_t res = TRUE; + bool res = true; if (format_flag != 2) { // DL DCI if (DL_req->number_pdu == MAX_NUM_DL_PDU) { @@ -3517,7 +3501,7 @@ CCE_allocation_infeasible(int module_idP, subframe, format_flag, rnti, aggregation); if (allocate_CCEs(module_idP, CC_idP, 0, subframe, 0) != -1) - res = FALSE; + res = false; DL_req->number_pdu--; } @@ -3532,7 +3516,7 @@ CCE_allocation_infeasible(int module_idP, HI_DCI0_req->number_of_dci++; if (allocate_CCEs(module_idP, CC_idP, 0, subframe, 0) != -1) - res = FALSE; + res = false; HI_DCI0_req->number_of_dci--; } @@ -5029,7 +5013,7 @@ SR_indication(module_id_t mod_idP, if (UE_id != -1) { UE_scheduling_ctrl = &(UE_info->UE_sched_ctrl[UE_id]); - if ((UE_scheduling_ctrl->cdrx_configured == TRUE) && + if ((UE_scheduling_ctrl->cdrx_configured == true) && (UE_scheduling_ctrl->dci0_ongoing_timer > 0) && (UE_scheduling_ctrl->dci0_ongoing_timer < 8)) { LOG_D(MAC, "[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d on CC_id %d. \ @@ -5052,7 +5036,7 @@ SR_indication(module_id_t mod_idP, } UE_info->UE_template[cc_idP][UE_id].ul_SR = 1; - UE_info->UE_template[cc_idP][UE_id].ul_active = TRUE; + UE_info->UE_template[cc_idP][UE_id].ul_active = true; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, 1); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, 0); } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index d4f486f7616..f9218d85116 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -242,7 +242,7 @@ rx_sdu(const module_id_t enb_mod_idP, } /* CDRX UL HARQ timers */ - if (UE_scheduling_control->cdrx_configured == TRUE) { + if (UE_scheduling_control->cdrx_configured == true) { /* Synchronous UL HARQ */ UE_scheduling_control->ul_synchronous_harq_timer[CC_idP][harq_pid] = 5; /* @@ -329,17 +329,7 @@ rx_sdu(const module_id_t enb_mod_idP, if (ra->msg3_round >= mac->common_channels[CC_idP].radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx - 1) { // Release RNTI of LTE PHY when RA does not succeed - UE_free_list_t *free_list = NULL; - pthread_mutex_lock(&lock_ue_freelist); - free_list = &mac->UE_free_list; - free_list->UE_free_ctrl[free_list->tail_freelist].rnti = current_rnti; - free_list->UE_free_ctrl[free_list->tail_freelist].removeContextFlg = 1; - free_list->UE_free_ctrl[free_list->tail_freelist].raFlag = 1; - free_list->num_UEs++; - mac->UE_release_req.ue_release_request_body.ue_release_request_TLVs_list[mac->UE_release_req.ue_release_request_body.number_of_TLVs].rnti = current_rnti; - mac->UE_release_req.ue_release_request_body.number_of_TLVs++; - free_list->tail_freelist = (free_list->tail_freelist + 1) % (NUMBER_OF_UE_MAX+1); - pthread_mutex_unlock(&lock_ue_freelist); + put_UE_in_freelist(enb_mod_idP, current_rnti, true); cancel_ra_proc(enb_mod_idP, CC_idP, frameP, current_rnti); nfapi_hi_dci0_request_t *hi_dci0_req = NULL; @@ -1003,7 +993,7 @@ rx_sdu(const module_id_t enb_mod_idP, /* CDRX UL HARQ timers */ if (UE_id != -1) { - if (UE_scheduling_control->cdrx_configured == TRUE) { + if (UE_scheduling_control->cdrx_configured == true) { /* Synchronous UL HARQ */ UE_scheduling_control->ul_synchronous_harq_timer[CC_idP][harq_pid] = 5; /* @@ -1447,7 +1437,7 @@ schedule_ulsch_rnti(module_id_t module_idP, continue; // don't schedule if Msg5 is not received yet - if (UE_info->UE_template[CC_id][UE_id].configured == FALSE) { + if (UE_info->UE_template[CC_id][UE_id].configured == false) { LOG_D(MAC, "[eNB %d] frame %d, subframe %d, UE %d: not configured, skipping " "UE scheduling \n", @@ -2033,7 +2023,7 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP, } /* Don't schedule if Msg4 is not received yet */ - if (UE_template->configured == FALSE) { + if (UE_template->configured == false) { LOG_D(MAC,"[eNB %d] frame %d subframe %d, UE %d: not configured, skipping UE scheduling \n", module_idP, frameP, diff --git a/openair2/LAYER2/MAC/mac.h b/openair2/LAYER2/MAC/mac.h index 6637d05a8af..1fd7182c6f9 100644 --- a/openair2/LAYER2/MAC/mac.h +++ b/openair2/LAYER2/MAC/mac.h @@ -811,9 +811,9 @@ typedef struct { /// TBS from last UL scheduling int TBS_UL[8]; /// Flag to indicate UL has been scheduled at least once - boolean_t ul_active; + bool ul_active; /// Flag to indicate UE has been configured (ACK from RRCConnectionSetup received) - boolean_t configured; + bool configured; /// MCS from last scheduling uint8_t mcs[8]; @@ -1026,16 +1026,16 @@ typedef struct { /* C-DRX related timers */ /* Note: only valid for FDD and LTE UE when this comment is written (11-01-19)*/ - /// is TRUE if the cqi mask feature is activated by RRC configuration - boolean_t cqi_mask_boolean; - /// is TRUE if the following drx parameters are configured for UE - boolean_t cdrx_configured; + /// is true if the cqi mask feature is activated by RRC configuration + bool cqi_mask_boolean; + /// is true if the following drx parameters are configured for UE + bool cdrx_configured; /* - * if TRUE, the eNB has configured the CDRX locally, but is waiting for the UE to acknowledge + * if true, the eNB has configured the CDRX locally, but is waiting for the UE to acknowledge * the activation. This is needed, during the RRC configuration process, when the context is * configured on the eNB side, but not yet on the UE side... */ - boolean_t cdrx_waiting_ack; + bool cdrx_waiting_ack; /* * Is set when a ULSCH scheduling is done and run until the first corresponding transmission is done (4 subframes). * When set, SR cannot be set for the UE. This allows OAI to avoid concidering a SR as uncompleted if the UE sends @@ -1043,16 +1043,16 @@ typedef struct { * create a lost in timers synchronization. */ uint8_t dci0_ongoing_timer; - /// is TRUE if the UE is in "Active Time", hence listening to PDCCH - boolean_t in_active_time; + /// is true if the UE is in "Active Time", hence listening to PDCCH + bool in_active_time; /// OnDurationTimer uint16_t on_duration_timer; uint16_t on_duration_timer_thres; /// drx-InactivityTimer uint16_t drx_inactivity_timer; uint16_t drx_inactivity_timer_thres; - /// is TRUE if UE is currently in short DRX cycle - boolean_t in_short_drx_cycle; + /// is true if UE is currently in short DRX cycle + bool in_short_drx_cycle; /// drxShortCycleTimer int (1..16) (number of short DRX cycles duration before long DRX cycles) uint8_t drx_shortCycle_timer_value; /// shortDRX-Cycle (duration of one short DRX cycle) @@ -1060,8 +1060,8 @@ typedef struct { /// DRX short cycle timer before switching to long DRX cycle = drx_shortCycle_timer_value * short_drx_cycle_duration uint16_t drx_shortCycle_timer; uint16_t drx_shortCycle_timer_thres; - /// is TRUE if UE is currently in long DRX cycle - boolean_t in_long_drx_cycle; + /// is true if UE is currently in long DRX cycle + bool in_long_drx_cycle; /// longDRX-CycleStartOffset (long DRX cycle timer) uint16_t drx_longCycle_timer; uint16_t drx_longCycle_timer_thres; @@ -1183,7 +1183,7 @@ typedef struct { UE_sched_ctrl_t UE_sched_ctrl[MAX_MOBILES_PER_ENB]; UE_list_t list; int num_UEs; - boolean_t active[MAX_MOBILES_PER_ENB]; + bool active[MAX_MOBILES_PER_ENB]; } UE_info_t; /*! \brief deleting control information*/ @@ -1191,18 +1191,10 @@ typedef struct { ///rnti of UE rnti_t rnti; ///remove UE context flag - boolean_t removeContextFlg; + bool removeContextFlg; ///remove RA flag - boolean_t raFlag; + bool raFlag; } UE_free_ctrl_t; -/*! \brief REMOVE UE list used by eNB to order UEs/CC for deleting*/ -typedef struct { - /// deleting control info - UE_free_ctrl_t UE_free_ctrl[NUMBER_OF_UE_MAX+1]; - int num_UEs; - int head_freelist; ///the head position of the delete list - int tail_freelist; ///the tail position of the delete list -} UE_free_list_t; /** * describes contiguous RBs @@ -1443,7 +1435,7 @@ typedef struct eNB_MAC_INST_s { /// processing time of eNB PCH scheduler time_stats_t schedule_pch; - UE_free_list_t UE_free_list; + UE_free_ctrl_t UE_free_ctrl[NUMBER_OF_UE_MAX+1]; /// for scheduling selection SCHEDULER_MODES scheduler_mode; /// Default scheduler: Pre-processor implementation. Algorithms for UL/DL diff --git a/openair2/LAYER2/MAC/mac_extern.h b/openair2/LAYER2/MAC/mac_extern.h index 522dc2721ff..212422898be 100644 --- a/openair2/LAYER2/MAC/mac_extern.h +++ b/openair2/LAYER2/MAC/mac_extern.h @@ -71,7 +71,7 @@ extern rb_id_t mbms_rab_id; extern uint16_t pre_nb_rbs_required[2][MAX_NUM_CCs][NUMBER_OF_UE_MAX]; extern uint8_t dlsch_ue_select_tbl_in_use; extern uint8_t new_dlsch_ue_select_tbl_in_use; -extern boolean_t pre_scd_activeUE[NUMBER_OF_UE_MAX]; +extern bool pre_scd_activeUE[NUMBER_OF_UE_MAX]; extern eNB_UE_STATS pre_scd_eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; #endif diff --git a/openair2/LAYER2/MAC/mac_proto.h b/openair2/LAYER2/MAC/mac_proto.h index b92ce85608f..889c727fdd5 100644 --- a/openair2/LAYER2/MAC/mac_proto.h +++ b/openair2/LAYER2/MAC/mac_proto.h @@ -400,7 +400,7 @@ int find_RA_id(module_id_t mod_idP, int CC_idP, rnti_t rntiP); rnti_t UE_RNTI(module_id_t module_idP, int UE_id); int UE_PCCID(module_id_t module_idP, int UE_id); uint8_t find_active_UEs(module_id_t module_idP); -boolean_t is_UE_active(module_id_t module_idP, int UE_id); +bool is_UE_active(module_id_t module_idP, int UE_id); uint8_t get_aggregation(uint8_t bw_index, uint8_t cqi, uint8_t dci_fmt); int8_t find_active_UEs_with_traffic(module_id_t module_idP); @@ -416,11 +416,11 @@ int get_nCCE_offset(int *CCE_table, int allocate_CCEs(int module_idP, int CC_idP, frame_t frameP, sub_frame_t subframeP, int test_only); -boolean_t CCE_allocation_infeasible(int module_idP, - int CC_idP, - int common_flag, - int subframe, - int aggregation, int rnti); +bool CCE_allocation_infeasible(int module_idP, + int CC_idP, + int common_flag, + int subframe, + int aggregation, int rnti); /* tries to allocate a CCE. If it succeeds, reserves NFAPI DCI and DLSCH config */ int CCE_try_allocate_dlsch(int module_id, int CC_id, @@ -741,13 +741,12 @@ BSR_SHORT *get_bsr_short(module_id_t module_idP, uint8_t bsr_len); */ BSR_LONG *get_bsr_long(module_id_t module_idP, uint8_t bsr_len); -/*! \fn boolean_t update_bsr(module_id_t module_idP, frame_t frameP,sub_frame_t subframeP) +/*! \fn bool update_bsr(module_id_t module_idP, frame_t frameP,sub_frame_t subframeP) \brief get the rlc stats and update the bsr level for each lcid \param[in] Mod_id instance of the UE \param[in] frame Frame index */ -boolean_t update_bsr(module_id_t module_idP, frame_t frameP, - sub_frame_t subframeP, eNB_index_t eNB_index); +bool update_bsr(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP, eNB_index_t eNB_index); /*! \fn locate_BsrIndexByBufferSize (int *table, int size, int value) \brief locate the BSR level in the table as defined in 36.321. This function requires that he values in table to be monotonic, either increasing or decreasing. The returned value is not less than 0, nor greater than n-1, where n is the size of table. diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index bb969668d6b..db4d51a92f8 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -638,7 +638,7 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id, LOG_E(MAC, "UE %d has RNTI NOT_A_RNTI!\n", UE_id); continue; } - if (UE_info->active[UE_id] != TRUE) { + if (UE_info->active[UE_id] != true) { LOG_E(MAC, "UE %d RNTI %x is NOT active!\n", UE_id, rnti); continue; } diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index 926c44381cb..d7796d1d404 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -2325,8 +2325,8 @@ ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP, uint8_t bsr_len = 0, bsr_ce_len = 0, bsr_header_len = 0; uint8_t phr_header_len = 0, phr_ce_len = 0, phr_len = 0; uint8_t lcid = 0, lcid_rlc_pdu_count = 0; - boolean_t is_lcid_processed = FALSE; - boolean_t is_all_lcid_processed = FALSE; + bool is_lcid_processed = false; + bool is_all_lcid_processed = false; uint16_t sdu_lengths[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; uint8_t sdu_lcids[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; uint8_t payload_offset = 0, num_sdus = 0; @@ -2444,11 +2444,11 @@ ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP, // Check for DCCH first // TO DO: Multiplex in the order defined by the logical channel prioritization for (lcid = DCCH; - (lcid < MAX_NUM_LCID) && (is_all_lcid_processed == FALSE); lcid++) { + (lcid < MAX_NUM_LCID) && (is_all_lcid_processed == false); lcid++) { if (UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] == LCID_NOT_EMPTY) { lcid_rlc_pdu_count = 0; - is_lcid_processed = FALSE; + is_lcid_processed = false; lcid_buffer_occupancy_old = mac_rlc_get_buffer_occupancy_ind(module_idP, UE_mac_inst[module_idP]. @@ -2536,8 +2536,8 @@ ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP, //No more remaining TBS after this PDU //exit the function rlc_pdu_header_len_last = 1; - is_lcid_processed = TRUE; - is_all_lcid_processed = TRUE; + is_lcid_processed = true; + is_all_lcid_processed = true; } else { rlc_pdu_header_len_last = (sdu_lengths[num_sdus] > 128) ? 3 : 2; @@ -2547,8 +2547,8 @@ ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP, (bsr_len + phr_len + total_rlc_pdu_header_len + rlc_pdu_header_len_last + sdu_length_total)) { rlc_pdu_header_len_last = 1; - is_lcid_processed = TRUE; - is_all_lcid_processed = TRUE; + is_lcid_processed = true; + is_all_lcid_processed = true; } } @@ -2559,7 +2559,7 @@ ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP, lcid_rlc_pdu_count++; } else { /* avoid infinite loop ... */ - is_lcid_processed = TRUE; + is_lcid_processed = true; } /* Get updated BO after multiplexing this PDU */ @@ -3164,7 +3164,7 @@ ue_scheduler(const module_id_t module_idP, } //Check whether Regular BSR is triggered - if (update_bsr(module_idP, txFrameP, txSubframeP, eNB_indexP) == TRUE) { + if (update_bsr(module_idP, txFrameP, txSubframeP, eNB_indexP) == true) { // call SR procedure to generate pending SR and BSR for next PUCCH/PUSCH TxOp. This should implement the procedures // outlined in Sections 5.4.4 an 5.4.5 of 36.321 UE_mac_inst[module_idP].scheduling_info.SR_pending = 1; @@ -3251,11 +3251,11 @@ ue_scheduler(const module_id_t module_idP, // to be improved -boolean_t +bool update_bsr(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP, eNB_index_t eNB_index) { mac_rlc_status_resp_t rlc_status; - boolean_t bsr_regular_triggered = FALSE; + bool bsr_regular_triggered = false; uint8_t lcid; uint8_t lcgid; uint8_t num_lcid_with_data = 0; // for LCID with data only if LCGID is defined @@ -3352,7 +3352,7 @@ update_bsr(module_id_t module_idP, frame_t frameP, (lcgid_buffer_remain [UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]] == 0)) { - bsr_regular_triggered = TRUE; + bsr_regular_triggered = true; LOG_D(MAC, "[UE %d] PDCCH Tick : MAC BSR Triggered LCID%d LCGID%d data become available at frame %d subframe %d\n", module_idP, lcid, @@ -3364,7 +3364,7 @@ update_bsr(module_id_t module_idP, frame_t frameP, // Trigger Regular BSR if ReTxBSR Timer has expired and UE has data for transmission if (UE_mac_inst[module_idP].scheduling_info.retxBSR_SF == 0) { - bsr_regular_triggered = TRUE; + bsr_regular_triggered = true; if ((UE_mac_inst[module_idP].BSR_reporting_active & BSR_TRIGGER_REGULAR) == 0) { diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c index c33946fa5ac..1acf23197c7 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_compute_tbs_common.c @@ -49,16 +49,15 @@ uint32_t nr_compute_tbs(uint16_t Qm, uint16_t nbp_re, nb_re; uint32_t nr_tbs=0; uint32_t Ninfo, Np_info, C; - uint8_t n, scale; + uint8_t n; LOG_D(NR_MAC, "In %s: nb_symb_sch %d, nb_dmrs_prb %d, nb_rb %d, nb_rb_oh %d, tb_scaling %d Nl %d\n", __FUNCTION__, nb_symb_sch, nb_dmrs_prb, nb_rb, nb_rb_oh, tb_scaling, Nl); nbp_re = NR_NB_SC_PER_RB * nb_symb_sch - nb_dmrs_prb - nb_rb_oh; nb_re = min(156, nbp_re) * nb_rb; - scale = (R>1024)?11:10; // Intermediate number of information bits - Ninfo = ((nb_re * R * Qm * Nl)>>scale)>>tb_scaling; - + // R is tabulated as 10 times the actual code rate + Ninfo = ((nb_re * R * Qm * Nl / 10)>>10)>>tb_scaling; if (Ninfo <=3824) { n = max(3, floor(log2(Ninfo)) - 6); @@ -73,7 +72,7 @@ uint32_t nr_compute_tbs(uint16_t Qm, n = log2(Ninfo-24)-5; Np_info = max(3840, (ROUNDIDIV((Ninfo-24),(1<<n)))<<n); - if (R <= 256) { + if (R <= 2560) { C = CEILIDIV((Np_info+24),3816); nr_tbs = (C<<3)*CEILIDIV((Np_info+24),(C<<3)) - 24; } else { @@ -92,12 +91,10 @@ uint32_t nr_compute_tbs(uint16_t Qm, } - //tbslbrm calculation according to 5.4.2.1 of 38.212 uint32_t nr_compute_tbslbrm(uint16_t table, uint16_t nb_rb, - uint8_t Nl) -{ + uint8_t Nl) { uint16_t R, nb_re; uint16_t nb_rb_lbrm=0; @@ -122,34 +119,31 @@ uint32_t nr_compute_tbslbrm(uint16_t table, Ninfo = (nb_re * R * Qm * Nl)>>10; if (Ninfo <=3824) { - n = max(3, floor(log2(Ninfo)) - 6); - Np_info = max(24, (Ninfo>>n)<<n); - for (int i=0; i<INDEX_MAX_TBS_TABLE; i++) { - if (Tbstable_nr[i] >= Np_info){ - nr_tbs = Tbstable_nr[i]; - break; - } - } + n = max(3, floor(log2(Ninfo)) - 6); + Np_info = max(24, (Ninfo>>n)<<n); + for (int i=0; i<INDEX_MAX_TBS_TABLE; i++) { + if (Tbstable_nr[i] >= Np_info){ + nr_tbs = Tbstable_nr[i]; + break; + } + } } else { - n = log2(Ninfo-24)-5; - Np_info = max(3840, (ROUNDIDIV((Ninfo-24),(1<<n)))<<n); - - if (R <= 256) { - C = CEILIDIV((Np_info+24),3816); - nr_tbs = (C<<3)*CEILIDIV((Np_info+24),(C<<3)) - 24; - } - else { - if (Np_info > 8424){ - C = CEILIDIV((Np_info+24),8424); - nr_tbs = (C<<3)*CEILIDIV((Np_info+24),(C<<3)) - 24; - } - else { - nr_tbs = ((CEILIDIV((Np_info+24),8))<<3) - 24; - } - - } + n = log2(Ninfo-24)-5; + Np_info = max(3840, (ROUNDIDIV((Ninfo-24),(1<<n)))<<n); + if (R <= 256) { + C = CEILIDIV((Np_info+24),3816); + nr_tbs = (C<<3)*CEILIDIV((Np_info+24),(C<<3)) - 24; + } + else { + if (Np_info > 8424){ + C = CEILIDIV((Np_info+24),8424); + nr_tbs = (C<<3)*CEILIDIV((Np_info+24),(C<<3)) - 24; + } + else + nr_tbs = ((CEILIDIV((Np_info+24),8))<<3) - 24; + } } return nr_tbs; } diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h index 9123afd3248..58e435f3f15 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h @@ -39,6 +39,7 @@ #include <stdbool.h> #include "NR_SubcarrierSpacing.h" +#include "NR_CSI-ReportConfig.h" #include "openair1/SCHED_NR_UE/harq_nr.h" #define NR_SHORT_BSR_TABLE_SIZE 32 @@ -63,6 +64,7 @@ #define CCCH_PAYLOAD_SIZE_MAX 512 #define RAR_PAYLOAD_SIZE_MAX 128 #define MAX_BWP_SIZE 275 +#define MAX_CSI_REPORTCONFIG 48 typedef enum frequency_range_e { FR1 = 0, @@ -512,5 +514,37 @@ typedef struct Type0_PDCCH_CSS_config_s { bool active; } NR_Type0_PDCCH_CSS_config_t; +typedef struct { + uint8_t nb_ssbri_cri; + uint8_t cri_ssbri_bitlen; + uint8_t rsrp_bitlen; + uint8_t diff_rsrp_bitlen; +} L1_RSRP_bitlen_t; + +typedef struct{ + uint8_t ri_restriction; + uint8_t cri_bitlen; + uint8_t ri_bitlen; + uint8_t li_bitlen[8]; + uint8_t pmi_x1_bitlen[8]; + uint8_t pmi_x2_bitlen[8]; + uint8_t cqi_bitlen[8]; +} CSI_Meas_bitlen_t; + +typedef struct nr_csi_report { + NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type; + long periodicity; + uint16_t offset; + long ** SSB_Index_list; + long ** CSI_Index_list; +// uint8_t nb_of_nzp_csi_report; + uint8_t nb_of_csi_ssb_report; + L1_RSRP_bitlen_t CSI_report_bitlen; + CSI_Meas_bitlen_t csi_meas_bitlen; + int codebook_mode; + int N1; + int N2; +} nr_csi_report_t; + #endif /*__LAYER2_MAC_H__ */ diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index 20002431b0a..e2a7efcaa05 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -33,6 +33,7 @@ #include "LAYER2/NR_MAC_gNB/mac_proto.h" #include "common/utils/nr/nr_common.h" #include <limits.h> +#include <executables/softmodem-common.h> #define reserved 0xffff @@ -1685,7 +1686,7 @@ int get_nr_prach_info_from_index(uint8_t index, } if ( (s_map>>subframe)&0x01 ) { *N_RA_slot = table_6_3_3_2_3_prachConfig_Index[index][6]; // Number of RACH slots within a subframe - if (mu == 1) { + if (mu == 1 && index >= 67) { if ( (*N_RA_slot <= 1) && (slot%2 == 0) ) return 0; // no prach in even slots @ 30kHz for 1 prach per subframe } @@ -2094,17 +2095,15 @@ void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu, uint16_t N_RE_prime = NR_NB_SC_PER_RB*N_sh_symb - N_PRB_DMRS*dmrs_length - N_PRB_oh; LOG_D(MAC, "N_RE_prime %d for %d symbols %d DMRS per PRB and %d overhead\n", N_RE_prime, N_sh_symb, N_PRB_DMRS, N_PRB_oh); - uint16_t R; uint32_t TBS=0; - uint8_t table_idx, Qm; /*uint8_t mcs_table = config.pdsch_config.mcs_table.value; uint8_t ss_type = params_rel15.search_space_type; uint8_t dci_format = params_rel15.dci_format; get_table_idx(mcs_table, dci_format, rnti_type, ss_type);*/ - table_idx = 0; - R = nr_get_code_rate_dl(Imcs, table_idx); - Qm = nr_get_Qm_dl(Imcs, table_idx); + uint8_t table_idx = 0; + uint16_t R = nr_get_code_rate_dl(Imcs, table_idx); + uint8_t Qm = nr_get_Qm_dl(Imcs, table_idx); TBS = nr_compute_tbs(Qm, R, @@ -2125,25 +2124,25 @@ void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu, TBS, N_PRB_DMRS, N_sh_symb, N_PRB_oh, R, Qm, table_idx,N_RE_prime*pdsch_rel15->rbSize*pdsch_rel15->NrOfCodewords ); } +// the following tables contain 10 times the value reported in 214 (in line with SCF specification and to avoid fractional values) //Table 5.1.3.1-1 of 38.214 -uint16_t Table_51311[29][2] = {{2,120},{2,157},{2,193},{2,251},{2,308},{2,379},{2,449},{2,526},{2,602},{2,679},{4,340},{4,378},{4,434},{4,490},{4,553},{4,616}, - {4,658},{6,438},{6,466},{6,517},{6,567},{6,616},{6,666},{6,719},{6,772},{6,822},{6,873}, {6,910}, {6,948}}; +uint16_t Table_51311[29][2] = {{2,1200},{2,1570},{2,1930},{2,2510},{2,3080},{2,3790},{2,4490},{2,5260},{2,6020},{2,6790},{4,3400},{4,3780},{4,4340},{4,4900},{4,5530},{4,6160}, + {4,6580},{6,4380},{6,4660},{6,5170},{6,5670},{6,6160},{6,6660},{6,7190},{6,7720},{6,8220},{6,8730}, {6,9100}, {6,9480}}; //Table 5.1.3.1-2 of 38.214 // Imcs values 20 and 26 have been multiplied by 2 to avoid the floating point -uint16_t Table_51312[28][2] = {{2,120},{2,193},{2,308},{2,449},{2,602},{4,378},{4,434},{4,490},{4,553},{4,616},{4,658},{6,466},{6,517},{6,567},{6,616},{6,666}, - {6,719},{6,772},{6,822},{6,873},{8,1365},{8,711},{8,754},{8,797},{8,841},{8,885},{8,1833},{8,948}}; +uint16_t Table_51312[28][2] = {{2,1200},{2,1930},{2,3080},{2,4490},{2,6020},{4,3780},{4,4340},{4,4900},{4,5530},{4,6160},{4,6580},{6,4660},{6,5170},{6,5670},{6,6160},{6,6660}, + {6,7190},{6,7720},{6,8220},{6,8730},{8,6825},{8,7110},{8,7540},{8,7970},{8,8410},{8,8850},{8,9165},{8,9480}}; //Table 5.1.3.1-3 of 38.214 -uint16_t Table_51313[29][2] = {{2,30},{2,40},{2,50},{2,64},{2,78},{2,99},{2,120},{2,157},{2,193},{2,251},{2,308},{2,379},{2,449},{2,526},{2,602},{4,340}, - {4,378},{4,434},{4,490},{4,553},{4,616},{6,438},{6,466},{6,517},{6,567},{6,616},{6,666}, {6,719}, {6,772}}; - -uint16_t Table_61411[28][2] = {{2,120},{2,157},{2,193},{2,251},{2,308},{2,379},{2,449},{2,526},{2,602},{2,679},{4,340},{4,378},{4,434},{4,490},{4,553},{4,616}, - {4,658},{6,466},{6,517},{6,567},{6,616},{6,666},{6,719},{6,772},{6,822},{6,873}, {6,910}, {6,948}}; +uint16_t Table_51313[29][2] = {{2,300},{2,400},{2,500},{2,640},{2,780},{2,990},{2,1200},{2,1570},{2,1930},{2,2510},{2,3080},{2,3790},{2,4490},{2,5260},{2,6020},{4,3400}, + {4,3780},{4,4340},{4,4900},{4,5530},{4,6160},{6,4380},{6,4660},{6,5170},{6,5670},{6,6160},{6,6660},{6,7190},{6,7720}}; -uint16_t Table_61412[28][2] = {{2,30},{2,40},{2,50},{2,64},{2,78},{2,99},{2,120},{2,157},{2,193},{2,251},{2,308},{2,379},{2,449},{2,526},{2,602},{2,679}, - {4,378},{4,434},{4,490},{4,553},{4,616},{4,658},{4,699},{4,772},{6,567},{6,616},{6,666}, {6,772}}; +uint16_t Table_61411[28][2] = {{2,1200},{2,1570},{2,1930},{2,2510},{2,3080},{2,3790},{2,4490},{2,5260},{2,6020},{2,6790},{4,3400},{4,3780},{4,4340},{4,4900},{4,5530},{4,6160}, + {4,6580},{6,4660},{6,5170},{6,5670},{6,6160},{6,6660},{6,7190},{6,7720},{6,8220},{6,8730},{6,9100},{6,9480}}; +uint16_t Table_61412[28][2] = {{2,300},{2,400},{2,500},{2,640},{2,780},{2,990},{2,1200},{2,1570},{2,1930},{2,2510},{2,3080},{2,3790},{2,4490},{2,5260},{2,6020},{2,6790}, + {4,3780},{4,4340},{4,4900},{4,5530},{4,6160},{4,6580},{4,6990},{4,7720},{6,5670},{6,6160},{6,6660},{6,7720}}; uint8_t nr_get_Qm_dl(uint8_t Imcs, uint8_t table_idx) { @@ -2590,6 +2589,30 @@ uint8_t get_transformPrecoding(const NR_BWP_UplinkCommon_t *initialUplinkBWP, return -1; } +uint8_t get_pusch_nb_antenna_ports(NR_PUSCH_Config_t *pusch_Config, + NR_SRS_Config_t *srs_config, + dci_field_t srs_resource_indicator) { + + uint8_t n_antenna_port = 1; + if (get_softmodem_params()->phy_test == 1) { + // temporary hack to allow UL-MIMO in phy-test mode without SRS + n_antenna_port = *pusch_Config->maxRank; + } + else { + if(srs_config != NULL && srs_resource_indicator.nbits > 0) { + for(int rs = 0; rs < srs_config->srs_ResourceSetToAddModList->list.count; rs++) { + NR_SRS_ResourceSet_t *srs_resource_set = srs_config->srs_ResourceSetToAddModList->list.array[rs]; + if(srs_resource_set->usage == NR_SRS_ResourceSet__usage_codebook) { + NR_SRS_Resource_t *srs_resource = srs_config->srs_ResourceToAddModList->list.array[srs_resource_indicator.val]; + AssertFatal(srs_resource != NULL,"SRS resource indicated by DCI does not exist\n"); + n_antenna_port = 1<<srs_resource->nrofSRS_Ports; + } + } + } + } + return n_antenna_port; +} + uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP, const NR_BWP_UplinkCommon_t *initialUplinkBWP, const NR_CellGroupConfig_t *cg, @@ -2598,23 +2621,23 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP, nr_rnti_type_t rnti_type, uint16_t N_RB, int bwp_id, + NR_ControlResourceSetId_t coreset_id, uint16_t cset0_bwp_size) { uint16_t size = 0; uint16_t numRBG = 0; long rbg_size_config; int num_entries = 0; - int pusch_antenna_ports = 1; // TODO hardcoded number of antenna ports for pusch const NR_BWP_DownlinkDedicated_t *bwpd = NULL; const NR_BWP_UplinkDedicated_t *ubwpd = NULL; const NR_BWP_DownlinkCommon_t *bwpc = NULL; const NR_BWP_UplinkCommon_t *ubwpc = NULL; - const NR_PDSCH_Config_t *pdsch_Config = NULL; - const NR_PUSCH_Config_t *pusch_Config = NULL; - const NR_PUCCH_Config_t *pucch_Config = NULL; - const NR_PDCCH_Config_t *pdcch_Config = NULL; - const NR_SRS_Config_t *srs_config = NULL; + NR_PDSCH_Config_t *pdsch_Config = NULL; + NR_PUSCH_Config_t *pusch_Config = NULL; + NR_PUCCH_Config_t *pucch_Config = NULL; + NR_PDCCH_Config_t *pdcch_Config = NULL; + NR_SRS_Config_t *srs_config = NULL; if(bwp_id > 0) { AssertFatal(cg!=NULL,"Cellgroup is null and bwp_id!=0"); bwpd=cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1]->bwp_Dedicated; @@ -2648,7 +2671,7 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP, /// fixed: Format identifier 1, Hop flag 1, MCS 5, NDI 1, RV 2, HARQ PID 4, PUSCH TPC 2 Time Domain assgnmt 4 --20 size += 20; size += (uint8_t)ceil( log2( (N_RB*(N_RB+1))>>1 ) ); // Freq domain assignment -- hopping scenario to be updated - int dci_10_size = nr_dci_size(initialDownlinkBWP,initialUplinkBWP,cg,dci_pdu,NR_DL_DCI_FORMAT_1_0, rnti_type, N_RB, bwp_id, cset0_bwp_size); + int dci_10_size = nr_dci_size(initialDownlinkBWP,initialUplinkBWP,cg,dci_pdu,NR_DL_DCI_FORMAT_1_0, rnti_type, N_RB, bwp_id, coreset_id, cset0_bwp_size); AssertFatal(dci_10_size >= size, "NR_UL_DCI_FORMAT_0_0 size is bigger than NR_DL_DCI_FORMAT_1_0! 3GPP TS 38.212 Section 7.3.1.0: DCI size alignment is not fully implemented"); size += dci_10_size - size; // Padding to match 1_0 size // UL/SUL indicator assumed to be 0 @@ -2773,6 +2796,9 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP, LOG_D(NR_MAC,"dci_pdu->srs_resource_indicator.nbits %d\n",dci_pdu->srs_resource_indicator.nbits); // Precoding info and number of layers long transformPrecoder = get_transformPrecoding(initialUplinkBWP, pusch_Config, ubwpd, (uint8_t*)&format, rnti_type, 0); + + uint8_t pusch_antenna_ports = get_pusch_nb_antenna_ports(pusch_Config, srs_config, dci_pdu->srs_resource_indicator); + dci_pdu->precoding_information.nbits=0; if (pusch_Config && pusch_Config->txConfig != NULL){ @@ -2992,10 +3018,15 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP, size += dci_pdu->antenna_ports.nbits; LOG_D(NR_MAC,"dci_pdu->antenna_ports.nbits %d\n",dci_pdu->antenna_ports.nbits); // Tx Config Indication - long *isTciEnable = pdcch_Config->controlResourceSetToAddModList->list.array[0]->tci_PresentInDCI; - if (isTciEnable != NULL) { - dci_pdu->transmission_configuration_indication.nbits = 3; - size += dci_pdu->transmission_configuration_indication.nbits; + for (int i = 0; i < pdcch_Config->controlResourceSetToAddModList->list.count; i++) { + if (pdcch_Config->controlResourceSetToAddModList->list.array[i]->controlResourceSetId == coreset_id) { + long *isTciEnable = pdcch_Config->controlResourceSetToAddModList->list.array[i]->tci_PresentInDCI; + if (isTciEnable != NULL) { + dci_pdu->transmission_configuration_indication.nbits = 3; + size += dci_pdu->transmission_configuration_indication.nbits; + } + break; + } } // SRS request if (cg->spCellConfig->spCellConfigDedicated->supplementaryUplink==NULL) @@ -3467,6 +3498,22 @@ void csi_period_offset(NR_CSI_ReportConfig_t *csirep, } } +uint32_t get_Y(NR_SearchSpace_t *ss, int slot, rnti_t rnti) { + + if(ss->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_common) + return 0; + + const int cid = *ss->controlResourceSetId%3; + const uint32_t A[3] = {39827, 39829, 39839}; + const uint32_t D = 65537; + uint32_t Y; + + Y = (A[cid] * rnti) % D; + for (int s = 0; s < slot; s++) + Y = (A[cid] * Y) % D; + + return Y; +} void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config, frame_t frameP, @@ -3907,25 +3954,17 @@ void fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *ty if(ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 == NULL) ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0)); - uint32_t duration,periodicity,offset; - uint16_t symbols,max_agg; - AssertFatal(type0_PDCCH_CSS_config!=NULL,"No type0 CSS configuration\n"); - max_agg = (type0_PDCCH_CSS_config->num_symbols*type0_PDCCH_CSS_config->num_rbs)/6; - - symbols = (1-(1<<type0_PDCCH_CSS_config->num_symbols))<<type0_PDCCH_CSS_config->first_symbol_index; - duration = type0_PDCCH_CSS_config->search_space_duration; - periodicity = type0_PDCCH_CSS_config->search_space_frame_period; - if (type0_PDCCH_CSS_config->type0_pdcch_ss_mux_pattern == 1) - offset = type0_PDCCH_CSS_config->n_0; - else - offset = type0_PDCCH_CSS_config->n_c; + const uint32_t periodicity = type0_PDCCH_CSS_config->search_space_frame_period; + const uint32_t offset = type0_PDCCH_CSS_config->type0_pdcch_ss_mux_pattern == 1 + ? type0_PDCCH_CSS_config->n_0 : type0_PDCCH_CSS_config->n_c; ss0->searchSpaceId = 0; *ss0->controlResourceSetId = 0; ss0->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*ss0->monitoringSlotPeriodicityAndOffset)); set_monitoring_periodicity_offset(ss0,periodicity,offset); + const uint32_t duration = type0_PDCCH_CSS_config->search_space_duration; if (duration==1) ss0->duration = NULL; else{ @@ -3933,6 +3972,7 @@ void fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *ty *ss0->duration = duration; } + const uint16_t symbols = SL_to_bitmap(type0_PDCCH_CSS_config->first_symbol_index, type0_PDCCH_CSS_config->num_symbols); ss0->monitoringSymbolsWithinSlot->size = 2; ss0->monitoringSymbolsWithinSlot->bits_unused = 2; ss0->monitoringSymbolsWithinSlot->buf[1] = 0; @@ -3942,6 +3982,7 @@ void fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *ty ss0->monitoringSymbolsWithinSlot->buf[0] |= ((symbols>>i)&0x01)<<(7-i); } + const uint16_t max_agg = (type0_PDCCH_CSS_config->num_symbols*type0_PDCCH_CSS_config->num_rbs)/6; // max values are set according to TS38.213 Section 10.1 Table 10.1-1 ss0->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0; ss0->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0; @@ -4087,6 +4128,25 @@ uint16_t compute_pucch_prb_size(uint8_t format, } } +int get_bw_tbslbrm(NR_BWP_t *genericParameters, + NR_CellGroupConfig_t *cg) { + + int bw = 0; + if (cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated && + cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList) { + struct NR_ServingCellConfig__downlinkBWP_ToAddModList *BWP_list = cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList; + for (int i=0; i<BWP_list->list.count; i++) { + genericParameters = &BWP_list->list.array[i]->bwp_Common->genericParameters; + int curr_bw = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE); + if (curr_bw > bw) + bw = curr_bw; + } + } + else + bw = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE); + return bw; +} + /* extract UL PTRS values from RRC and validate it based upon 38.214 6.2.3 */ bool set_ul_ptrs_values(NR_PTRS_UplinkConfig_t *ul_ptrs_config, uint16_t rbSize,uint8_t mcsIndex, uint8_t mcsTable, @@ -4161,3 +4221,521 @@ bool set_ul_ptrs_values(NR_PTRS_UplinkConfig_t *ul_ptrs_config, } return valid; } + +//! Calculating number of bits set +uint8_t number_of_bits_set(uint8_t buf) { + uint8_t nb_of_bits_set = 0; + uint8_t mask = 0xff; + uint8_t index = 0; + + for (index=7; (buf & mask) && (index>=0) ; index--){ + if (buf & (1<<index)) + nb_of_bits_set++; + + mask>>=1; + } + return nb_of_bits_set; +} + +void compute_rsrp_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, + uint8_t nb_resources, + nr_csi_report_t *csi_report) { + + if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled == csi_reportconfig->groupBasedBeamReporting.present) { + if (NULL != csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS) + csi_report->CSI_report_bitlen.nb_ssbri_cri = *(csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1; + else + /*! From Spec 38.331 + * nrofReportedRS + * The number (N) of measured RS resources to be reported per report setting in a non-group-based report. N <= N_max, where N_max is either 2 or 4 depending on UE + * capability. FFS: The signaling mechanism for the gNB to select a subset of N beams for the UE to measure and report. + * When the field is absent the UE applies the value 1 + */ + csi_report->CSI_report_bitlen.nb_ssbri_cri= 1; + } else + csi_report->CSI_report_bitlen.nb_ssbri_cri= 2; + + if (nb_resources) { + csi_report->CSI_report_bitlen.cri_ssbri_bitlen =ceil(log2 (nb_resources)); + csi_report->CSI_report_bitlen.rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP + csi_report->CSI_report_bitlen.diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP + } else { + csi_report->CSI_report_bitlen.cri_ssbri_bitlen =0; + csi_report->CSI_report_bitlen.rsrp_bitlen = 0; + csi_report->CSI_report_bitlen.diff_rsrp_bitlen =0; + } +} + +uint8_t compute_ri_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, + nr_csi_report_t *csi_report) { + + struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig; + uint8_t nb_allowed_ri, ri_bitlen; + uint8_t ri_restriction = 0; + + if (codebookConfig == NULL) { + csi_report->csi_meas_bitlen.ri_bitlen=0; + return ri_restriction; + } + + // codebook type1 single panel + if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==codebookConfig->codebookType.choice.type1->subType.present){ + struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel *type1single = codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel; + if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two){ + + ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0]; + + nb_allowed_ri = number_of_bits_set(ri_restriction); + ri_bitlen = ceil(log2(nb_allowed_ri)); + + ri_bitlen = ri_bitlen<1?ri_bitlen:1; //from the spec 38.212 and table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel + csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen; + } + if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo){ + if (type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present == + NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction) { + // 4 ports + + ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0]; + + nb_allowed_ri = number_of_bits_set(ri_restriction); + ri_bitlen = ceil(log2(nb_allowed_ri)); + + ri_bitlen = ri_bitlen<2?ri_bitlen:2; //from the spec 38.212 and table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel + csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen; + } + else { + // more than 4 ports + + ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0]; + + nb_allowed_ri = number_of_bits_set(ri_restriction); + ri_bitlen = ceil(log2(nb_allowed_ri)); + + csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen; + } + } + return ri_restriction; + } + else + AssertFatal(1==0,"Other configurations not yet implemented\n"); + return -1; +} + +void compute_li_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, + uint8_t ri_restriction, + nr_csi_report_t *csi_report) { + + struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig; + for(int i=0; i<8; i++) { + if (codebookConfig == NULL || ((ri_restriction>>i)&0x01) == 0) + csi_report->csi_meas_bitlen.li_bitlen[i]=0; + else { + // codebook type1 single panel + if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==codebookConfig->codebookType.choice.type1->subType.present) + csi_report->csi_meas_bitlen.li_bitlen[i]=ceil(log2(i+1))<2?ceil(log2(i+1)):2; + else + AssertFatal(1==0,"Other configurations not yet implemented\n"); + } + } +} + +void get_n1n2_o1o2_singlepanel(int *n1, int *n2, int *o1, int *o2, + struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo *morethantwo) { + + // Table 5.2.2.2.1-2 in 38.214 for supported configurations + switch(morethantwo->n1_n2.present){ + case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction): + *n1 = 2; + *n2 = 1; + *o1 = 4; + *o2 = 1; + break; + case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_two_TypeI_SinglePanel_Restriction): + *n1 = 2; + *n2 = 2; + *o1 = 4; + *o2 = 4; + break; + case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_one_TypeI_SinglePanel_Restriction): + *n1 = 4; + *n2 = 1; + *o1 = 4; + *o2 = 1; + break; + case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_three_two_TypeI_SinglePanel_Restriction): + *n1 = 3; + *n2 = 2; + *o1 = 4; + *o2 = 4; + break; + case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_one_TypeI_SinglePanel_Restriction): + *n1 = 6; + *n2 = 1; + *o1 = 4; + *o2 = 1; + break; + case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_two_TypeI_SinglePanel_Restriction): + *n1 = 4; + *n2 = 2; + *o1 = 4; + *o2 = 4; + break; + case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_one_TypeI_SinglePanel_Restriction): + *n1 = 8; + *n2 = 1; + *o1 = 4; + *o2 = 1; + break; + case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_three_TypeI_SinglePanel_Restriction): + *n1 = 4; + *n2 = 3; + *o1 = 4; + *o2 = 4; + break; + case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_two_TypeI_SinglePanel_Restriction): + *n1 = 4; + *n2 = 2; + *o1 = 4; + *o2 = 4; + break; + case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_twelve_one_TypeI_SinglePanel_Restriction): + *n1 = 12; + *n2 = 1; + *o1 = 4; + *o2 = 1; + break; + case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_four_TypeI_SinglePanel_Restriction): + *n1 = 4; + *n2 = 4; + *o1 = 4; + *o2 = 4; + break; + case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_two_TypeI_SinglePanel_Restriction): + *n1 = 8; + *n2 = 2; + *o1 = 4; + *o2 = 4; + break; + case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_sixteen_one_TypeI_SinglePanel_Restriction): + *n1 = 16; + *n2 = 1; + *o1 = 4; + *o2 = 1; + break; + default: + AssertFatal(1==0,"Not supported configuration for n1_n2 in codebook configuration"); + } +} + +void get_x1x2_bitlen_singlepanel(int n1, int n2, int o1, int o2, + int *x1, int *x2, int rank, int codebook_mode) { + + // Table 6.3.1.1.2-1 in 38.212 + switch(rank){ + case 1: + if(n2>1) { + if (codebook_mode == 1) { + *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); + *x2 = 2; + } + else { + *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2/2)); + *x2 = 4; + } + } + else{ + if (codebook_mode == 1) { + *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); + *x2 = 2; + } + else { + *x1 = ceil(log2(n1*o1/2)); + *x2 = 4; + } + } + break; + case 2: + if(n1*n2 == 2) { + if (codebook_mode == 1) { + *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); + *x2 = 1; + } + else { + *x1 = ceil(log2(n1*o1/2)); + *x2 = 3; + } + *x1 += 1; + } + else { + if(n2>1) { + if (codebook_mode == 1) { + *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); + *x2 = 3; + } + else { + *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2/2)); + *x2 = 3; + } + } + else{ + if (codebook_mode == 1) { + *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); + *x2 = 1; + } + else { + *x1 = ceil(log2(n1*o1/2)); + *x2 = 3; + } + } + *x1 += 2; + } + break; + case 3: + case 4: + if(n1*n2 == 2) { + *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); + *x2 = 1; + } + else { + if(n1*n2 >= 8) { + *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2)) + 2; + *x2 = 1; + } + else { + *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)) + 2; + *x2 = 1; + } + } + break; + case 5: + case 6: + *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); + *x2 = 1; + break; + case 7: + case 8: + if(n1 == 4 && n2 == 1) { + *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2)); + *x2 = 1; + } + else { + if(n1 > 2 && n2 == 2) { + *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2/2)); + *x2 = 1; + } + else { + *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); + *x2 = 1; + } + } + break; + default: + AssertFatal(1==0,"Invalid rank in x1 x2 bit length computation\n"); + } +} + + +void compute_pmi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, + uint8_t ri_restriction, + nr_csi_report_t *csi_report) { + + struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig; + for(int i=0; i<8; i++) { + csi_report->csi_meas_bitlen.pmi_x1_bitlen[i]=0; + csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=0; + if (codebookConfig == NULL || ((ri_restriction>>i)&0x01) == 0) + return; + else { + if(codebookConfig->codebookType.present == NR_CodebookConfig__codebookType_PR_type1) { + if(codebookConfig->codebookType.choice.type1->subType.present == NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel) { + if(codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present == + NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two) { + csi_report->N1 = 1; + csi_report->N2 = 1; + if (i==0) + csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=2; + if (i==1) + csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=1; + } + else { // more than two + int n1,n2,o1,o2,x1,x2; + get_n1n2_o1o2_singlepanel(&n1,&n2,&o1,&o2,codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo); + get_x1x2_bitlen_singlepanel(n1,n2,o1,o2,&x1,&x2,i+1,codebookConfig->codebookType.choice.type1->codebookMode); + csi_report->N1 = n1; + csi_report->N2 = n2; + csi_report->codebook_mode = codebookConfig->codebookType.choice.type1->codebookMode; + csi_report->csi_meas_bitlen.pmi_x1_bitlen[i]=x1; + csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=x2; + } + } + else + AssertFatal(1==0,"Type1 Multi-panel Codebook Config not yet implemented\n"); + } + else + AssertFatal(1==0,"Type2 Codebook Config not yet implemented\n"); + } + } +} + +void compute_cqi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, + uint8_t ri_restriction, + nr_csi_report_t *csi_report) { + + struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig; + struct NR_CSI_ReportConfig__reportFreqConfiguration *freq_config = csi_reportconfig->reportFreqConfiguration; + + if (*freq_config->cqi_FormatIndicator == NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI) { + for(int i=0; i<8; i++) { + if ((ri_restriction>>i)&0x01) { + csi_report->csi_meas_bitlen.cqi_bitlen[i] = 4; + if(codebookConfig != NULL) { + if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel == codebookConfig->codebookType.choice.type1->subType.present){ + struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel *type1single = codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel; + if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo) { + if (type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present > + NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction) { + // more than 4 antenna ports + if (i > 4) + csi_report->csi_meas_bitlen.cqi_bitlen[i] += 4; // CQI for second TB + } + } + } + } + } + else + csi_report->csi_meas_bitlen.cqi_bitlen[i] = 0; + } + } + else + AssertFatal(1==0,"Sub-band CQI reporting not yet supported"); +} + +//!TODO : same function can be written to handle csi_resources +void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report_t *csi_report_template) { + uint8_t csi_report_id = 0; + uint8_t nb_resources = 0; + NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type; + NR_CSI_ResourceConfigId_t csi_ResourceConfigId; + struct NR_CSI_ResourceConfig *csi_resourceconfig; + + // for each CSI measurement report configuration (list of CSI-ReportConfig) + LOG_D(NR_MAC,"Searching %d csi_reports\n",csi_MeasConfig->csi_ReportConfigToAddModList->list.count); + for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){ + struct NR_CSI_ReportConfig *csi_reportconfig = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]; + // MAC structure for CSI measurement reports (per UE and per report) + nr_csi_report_t *csi_report = &csi_report_template[csi_report_id]; + // csi-ResourceConfigId of a CSI-ResourceConfig included in the configuration + // (either CSI-RS or SSB) + csi_ResourceConfigId = csi_reportconfig->resourcesForChannelMeasurement; + // looking for CSI-ResourceConfig + int found_resource = 0; + int csi_resourceidx = 0; + while (found_resource == 0 && csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count) { + csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]; + if ( csi_resourceconfig->csi_ResourceConfigId == csi_ResourceConfigId) + found_resource = 1; + csi_resourceidx++; + } + AssertFatal(found_resource==1,"Not able to found any CSI-ResourceConfig with csi-ResourceConfigId %ld\n", + csi_ResourceConfigId); + + long resourceType = csi_resourceconfig->resourceType; + + reportQuantity_type = csi_reportconfig->reportQuantity.present; + csi_report->reportQuantity_type = reportQuantity_type; + + // setting the CSI or SSB index list + if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == csi_report->reportQuantity_type) { + for (int csi_idx = 0; csi_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_idx++) { + if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceSetId == + *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])){ + //We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig + nb_resources= csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceList.list.count; + csi_report->SSB_Index_list = csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceList.list.array; + csi_report->CSI_Index_list = NULL; + break; + } + } + } + else { + if (resourceType == NR_CSI_ResourceConfig__resourceType_periodic) { + AssertFatal(csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList != NULL, + "Wrong settings! Report quantity requires CSI-RS but csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList is NULL\n"); + for (int csi_idx = 0; csi_idx < csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.count; csi_idx++) { + if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_ResourceSetId == + *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) { + //For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1 for spec 38.212 + nb_resources = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_RS_Resources.list.count; + csi_report->CSI_Index_list = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_RS_Resources.list.array; + csi_report->SSB_Index_list = NULL; + break; + } + } + } + else AssertFatal(1==0,"Only periodic resource configuration currently supported\n"); + } + LOG_D(NR_MAC,"nb_resources %d\n",nb_resources); + // computation of bit length depending on the report type + switch(reportQuantity_type){ + case (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP): + compute_rsrp_bitlen(csi_reportconfig, nb_resources, csi_report); + break; + case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP): + compute_rsrp_bitlen(csi_reportconfig, nb_resources, csi_report); + break; + case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI): + csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources)); + csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report); + compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); + break; + case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI): + csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources)); + csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report); + compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); + compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); + break; + case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI): + csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources)); + csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report); + compute_li_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); + compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); + compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); + break; + default: + AssertFatal(1==0,"Not yet supported CSI report quantity type"); + } + } +} + +uint16_t nr_get_csi_bitlen(nr_csi_report_t *csi_report_template, uint8_t csi_report_id) { + + uint16_t csi_bitlen = 0; + uint16_t max_bitlen = 0; + L1_RSRP_bitlen_t *CSI_report_bitlen = NULL; + CSI_Meas_bitlen_t *csi_meas_bitlen = NULL; + + if (csi_report_template[csi_report_id].reportQuantity_type == NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP || + csi_report_template[csi_report_id].reportQuantity_type == NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP) { + CSI_report_bitlen = &(csi_report_template[csi_report_id].CSI_report_bitlen); // This might need to be moodif for Aperiodic CSI-RS measurements + csi_bitlen += ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) + + CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen * + (CSI_report_bitlen->nb_ssbri_cri -1 ))); + } else { + csi_meas_bitlen = &(csi_report_template[csi_report_id].csi_meas_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements + uint16_t temp_bitlen; + for (int i=0; i<8; i++) { + temp_bitlen = (csi_meas_bitlen->cri_bitlen+ + csi_meas_bitlen->ri_bitlen+ + csi_meas_bitlen->li_bitlen[i]+ + csi_meas_bitlen->cqi_bitlen[i]+ + csi_meas_bitlen->pmi_x1_bitlen[i]+ + csi_meas_bitlen->pmi_x2_bitlen[i]); + if(temp_bitlen>max_bitlen) + max_bitlen = temp_bitlen; + } + csi_bitlen += max_bitlen; + } + + return csi_bitlen; +} \ No newline at end of file diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h index e8a3af24981..2b8d3c66527 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h @@ -37,6 +37,8 @@ #include "nr_mac.h" #include "openair1/PHY/impl_defs_nr.h" +uint32_t get_Y(NR_SearchSpace_t *ss, int slot, rnti_t rnti); + uint64_t from_nrarfcn(int nr_bandP, uint8_t scs_index, uint32_t dl_nrarfcn); uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint8_t scs_index, uint32_t bw); @@ -55,6 +57,7 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDLBWP, nr_rnti_type_t rnti_type, uint16_t N_RB, int bwp_id, + NR_ControlResourceSetId_t coreset_id, uint16_t cset0_bwp_size); void find_aggregation_candidates(uint8_t *aggregation_level, @@ -102,7 +105,7 @@ uint8_t get_pusch_mcs_table(long *mcs_Table, uint8_t compute_nr_root_seq(NR_RACH_ConfigCommon_t *rach_config, uint8_t nb_preambles, uint8_t unpaired, - frequency_range_t); + frequency_range_t); int ul_ant_bits(NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig,long transformPrecoder); @@ -120,8 +123,32 @@ int32_t get_l_prime(uint8_t duration_in_symbols, uint8_t mapping_type, pusch_dmr uint8_t get_L_ptrs(uint8_t mcs1, uint8_t mcs2, uint8_t mcs3, uint8_t I_mcs, uint8_t mcs_table); uint8_t get_K_ptrs(uint16_t nrb0, uint16_t nrb1, uint16_t N_RB); +uint32_t nr_compute_tbs(uint16_t Qm, + uint16_t R, + uint16_t nb_rb, + uint16_t nb_symb_sch, + uint16_t nb_dmrs_prb, + uint16_t nb_rb_oh, + uint8_t tb_scaling, + uint8_t Nl); + +/** \brief Computes Q based on I_MCS PDSCH and table_idx for downlink. Implements MCS Tables from 38.214. */ +uint8_t nr_get_Qm_dl(uint8_t Imcs, uint8_t table_idx); +uint32_t nr_get_code_rate_dl(uint8_t Imcs, uint8_t table_idx); + +/** \brief Computes Q based on I_MCS PDSCH and table_idx for uplink. Implements MCS Tables from 38.214. */ +uint8_t nr_get_Qm_ul(uint8_t Imcs, uint8_t table_idx); +uint32_t nr_get_code_rate_ul(uint8_t Imcs, uint8_t table_idx); + uint16_t get_nr_srs_offset(NR_SRS_PeriodicityAndOffset_t periodicityAndOffset); +int get_bw_tbslbrm(NR_BWP_t *genericParameters, + NR_CellGroupConfig_t *cg); + +uint32_t nr_compute_tbslbrm(uint16_t table, + uint16_t nb_rb, + uint8_t Nl); + void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config, frame_t frameP, NR_MIB_t *mib, @@ -148,6 +175,10 @@ void get_info_from_tda_tables(int default_abc, void fill_coresetZero(NR_ControlResourceSet_t *coreset0, NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config); void fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config); +uint8_t get_pusch_nb_antenna_ports(NR_PUSCH_Config_t *pusch_Config, + NR_SRS_Config_t *srs_config, + dci_field_t srs_resource_indicator); + uint16_t compute_pucch_prb_size(uint8_t format, uint8_t nr_prbs, uint16_t O_tot, @@ -203,4 +234,36 @@ void nr_mac_gNB_rrc_ul_failure_reset(const module_id_t Mod_instP, const frame_t frameP, const sub_frame_t subframeP, const rnti_t rntiP); + +uint8_t number_of_bits_set(uint8_t buf); + +void compute_rsrp_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, + uint8_t nb_resources, + nr_csi_report_t *csi_report); + +uint8_t compute_ri_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, + nr_csi_report_t *csi_report); + +void compute_li_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, + uint8_t ri_restriction, + nr_csi_report_t *csi_report); + +void get_n1n2_o1o2_singlepanel(int *n1, int *n2, int *o1, int *o2, + struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo *morethantwo); + +void get_x1x2_bitlen_singlepanel(int n1, int n2, int o1, int o2, + int *x1, int *x2, int rank, int codebook_mode); + +void compute_pmi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, + uint8_t ri_restriction, + nr_csi_report_t *csi_report); + +void compute_cqi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, + uint8_t ri_restriction, + nr_csi_report_t *csi_report); + +void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report_t *csi_report_template); + +uint16_t nr_get_csi_bitlen(nr_csi_report_t *csi_report_template, uint8_t csi_report_id); + #endif diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h index 4b37c19dff2..7bbe8d68a75 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h @@ -74,7 +74,7 @@ extern uint8_t rb_table[34]; extern uint16_t pre_nb_rbs_required[2][MAX_NUM_CCs][NUMBER_OF_UE_MAX]; extern uint8_t dlsch_ue_select_tbl_in_use; extern uint8_t new_dlsch_ue_select_tbl_in_use; -extern boolean_t pre_scd_activeUE[NUMBER_OF_UE_MAX]; +extern bool pre_scd_activeUE[NUMBER_OF_UE_MAX]; extern eNB_UE_STATS pre_scd_eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; #endif*/ diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index bd693e4d888..2804a9ec1e6 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -190,7 +190,7 @@ void config_common_ue_sa(NR_UE_MAC_INST_t *mac, cfg->ssb_table.ssb_subcarrier_offset = mac->ssb_subcarrier_offset; if (mac->frequency_range == FR1){ - cfg->ssb_table.ssb_mask_list[0].ssb_mask = scc->ssb_PositionsInBurst.inOneGroup.buf[0]<<24; + cfg->ssb_table.ssb_mask_list[0].ssb_mask = ((uint32_t) scc->ssb_PositionsInBurst.inOneGroup.buf[0]) << 24; cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0; } else{ @@ -343,7 +343,9 @@ void config_common_ue(NR_UE_MAC_INST_t *mac, uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); cfg->ssb_table.ssb_offset_point_a = absolute_diff/(12*scs_scaling) - 10; cfg->ssb_table.ssb_period = *scc->ssb_periodicityServingCell; - cfg->ssb_table.ssb_subcarrier_offset = mac->ssb_subcarrier_offset; + + // NSA -> take ssb offset from SCS + cfg->ssb_table.ssb_subcarrier_offset = absolute_diff%(12*scs_scaling); switch (scc->ssb_PositionsInBurst->present) { case 1 : @@ -351,7 +353,7 @@ void config_common_ue(NR_UE_MAC_INST_t *mac, cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0; break; case 2 : - cfg->ssb_table.ssb_mask_list[0].ssb_mask = scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0]<<24; + cfg->ssb_table.ssb_mask_list[0].ssb_mask = ((uint32_t) scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0]) << 24; cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0; break; case 3 : @@ -434,19 +436,24 @@ void config_bwp_ue(NR_UE_MAC_INST_t *mac, uint16_t *bwp_ind, uint8_t *dci_format NR_ServingCellConfig_t *scd = mac->cg->spCellConfig->spCellConfigDedicated; - if (bwp_ind && dci_format){ + int n_ubwp = 0; + if (scd && scd->uplinkConfig && + scd->uplinkConfig->uplinkBWP_ToAddModList) + n_ubwp = scd->uplinkConfig->uplinkBWP_ToAddModList->list.count; + if (bwp_ind && dci_format){ switch(*dci_format){ case NR_UL_DCI_FORMAT_0_1: - mac->UL_BWP_Id = *bwp_ind; + mac->UL_BWP_Id = n_ubwp < 4 ? *bwp_ind : *bwp_ind + 1; break; case NR_DL_DCI_FORMAT_1_1: - mac->DL_BWP_Id = *bwp_ind; + mac->DL_BWP_Id = n_ubwp < 4 ? *bwp_ind : *bwp_ind + 1; break; default: LOG_E(MAC, "In %s: failed to configure BWP Id from DCI with format %d \n", __FUNCTION__, *dci_format); } - + // configure ss coreset after switching BWP + configure_ss_coreset(mac, scd, mac->DL_BWP_Id); } else { if (scd->firstActiveDownlinkBWP_Id) @@ -474,82 +481,96 @@ void config_bwp_ue(NR_UE_MAC_INST_t *mac, uint16_t *bwp_ind, uint8_t *dci_format */ void config_control_ue(NR_UE_MAC_INST_t *mac){ - uint8_t coreset_id = 1, ss_id; - NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id; - NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id; + int bwp_id; NR_ServingCellConfig_t *scd = mac->cg->spCellConfig->spCellConfigDedicated; - if (dl_bwp_id==0) AssertFatal(mac->scc_SIB,"dl_bwp_id 0 (DL %d,UL %d) means mac->scc_SIB should exist here!\n",(int)mac->DL_BWP_Id,(int)mac->UL_BWP_Id); - NR_BWP_DownlinkCommon_t *bwp_Common = dl_bwp_id>0 ? scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]->bwp_Common : - &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP; + config_bwp_ue(mac, NULL, NULL); + NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id; + // configure DLbwp + if (scd->downlinkBWP_ToAddModList) { + for (int i = 0; i < scd->downlinkBWP_ToAddModList->list.count; i++) { + bwp_id = scd->downlinkBWP_ToAddModList->list.array[i]->bwp_Id; + mac->DLbwp[bwp_id-1] = scd->downlinkBWP_ToAddModList->list.array[i]; + } + } - if (dl_bwp_id > 0 ) { - AssertFatal(scd->downlinkBWP_ToAddModList != NULL, "downlinkBWP_ToAddModList is null\n"); - AssertFatal(scd->downlinkBWP_ToAddModList->list.count == 1, "downlinkBWP_ToAddModList->list->count is %d\n", scd->downlinkBWP_ToAddModList->list.count); + // configure ULbwp + if (scd->uplinkConfig->uplinkBWP_ToAddModList) { + for (int i = 0; i < scd->uplinkConfig->uplinkBWP_ToAddModList->list.count; i++) { + bwp_id = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[i]->bwp_Id; + mac->ULbwp[bwp_id-1] = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[i]; + } } + + configure_ss_coreset(mac, scd, dl_bwp_id); +} + + +void configure_ss_coreset(NR_UE_MAC_INST_t *mac, + NR_ServingCellConfig_t *scd, + NR_BWP_Id_t dl_bwp_id) { + + NR_BWP_DownlinkCommon_t *bwp_Common = get_bwp_downlink_common(mac, dl_bwp_id); + AssertFatal(bwp_Common != NULL, "bwp_Common is null\n"); + + NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon; + AssertFatal(pdcch_ConfigCommon != NULL, "pdcch_ConfigCommon is null\n"); + + // configuring eventual common coreset + NR_ControlResourceSet_t *coreset = pdcch_ConfigCommon->choice.setup->commonControlResourceSet; + if (coreset) + mac->coreset[dl_bwp_id][coreset->controlResourceSetId - 1] = coreset; + NR_BWP_DownlinkDedicated_t *dl_bwp_Dedicated = dl_bwp_id>0 ? scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]->bwp_Dedicated: scd->initialDownlinkBWP; + AssertFatal(dl_bwp_Dedicated != NULL, "dl_bwp_Dedicated is null\n"); - config_bwp_ue(mac, NULL, NULL); NR_SetupRelease_PDCCH_Config_t *pdcch_Config = dl_bwp_Dedicated->pdcch_Config; AssertFatal(pdcch_Config != NULL, "pdcch_Config is null\n"); - NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon; - AssertFatal(pdcch_ConfigCommon != NULL, "pdcch_ConfigCommon is null\n"); - AssertFatal(pdcch_ConfigCommon->choice.setup->ra_SearchSpace != NULL, "ra_SearchSpace must be available in DL BWP\n"); - - struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = pdcch_ConfigCommon->choice.setup->commonSearchSpaceList; - AssertFatal(commonSearchSpaceList != NULL, "commonSearchSpaceList is null\n"); - AssertFatal(commonSearchSpaceList->list.count > 0, "PDCCH CSS list has 0 elements\n"); - struct NR_PDCCH_Config__controlResourceSetToAddModList *controlResourceSetToAddModList = pdcch_Config->choice.setup->controlResourceSetToAddModList; AssertFatal(controlResourceSetToAddModList != NULL, "controlResourceSetToAddModList is null\n"); - AssertFatal(controlResourceSetToAddModList->list.count == 1, "controlResourceSetToAddModList->list.count=%d\n", controlResourceSetToAddModList->list.count); - AssertFatal(controlResourceSetToAddModList->list.array[0] != NULL, "coreset[0][0] is null\n"); + + // configuring dedicated coreset + // In case network reconfigures control resource set with the same ControlResourceSetId as used for commonControlResourceSet configured via PDCCH-ConfigCommon, + // the configuration from PDCCH-Config always takes precedence + for (int i=0; i<controlResourceSetToAddModList->list.count; i++) { + coreset = controlResourceSetToAddModList->list.array[i]; + mac->coreset[dl_bwp_id][coreset->controlResourceSetId - 1] = coreset; + } struct NR_PDCCH_Config__searchSpacesToAddModList *searchSpacesToAddModList = pdcch_Config->choice.setup->searchSpacesToAddModList; AssertFatal(searchSpacesToAddModList != NULL, "searchSpacesToAddModList is null\n"); AssertFatal(searchSpacesToAddModList->list.count > 0, "list of UE specifically configured Search Spaces is empty\n"); - AssertFatal(searchSpacesToAddModList->list.count < FAPI_NR_MAX_SS, "too many searchpaces per coreset %d\n", searchSpacesToAddModList->list.count); - - struct NR_UplinkConfig__uplinkBWP_ToAddModList *uplinkBWP_ToAddModList = scd->uplinkConfig->uplinkBWP_ToAddModList; - if (ul_bwp_id > 0) { - AssertFatal(uplinkBWP_ToAddModList != NULL, "uplinkBWP_ToAddModList is null\n"); - AssertFatal(uplinkBWP_ToAddModList->list.count == 1, "uplinkBWP_ToAddModList->list->count is %d\n", uplinkBWP_ToAddModList->list.count); - } - // check pdcch_Config, pdcch_ConfigCommon and DL BWP - mac->DLbwp[0] = dl_bwp_id>0?scd->downlinkBWP_ToAddModList->list.array[dl_bwp_id - 1]:NULL; - mac->coreset[dl_bwp_id][coreset_id - 1] = controlResourceSetToAddModList->list.array[0]; - - // Check dedicated UL BWP and pass to MAC - mac->ULbwp[0] = ul_bwp_id>0?uplinkBWP_ToAddModList->list.array[0]:NULL; - if (mac->ULbwp[0]) AssertFatal(mac->ULbwp[0]->bwp_Dedicated != NULL, "UL bwp_Dedicated is null\n"); + AssertFatal(searchSpacesToAddModList->list.count < FAPI_NR_MAX_SS_PER_BWP, "too many searchpaces per coreset %d\n", searchSpacesToAddModList->list.count); // check available Search Spaces in the searchSpacesToAddModList and pass to MAC // note: the network configures at most 10 Search Spaces per BWP per cell (including UE-specific and common Search Spaces). - for (ss_id = 0; ss_id < searchSpacesToAddModList->list.count; ss_id++) { + for (int ss_id = 0; ss_id < searchSpacesToAddModList->list.count; ss_id++) { NR_SearchSpace_t *ss = searchSpacesToAddModList->list.array[ss_id]; AssertFatal(ss->controlResourceSetId != NULL, "ss->controlResourceSetId is null\n"); AssertFatal(ss->searchSpaceType != NULL, "ss->searchSpaceType is null\n"); - AssertFatal(*ss->controlResourceSetId == mac->coreset[dl_bwp_id][coreset_id - 1]->controlResourceSetId, "ss->controlResourceSetId is unknown\n"); AssertFatal(ss->monitoringSymbolsWithinSlot != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot is null\n"); AssertFatal(ss->monitoringSymbolsWithinSlot->buf != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot->buf is null\n"); - mac->SSpace[dl_bwp_id][ss_id] = ss; + AssertFatal(ss->searchSpaceId <= FAPI_NR_MAX_SS, "Invalid searchSpaceId\n"); + mac->SSpace[dl_bwp_id][ss->searchSpaceId - 1] = ss; } + struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = pdcch_ConfigCommon->choice.setup->commonSearchSpaceList; + AssertFatal(commonSearchSpaceList != NULL, "commonSearchSpaceList is null\n"); + AssertFatal(commonSearchSpaceList->list.count > 0, "PDCCH CSS list has 0 elements\n"); + // Check available CSSs in the commonSearchSpaceList (list of additional common search spaces) // note: commonSearchSpaceList SIZE(1..4) for (int css_id = 0; css_id < commonSearchSpaceList->list.count; css_id++) { NR_SearchSpace_t *css = commonSearchSpaceList->list.array[css_id]; AssertFatal(css->controlResourceSetId != NULL, "ss->controlResourceSetId is null\n"); - AssertFatal(*css->controlResourceSetId == 0 || *css->controlResourceSetId == mac->coreset[dl_bwp_id][coreset_id - 1]->controlResourceSetId, "css->controlResourceSetId %ld is unknown, mac->coreset[%ld][%d]->controlResourceSetId %ld\n",*css->controlResourceSetId,dl_bwp_id,coreset_id-1,mac->coreset[dl_bwp_id][coreset_id - 1]->controlResourceSetId); - AssertFatal(css->searchSpaceType != NULL, "css->searchSpaceType is null\n"); AssertFatal(css->monitoringSymbolsWithinSlot != NULL, "css->monitoringSymbolsWithinSlot is null\n"); AssertFatal(css->monitoringSymbolsWithinSlot->buf != NULL, "css->monitoringSymbolsWithinSlot->buf is null\n"); - mac->SSpace[dl_bwp_id][ss_id] = css; - ss_id++; + AssertFatal(css->searchSpaceId <= FAPI_NR_MAX_SS, "Invalid searchSpaceId\n"); + mac->SSpace[dl_bwp_id][css->searchSpaceId - 1] = css; } } @@ -559,7 +580,7 @@ int nr_rrc_mac_config_req_ue_logicalChannelBearer( int cc_idP, uint8_t gNB_index, long logicalChannelIdentity, - boolean_t status){ + bool status){ NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); mac->logicalChannelBearer_exist[logicalChannelIdentity] = status; return 0; diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index 99cbdf32927..35302eaafba 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -74,7 +74,7 @@ // ========== #define NB_NR_UE_MAC_INST 1 -#define MAX_NUM_BWP 2 +#define MAX_NUM_BWP_UE 4 #define NUM_SLOT_FRAME 10 /*!\brief value for indicating BSR Timer is not running */ @@ -364,10 +364,10 @@ typedef struct { NR_RNTI_Value_t *cs_RNTI; NR_MIB_t *mib; - NR_BWP_Downlink_t *DLbwp[MAX_NUM_BWP]; - NR_BWP_Uplink_t *ULbwp[MAX_NUM_BWP]; - NR_ControlResourceSet_t *coreset[MAX_NUM_BWP][FAPI_NR_MAX_CORESET_PER_BWP]; - NR_SearchSpace_t *SSpace[MAX_NUM_BWP][FAPI_NR_MAX_SS]; + NR_BWP_Downlink_t *DLbwp[MAX_NUM_BWP_UE]; + NR_BWP_Uplink_t *ULbwp[MAX_NUM_BWP_UE]; + NR_ControlResourceSet_t *coreset[MAX_NUM_BWP_UE][FAPI_NR_MAX_CORESET_PER_BWP]; + NR_SearchSpace_t *SSpace[MAX_NUM_BWP_UE][FAPI_NR_MAX_SS]; frame_type_t frame_type; @@ -399,6 +399,11 @@ typedef struct { /// measured SSB RSRP in dBm short ssb_rsrp_dBm; + nr_csi_report_t csi_report_template[MAX_CSI_REPORTCONFIG]; + + /// measurements from CSI-RS + fapi_nr_csirs_measurements_t csirs_measurements; + /// Last NDI of UL HARQ processes uint8_t UL_ndi[NR_MAX_HARQ_PROCESSES]; /// first ULTX of UL HARQ processes @@ -415,7 +420,7 @@ typedef struct { uint8_t BSR_reporting_active; /// LogicalChannelConfig has bearer. - boolean_t logicalChannelBearer_exist[NR_MAX_NUM_LCID]; + bool logicalChannelBearer_exist[NR_MAX_NUM_LCID]; NR_UE_SCHEDULING_INFO scheduling_info; /// PHR @@ -546,7 +551,7 @@ typedef struct prach_association_pattern { // SSB details typedef struct ssb_info { - boolean_t transmitted; // True if the SSB index is transmitted according to the SSB positions map configuration + bool transmitted; // True if the SSB index is transmitted according to the SSB positions map configuration prach_occasion_info_t *mapped_ro[MAX_NB_RO_PER_SSB_IN_ASSOCIATION_PATTERN]; // List of mapped RACH Occasions to this SSB index uint16_t nb_mapped_ro; // Total number of mapped ROs to this SSB index } ssb_info_t; @@ -558,7 +563,6 @@ typedef struct ssb_list_info { } ssb_list_info_t; void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id); -void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15); /*@}*/ #endif /*__LAYER2_MAC_DEFS_H__ */ diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h index 7ed99b92b51..161799fb667 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h @@ -85,14 +85,12 @@ int8_t nr_ue_decode_BCCH_DL_SCH(module_id_t module_id, \param cc_id component carrier id \param gNB_index gNB index \param long logicalChannelIdentity - \param boolean_t status*/ -int nr_rrc_mac_config_req_ue_logicalChannelBearer( - module_id_t module_id, - int cc_idP, - uint8_t gNB_index, - long logicalChannelIdentity, - boolean_t status -); + \param bool status*/ +int nr_rrc_mac_config_req_ue_logicalChannelBearer(module_id_t module_id, + int cc_idP, + uint8_t gNB_index, + long logicalChannelIdentity, + bool status); /**\brief primitive from RRC layer to MAC layer for configuration L1/L2, now supported 4 rrc messages: MIB, cell_group_config for MAC/PHY, spcell_config(serving cell config) \param module_id module id @@ -154,14 +152,14 @@ void fill_scheduled_response(nr_scheduled_response_t *scheduled_response, */ int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slotP); -/*! \fn boolean_t update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index) +/*! \fn bool update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index) \brief get the rlc stats and update the bsr level for each lcid \param[in] Mod_id instance of the UE \param[in] frameP Frame index \param[in] slot slotP number \param[in] uint8_t gNB_index */ -boolean_t nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index); +bool nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index); /*! \fn nr_locate_BsrIndexByBufferSize (int *table, int size, int value) \brief locate the BSR level in the table as defined in 38.321. This function requires that he values in table to be monotonic, either increasing or decreasing. The returned value is not less than 0, nor greater than n-1, where n is the size of table. @@ -196,6 +194,7 @@ int nr_get_sf_retxBSRTimer(uint8_t retxBSR_Timer); int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, frame_t frame, int slot, dci_pdu_rel15_t *dci, fapi_nr_dci_indication_pdu_t *dci_ind); int nr_ue_process_dci_indication_pdu(module_id_t module_id, int cc_id, int gNB_index, frame_t frame, int slot, fapi_nr_dci_indication_pdu_t *dci); +int8_t nr_ue_process_csirs_measurements(module_id_t module_id, frame_t frame, int slot, fapi_nr_csirs_measurements_t *csirs_measurements); uint32_t get_ssb_frame(uint32_t test); @@ -215,6 +214,18 @@ uint8_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac, NR_CSI_ResourceConfigId_t csi_ResourceConfigId, NR_CSI_MeasConfig_t *csi_MeasConfig); +uint8_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac, + PUCCH_sched_t *pucch, + struct NR_CSI_ReportConfig *csi_reportconfig, + NR_CSI_ResourceConfigId_t csi_ResourceConfigId, + NR_CSI_MeasConfig_t *csi_MeasConfig); + +uint8_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac, + PUCCH_sched_t *pucch, + struct NR_CSI_ReportConfig *csi_reportconfig, + NR_CSI_ResourceConfigId_t csi_ResourceConfigId, + NR_CSI_MeasConfig_t *csi_MeasConfig); + uint8_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac, PUCCH_sched_t *pucch, int csi_report_id, @@ -243,10 +254,7 @@ int nr_write_ce_ulsch_pdu(uint8_t *mac_ce, uint16_t *crnti, NR_BSR_SHORT *truncated_bsr, NR_BSR_SHORT *short_bsr, - NR_BSR_LONG *long_bsr - ); - -void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15); + NR_BSR_LONG *long_bsr); void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id); @@ -260,14 +268,9 @@ void get_bwp_info(NR_UE_MAC_INST_t *mac, NR_BWP_UplinkDedicated_t **ubwpd, NR_BWP_UplinkCommon_t **ubwpc); -uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac, - uint8_t dci_format, - uint8_t dci_length, - uint16_t rnti, - uint64_t *dci_pdu, - dci_pdu_rel15_t *nr_pdci_info_extracted); +NR_BWP_DownlinkCommon_t *get_bwp_downlink_common(NR_UE_MAC_INST_t *mac, NR_BWP_Id_t dl_bwp_id); -NR_PUSCH_TimeDomainResourceAllocationList_t *choose_ul_tda_list(NR_PUSCH_Config_t *pusch_Config,NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon); +NR_PUSCH_TimeDomainResourceAllocationList_t *choose_ul_tda_list(const NR_PUSCH_Config_t *pusch_Config,NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon); NR_PDSCH_TimeDomainResourceAllocationList_t *choose_dl_tda_list(NR_PDSCH_Config_t *pdsch_Config,NR_PDSCH_ConfigCommon_t *pdsch_ConfigCommon); int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac, @@ -446,12 +449,16 @@ int8_t nr_ue_process_dci_freq_dom_resource_assignment(nfapi_nr_ue_pusch_pdu_t *p uint16_t riv); void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id); -void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15); +void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, int slot, int rnti); void build_ssb_to_ro_map(NR_UE_MAC_INST_t *mac); void config_bwp_ue(NR_UE_MAC_INST_t *mac, uint16_t *bwp_ind, uint8_t *dci_format); +void configure_ss_coreset(NR_UE_MAC_INST_t *mac, + NR_ServingCellConfig_t *scd, + NR_BWP_Id_t dl_bwp_id); + fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int slot); void fill_ul_config(fapi_nr_ul_config_request_t *ul_config, frame_t frame_tx, int slot_tx, uint8_t pdu_type); diff --git a/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h b/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h old mode 100755 new mode 100644 index 8b3f00af43d..3bfeb29e2e0 --- a/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h +++ b/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h @@ -24,3 +24,4 @@ */ long nr_get_Pcmax(module_id_t mod_id); /** @}*/ + diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index 3851ee011d3..507cdb2661d 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -94,10 +94,12 @@ void init_RA(module_id_t mod_id, } } if (ss_id < 0) { - ra_ss = mac->DLbwp[0]->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace; - if (ra_ss) { - commonSearchSpaceList = mac->DLbwp[0]->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList; - ss_id = *mac->DLbwp[0]->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace; + if (mac->DL_BWP_Id>0) { + ra_ss = mac->DLbwp[mac->DL_BWP_Id-1]->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace; + if (ra_ss) { + commonSearchSpaceList = mac->DLbwp[mac->DL_BWP_Id-1]->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList; + ss_id = *mac->DLbwp[mac->DL_BWP_Id-1]->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace; + } } } } @@ -323,7 +325,7 @@ void ssb_rach_config(RA_config_t *ra, NR_PRACH_RESOURCES_t *prach_resources, NR_ // ======================================= NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR ssb_perRACH_config = nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present; - boolean_t multiple_ssb_per_ro; // true if more than one or exactly one SSB per RACH occasion, false if more than one RO per SSB + bool multiple_ssb_per_ro; // true if more than one or exactly one SSB per RACH occasion, false if more than one RO per SSB uint8_t ssb_rach_ratio; // Nb of SSBs per RACH or RACHs per SSB int total_preambles_per_ssb; uint8_t ssb_nb_in_ro; @@ -743,7 +745,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources, } else if (get_softmodem_params()->nsa) { - uint8_t mac_sdus[MAX_NR_ULSCH_PAYLOAD_BYTES]; + uint8_t mac_sdus[MAX_NUM_NR_ULSCH_SEGMENTS_PER_LAYER*1056]; uint16_t sdu_lengths[NB_RB_MAX] = {0}; int TBS_bytes = 848; int mac_ce_len = 0; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c index 0ee6f5501c1..9b618cdbfb4 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c @@ -49,7 +49,9 @@ //#define DEBUG_DCI -void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15) { +void fill_dci_search_candidates(NR_SearchSpace_t *ss, + fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, + int slot, int rnti) { LOG_D(NR_MAC,"Filling search candidates for DCI\n"); @@ -57,6 +59,9 @@ void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pd uint8_t number_of_candidates=0; rel15->number_of_candidates=0; int i=0; + uint32_t Y = 0; + if (slot >= 0) + Y = get_Y(ss, slot, rnti); for (int maxL=16;maxL>0;maxL>>=1) { find_aggregation_candidates(&aggregation, &number_of_candidates, @@ -65,8 +70,17 @@ void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pd if (number_of_candidates>0) { LOG_D(NR_MAC,"L %d, number of candidates %d, aggregation %d\n",maxL,number_of_candidates,aggregation); rel15->number_of_candidates += number_of_candidates; + int N_cce_sym = 0; // nb of rbs of coreset per symbol + for (int i=0;i<6;i++) { + for (int t=0;t<8;t++) { + N_cce_sym+=((rel15->coreset.frequency_domain_resource[i]>>t)&1); + } + } + int N_cces = N_cce_sym*rel15->coreset.duration; for (int j=0; j<number_of_candidates; i++,j++) { - rel15->CCE[i] = j*aggregation; + int first_cce = aggregation * (( Y + CEILIDIV((j*N_cces),(aggregation*number_of_candidates)) + 0 ) % CEILIDIV(N_cces,aggregation)); + LOG_D(NR_MAC,"Candidate %d of %d first_cce %d (L %d N_cces %d Y %d)\n", j, number_of_candidates, first_cce, aggregation, N_cces, Y); + rel15->CCE[i] = first_cce; rel15->L[i] = aggregation; } } @@ -80,7 +94,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t AssertFatal(mac->scc == NULL || mac->scc_SIB == NULL, "both scc and scc_SIB cannot be non-null\n"); - NR_BWP_Id_t bwp_id = mac->DL_BWP_Id; + NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id; NR_ServingCellConfigCommon_t *scc = mac->scc; NR_ServingCellConfigCommonSIB_t *scc_SIB = mac->scc_SIB; NR_BWP_DownlinkCommon_t *bwp_Common=NULL; @@ -91,7 +105,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t initialDownlinkBWP = scc!=NULL ? scc->downlinkConfigCommon->initialDownlinkBWP : &scc_SIB->downlinkConfigCommon.initialDownlinkBWP; initialUplinkBWP = scc!=NULL ? scc->uplinkConfigCommon->initialUplinkBWP : &scc_SIB->uplinkConfigCommon->initialUplinkBWP; } - bwp_Common = bwp_id>0 ? mac->DLbwp[bwp_id-1]->bwp_Common : NULL; + bwp_Common = dl_bwp_id>0 ? mac->DLbwp[dl_bwp_id-1]->bwp_Common : NULL; NR_SearchSpace_t *ss; NR_ControlResourceSet_t *coreset; @@ -102,7 +116,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t ss_id,mac->ra.ss->searchSpaceId); } else - ss = mac->SSpace[bwp_id][ss_id]; + ss = mac->SSpace[dl_bwp_id][ss_id-1]; } else ss = mac->search_space_zero; @@ -110,7 +124,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t uint8_t coreset_id = *ss->controlResourceSetId; if(coreset_id>0) { - coreset = mac->coreset[bwp_id][coreset_id - 1]; + coreset = mac->coreset[dl_bwp_id][coreset_id - 1]; rel15->coreset.CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG; } else { coreset = mac->coreset0; @@ -169,7 +183,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t rel15->SubcarrierSpacing = bwp_Common->genericParameters.subcarrierSpacing; } for (int i = 0; i < rel15->num_dci_options; i++) { - rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_C, rel15->BWPSize, bwp_id, mac->type0_PDCCH_CSS_config.num_rbs); + rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_C, rel15->BWPSize, dl_bwp_id, coreset_id, mac->type0_PDCCH_CSS_config.num_rbs); } break; case NR_RNTI_RA: @@ -185,7 +199,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t rel15->BWPStart = NRRIV2PRBOFFSET(bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); } rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing; - rel15->dci_length_options[0] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[0]], rel15->dci_format_options[0], NR_RNTI_RA, rel15->BWPSize, bwp_id, mac->type0_PDCCH_CSS_config.num_rbs); + rel15->dci_length_options[0] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[0]], rel15->dci_format_options[0], NR_RNTI_RA, rel15->BWPSize, dl_bwp_id, coreset_id, mac->type0_PDCCH_CSS_config.num_rbs); break; case NR_RNTI_P: break; @@ -200,7 +214,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t rel15->BWPStart = mac->type0_PDCCH_CSS_config.cset_start_rb; rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing; for (int i = 0; i < rel15->num_dci_options; i++) { - rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_TC, rel15->BWPSize, bwp_id, mac->type0_PDCCH_CSS_config.num_rbs); + rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_TC, rel15->BWPSize, dl_bwp_id, coreset_id, mac->type0_PDCCH_CSS_config.num_rbs); } break; case NR_RNTI_SP_CSI: @@ -223,7 +237,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t rel15->SubcarrierSpacing = mac->mib->subCarrierSpacingCommon + 2; for (int i = 0; i < rel15->num_dci_options; i++) { - rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_SI, rel15->BWPSize, 0, mac->type0_PDCCH_CSS_config.num_rbs); + rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_SI, rel15->BWPSize, 0, coreset_id, mac->type0_PDCCH_CSS_config.num_rbs); } break; case NR_RNTI_SFI: @@ -273,11 +287,17 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl LOG_D(NR_MAC, "[DCI_CONFIG] ra_rnti %p (%x) crnti %p (%x) t_crnti %p (%x)\n", &ra->ra_rnti, ra->ra_rnti, &mac->crnti, mac->crnti, &ra->t_crnti, ra->t_crnti); - // loop over all available SS for CORESET ID 1 + // loop over all available SS for bwp_id if (bwpd) { - for (ss_id = 0; ss_id < FAPI_NR_MAX_SS && mac->SSpace[bwp_id][ss_id] != NULL; ss_id++){ + for (ss_id = 1; ss_id <= FAPI_NR_MAX_SS; ss_id++){ + + if(mac->SSpace[bwp_id][ss_id-1]==NULL) { + continue; + } + LOG_D(NR_MAC, "[DCI_CONFIG] ss_id %d\n",ss_id); - NR_SearchSpace_t *ss = mac->SSpace[bwp_id][ss_id]; + NR_SearchSpace_t *ss = mac->SSpace[bwp_id][ss_id-1]; + AssertFatal(ss_id == ss->searchSpaceId,"SS IDs don't correspond\n"); fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15; NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon; struct NR_PhysicalCellGroupConfig *phy_cgc = mac->cg->physicalCellGroupConfig; @@ -285,15 +305,6 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl case NR_SearchSpace__searchSpaceType_PR_common: // this is for CSSs, we use BWP common and pdcch_ConfigCommon - // Fetch configuration for searchSpaceZero - // note: The search space with the SearchSpaceId = 0 identifies the search space configured via PBCH (MIB) and in ServingCellConfigCommon (searchSpaceZero). - if (pdcch_ConfigCommon->choice.setup->searchSpaceZero){ - if (pdcch_ConfigCommon->choice.setup->searchSpaceSIB1 == NULL){ - pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=calloc(1,sizeof(*pdcch_ConfigCommon->choice.setup->searchSpaceSIB1)); - } - *pdcch_ConfigCommon->choice.setup->searchSpaceSIB1 = 0; - LOG_D(NR_MAC, "[DCI_CONFIG] Configure SearchSpace#0 of the initial BWP\n"); - } if (ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0){ // check available SS IDs if (pdcch_ConfigCommon->choice.setup->ra_SearchSpace){ @@ -308,14 +319,14 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl } else { config_dci_pdu(mac, rel15, dl_config, NR_RNTI_RA, ss_id); } - fill_dci_search_candidates(ss, rel15); + fill_dci_search_candidates(ss, rel15, -1, -1); break; case WAIT_CONTENTION_RESOLUTION: LOG_D(NR_MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in Type1-PDCCH common random access search space (RA-Msg4)\n"); rel15->num_dci_options = 1; rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0; config_dci_pdu(mac, rel15, dl_config, NR_RNTI_TC, -1); - fill_dci_search_candidates(ss, rel15); + fill_dci_search_candidates(ss, rel15, -1, -1); break; default: break; @@ -387,7 +398,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_1; rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_1; config_dci_pdu(mac, rel15, dl_config, NR_RNTI_C, ss_id); - fill_dci_search_candidates(ss, rel15); + fill_dci_search_candidates(ss, rel15, slot, mac->crnti); //#ifdef DEBUG_DCI LOG_D(NR_MAC, "[DCI_CONFIG] ss %d ue_Specific %p searchSpaceType->present %d dci_Formats %d\n", @@ -423,35 +434,4 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl AssertFatal(1==0,"Handle DCI searching when CellGroup without dedicated BWP\n"); } - // Search space 0, CORESET ID 0 - - NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon; - - if (pdcch_ConfigCommon && - pdcch_ConfigCommon->choice.setup->searchSpaceSIB1 && - !get_softmodem_params()->nsa) { - - NR_SearchSpace_t *ss0 = mac->search_space_zero; - fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15; - - if (ss0->searchSpaceId == *pdcch_ConfigCommon->choice.setup->searchSpaceSIB1){ - if( (frame%2 == mac->type0_PDCCH_CSS_config.sfn_c) && (slot == mac->type0_PDCCH_CSS_config.n_0) ){ - rel15->num_dci_options = 1; - rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0; - config_dci_pdu(mac, rel15, dl_config, NR_RNTI_SI, -1); - fill_dci_search_candidates(ss0, rel15); - } - } - } - else if (!get_softmodem_params()->nsa) { // use coreset0/ss0 - NR_SearchSpace_t *ss0 = mac->search_space_zero; - if(ss0) { - fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[0].dci_config_pdu.dci_config_rel15; - rel15->num_dci_options = 1; - rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0; - config_dci_pdu(mac, rel15, dl_config, NR_RNTI_C , -1); - fill_dci_search_candidates(ss0, rel15); - dl_config->number_pdus = 1; - } - } } diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 8e9442d00c1..67df66b66da 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -134,6 +134,13 @@ const initial_pucch_resource_t initial_pucch_resource[16] = { }; +static uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac, + uint8_t dci_format, + uint8_t dci_length, + uint16_t rnti, + uint64_t *dci_pdu, + dci_pdu_rel15_t *nr_pdci_info_extracted); + void nr_ue_init_mac(module_id_t module_idP) { int i; @@ -191,32 +198,27 @@ void get_bwp_info(NR_UE_MAC_INST_t *mac, NR_BWP_UplinkDedicated_t **ubwpd, NR_BWP_UplinkCommon_t **ubwpc) { - if (dl_bwp_id > 0) { - AssertFatal(mac->DLbwp[dl_bwp_id-1]!=NULL,"mac->DLbwp[%d] is null, shouldn't be\n", - (int)dl_bwp_id-1); - *bwpd = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated; - if (mac->DLbwp[dl_bwp_id-1]->bwp_Common) *bwpc = mac->DLbwp[dl_bwp_id-1]->bwp_Common; - else if (mac->scc_SIB) *bwpc = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP; - else if (mac->scc) *bwpc = mac->scc->downlinkConfigCommon->initialDownlinkBWP; - AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n"); - } else { - if (mac->cg && - mac->cg->spCellConfig && - mac->cg->spCellConfig->spCellConfigDedicated && - mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP) - *bwpd = mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP; - if (mac->scc_SIB) *bwpc = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP; - else if (mac->scc) *bwpc = mac->scc->downlinkConfigCommon->initialDownlinkBWP; - AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n"); - } + if (dl_bwp_id > 0) { + AssertFatal(mac->DLbwp[dl_bwp_id-1]!=NULL,"mac->DLbwp[%d] is null, shouldn't be\n", (int)dl_bwp_id-1); + *bwpd = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated; + } else { + if (mac->cg && + mac->cg->spCellConfig && + mac->cg->spCellConfig->spCellConfigDedicated && + mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP) + *bwpd = mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP; + } + + *bwpc = get_bwp_downlink_common(mac, dl_bwp_id); + AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n"); if (ul_bwp_id > 0) { AssertFatal(mac->ULbwp[ul_bwp_id-1]!=NULL,"mac->ULbwp[%d] is null, shouldn't be\n", ul_bwp_id-1); *ubwpd = mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated; if (mac->ULbwp[ul_bwp_id-1]->bwp_Common) *ubwpc = mac->ULbwp[ul_bwp_id-1]->bwp_Common; - else if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP; else if (mac->scc) *ubwpc = mac->scc->uplinkConfigCommon->initialUplinkBWP; + else if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP; AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n"); } @@ -227,12 +229,24 @@ void get_bwp_info(NR_UE_MAC_INST_t *mac, mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) *ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP; - if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP; - else if (mac->scc) *ubwpc = mac->scc->uplinkConfigCommon->initialUplinkBWP; + if (mac->scc) *ubwpc = mac->scc->uplinkConfigCommon->initialUplinkBWP; + else if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP; AssertFatal(*ubwpc!=NULL,"ubwpc shouldn't be null\n"); } } +NR_BWP_DownlinkCommon_t *get_bwp_downlink_common(NR_UE_MAC_INST_t *mac, NR_BWP_Id_t dl_bwp_id) { + NR_BWP_DownlinkCommon_t *bwp_Common = NULL; + if (dl_bwp_id > 0 && mac->cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList) { + bwp_Common = mac->cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[dl_bwp_id-1]->bwp_Common; + } else if (mac->scc) { + bwp_Common = mac->scc->downlinkConfigCommon->initialDownlinkBWP; + } else if (mac->scc_SIB) { + bwp_Common = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP; + } + return bwp_Common; +} + NR_PDSCH_TimeDomainResourceAllocationList_t *choose_dl_tda_list(NR_PDSCH_Config_t *pdsch_Config,NR_PDSCH_ConfigCommon_t *pdsch_ConfigCommon) { NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList=NULL; @@ -246,7 +260,7 @@ NR_PDSCH_TimeDomainResourceAllocationList_t *choose_dl_tda_list(NR_PDSCH_Config_ return(pdsch_TimeDomainAllocationList); } -NR_PUSCH_TimeDomainResourceAllocationList_t *choose_ul_tda_list(NR_PUSCH_Config_t *pusch_Config,NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon) { +NR_PUSCH_TimeDomainResourceAllocationList_t *choose_ul_tda_list(const NR_PUSCH_Config_t *pusch_Config,NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon) { NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList=NULL; @@ -572,7 +586,7 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac, if(pusch_config_pdu != NULL){ if (pusch_TimeDomainAllocationList && use_default==false) { if (time_domain_ind >= pusch_TimeDomainAllocationList->list.count) { - LOG_E(MAC, "time_domain_ind %d >= pusch->TimeDomainAllocationList->list.count %d\n", + LOG_E(NR_MAC, "time_domain_ind %d >= pusch->TimeDomainAllocationList->list.count %d\n", time_domain_ind, pusch_TimeDomainAllocationList->list.count); pusch_config_pdu->start_symbol_index=0; pusch_config_pdu->nr_of_symbols=0; @@ -633,10 +647,13 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr RA_config_t *ra = &mac->ra; fapi_nr_dl_config_request_t *dl_config = &mac->dl_config_request; uint8_t is_Msg3 = 0; + NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id; + NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id; int default_abc = 1; uint16_t n_RB_DLBWP; - if (mac->DLbwp[0]) n_RB_DLBWP = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) n_RB_DLBWP = NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + else if (mac->scc) n_RB_DLBWP = NRRIV2BW(mac->scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); else if (mac->scc_SIB) n_RB_DLBWP = NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth,MAX_BWP_SIZE); else n_RB_DLBWP = mac->type0_PDCCH_CSS_config.num_rbs; @@ -806,7 +823,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.rnti = rnti; fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu_1_0 = &dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.dlsch_config_rel15; - NR_PDSCH_Config_t *pdsch_config= (mac->DLbwp[0]) ? mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup : NULL; + NR_PDSCH_Config_t *pdsch_config= (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) ? mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup : NULL; int is_common=0; if(rnti == SI_RNTI) { NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config = mac->type0_PDCCH_CSS_config; @@ -833,14 +850,19 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); } if (!get_softmodem_params()->sa) { // NSA mode is not using the Initial BWP - dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - pdsch_config = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup; + dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + pdsch_config = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup; } - } else if (mac->DLbwp[0]) { - dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - dlsch_config_pdu_1_0->SubcarrierSpacing = mac->DLbwp[0]->bwp_Common->genericParameters.subcarrierSpacing; - pdsch_config = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup; + } else if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) { + dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + dlsch_config_pdu_1_0->SubcarrierSpacing = mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing; + pdsch_config = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup; + } else if (mac->scc) { + dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + dlsch_config_pdu_1_0->SubcarrierSpacing = mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing; + pdsch_config = NULL; } else if (mac->scc_SIB) { dlsch_config_pdu_1_0->BWPSize = NRRIV2BW(mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE); dlsch_config_pdu_1_0->BWPStart = NRRIV2PRBOFFSET(mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE); @@ -858,13 +880,14 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = NULL; - if (mac->DLbwp[0] && - mac->DLbwp[0]->bwp_Dedicated && - mac->DLbwp[0]->bwp_Dedicated->pdsch_Config && - mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList) - pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList->choice.setup; - else if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList) - pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; + if (dl_bwp_id>0 && + mac->DLbwp[dl_bwp_id-1] && + mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated && + mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config && + mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList) + pdsch_TimeDomainAllocationList = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList->choice.setup; + else if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1] && mac->DLbwp[dl_bwp_id-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList) + pdsch_TimeDomainAllocationList = mac->DLbwp[dl_bwp_id-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; else if (mac->scc_SIB && mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup) pdsch_TimeDomainAllocationList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; @@ -881,10 +904,10 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr mappingtype = pdsch_TimeDomainAllocationList->list.array[dci->time_domain_assignment.val]->mappingType; struct NR_DMRS_DownlinkConfig *dl_dmrs_config = NULL; - if(mac->DLbwp[0]) + if(dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1] != NULL) dl_dmrs_config = (mappingtype == typeA) ? - mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup : - mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup; + mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup : + mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup; dlsch_config_pdu_1_0->nscid = 0; if(dl_dmrs_config && dl_dmrs_config->scramblingID0) @@ -897,7 +920,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr (get_softmodem_params()->nsa) ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position, dlsch_config_pdu_1_0->number_symbols, dlsch_config_pdu_1_0->start_symbol, - mappingtype, 1); + mappingtype, + 1); dlsch_config_pdu_1_0->dmrsConfigType = (dl_dmrs_config != NULL) ? (dl_dmrs_config->dmrs_Type == NULL ? 0 : 1) : 0; @@ -918,6 +942,36 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr LOG_W(MAC, "[%d.%d] MCS value %d out of bounds! Possibly due to false DCI. Ignoring DCI!\n", frame, slot, dlsch_config_pdu_1_0->mcs); return -1; } + + dlsch_config_pdu_1_0->qamModOrder = nr_get_Qm_dl(dlsch_config_pdu_1_0->mcs, dlsch_config_pdu_1_0->mcs_table); + int R = nr_get_code_rate_dl(dlsch_config_pdu_1_0->mcs, dlsch_config_pdu_1_0->mcs_table); + dlsch_config_pdu_1_0->targetCodeRate = R; + if (dlsch_config_pdu_1_0->targetCodeRate == 0 || dlsch_config_pdu_1_0->qamModOrder == 0) { + LOG_W(MAC, "Invalid code rate or Mod order, likely due to unexpected DL DCI.\n"); + return -1; + } + + int nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs + int nb_re_dmrs = ((dlsch_config_pdu_1_0->dmrsConfigType == NFAPI_NR_DMRS_TYPE1) ? 6:4)*dlsch_config_pdu_1_0->n_dmrs_cdm_groups; + dlsch_config_pdu_1_0->TBS = nr_compute_tbs(dlsch_config_pdu_1_0->qamModOrder, + R, + dlsch_config_pdu_1_0->number_rbs, + dlsch_config_pdu_1_0->number_symbols, + nb_re_dmrs*get_num_dmrs(dlsch_config_pdu_1_0->dlDmrsSymbPos), + nb_rb_oh, 0, 1); + + int bw_tbslbrm; + if (mac->scc || mac->scc_SIB || mac->cg) { + NR_BWP_t genericParameters = mac->scc ? mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters : + mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters; + bw_tbslbrm = get_bw_tbslbrm(&genericParameters, mac->cg); + } + else + bw_tbslbrm = dlsch_config_pdu_1_0->BWPSize; + dlsch_config_pdu_1_0->tbslbrm = nr_compute_tbslbrm(dlsch_config_pdu_1_0->mcs_table, + bw_tbslbrm, + 1); + /* NDI (only if CRC scrambled by C-RNTI or CS-RNTI or new-RNTI or TC-RNTI)*/ dlsch_config_pdu_1_0->ndi = dci->ndi; /* RV (only if CRC scrambled by C-RNTI or CS-RNTI or new-RNTI or TC-RNTI)*/ @@ -938,14 +992,15 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr if (dci->tpc == 3) dlsch_config_pdu_1_0->accumulated_delta_PUCCH = 3; // Sanity check for pucch_resource_indicator value received to check for false DCI. valid = 0; - if (mac->ULbwp[0] && - mac->ULbwp[0]->bwp_Dedicated && - mac->ULbwp[0]->bwp_Dedicated->pucch_Config && - mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup&& - mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList) { - pucch_res_set_cnt = mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.count; + if (ul_bwp_id > 0 && + mac->ULbwp[ul_bwp_id-1] && + mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated && + mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config && + mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup&& + mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList) { + pucch_res_set_cnt = mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.count; for (int id = 0; id < pucch_res_set_cnt; id++) { - if (dci->pucch_resource_indicator < mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) { + if (dci->pucch_resource_indicator < mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) { valid = 1; break; } @@ -1048,8 +1103,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr * 47 DMRS_SEQ_INI: */ - if (dci->bwp_indicator.val > 1) { - LOG_W(NR_MAC,"[%d.%d] bwp_indicator %d > 1 Possibly due to false DCI. Ignoring DCI!\n", frame, slot,dci->bwp_indicator.val); + if (dci->bwp_indicator.val > NR_MAX_NUM_BWP) { + LOG_W(NR_MAC,"[%d.%d] bwp_indicator %d > NR_MAX_NUM_BWP Possibly due to false DCI. Ignoring DCI!\n", frame, slot,dci->bwp_indicator.val); return -1; } config_bwp_ue(mac, &dci->bwp_indicator.val, &dci_format); @@ -1276,8 +1331,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr /* dmrs symbol positions*/ dlsch_config_pdu_1_1->dlDmrsSymbPos = fill_dmrs_mask(pdsch_Config, - mac->scc? mac->scc->dmrs_TypeA_Position:mac->mib->dmrs_TypeA_Position, - dlsch_config_pdu_1_1->number_symbols, + mac->scc? mac->scc->dmrs_TypeA_Position:mac->mib->dmrs_TypeA_Position, + dlsch_config_pdu_1_1->number_symbols, dlsch_config_pdu_1_1->start_symbol, mappingtype, dlsch_config_pdu_1_1->n_front_load_symb); @@ -1323,6 +1378,36 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr dl_config->number_pdus = dl_config->number_pdus + 1; /* TODO same calculation for MCS table as done in UL */ dlsch_config_pdu_1_1->mcs_table = (pdsch_Config->mcs_Table) ? (*pdsch_Config->mcs_Table + 1) : 0; + dlsch_config_pdu_1_1->qamModOrder = nr_get_Qm_dl(dlsch_config_pdu_1_1->mcs, dlsch_config_pdu_1_1->mcs_table); + int R = nr_get_code_rate_dl(dlsch_config_pdu_1_1->mcs, dlsch_config_pdu_1_1->mcs_table); + dlsch_config_pdu_1_1->targetCodeRate = R; + if (dlsch_config_pdu_1_1->targetCodeRate == 0 || dlsch_config_pdu_1_1->qamModOrder == 0) { + LOG_W(MAC, "Invalid code rate or Mod order, likely due to unexpected DL DCI.\n"); + return -1; + } + uint8_t Nl = 0; + for (int i = 0; i < 12; i++) { // max 12 ports + if ((dlsch_config_pdu_1_1->dmrs_ports>>i)&0x01) Nl += 1; + } + int nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs + int nb_re_dmrs = ((dmrs_type == NULL) ? 6:4)*dlsch_config_pdu_1_1->n_dmrs_cdm_groups; + dlsch_config_pdu_1_1->TBS = nr_compute_tbs(dlsch_config_pdu_1_1->qamModOrder, + R, + dlsch_config_pdu_1_1->number_rbs, + dlsch_config_pdu_1_1->number_symbols, + nb_re_dmrs*get_num_dmrs(dlsch_config_pdu_1_1->dlDmrsSymbPos), + nb_rb_oh, 0, Nl); + + // TBS_LBRM according to section 5.4.2.1 of 38.212 + long *maxMIMO_Layers = mac->cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers; + AssertFatal (maxMIMO_Layers != NULL,"Option with max MIMO layers not configured is not supported\n"); + int nl_tbslbrm = *maxMIMO_Layers < 4 ? *maxMIMO_Layers : 4; + NR_BWP_t genericParameters = mac->scc ? mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters : + mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters; + int bw_tbslbrm = get_bw_tbslbrm(&genericParameters, mac->cg); + dlsch_config_pdu_1_1->tbslbrm = nr_compute_tbslbrm(dlsch_config_pdu_1_1->mcs_table, + bw_tbslbrm, + nl_tbslbrm); /*PTRS configuration */ dlsch_config_pdu_1_1->pduBitmap = 0; if(pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS != NULL) { @@ -1377,6 +1462,16 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr } +int8_t nr_ue_process_csirs_measurements(module_id_t module_id, + frame_t frame, + int slot, + fapi_nr_csirs_measurements_t *csirs_measurements) { + LOG_D(NR_MAC,"(%d.%d) Received CSI-RS measurements\n", frame, slot); + NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); + memcpy(&mac->csirs_measurements, csirs_measurements, sizeof(*csirs_measurements)); + return 0; +} + void set_harq_status(NR_UE_MAC_INST_t *mac, uint8_t pucch_id, uint8_t harq_id, @@ -1435,13 +1530,12 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, NR_BWP_UplinkCommon_t *initialUplinkBWP; if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP; else initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP; - NR_BWP_Uplink_t *ubwp = mac->ULbwp[0]; - if (mac->cg && ubwp && + if (mac->cg && bwp_id > 1 && mac->ULbwp[bwp_id - 1] && mac->cg->spCellConfig && mac->cg->spCellConfig->spCellConfigDedicated && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) { - scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing; + scs = mac->ULbwp[bwp_id - 1]->bwp_Common->genericParameters.subcarrierSpacing; } else scs = initialUplinkBWP->genericParameters.subcarrierSpacing; @@ -1925,7 +2019,7 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, int uci_size) { * processing slots of reception/transmission * gNB_id identifier * -* RETURN : TRUE a valid resource has been found +* RETURN : true a valid resource has been found * * DESCRIPTION : return tx harq process identifier for given transmission slot * TS 38.213 9.2.1 PUCCH Resource Sets @@ -2055,7 +2149,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, int number_harq_feedback = 0; uint32_t dai_current = 0; uint32_t dai_max = 0; - bool two_transport_blocks = FALSE; + bool two_transport_blocks = false; int number_of_code_word = 1; int U_DAI_c = 0; int N_m_c_rx = 0; @@ -2077,7 +2171,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, bwpd->pdsch_Config->choice.setup && bwpd->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI && bwpd->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI[0] == 2) { - two_transport_blocks = TRUE; + two_transport_blocks = true; number_of_code_word = 2; } @@ -2177,7 +2271,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, * For a monitoring occasion of a PDCCH with DCI format 1_0 or DCI format 1_1 in at least one serving cell, * when a UE receives a PDSCH with one transport block and the value of higher layer parameter maxNrofCodeWordsScheduledByDCI is 2, * the HARQ-ACK response is associated with the first transport block and the UE generates a NACK for the second transport block - * if spatial bundling is not applied (HARQ-ACK-spatial-bundling-PUCCH = FALSE) and generates HARQ-ACK value of ACK for the second + * if spatial bundling is not applied (HARQ-ACK-spatial-bundling-PUCCH = false) and generates HARQ-ACK value of ACK for the second * transport block if spatial bundling is applied. */ @@ -2188,7 +2282,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, ack_data[code_word][i] = 0; /* nack data transport block which has been missed */ number_harq_feedback++; } - if (two_transport_blocks == TRUE) { + if (two_transport_blocks == true) { dai_total[code_word][i] = dai[code_word][i]; /* for a single cell, dai_total is the same as dai of first cell */ } } @@ -2219,7 +2313,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, o_ACK = o_ACK | (ack_data[1][m] << O_bit_number_cw1); } - if (two_transport_blocks == TRUE) { + if (two_transport_blocks == true) { O_bit_number_cw0 = (8 * j) + 2*(V_temp - 1); } else { @@ -2234,7 +2328,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, j = j + 1; } - if (two_transport_blocks == TRUE) { + if (two_transport_blocks == true) { O_ACK = 2 * ( 4 * j + V_temp2); /* for two transport blocks */ } else { @@ -2263,17 +2357,16 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac, NR_BWP_Id_t bwp_id = mac->UL_BWP_Id; NR_PUCCH_Config_t *pucch_Config = NULL; int scs; - NR_BWP_Uplink_t *ubwp = mac->ULbwp[0]; NR_BWP_UplinkCommon_t *initialUplinkBWP; if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP; else initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP; - if (mac->cg && ubwp && + if (mac->cg && bwp_id && mac->ULbwp[bwp_id - 1] && mac->cg->spCellConfig && mac->cg->spCellConfig->spCellConfigDedicated && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) { - scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing; + scs = mac->ULbwp[bwp_id - 1]->bwp_Common->genericParameters.subcarrierSpacing; } else scs = initialUplinkBWP->genericParameters.subcarrierSpacing; @@ -2356,11 +2449,9 @@ int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slot){ // start the sr-prohibittimer : rel 9 and above if (mac->scheduling_info.sr_ProhibitTimer > 0) { // timer configured mac->scheduling_info.sr_ProhibitTimer--; - mac->scheduling_info. - sr_ProhibitTimer_Running = 1; + mac->scheduling_info.sr_ProhibitTimer_Running = 1; } else { - mac->scheduling_info. - sr_ProhibitTimer_Running = 0; + mac->scheduling_info.sr_ProhibitTimer_Running = 0; } //mac->ul_active =1; return (1); //instruct phy to signal SR @@ -2408,7 +2499,7 @@ uint8_t nr_get_csi_measurements(NR_UE_MAC_INST_t *mac, csi_period_offset(csirep, NULL, &period, &offset); int scs; - NR_BWP_Uplink_t *ubwp = mac->ULbwp[0]; + NR_BWP_Uplink_t *ubwp = mac->ULbwp[bwp_id-1]; NR_BWP_UplinkCommon_t *initialUplinkBWP; if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP; else initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP; @@ -2483,13 +2574,18 @@ uint8_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac, case NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP: n_csi_bits = get_ssb_rsrp_payload(mac,pucch,csi_reportconfig,csi_ResourceConfigId,csi_MeasConfig); break; - case NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP: case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI: + n_csi_bits = get_csirs_RI_PMI_CQI_payload(mac,pucch,csi_reportconfig,csi_ResourceConfigId,csi_MeasConfig); + break; + case NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP: + n_csi_bits = get_csirs_RSRP_payload(mac,pucch,csi_reportconfig,csi_ResourceConfigId,csi_MeasConfig); + break; case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1: case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1_CQI: case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI: case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI: - AssertFatal(1==0,"Measurement report based on CSI-RS not availalble\n"); + LOG_E(NR_MAC,"Measurement report %d based on CSI-RS is not available\n", csi_reportconfig->reportQuantity.present); + break; default: AssertFatal(1==0,"Invalid CSI report quantity type %d\n",csi_reportconfig->reportQuantity.present); } @@ -2576,6 +2672,122 @@ uint8_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac, return bits; } +uint8_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac, + PUCCH_sched_t *pucch, + struct NR_CSI_ReportConfig *csi_reportconfig, + NR_CSI_ResourceConfigId_t csi_ResourceConfigId, + NR_CSI_MeasConfig_t *csi_MeasConfig) { + + int n_bits = 0; + uint32_t temp_payload = 0; + + for (int csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) { + + struct NR_CSI_ResourceConfig *csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]; + if (csi_resourceconfig->csi_ResourceConfigId == csi_ResourceConfigId) { + + for (int csi_idx = 0; csi_idx < csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.count; csi_idx++) { + if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_ResourceSetId == + *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) { + + nr_csi_report_t *csi_report = &mac->csi_report_template[csi_reportconfig->reportConfigId]; + compute_csi_bitlen(csi_MeasConfig, mac->csi_report_template); + n_bits = nr_get_csi_bitlen(mac->csi_report_template, csi_reportconfig->reportConfigId); + + int cri_bitlen = csi_report->csi_meas_bitlen.cri_bitlen; + int ri_bitlen = csi_report->csi_meas_bitlen.ri_bitlen; + int pmi_x1_bitlen = csi_report->csi_meas_bitlen.pmi_x1_bitlen[mac->csirs_measurements.rank_indicator]; + int pmi_x2_bitlen = csi_report->csi_meas_bitlen.pmi_x2_bitlen[mac->csirs_measurements.rank_indicator]; + int cqi_bitlen = csi_report->csi_meas_bitlen.cqi_bitlen[mac->csirs_measurements.rank_indicator]; + int padding_bitlen = n_bits - (cri_bitlen + ri_bitlen + pmi_x1_bitlen + pmi_x2_bitlen + cqi_bitlen); + + // TODO: Improvements will be needed to cri_bitlen>0 and pmi_x1_bitlen>0 + temp_payload = (mac->csirs_measurements.rank_indicator<<(cri_bitlen+cqi_bitlen+pmi_x2_bitlen+padding_bitlen+pmi_x1_bitlen)) | + (mac->csirs_measurements.i1<<(cri_bitlen+cqi_bitlen+pmi_x2_bitlen)) | + (mac->csirs_measurements.i2<<(cri_bitlen+cqi_bitlen)) | + (mac->csirs_measurements.cqi<<cri_bitlen) | + 0; + + reverse_n_bits((uint8_t *)&temp_payload, n_bits); + + LOG_D(NR_MAC, "cri_bitlen = %d\n", cri_bitlen); + LOG_D(NR_MAC, "ri_bitlen = %d\n", ri_bitlen); + LOG_D(NR_MAC, "pmi_x1_bitlen = %d\n", pmi_x1_bitlen); + LOG_D(NR_MAC, "pmi_x2_bitlen = %d\n", pmi_x2_bitlen); + LOG_D(NR_MAC, "cqi_bitlen = %d\n", cqi_bitlen); + LOG_D(NR_MAC, "csi_part1_payload = 0x%x\n", temp_payload); + + LOG_D(NR_MAC, "n_bits = %d\n", n_bits); + LOG_D(NR_MAC, "csi_part1_payload = 0x%x\n", temp_payload); + + break; + } + } + } + } + pucch->csi_part1_payload = temp_payload; + return n_bits; +} + +uint8_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac, + PUCCH_sched_t *pucch, + struct NR_CSI_ReportConfig *csi_reportconfig, + NR_CSI_ResourceConfigId_t csi_ResourceConfigId, + NR_CSI_MeasConfig_t *csi_MeasConfig) { + + int n_bits = 0; + uint32_t temp_payload = 0; + + for (int csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) { + + struct NR_CSI_ResourceConfig *csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]; + if (csi_resourceconfig->csi_ResourceConfigId == csi_ResourceConfigId) { + + for (int csi_idx = 0; csi_idx < csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.count; csi_idx++) { + if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_ResourceSetId == + *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) { + + nr_csi_report_t *csi_report = &mac->csi_report_template[csi_reportconfig->reportConfigId]; + compute_csi_bitlen(csi_MeasConfig, mac->csi_report_template); + n_bits = nr_get_csi_bitlen(mac->csi_report_template, csi_reportconfig->reportConfigId); + + int cri_ssbri_bitlen = csi_report->CSI_report_bitlen.cri_ssbri_bitlen; + int rsrp_bitlen = csi_report->CSI_report_bitlen.rsrp_bitlen; + int diff_rsrp_bitlen = csi_report->CSI_report_bitlen.diff_rsrp_bitlen; + + if (cri_ssbri_bitlen > 0) { + LOG_E(NR_MAC, "Implementation for cri_ssbri_bitlen>0 is not supported yet!\n");; + } + + // TODO: Improvements will be needed to cri_ssbri_bitlen>0 + // TS 38.133 - Table 10.1.6.1-1 + int rsrp_dBm = mac->csirs_measurements.rsrp_dBm; + if (rsrp_dBm < -140) { + temp_payload = 16; + } else if (rsrp_dBm > -44) { + temp_payload = 113; + } else { + temp_payload = mac->csirs_measurements.rsrp_dBm + 157; + } + + reverse_n_bits((uint8_t *)&temp_payload, n_bits); + + LOG_D(NR_MAC, "cri_ssbri_bitlen = %d\n", cri_ssbri_bitlen); + LOG_D(NR_MAC, "rsrp_bitlen = %d\n", rsrp_bitlen); + LOG_D(NR_MAC, "diff_rsrp_bitlen = %d\n", diff_rsrp_bitlen); + + LOG_D(NR_MAC, "n_bits = %d\n", n_bits); + LOG_D(NR_MAC, "csi_part1_payload = 0x%x\n", temp_payload); + + break; + } + } + } + } + + pucch->csi_part1_payload = temp_payload; + return n_bits; +} // returns index from RSRP // according to Table 10.1.6.1-1 in 38.133 @@ -2631,14 +2843,14 @@ void nr_ue_send_sdu(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *u int get_n_rb(NR_UE_MAC_INST_t *mac, int rnti_type){ int N_RB = 0, start_RB; + NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id; switch(rnti_type) { case NR_RNTI_RA: case NR_RNTI_TC: case NR_RNTI_P: { - NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id; if (mac->DLbwp[dl_bwp_id-1]->bwp_Common->pdcch_ConfigCommon->choice.setup->controlResourceSetZero) { uint8_t coreset_id = 0; // assuming controlResourceSetId is 0 for controlResourceSetZero - NR_ControlResourceSet_t *coreset = mac->coreset[dl_bwp_id-1][coreset_id]; + NR_ControlResourceSet_t *coreset = mac->coreset[dl_bwp_id][coreset_id]; get_coreset_rballoc(coreset->frequencyDomainResources.buf,&N_RB,&start_RB); } else { N_RB = NRRIV2BW(mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); @@ -2649,14 +2861,14 @@ int get_n_rb(NR_UE_MAC_INST_t *mac, int rnti_type){ N_RB = mac->type0_PDCCH_CSS_config.num_rbs; break; case NR_RNTI_C: - N_RB = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + N_RB = NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); break; } return N_RB; } -uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac, +static uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac, uint8_t dci_format, uint8_t dci_size, uint16_t rnti, @@ -2668,14 +2880,16 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac, int fsize = 0; int rnti_type = get_rnti_type(mac, rnti); + NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id ; + NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id ; int N_RB_UL = 0; - if(mac->scc_SIB) { - N_RB_UL = NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - } else if(mac->ULbwp[0]) { - N_RB_UL = NRRIV2BW(mac->ULbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + if(ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1]) { + N_RB_UL = NRRIV2BW(mac->ULbwp[ul_bwp_id - 1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); } else if(mac->scc) { N_RB_UL = NRRIV2BW(mac->scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + } else if(mac->scc_SIB) { + N_RB_UL = NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE); } LOG_D(MAC,"nr_extract_dci_info : dci_pdu %lx, size %d\n",*dci_pdu,dci_size); @@ -2739,7 +2953,7 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac, #endif // check BWP id - if (mac->DLbwp[0]) N_RB=NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) N_RB=NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); else N_RB=NRRIV2BW(mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE); // Freq domain assignment (275rb >> fsize = 16) @@ -2922,7 +3136,7 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac, case NR_RNTI_TC: // check BWP id - if (mac->DLbwp[0]) N_RB=NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) N_RB=NRRIV2BW(mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); else N_RB=mac->type0_PDCCH_CSS_config.num_rbs; @@ -3004,7 +3218,7 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac, break; case NR_UL_DCI_FORMAT_0_0: - if (mac->ULbwp[0]) N_RB_UL=NRRIV2BW(mac->ULbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + if (mac->ULbwp[ul_bwp_id-1]) N_RB_UL=NRRIV2BW(mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); else N_RB_UL=NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE); switch(rnti_type) @@ -3502,7 +3716,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info, #endif */ - LOG_I(NR_MAC, "[%d.%d] Received TA_COMMAND %u TAGID %u CC_id %d\n", frameP, slot, ul_time_alignment->ta_command, ul_time_alignment->tag_id, CC_id); + LOG_I(NR_MAC, "[%d.%d] Received TA_COMMAND %u TAGID %u CC_id %d\n", frameP, slot, ul_time_alignment->ta_command, ul_time_alignment->tag_id, CC_id); break; case DL_SCH_LCID_CON_RES_ID: diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 0afad893d75..8605550593e 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -44,6 +44,7 @@ /* MAC */ #include "NR_MAC_COMMON/nr_mac.h" +#include "NR_MAC_COMMON/nr_mac_common.h" #include "NR_MAC_UE/mac_proto.h" #include "NR_MAC_UE/mac_extern.h" @@ -114,18 +115,21 @@ void fill_scheduled_response(nr_scheduled_response_t *scheduled_response, */ long get_k2(NR_UE_MAC_INST_t *mac, uint8_t time_domain_ind) { long k2 = -1; + + NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id; // Get K2 from RRC configuration - NR_PUSCH_Config_t *pusch_config=mac->ULbwp[0] ? mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup : NULL; + NR_PUSCH_Config_t *pusch_config= ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ? mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup : NULL; NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL; if (pusch_config && pusch_config->pusch_TimeDomainAllocationList) { pusch_TimeDomainAllocationList = pusch_config->pusch_TimeDomainAllocationList->choice.setup; } - else if (mac->ULbwp[0] && - mac->ULbwp[0]->bwp_Common&& - mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon&& - mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup && - mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) { - pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList; + else if (ul_bwp_id > 0 && + mac->ULbwp[ul_bwp_id-1] && + mac->ULbwp[ul_bwp_id-1]->bwp_Common&& + mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon&& + mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup && + mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) { + pusch_TimeDomainAllocationList = mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList; } else if (mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) pusch_TimeDomainAllocationList=mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList; @@ -154,6 +158,7 @@ long get_k2(NR_UE_MAC_INST_t *mac, uint8_t time_domain_ind) { */ fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int slot) { + NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id; NR_TDD_UL_DL_ConfigCommon_t *tdd_config = mac->scc==NULL ? mac->scc_SIB->tdd_UL_DL_ConfigurationCommon : mac->scc->tdd_UL_DL_ConfigurationCommon; //Check if request to access ul_config is for a UL slot @@ -165,8 +170,8 @@ fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int sl // Calculate the index of the UL slot in mac->ul_config_request list. This is // based on the TDD pattern (slot configuration period) and number of UL+mixed // slots in the period. TS 38.213 Sec 11.1 - int mu = mac->ULbwp[0] ? - mac->ULbwp[0]->bwp_Common->genericParameters.subcarrierSpacing : + int mu = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ? + mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing : mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing; const int n = nr_slots_per_frame[mu]; const int num_slots_per_tdd = tdd_config ? (n >> (7 - tdd_config->pattern1.dl_UL_TransmissionPeriodicity)) : n; @@ -188,17 +193,21 @@ fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int sl void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) { NR_ServingCellConfigCommon_t *scc = mac->scc; + NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id; NR_BWP_UplinkDedicated_t *ubwpd=NULL; + NR_SRS_Config_t *srs_config = NULL; if (mac->cg && mac->cg->spCellConfig && mac->cg->spCellConfig->spCellConfigDedicated && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig && - mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) + mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) { ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP; + srs_config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup; + } - NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0] ? - mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup : + NR_PUSCH_Config_t *pusch_Config = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ? + mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup : (ubwpd? ubwpd->pusch_Config->choice.setup: NULL); @@ -212,7 +221,7 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con else transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled; } - + pusch_config_pdu->transform_precoding = transformPrecoder; /* PRECOD_NBR_LAYERS */ if ((*pusch_Config->txConfig == NR_PUSCH_Config__txConfig_nonCodebook)); @@ -220,11 +229,14 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con if ((*pusch_Config->txConfig == NR_PUSCH_Config__txConfig_codebook)){ - uint8_t n_antenna_port = 0; //FIXME!!! + // The UE shall transmit PUSCH using the same antenna port(s) as the SRS port(s) in the SRS resource indicated by the DCI format 0_1 + // 38.214 Section 6.1.1 + + uint8_t n_antenna_port = get_pusch_nb_antenna_ports(pusch_Config, srs_config, dci->srs_resource_indicator); if (n_antenna_port == 1); // 1 antenna port and the higher layer parameter txConfig = codebook 0 bits - if (n_antenna_port == 4){ // 4 antenna port and the higher layer parameter txConfig = codebook + if (n_antenna_port == 4) { // 4 antenna port and the higher layer parameter txConfig = codebook // Table 7.3.1.1.2-2: transformPrecoder=disabled and maxRank = 2 or 3 or 4 if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled) @@ -234,54 +246,54 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_fullyAndPartialAndNonCoherent) { pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][0]; - pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][1]; + pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][1]; } if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_partialAndNonCoherent){ pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][2]; - pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][3]; + pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][3]; } if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_nonCoherent){ pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][4]; - pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][5]; + pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][5]; } } // Table 7.3.1.1.2-3: transformPrecoder= enabled, or transformPrecoder=disabled and maxRank = 1 if (((transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled) || (transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled)) - && (*pusch_Config->maxRank == 1)){ + && (*pusch_Config->maxRank == 1)) { if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_fullyAndPartialAndNonCoherent) { pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][6]; - pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][7]; + pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][7]; } if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_partialAndNonCoherent){ pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][8]; - pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][9]; + pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][9]; } if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_nonCoherent){ pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][10]; - pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][11]; + pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][11]; } } } - if (n_antenna_port == 4){ // 2 antenna port and the higher layer parameter txConfig = codebook + if (n_antenna_port == 2) { + // 2 antenna port and the higher layer parameter txConfig = codebook // Table 7.3.1.1.2-4: transformPrecoder=disabled and maxRank = 2 - if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled) && (*pusch_Config->maxRank == 2)){ - + if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled) && (*pusch_Config->maxRank == 2)) { if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_fullyAndPartialAndNonCoherent) { pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][12]; - pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][13]; + pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][13]; } if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_nonCoherent){ pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][14]; - pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][15]; + pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][15]; } } @@ -289,16 +301,16 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con // Table 7.3.1.1.2-5: transformPrecoder= enabled, or transformPrecoder= disabled and maxRank = 1 if (((transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled) || (transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled)) - && (*pusch_Config->maxRank == 1)){ + && (*pusch_Config->maxRank == 1)) { if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_fullyAndPartialAndNonCoherent) { pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][16]; - pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][17]; + pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][17]; } if (*pusch_Config->codebookSubset == NR_PUSCH_Config__codebookSubset_nonCoherent){ pusch_config_pdu->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][18]; - pusch_config_pdu->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][19]; + pusch_config_pdu->Tpmi = table_7_3_1_1_2_2_3_4_5[dci->precoding_information.val][19]; } } @@ -307,9 +319,9 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con /*-------------------- Changed to enable Transform precoding in RF SIM------------------------------------------------*/ - /*if (pusch_config_pdu->transform_precoding == transform_precoder_enabled) { + /*if (pusch_config_pdu->transformPrecoder == transformPrecoder_enabled) { - pusch_config_dedicated->transform_precoder = transform_precoder_enabled; + pusch_config_dedicated->transform_precoder = transformPrecoder_enabled; if(pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA != NULL) { @@ -331,15 +343,15 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con } } else - pusch_config_dedicated->transform_precoder = transform_precoder_disabled;*/ + pusch_config_dedicated->transformPrecoder = ttransformPrecoder_disabled;*/ } // todo: this function shall be reviewed completely because of the many comments left by the author -void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) { +void ul_ports_config(NR_UE_MAC_INST_t *mac, int *n_front_load_symb, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) { - /* ANTENNA_PORTS */ - uint8_t rank = 1; // We need to initialize rank FIXME!!! + uint8_t rank = pusch_config_pdu->nrOfLayers; + NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id; NR_ServingCellConfigCommon_t *scc = mac->scc; NR_BWP_UplinkDedicated_t *ubwpd=NULL; @@ -350,7 +362,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP; - NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0] ? mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup : (ubwpd?ubwpd->pusch_Config->choice.setup:NULL); + NR_PUSCH_Config_t *pusch_Config = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ? mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup : (ubwpd?ubwpd->pusch_Config->choice.setup:NULL); AssertFatal(pusch_Config!=NULL,"pusch_Config shouldn't be null\n"); long transformPrecoder; @@ -375,51 +387,44 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf dmrs_type = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->dmrs_Type; } - LOG_D(NR_MAC,"MappingType%s max_length %s, dmrs_type %s, antenna_ports %d\n",pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA?"A":"B",max_length?"len2":"len1",dmrs_type?"type2":"type1",dci->antenna_ports.val); + LOG_D(NR_MAC,"MappingType%s max_length %s, dmrs_type %s, antenna_ports %d\n", + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA?"A":"B",max_length?"len2":"len1",dmrs_type?"type2":"type1",dci->antenna_ports.val); + if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled) && - (dmrs_type == NULL) && (max_length == NULL)) { // tables 7.3.1.1.2-6 - pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; //TBC - pusch_config_pdu->dmrs_ports = dci->antenna_ports.val; //TBC + (dmrs_type == NULL) && (max_length == NULL)) { // tables 7.3.1.1.2-6 + pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; + pusch_config_pdu->dmrs_ports = 1<<dci->antenna_ports.val; } if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled) && - (dmrs_type == NULL) && (max_length != NULL)) { // tables 7.3.1.1.2-7 + (dmrs_type == NULL) && (max_length != NULL)) { // tables 7.3.1.1.2-7 pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; //TBC - pusch_config_pdu->dmrs_ports = (dci->antenna_ports.val > 3)?(dci->antenna_ports.val-4):(dci->antenna_ports.val); //TBC - //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports > 3)?2:1; //FIXME + pusch_config_pdu->dmrs_ports = 1<<((dci->antenna_ports.val > 3)?(dci->antenna_ports.val-4):(dci->antenna_ports.val)); + *n_front_load_symb = (dci->antenna_ports.val > 3)?2:1; } if ((transformPrecoder == NR_PUSCH_Config__transformPrecoder_disabled) && (dmrs_type == NULL) && (max_length == NULL)) { // tables 7.3.1.1.2-8/9/10/11 if (rank == 1) { - pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 1)?2:1; //TBC - pusch_config_pdu->dmrs_ports = (dci->antenna_ports.val > 1)?(dci->antenna_ports.val-2):(dci->antenna_ports.val); //TBC + pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 1)?2:1; + pusch_config_pdu->dmrs_ports =1<<((dci->antenna_ports.val > 1)?(dci->antenna_ports.val-2):(dci->antenna_ports.val)); } if (rank == 2){ - pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 0)?2:1; //TBC - pusch_config_pdu->dmrs_ports = 0; //FIXME - //pusch_config_pdu->dmrs_ports[0] = (dci->antenna_ports > 1)?(dci->antenna_ports > 2 ?0:2):0; - //pusch_config_pdu->dmrs_ports[1] = (dci->antenna_ports > 1)?(dci->antenna_ports > 2 ?2:3):1; + pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 0)?2:1; + pusch_config_pdu->dmrs_ports = (dci->antenna_ports.val > 1)?((dci->antenna_ports.val> 2)?0x5:0xc):0x3; } if (rank == 3){ - pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; //TBC - pusch_config_pdu->dmrs_ports = 0; //FIXME - //pusch_config_pdu->dmrs_ports[0] = 0; - //pusch_config_pdu->dmrs_ports[1] = 1; - //pusch_config_pdu->dmrs_ports[2] = 2; + pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; + pusch_config_pdu->dmrs_ports = 0x7; // ports 0-2 } if (rank == 4){ - pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; //TBC - pusch_config_pdu->dmrs_ports = 0; //FIXME - //pusch_config_pdu->dmrs_ports[0] = 0; - //pusch_config_pdu->dmrs_ports[1] = 1; - //pusch_config_pdu->dmrs_ports[2] = 2; - //pusch_config_pdu->dmrs_ports[3] = 3; + pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; + pusch_config_pdu->dmrs_ports = 0xf; // ports 0-3 } } @@ -428,8 +433,8 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf if (rank == 1){ pusch_config_pdu->num_dmrs_cdm_grps_no_data = (dci->antenna_ports.val > 1)?2:1; //TBC - pusch_config_pdu->dmrs_ports = (dci->antenna_ports.val > 1)?(dci->antenna_ports.val > 5 ?(dci->antenna_ports.val-6):(dci->antenna_ports.val-2)):dci->antenna_ports.val; //TBC - //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports.val > 6)?2:1; //FIXME + pusch_config_pdu->dmrs_ports = 1<<((dci->antenna_ports.val > 1)?(dci->antenna_ports.val > 5 ?(dci->antenna_ports.val-6):(dci->antenna_ports.val-2)):dci->antenna_ports.val); + *n_front_load_symb = (dci->antenna_ports.val > 6)?2:1; } if (rank == 2){ @@ -437,7 +442,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf pusch_config_pdu->dmrs_ports = 0; //FIXME //pusch_config_pdu->dmrs_ports[0] = table_7_3_1_1_2_13[dci->antenna_ports.val][1]; //pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_13[dci->antenna_ports.val][2]; - //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports.val > 3)?2:1; // FIXME + //n_front_load_symb = (dci->antenna_ports.val > 3)?2:1; // FIXME } if (rank == 3){ @@ -446,7 +451,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf //pusch_config_pdu->dmrs_ports[0] = table_7_3_1_1_2_14[dci->antenna_ports.val][1]; //pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_14[dci->antenna_ports.val][2]; //pusch_config_pdu->dmrs_ports[2] = table_7_3_1_1_2_14[dci->antenna_ports.val][3]; - //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports.val > 1)?2:1; //FIXME + //n_front_load_symb = (dci->antenna_ports.val > 1)?2:1; //FIXME } if (rank == 4){ @@ -456,7 +461,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf //pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_15[dci->antenna_ports.val][2]; //pusch_config_pdu->dmrs_ports[2] = table_7_3_1_1_2_15[dci->antenna_ports.val][3]; //pusch_config_pdu->dmrs_ports[3] = table_7_3_1_1_2_15[dci->antenna_ports.val][4]; - //pusch_config_pdu->n_front_load_symb = (dci->antenna_ports.val > 1)?2:1; //FIXME + //n_front_load_symb = (dci->antenna_ports.val > 1)?2:1; //FIXME } } @@ -500,7 +505,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf if (rank == 1){ pusch_config_pdu->num_dmrs_cdm_grps_no_data = table_7_3_1_1_2_20[dci->antenna_ports.val][0]; //TBC pusch_config_pdu->dmrs_ports = table_7_3_1_1_2_20[dci->antenna_ports.val][1]; //TBC - //pusch_config_pdu->n_front_load_symb = table_7_3_1_1_2_20[dci->antenna_ports.val][2]; //FIXME + //n_front_load_symb = table_7_3_1_1_2_20[dci->antenna_ports.val][2]; //FIXME } if (rank == 2){ @@ -508,7 +513,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf pusch_config_pdu->dmrs_ports = 0; //FIXME //pusch_config_pdu->dmrs_ports[0] = table_7_3_1_1_2_21[dci->antenna_ports.val][1]; //pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_21[dci->antenna_ports.val][2]; - //pusch_config_pdu->n_front_load_symb = table_7_3_1_1_2_21[dci->antenna_ports.val][3]; //FIXME + //n_front_load_symb = table_7_3_1_1_2_21[dci->antenna_ports.val][3]; //FIXME } if (rank == 3){ @@ -517,7 +522,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf //pusch_config_pdu->dmrs_ports[0] = table_7_3_1_1_2_22[dci->antenna_ports.val][1]; //pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_22[dci->antenna_ports.val][2]; //pusch_config_pdu->dmrs_ports[2] = table_7_3_1_1_2_22[dci->antenna_ports.val][3]; - //pusch_config_pdu->n_front_load_symb = table_7_3_1_1_2_22[dci->antenna_ports.val][4]; //FIXME + //n_front_load_symb = table_7_3_1_1_2_22[dci->antenna_ports.val][4]; //FIXME } if (rank == 4){ @@ -527,7 +532,7 @@ void ul_ports_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_conf //pusch_config_pdu->dmrs_ports[1] = table_7_3_1_1_2_23[dci->antenna_ports.val][2]; //pusch_config_pdu->dmrs_ports[2] = table_7_3_1_1_2_23[dci->antenna_ports.val][3]; //pusch_config_pdu->dmrs_ports[3] = table_7_3_1_1_2_23[dci->antenna_ports.val][4]; - //pusch_config_pdu->n_front_load_symb = table_7_3_1_1_2_23[dci->antenna_ports.val][5]; //FIXME + //n_front_load_symb = table_7_3_1_1_2_23[dci->antenna_ports.val][5]; //FIXME } } LOG_D(NR_MAC,"num_dmrs_cdm_grps_no_data %d, dmrs_ports %d\n",pusch_config_pdu->num_dmrs_cdm_grps_no_data,pusch_config_pdu->dmrs_ports); @@ -559,23 +564,25 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, int N_PRB_oh = 0; int rnti_type = get_rnti_type(mac, rnti); + NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id; // Common configuration pusch_config_pdu->dmrs_config_type = pusch_dmrs_type1; pusch_config_pdu->pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA; pusch_config_pdu->nrOfLayers = 1; + pusch_config_pdu->Tpmi = 0; pusch_config_pdu->rnti = rnti; NR_BWP_UplinkCommon_t *initialUplinkBWP; if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP; else initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP; pusch_dmrs_AdditionalPosition_t add_pos = pusch_dmrs_pos2; - pusch_maxLength_t dmrslength = pusch_len1; + int dmrslength = 1; if (rar_grant) { // Note: for Msg3 or MsgA PUSCH transmission the N_PRB_oh is always set to 0 - NR_BWP_Uplink_t *ubwp = mac->ULbwp[0]; + NR_BWP_Uplink_t *ubwp = ul_bwp_id > 0 ? mac->ULbwp[ul_bwp_id - 1] : NULL; NR_BWP_UplinkDedicated_t *ibwp; int scs,abwp_start,abwp_size,startSymbolAndLength,mappingtype; NR_PUSCH_Config_t *pusch_Config=NULL; @@ -686,13 +693,12 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, int target_ss; bool valid_ptrs_setup = 0; - uint16_t n_RB_ULBWP; - n_RB_ULBWP = NRRIV2BW(ubwpc->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + + uint16_t n_RB_ULBWP = NRRIV2BW(ubwpc->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); pusch_config_pdu->bwp_start = NRRIV2PRBOFFSET(ubwpc->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); pusch_config_pdu->bwp_size = n_RB_ULBWP; - AssertFatal(ubwpd->pusch_Config != NULL,"pusch_Config shouldn't be null\n"); - NR_PUSCH_Config_t *pusch_Config = ubwpd->pusch_Config->choice.setup; + const NR_PUSCH_Config_t *pusch_Config = ubwpd? ubwpd->pusch_Config->choice.setup : NULL; // Basic sanity check for MCS value to check for a false or erroneous DCI if (dci->mcs > 28) { @@ -713,11 +719,12 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, } else if (*dci_format == NR_UL_DCI_FORMAT_0_1) { config_bwp_ue(mac, &dci->bwp_indicator.val, dci_format); + get_bwp_info(mac,dl_bwp_id,ul_bwp_id,&bwpd,&bwpc,&ubwpd,&ubwpc); target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific; ul_layers_config(mac, pusch_config_pdu, dci); - ul_ports_config(mac, pusch_config_pdu, dci); + ul_ports_config(mac, &dmrslength, pusch_config_pdu, dci); } else { @@ -725,6 +732,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, return -1; } + NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon = ubwpc->pusch_ConfigCommon->choice.setup; NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = choose_ul_tda_list(pusch_Config,pusch_ConfigCommon); @@ -748,7 +756,8 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; uint32_t n_RS_Id = 0; - if (NR_DMRS_ulconfig->transformPrecodingEnabled->nPUSCH_Identity != NULL) + if (NR_DMRS_ulconfig->transformPrecodingEnabled && + NR_DMRS_ulconfig->transformPrecodingEnabled->nPUSCH_Identity != NULL) n_RS_Id = *NR_DMRS_ulconfig->transformPrecodingEnabled->nPUSCH_Identity; else n_RS_Id = *mac->scc->physCellId; @@ -767,10 +776,10 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, pusch_config_pdu->dfts_ofdm.low_papr_group_number); } else { - if (pusch_config_pdu->scid == 0 && + if (pusch_config_pdu->scid == 0 && NR_DMRS_ulconfig && NR_DMRS_ulconfig->transformPrecodingDisabled->scramblingID0) pusch_config_pdu->ul_dmrs_scrambling_id = *NR_DMRS_ulconfig->transformPrecodingDisabled->scramblingID0; - if (pusch_config_pdu->scid == 1 && + if (pusch_config_pdu->scid == 1 && NR_DMRS_ulconfig && NR_DMRS_ulconfig->transformPrecodingDisabled->scramblingID1) pusch_config_pdu->ul_dmrs_scrambling_id = *NR_DMRS_ulconfig->transformPrecodingDisabled->scramblingID1; } @@ -823,20 +832,25 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, pusch_config_pdu->absolute_delta_PUSCH = 4; } - if (NR_DMRS_ulconfig != NULL) { + if (NR_DMRS_ulconfig != NULL) add_pos = (NR_DMRS_ulconfig->dmrs_AdditionalPosition == NULL) ? 2 : *NR_DMRS_ulconfig->dmrs_AdditionalPosition; - dmrslength = NR_DMRS_ulconfig->maxLength == NULL ? pusch_len1 : pusch_len2; - } /* DMRS */ l_prime_mask = get_l_prime(pusch_config_pdu->nr_of_symbols, mappingtype, add_pos, dmrslength, pusch_config_pdu->start_symbol_index, mac->scc ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position); - if ((mac->ULbwp[0] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled)) + if (ul_bwp_id > 0 && + mac->ULbwp[ul_bwp_id - 1] && + pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled && + *dci_format != NR_UL_DCI_FORMAT_0_1) { pusch_config_pdu->num_dmrs_cdm_grps_no_data = 1; - else if (*dci_format == NR_UL_DCI_FORMAT_0_0 || (mac->ULbwp[0] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled)) + } else if (*dci_format == NR_UL_DCI_FORMAT_0_0 || + (ul_bwp_id > 0 && + mac->ULbwp[ul_bwp_id-1] && + pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled)) { pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; + } // Num PRB Overhead from PUSCH-ServingCellConfig if (mac->cg && @@ -850,16 +864,17 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, else N_PRB_oh = 0; /* PTRS */ - if (mac->ULbwp[0] && - mac->ULbwp[0]->bwp_Dedicated && - mac->ULbwp[0]->bwp_Dedicated->pusch_Config && - mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup && - mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB && - mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) { + if (ul_bwp_id > 0 && + mac->ULbwp[ul_bwp_id-1] && + mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated && + mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config && + mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup && + mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB && + mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) { if (pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled) { nfapi_nr_ue_ptrs_ports_t ptrs_ports_list; pusch_config_pdu->pusch_ptrs.ptrs_ports_list = &ptrs_ports_list; - valid_ptrs_setup = set_ul_ptrs_values(mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup, + valid_ptrs_setup = set_ul_ptrs_values(mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup, pusch_config_pdu->rb_size, pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table, &pusch_config_pdu->pusch_ptrs.ptrs_freq_density,&pusch_config_pdu->pusch_ptrs.ptrs_time_density, &pusch_config_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset,&pusch_config_pdu->pusch_ptrs.num_ptrs_ports, @@ -882,7 +897,8 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, rnti_types[rnti_type]); pusch_config_pdu->ul_dmrs_symb_pos = l_prime_mask; - pusch_config_pdu->target_code_rate = nr_get_code_rate_ul(pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table); + uint16_t R = nr_get_code_rate_ul(pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table); + pusch_config_pdu->target_code_rate = R; pusch_config_pdu->qam_mod_order = nr_get_Qm_ul(pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table); if (pusch_config_pdu->target_code_rate == 0 || pusch_config_pdu->qam_mod_order == 0) { @@ -901,14 +917,13 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, // Compute TBS pusch_config_pdu->pusch_data.tb_size = nr_compute_tbs(pusch_config_pdu->qam_mod_order, - pusch_config_pdu->target_code_rate, + R, pusch_config_pdu->rb_size, pusch_config_pdu->nr_of_symbols, nb_dmrs_re_per_rb*number_dmrs_symbols, N_PRB_oh, 0, // TBR to verify tb scaling - pusch_config_pdu->nrOfLayers)/8; - + pusch_config_pdu->nrOfLayers)>>3; return 0; } @@ -919,15 +934,23 @@ bool nr_ue_periodic_srs_scheduling(module_id_t mod_id, frame_t frame, slot_t slo bool srs_scheduled = false; NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); + const NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id; NR_SRS_Config_t *srs_config = NULL; - if (mac->cg && - mac->cg->spCellConfig && - mac->cg->spCellConfig->spCellConfigDedicated && - mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig && - mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) { + if (ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1]) { + if (mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated && + mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->srs_Config) { + srs_config = mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->srs_Config->choice.setup; + } + } else if (mac->cg && + mac->cg->spCellConfig && + mac->cg->spCellConfig->spCellConfigDedicated && + mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig && + mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) { srs_config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup; - } else { + } + + if (!srs_config) { return false; } @@ -955,9 +978,9 @@ bool nr_ue_periodic_srs_scheduling(module_id_t mod_id, frame_t frame, slot_t slo continue; } - NR_BWP_t ubwp = mac->ULbwp[0] ? - mac->ULbwp[0]->bwp_Common->genericParameters : - mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters; + NR_BWP_t ubwp = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ? + mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters : + mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters; uint16_t period = srs_period[srs_resource->resourceType.choice.periodic->periodicityAndOffset_p.present]; uint16_t offset = get_nr_srs_offset(srs_resource->resourceType.choice.periodic->periodicityAndOffset_p); @@ -1062,9 +1085,6 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in if(mac->cg != NULL){ // we have a cg - nr_schedule_csirs_reception(mac, rx_frame, rx_slot); - nr_schedule_csi_for_im(mac, rx_frame, rx_slot); - dcireq.module_id = mod_id; dcireq.gNB_index = gNB_index; dcireq.cc_id = cc_id; @@ -1074,9 +1094,15 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in nr_ue_dcireq(&dcireq); //to be replaced with function pointer later mac->dl_config_request = dcireq.dl_config_req; + nr_schedule_csirs_reception(mac, rx_frame, rx_slot); + nr_schedule_csi_for_im(mac, rx_frame, rx_slot); + dcireq.dl_config_req = mac->dl_config_request; + fill_scheduled_response(&scheduled_response, &dcireq.dl_config_req, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id, dl_info->phy_data); - if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL) + if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL) { + LOG_D(NR_MAC,"1# scheduled_response transmitted, %d, %d\n", rx_frame, rx_slot); mac->if_module->scheduled_response(&scheduled_response); + } } else { // this is for Msg2/Msg4 @@ -1087,7 +1113,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in if (mac->ra.ra_state == WAIT_CONTENTION_RESOLUTION) rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_0; // msg3 retransmission config_dci_pdu(mac, rel15, dl_config, mac->ra.ra_state == WAIT_RAR ? NR_RNTI_RA : NR_RNTI_TC , mac->ra.ss->searchSpaceId); - fill_dci_search_candidates(mac->ra.ss, rel15); + fill_dci_search_candidates(mac->ra.ss, rel15, -1 , -1); dl_config->number_pdus = 1; LOG_D(MAC,"mac->cg %p: Calling fill_scheduled_response rnti %x, type0_pdcch, num_pdus %d\n",mac->cg,rel15->rnti,dl_config->number_pdus); fill_scheduled_response(&scheduled_response, dl_config, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id, dl_info->phy_data); @@ -1201,6 +1227,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in fill_scheduled_response(&scheduled_response, NULL, ul_config, &tx_req, mod_id, cc_id, frame_tx, slot_tx, ul_info->thread_id, NULL); if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL){ + LOG_D(NR_MAC,"3# scheduled_response transmitted,%d, %d\n", frame_tx, slot_tx); mac->if_module->scheduled_response(&scheduled_response); } pthread_mutex_lock(&ul_config->mutex_ul_config); @@ -1234,7 +1261,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in } //Check whether Regular BSR is triggered - if (nr_update_bsr(mod_id, txFrameP, txSlotP, gNB_indexP) == TRUE) { + if (nr_update_bsr(mod_id, txFrameP, txSlotP, gNB_indexP) == true) { // call SR procedure to generate pending SR and BSR for next PUCCH/PUSCH TxOp. This should implement the procedures // outlined in Sections 5.4.4 an 5.4.5 of 38.321 mac->scheduling_info.SR_pending = 1; @@ -1247,10 +1274,10 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in } -boolean_t +bool nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index) { mac_rlc_status_resp_t rlc_status; - boolean_t bsr_regular_triggered = FALSE; + bool bsr_regular_triggered = false; uint8_t lcid; uint8_t lcgid; uint8_t num_lcid_with_data = 0; // for LCID with data only if LCGID is defined @@ -1343,7 +1370,7 @@ nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_ which belong to any LCG and for which data is already available for transmission */ { - bsr_regular_triggered = TRUE; + bsr_regular_triggered = true; LOG_D(NR_MAC, "[UE %d] PDCCH Tick : MAC BSR Triggered LCID%d LCGID%d data become available at frame %d slot %d\n", module_idP, lcid, mac->scheduling_info.LCGID[lcid], @@ -1354,7 +1381,7 @@ nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_ // Trigger Regular BSR if ReTxBSR Timer has expired and UE has data for transmission if (mac->scheduling_info.retxBSR_SF == 0) { - bsr_regular_triggered = TRUE; + bsr_regular_triggered = true; if ((mac->BSR_reporting_active & NR_BSR_TRIGGER_REGULAR) == 0) { LOG_I(NR_MAC, "[UE %d] PDCCH Tick : MAC BSR Triggered ReTxBSR Timer expiry at frame %d slot %d\n", @@ -1543,14 +1570,15 @@ int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac, uint8_t tda_id){ int delta = 0; - NR_BWP_Uplink_t *ubwp = mac->ULbwp[0]; + NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id; + // Get the numerology to calculate the Tx frame and slot - int mu = ubwp ? - ubwp->bwp_Common->genericParameters.subcarrierSpacing : + int mu = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ? + mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing : mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing; - NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = ubwp ? - ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList: + NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ? + mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList: mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList; // k2 as per 3GPP TS 38.214 version 15.9.0 Release 15 ch 6.1.2.1.1 // PUSCH time domain resource allocation is higher layer configured from uschTimeDomainAllocationList in either pusch-ConfigCommon @@ -1613,7 +1641,7 @@ static void build_ro_list(NR_UE_MAC_INST_t *mac) { int y2; // PRACH Configuration Index table additional variable used to compute the valid frame numbers uint8_t slot_shift_for_map; uint8_t map_shift; - boolean_t even_slot_invalid; + bool even_slot_invalid; int64_t s_map; uint8_t prach_conf_start_symbol; // Starting symbol of the PRACH occasions in the PRACH slot uint8_t N_t_slot; // Number of PRACH occasions in a 14-symbols PRACH slot @@ -1885,7 +1913,7 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac) { mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup; NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR ssb_perRACH_config = setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present; - boolean_t multiple_ssb_per_ro; // true if more than one or exactly one SSB per RACH occasion, false if more than one RO per SSB + bool multiple_ssb_per_ro; // true if more than one or exactly one SSB per RACH occasion, false if more than one RO per SSB uint8_t ssb_rach_ratio; // Nb of SSBs per RACH or RACHs per SSB uint16_t required_nb_of_prach_occasion; // Nb of RACH occasions required to map all the SSBs uint8_t required_nb_of_prach_conf_period; // Nb of PRACH configuration periods required to map all the SSBs @@ -2381,9 +2409,17 @@ void nr_schedule_csi_for_im(NR_UE_MAC_INST_t *mac, int frame, int slot) { NR_CSI_IM_Resource_t *imcsi; int period, offset; NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id; - int mu = mac->DLbwp[dl_bwp_id-1] ? - mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing : - mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.subcarrierSpacing; + + NR_BWP_t *genericParameters = NULL; + if(dl_bwp_id > 0 && mac->DLbwp[dl_bwp_id-1]) { + genericParameters = &mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters; + } else { + genericParameters = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters; + } + + int mu = genericParameters->subcarrierSpacing; + uint16_t bwp_size = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE); + uint16_t bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE); for (int id = 0; id < csi_measconfig->csi_IM_ResourceToAddModList->list.count; id++){ imcsi = csi_measconfig->csi_IM_ResourceToAddModList->list.array[id]; @@ -2391,11 +2427,8 @@ void nr_schedule_csi_for_im(NR_UE_MAC_INST_t *mac, int frame, int slot) { if((frame*nr_slots_per_frame[mu]+slot-offset)%period != 0) continue; fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu = &dl_config->dl_config_list[dl_config->number_pdus].csiim_config_pdu.csiim_config_rel15; - const NR_BWP_Downlink_t *dlbwp = mac->DLbwp[dl_bwp_id-1]; - const int locationAndBandwidth = dlbwp != NULL ? dlbwp->bwp_Common->genericParameters.locationAndBandwidth: - mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth; - csiim_config_pdu->bwp_size = NRRIV2BW(locationAndBandwidth, MAX_BWP_SIZE); - csiim_config_pdu->bwp_start = NRRIV2PRBOFFSET(locationAndBandwidth, MAX_BWP_SIZE); + csiim_config_pdu->bwp_size = bwp_size; + csiim_config_pdu->bwp_start = bwp_start; csiim_config_pdu->subcarrier_spacing = mu; csiim_config_pdu->start_rb = imcsi->freqBand->startingRB; csiim_config_pdu->nr_of_rbs = imcsi->freqBand->nrofRBs; @@ -2417,7 +2450,7 @@ void nr_schedule_csi_for_im(NR_UE_MAC_INST_t *mac, int frame, int slot) { AssertFatal(1==0, "Invalid CSI-IM pattern\n"); } dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_CSI_IM; - dl_config->number_pdus = dl_config->number_pdus + 1; + dl_config->number_pdus += 1; } } @@ -2441,9 +2474,17 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) { NR_NZP_CSI_RS_Resource_t *nzpcsi; int period, offset; NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id; - int mu = mac->DLbwp[dl_bwp_id-1] ? - mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing : - mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.subcarrierSpacing; + + NR_BWP_t *genericParameters = NULL; + if(dl_bwp_id > 0 && mac->DLbwp[dl_bwp_id-1]) { + genericParameters = &mac->DLbwp[dl_bwp_id-1]->bwp_Common->genericParameters; + } else { + genericParameters = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters; + } + + int mu = genericParameters->subcarrierSpacing; + uint16_t bwp_size = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE); + uint16_t bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE); for (int id = 0; id < csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.count; id++){ nzpcsi = csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.array[id]; @@ -2452,17 +2493,23 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) { continue; LOG_D(MAC,"Scheduling reception of CSI-RS in frame %d slot %d\n",frame,slot); fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu = &dl_config->dl_config_list[dl_config->number_pdus].csirs_config_pdu.csirs_config_rel15; - NR_CSI_RS_ResourceMapping_t resourceMapping = nzpcsi->resourceMapping; - - const NR_BWP_Downlink_t *dlbwp = mac->DLbwp[dl_bwp_id-1]; - const int locationAndBandwidth = dlbwp != NULL ? dlbwp->bwp_Common->genericParameters.locationAndBandwidth: - mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth; - csirs_config_pdu->bwp_size = NRRIV2BW(locationAndBandwidth, MAX_BWP_SIZE); - csirs_config_pdu->bwp_start = NRRIV2PRBOFFSET(locationAndBandwidth, MAX_BWP_SIZE); csirs_config_pdu->subcarrier_spacing = mu; - csirs_config_pdu->start_rb = resourceMapping.freqBand.startingRB; - csirs_config_pdu->nr_of_rbs = resourceMapping.freqBand.nrofRBs; + csirs_config_pdu->cyclic_prefix = genericParameters->cyclicPrefix ? *genericParameters->cyclicPrefix : 0; + + // According to last paragraph of TS 38.214 5.2.2.3.1 + if (resourceMapping.freqBand.startingRB < bwp_start) { + csirs_config_pdu->start_rb = bwp_start; + } else { + csirs_config_pdu->start_rb = resourceMapping.freqBand.startingRB; + } + if (resourceMapping.freqBand.nrofRBs > (bwp_start + bwp_size - csirs_config_pdu->start_rb)) { + csirs_config_pdu->nr_of_rbs = bwp_start + bwp_size - csirs_config_pdu->start_rb; + } else { + csirs_config_pdu->nr_of_rbs = resourceMapping.freqBand.nrofRBs; + } + AssertFatal(csirs_config_pdu->nr_of_rbs >= 24, "CSI-RS has %d RBs, but the minimum is 24\n", csirs_config_pdu->nr_of_rbs); + csirs_config_pdu->csi_type = 1; // NZP-CSI-RS csirs_config_pdu->symb_l0 = resourceMapping.firstOFDMSymbolInTimeDomain; if (resourceMapping.firstOFDMSymbolInTimeDomain2) @@ -2473,6 +2520,11 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) { && (resourceMapping.density.choice.dot5 == NR_CSI_RS_ResourceMapping__density__dot5_evenPRBs)) csirs_config_pdu->freq_density--; csirs_config_pdu->scramb_id = nzpcsi->scramblingID; + csirs_config_pdu->power_control_offset = nzpcsi->powerControlOffset + 8; + if (nzpcsi->powerControlOffsetSS) + csirs_config_pdu->power_control_offset_ss = *nzpcsi->powerControlOffsetSS; + else + csirs_config_pdu->power_control_offset_ss = 1; // 0 dB switch(resourceMapping.frequencyDomainAllocation.present){ case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1: csirs_config_pdu->row = 1; @@ -2553,7 +2605,7 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) { AssertFatal(1==0,"Invalid freqency domain allocation in CSI-RS resource\n"); } dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_CSI_RS; - dl_config->number_pdus = dl_config->number_pdus + 1; + dl_config->number_pdus += 1; } } @@ -2750,7 +2802,7 @@ void nr_ue_sib1_scheduler(module_id_t module_idP, rel15->num_dci_options = 1; rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0; config_dci_pdu(mac, rel15, dl_config, NR_RNTI_SI, -1); - fill_dci_search_candidates(mac->search_space_zero, rel15); + fill_dci_search_candidates(mac->search_space_zero, rel15, -1, -1); if(mac->type0_PDCCH_CSS_config.type0_pdcch_ss_mux_pattern == 1){ // same frame as ssb diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 9dff368cccd..46ea821a878 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -160,11 +160,10 @@ void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sche } -void config_common(int Mod_idP, int ssb_SubcarrierOffset, rrc_pdsch_AntennaPorts_t dl_antenna_ports_struct, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc) { +void config_common(int Mod_idP, int pdsch_AntennaPorts, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc) { nfapi_nr_config_request_scf_t *cfg = &RC.nrmac[Mod_idP]->config[0]; RC.nrmac[Mod_idP]->common_channels[0].ServingCellConfigCommon = scc; - int pdsch_AntennaPorts = dl_antenna_ports_struct.N1 * dl_antenna_ports_struct.N2 * dl_antenna_ports_struct.XP; // Carrier configuration @@ -336,42 +335,32 @@ void config_common(int Mod_idP, int ssb_SubcarrierOffset, rrc_pdsch_AntennaPorts cfg->num_tlv++; // SSB Table Configuration - int scs_scaling = 1<<(cfg->ssb_config.scs_common.value); - if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000) - scs_scaling = scs_scaling*3; - if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666) - scs_scaling = scs_scaling>>2; uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); - uint16_t sco = absolute_diff%(12*scs_scaling); - // values of subcarrier offset larger than the limit only indicates CORESET for Type0-PDCCH CSS set is not present - int ssb_SubcarrierOffset_limit = 0; - int offset_scaling = 0; //15kHz - if(frequency_range == FR1) { - ssb_SubcarrierOffset_limit = 24; - if (ssb_SubcarrierOffset<ssb_SubcarrierOffset_limit) - offset_scaling = cfg->ssb_config.scs_common.value; - } else - ssb_SubcarrierOffset_limit = 12; - if (ssb_SubcarrierOffset<ssb_SubcarrierOffset_limit) - AssertFatal(sco==(scs_scaling * ssb_SubcarrierOffset), - "absoluteFrequencySSB has a subcarrier offset of %d while it should be %d\n",sco/scs_scaling,ssb_SubcarrierOffset); - cfg->ssb_table.ssb_offset_point_a.value = absolute_diff/(12*scs_scaling) - 10; //absoluteFrequencySSB is the central frequency of SSB which is made by 20RBs in total + const int scaling_5khz = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000 ? 3 : 1; + int sco = (absolute_diff/scaling_5khz) % 24; + if(frequency_range == FR2) + sco >>= 1; // this assumes 120kHz SCS for SSB and subCarrierSpacingCommon (only option supported by OAI for + const int scs_scaling = frequency_range == FR2 ? 1 << (*scc->ssbSubcarrierSpacing - 2) : 1 << *scc->ssbSubcarrierSpacing; + cfg->ssb_table.ssb_offset_point_a.value = absolute_diff/(12*scaling_5khz) - 10*scs_scaling; //absoluteFrequencySSB is the central frequency of SSB which is made by 20RBs in total cfg->ssb_table.ssb_offset_point_a.tl.tag = NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG; cfg->num_tlv++; cfg->ssb_table.ssb_period.value = *scc->ssb_periodicityServingCell; cfg->ssb_table.ssb_period.tl.tag = NFAPI_NR_CONFIG_SSB_PERIOD_TAG; cfg->num_tlv++; - cfg->ssb_table.ssb_subcarrier_offset.value = ssb_SubcarrierOffset<<offset_scaling; + cfg->ssb_table.ssb_subcarrier_offset.value = sco; cfg->ssb_table.ssb_subcarrier_offset.tl.tag = NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG; cfg->num_tlv++; + RC.nrmac[Mod_idP]->ssb_SubcarrierOffset = cfg->ssb_table.ssb_subcarrier_offset.value; + RC.nrmac[Mod_idP]->ssb_OffsetPointA = cfg->ssb_table.ssb_offset_point_a.value; + switch (scc->ssb_PositionsInBurst->present) { case 1 : cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0]<<24; cfg->ssb_table.ssb_mask_list[1].ssb_mask.value = 0; break; case 2 : - cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0]<<24; + cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = ((uint32_t) scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0]) << 24; cfg->ssb_table.ssb_mask_list[1].ssb_mask.value = 0; break; case 3 : @@ -416,8 +405,8 @@ void config_common(int Mod_idP, int ssb_SubcarrierOffset, rrc_pdsch_AntennaPorts cfg->carrier_config.num_rx_ant.value = pusch_AntennaPorts; AssertFatal(pusch_AntennaPorts > 0 && pusch_AntennaPorts < 13, "pusch_AntennaPorts in 1...12\n"); cfg->carrier_config.num_rx_ant.tl.tag = NFAPI_NR_CONFIG_NUM_RX_ANT_TAG; - LOG_I(NR_MAC,"Set TX/RX antenna number to %d (num ssb %d: %x,%x)\n", - cfg->carrier_config.num_tx_ant.value,num_ssb,cfg->ssb_table.ssb_mask_list[0].ssb_mask.value,cfg->ssb_table.ssb_mask_list[1].ssb_mask.value); + LOG_I(NR_MAC,"Set RX antenna number to %d, Set TX antenna number to %d (num ssb %d: %x,%x)\n", + cfg->carrier_config.num_tx_ant.value,cfg->carrier_config.num_rx_ant.value,num_ssb,cfg->ssb_table.ssb_mask_list[0].ssb_mask.value,cfg->ssb_table.ssb_mask_list[1].ssb_mask.value); AssertFatal(cfg->carrier_config.num_tx_ant.value > 0,"carrier_config.num_tx_ant.value %d !\n",cfg->carrier_config.num_tx_ant.value ); cfg->num_tlv++; cfg->num_tlv++; @@ -456,24 +445,21 @@ int nr_mac_enable_ue_rrc_processing_timer(module_id_t Mod_idP, rnti_t rnti, NR_S if (rrc_reconfiguration_delay == 0) { return -1; } - const int UE_id = find_nr_UE_id(Mod_idP,rnti); - if (UE_id < 0) { + + NR_UE_info_t *UE_info = find_nr_UE(&RC.nrmac[Mod_idP]->UE_info,rnti); + if (!UE_info) { LOG_W(NR_MAC, "Could not find UE for RNTI 0x%04x\n", rnti); return -1; } - - NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - const uint16_t sf_ahead = 6/(0x01<<subcarrierSpacing) + ((6%(0x01<<subcarrierSpacing))>0); - const uint16_t sl_ahead = sf_ahead * (0x01<<subcarrierSpacing); + NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl; + const uint16_t sl_ahead = RC.nrmac[Mod_idP]->if_inst->sl_ahead; sched_ctrl->rrc_processing_timer = (rrc_reconfiguration_delay<<subcarrierSpacing) + sl_ahead; - LOG_I(NR_MAC, "Activating RRC processing timer for UE %d\n", UE_id); + LOG_I(NR_MAC, "Activating RRC processing timer for UE %04x with %d ms\n", UE_info->rnti, rrc_reconfiguration_delay); return 0; } int rrc_mac_config_req_gNB(module_id_t Mod_idP, - int ssb_SubcarrierOffset, rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts, int pusch_AntennaPorts, int sib1_tda, @@ -488,19 +474,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, if (scc != NULL ) { AssertFatal((scc->ssb_PositionsInBurst->present > 0) && (scc->ssb_PositionsInBurst->present < 4), "SSB Bitmap type %d is not valid\n",scc->ssb_PositionsInBurst->present); - /* dimension UL_tti_req_ahead for number of slots in frame */ const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing]; - RC.nrmac[Mod_idP]->UL_tti_req_ahead[0] = calloc(n, sizeof(nfapi_nr_ul_tti_request_t)); - AssertFatal(RC.nrmac[Mod_idP]->UL_tti_req_ahead[0], - "could not allocate memory for RC.nrmac[]->UL_tti_req_ahead[]\n"); - /* fill in slot/frame numbers: slot is fixed, frame will be updated by scheduler - * consider that scheduler runs sl_ahead: the first sl_ahead slots are - * already "in the past" and thus we put frame 1 instead of 0! */ - for (int i = 0; i < n; ++i) { - nfapi_nr_ul_tti_request_t *req = &RC.nrmac[Mod_idP]->UL_tti_req_ahead[0][i]; - req->SFN = i < (RC.nrmac[Mod_idP]->if_inst->sl_ahead-1); - req->Slot = i; - } RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL = calloc(n * MAX_BWP_SIZE, sizeof(uint16_t)); AssertFatal(RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL, @@ -508,9 +482,10 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, LOG_I(NR_MAC,"Configuring common parameters from NR ServingCellConfig\n"); + int num_pdsch_antenna_ports = pdsch_AntennaPorts.N1 * pdsch_AntennaPorts.N2 * pdsch_AntennaPorts.XP; + RC.nrmac[Mod_idP]->xp_pdsch_antenna_ports = pdsch_AntennaPorts.XP; config_common(Mod_idP, - ssb_SubcarrierOffset, - pdsch_AntennaPorts, + num_pdsch_antenna_ports, pusch_AntennaPorts, scc); LOG_D(NR_MAC, "%s() %s:%d RC.nrmac[Mod_idP]->if_inst->NR_PHY_config_req:%p\n", __FUNCTION__, __FILE__, __LINE__, RC.nrmac[Mod_idP]->if_inst->NR_PHY_config_req); @@ -523,7 +498,6 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, printf("Waiting for PHY_config_req\n"); } } - RC.nrmac[Mod_idP]->ssb_SubcarrierOffset = ssb_SubcarrierOffset; RC.nrmac[Mod_idP]->minRXTXTIMEpdsch = minRXTXTIMEpdsch; NR_PHY_Config_t phycfg; @@ -550,9 +524,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, AssertFatal(RC.nrmac[Mod_idP]->common_channels[0].frame_type == FDD,"Dynamic TDD not handled yet\n"); for (int slot = 0; slot < n; ++slot) { - if (RC.nrmac[Mod_idP]->common_channels[0].frame_type == FDD || - (slot != 0)) - RC.nrmac[Mod_idP]->dlsch_slot_bitmap[slot / 64] |= (uint64_t)((slot % nr_slots_period) < nr_dl_slots) << (slot % 64); + RC.nrmac[Mod_idP]->dlsch_slot_bitmap[slot / 64] |= (uint64_t)((slot % nr_slots_period) < nr_dl_slots) << (slot % 64); RC.nrmac[Mod_idP]->ulsch_slot_bitmap[slot / 64] |= (uint64_t)((slot % nr_slots_period) >= nr_ulstart_slot) << (slot % 64); LOG_I(NR_MAC, "In %s: slot %d DL %d UL %d\n", @@ -590,37 +562,15 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, if (CellGroup) { - if (get_softmodem_params()->sa) { - calculate_preferred_dl_tda(Mod_idP, NULL); - } - - const NR_ServingCellConfig_t *servingCellConfig = NULL; - if(CellGroup->spCellConfig && CellGroup->spCellConfig->spCellConfigDedicated) { - servingCellConfig = CellGroup->spCellConfig->spCellConfigDedicated; - const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = servingCellConfig->downlinkBWP_ToAddModList; - if(bwpList) { - AssertFatal(bwpList->list.count > 0, "downlinkBWP_ToAddModList has no BWPs!\n"); - for (int i = 0; i < bwpList->list.count; ++i) { - const NR_BWP_Downlink_t *bwp = bwpList->list.array[i]; - calculate_preferred_dl_tda(Mod_idP, bwp); - } - } - - const struct NR_UplinkConfig__uplinkBWP_ToAddModList *ubwpList = servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList; - if(ubwpList) { - AssertFatal(ubwpList->list.count > 0, "uplinkBWP_ToAddModList no BWPs!\n"); - for (int i = 0; i < ubwpList->list.count; ++i) { - const NR_BWP_Uplink_t *ubwp = ubwpList->list.array[i]; - calculate_preferred_ul_tda(Mod_idP, ubwp); - } - } - } - - NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info; if (add_ue == 1 && get_softmodem_params()->phy_test) { - const int UE_id = add_new_nr_ue(Mod_idP, rnti, CellGroup); - LOG_I(NR_MAC,"Added new UE_id %d/%x with initial CellGroup\n",UE_id,rnti); - process_CellGroup(CellGroup,&UE_info->UE_sched_ctrl[UE_id]); + NR_UE_info_t* UE = add_new_nr_ue(RC.nrmac[Mod_idP], rnti, CellGroup); + if (UE) { + LOG_I(NR_MAC,"Added new UE %x with initial CellGroup\n", rnti); + } else { + LOG_E(NR_MAC,"Error adding UE %04x\n", rnti); + return -1; + } + process_CellGroup(CellGroup,&UE->UE_sched_ctrl); } else if (add_ue == 1 && !get_softmodem_params()->phy_test) { const int CC_id = 0; NR_COMMON_channels_t *cc = &RC.nrmac[Mod_idP]->common_channels[CC_id]; @@ -666,49 +616,30 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, ra->msg3_dcch_dtch = false; LOG_I(NR_MAC,"Added new RA process for UE RNTI %04x with initial CellGroup\n", rnti); } else { // CellGroup has been updated - NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels[0].ServingCellConfigCommon; - const int UE_id = find_nr_UE_id(Mod_idP,rnti); - int target_ss; - UE_info->CellGroup[UE_id] = CellGroup; - LOG_I(NR_MAC,"Modified UE_id %d/%x with CellGroup\n",UE_id,rnti); - process_CellGroup(CellGroup,&UE_info->UE_sched_ctrl[UE_id]); - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL; - if (get_softmodem_params()->sa) { - // add all available DL HARQ processes for this UE in SA - create_dl_harq_list(sched_ctrl, pdsch); - } - // update coreset/searchspace - void *bwpd = NULL; - NR_BWP_t *genericParameters = NULL; - target_ss = NR_SearchSpace__searchSpaceType_PR_common; - if ((sched_ctrl->active_bwp)) { - target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific; - bwpd = (void*)sched_ctrl->active_bwp->bwp_Dedicated; - genericParameters = &sched_ctrl->active_bwp->bwp_Common->genericParameters; + NR_UE_info_t *UE = find_nr_UE(&RC.nrmac[Mod_idP]->UE_info, rnti); + if (!UE) { + LOG_E(NR_MAC, "Can't find UE %04x\n", rnti); + return -1; } - else if (CellGroup->spCellConfig && - CellGroup->spCellConfig->spCellConfigDedicated && - (CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)) { - target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific; - bwpd = (void*)CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP; - genericParameters = &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters; + + /* copy CellGroup by calling asn1c encode + this is a temporary hack to avoid the gNB having + a pointer to RRC CellGroup structure + (otherwise it would be applied to early) + TODO remove once we have a proper implementation */ + UE->enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, + NULL, + (void *) CellGroup, + UE->cg_buf, + 32768); + + if (UE->enc_rval.encoded == -1) { + LOG_E(NR_MAC, "ASN1 message CellGroupConfig encoding failed (%s, %lu)!\n", + UE->enc_rval.failed_type->name, UE->enc_rval.encoded); + exit(1); } - sched_ctrl->search_space = get_searchspace(sib1 ? sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL, scc, bwpd, target_ss); - sched_ctrl->coreset = get_coreset(Mod_idP, scc, bwpd, sched_ctrl->search_space, target_ss); - sched_ctrl->sched_pdcch = set_pdcch_structure(RC.nrmac[Mod_idP], - sched_ctrl->search_space, - sched_ctrl->coreset, - scc, - genericParameters, - RC.nrmac[Mod_idP]->type0_PDCCH_CSS_config); - sched_ctrl->maxL = 2; - if (CellGroup->spCellConfig && - CellGroup->spCellConfig->spCellConfigDedicated && - CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig && - CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup - ) - compute_csi_bitlen (CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info, UE_id, Mod_idP); + + process_CellGroup(CellGroup,&UE->UE_sched_ctrl); } } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c index 6520d7c178b..780c47057e0 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c @@ -68,6 +68,8 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB, NR_ServingCellConfigCommon_t *scc = gNB->common_channels->ServingCellConfigCommon; const int num_slots = nr_slots_per_frame[*scc->ssbSubcarrierSpacing]; + UL_tti_req_ahead_initialization(gNB, scc, num_slots, CC_idP); + nfapi_nr_dl_tti_request_t *DL_req = &gNB->DL_req[0]; nfapi_nr_dl_tti_pdcch_pdu_rel15_t **pdcch = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t **)gNB->pdcch_pdu_idx[CC_idP]; nfapi_nr_ul_tti_request_t *future_ul_tti_req = @@ -104,167 +106,6 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB, TX_req[CC_idP].Number_of_PDUs = 0; } -/* -void check_nr_ul_failure(module_id_t module_idP, - int CC_id, - int UE_id, - frame_t frameP, - sub_frame_t slotP) { - - NR_UE_info_t *UE_info = &RC.nrmac[module_idP]->UE_info; - nfapi_nr_dl_dci_request_t *DL_req = &RC.nrmac[module_idP]->DL_req[0]; - uint16_t rnti = UE_RNTI(module_idP, UE_id); - NR_COMMON_channels_t *cc = RC.nrmac[module_idP]->common_channels; - - // check uplink failure - if ((UE_info->UE_sched_ctrl[UE_id].ul_failure_timer > 0) && - (UE_info->UE_sched_ctrl[UE_id].ul_out_of_sync == 0)) { - LOG_I(MAC, "UE %d rnti %x: UL Failure timer %d \n", UE_id, rnti, - UE_info->UE_sched_ctrl[UE_id].ul_failure_timer); - if (UE_info->UE_sched_ctrl[UE_id].ra_pdcch_order_sent == 0) { - UE_info->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 1; - - // add a format 1A dci for this UE to request an RA procedure (only one UE per subframe) - nfapi_nr_dl_dci_request_pdu_t *dl_config_pdu = &DL_req[CC_id].dl_tti_request_body.dl_config_pdu_list[DL_req[CC_id].dl_tti_request_body.number_pdu]; - memset((void *) dl_config_pdu, 0,sizeof(nfapi_dl_dci_request_pdu_t)); - dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; - dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu)); - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_DCI_REQUEST_DCI_DL_PDU_REL8_TAG; - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = NFAPI_DL_DCI_FORMAT_1A; - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = get_aggregation(get_bw_index(module_idP, CC_id), - UE_info->UE_sched_ctrl[UE_id]. - dl_cqi[CC_id], format1A); - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = rnti; - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 1; // CRNTI : see Table 4-10 from SCF082 - nFAPI specifications - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power - - AssertFatal((cc[CC_id].mib->message.dl_Bandwidth >= 0) && (cc[CC_id].mib->message.dl_Bandwidth < 6), - "illegal dl_Bandwidth %d\n", - (int) cc[CC_id].mib->message.dl_Bandwidth); - dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = nr_pdcch_order_table[cc[CC_id].mib->message.dl_Bandwidth]; - DL_req[CC_id].dl_tti_request_body.number_dci++; - DL_req[CC_id].dl_tti_request_body.number_pdu++; - DL_req[CC_id].dl_tti_request_body.tl.tag = NFAPI_DL_TTI_REQUEST_BODY_TAG; - LOG_I(MAC, - "UE %d rnti %x: sending PDCCH order for RAPROC (failure timer %d), resource_block_coding %d \n", - UE_id, rnti, - UE_info->UE_sched_ctrl[UE_id].ul_failure_timer, - dl_config_pdu->dci_dl_pdu. - dci_dl_pdu_rel8.resource_block_coding); - } else { // ra_pdcch_sent==1 - LOG_I(MAC, - "UE %d rnti %x: sent PDCCH order for RAPROC waiting (failure timer %d) \n", - UE_id, rnti, - UE_info->UE_sched_ctrl[UE_id].ul_failure_timer); - if ((UE_info->UE_sched_ctrl[UE_id].ul_failure_timer % 40) == 0) UE_info->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 0; // resend every 4 frames - } - - UE_info->UE_sched_ctrl[UE_id].ul_failure_timer++; - // check threshold - if (UE_info->UE_sched_ctrl[UE_id].ul_failure_timer > 20000) { - // inform RRC of failure and clear timer - LOG_I(MAC, - "UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n", - UE_id, rnti); - mac_eNB_rrc_ul_failure(module_idP, CC_id, frameP, subframeP,rnti); - UE_info->UE_sched_ctrl[UE_id].ul_failure_timer = 0; - UE_info->UE_sched_ctrl[UE_id].ul_out_of_sync = 1; - - //Inform the controller about the UE deactivation. Should be moved to RRC agent in the future - if (rrc_agent_registered[module_idP]) { - LOG_W(MAC, "notify flexran Agent of UE state change\n"); - agent_rrc_xface[module_idP]->flexran_agent_notify_ue_state_change(module_idP, - rnti, PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_DEACTIVATED); - } - } - } // ul_failure_timer>0 - -} -*/ -/* -void schedule_nr_SRS(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) -{ - gNB_MAC_INST *gNB = RC.nrmac[module_idP]; - NR_UE_info_t *UE_info = &gNB->UE_info; - nfapi_ul_config_request_body_t *ul_req; - int CC_id, UE_id; - NR_COMMON_channels_t *cc = RC.nrmac[module_idP]->common_channels; - SoundingRS_UL_ConfigCommon_t *soundingRS_UL_ConfigCommon; - struct SoundingRS_UL_ConfigDedicated *soundingRS_UL_ConfigDedicated; - uint8_t TSFC; - uint16_t deltaTSFC; // bitmap - uint8_t srs_SubframeConfig; - - // table for TSFC (Period) and deltaSFC (offset) - const uint16_t deltaTSFCTabType1[15][2] = { {1, 1}, {1, 2}, {2, 2}, {1, 5}, {2, 5}, {4, 5}, {8, 5}, {3, 5}, {12, 5}, {1, 10}, {2, 10}, {4, 10}, {8, 10}, {351, 10}, {383, 10} }; // Table 5.5.3.3-2 3GPP 36.211 FDD - const uint16_t deltaTSFCTabType2[14][2] = { {2, 5}, {6, 5}, {10, 5}, {18, 5}, {14, 5}, {22, 5}, {26, 5}, {30, 5}, {70, 10}, {74, 10}, {194, 10}, {326, 10}, {586, 10}, {210, 10} }; // Table 5.5.3.3-2 3GPP 36.211 TDD - - uint16_t srsPeriodicity, srsOffset; - - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { - soundingRS_UL_ConfigCommon = &cc[CC_id].radioResourceConfigCommon->soundingRS_UL_ConfigCommon; - // check if SRS is enabled in this frame/subframe - if (soundingRS_UL_ConfigCommon) { - srs_SubframeConfig = soundingRS_UL_ConfigCommon->choice.setup.srs_SubframeConfig; - if (cc[CC_id].tdd_Config == NULL) { // FDD - deltaTSFC = deltaTSFCTabType1[srs_SubframeConfig][0]; - TSFC = deltaTSFCTabType1[srs_SubframeConfig][1]; - } else { // TDD - deltaTSFC = deltaTSFCTabType2[srs_SubframeConfig][0]; - TSFC = deltaTSFCTabType2[srs_SubframeConfig][1]; - } - // Sounding reference signal subframes are the subframes satisfying ns/2 mod TSFC (- deltaTSFC - uint16_t tmp = (subframeP % TSFC); - - if ((1 << tmp) & deltaTSFC) { - // This is an SRS subframe, loop over UEs - for (UE_id = 0; UE_id < MAX_MOBILES_PER_GNB; UE_id++) { - if (!RC.nrmac[module_idP]->UE_info.active[UE_id]) continue; - ul_req = &RC.nrmac[module_idP]->UL_req[CC_id].ul_config_request_body; - // drop the allocation if the UE hasn't send RRCConnectionSetupComplete yet - if (mac_eNB_get_rrc_status(module_idP,UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) continue; - - AssertFatal(UE_info->UE_template[CC_id][UE_id].physicalConfigDedicated != NULL, - "physicalConfigDedicated is null for UE %d\n", - UE_id); - - if ((soundingRS_UL_ConfigDedicated = UE_info->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated) != NULL) { - if (soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup) { - get_srs_pos(&cc[CC_id], - soundingRS_UL_ConfigDedicated->choice. - setup.srs_ConfigIndex, - &srsPeriodicity, &srsOffset); - if (((10 * frameP + subframeP) % srsPeriodicity) == srsOffset) { - // Program SRS - ul_req->srs_present = 1; - nfapi_ul_config_request_pdu_t * ul_config_pdu = &ul_req->ul_config_pdu_list[ul_req->number_of_pdus]; - memset((void *) ul_config_pdu, 0, sizeof(nfapi_ul_config_request_pdu_t)); - ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_SRS_PDU_TYPE; - ul_config_pdu->pdu_size = 2 + (uint8_t) (2 + sizeof(nfapi_ul_config_srs_pdu)); - ul_config_pdu->srs_pdu.srs_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG; - ul_config_pdu->srs_pdu.srs_pdu_rel8.size = (uint8_t)sizeof(nfapi_ul_config_srs_pdu); - ul_config_pdu->srs_pdu.srs_pdu_rel8.rnti = UE_info->UE_template[CC_id][UE_id].rnti; - ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_bandwidth = soundingRS_UL_ConfigDedicated->choice.setup.srs_Bandwidth; - ul_config_pdu->srs_pdu.srs_pdu_rel8.frequency_domain_position = soundingRS_UL_ConfigDedicated->choice.setup.freqDomainPosition; - ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_hopping_bandwidth = soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth;; - ul_config_pdu->srs_pdu.srs_pdu_rel8.transmission_comb = soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb; - ul_config_pdu->srs_pdu.srs_pdu_rel8.i_srs = soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex; - ul_config_pdu->srs_pdu.srs_pdu_rel8.sounding_reference_cyclic_shift = soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift; // ul_config_pdu->srs_pdu.srs_pdu_rel10.antenna_port = ;// - // ul_config_pdu->srs_pdu.srs_pdu_rel13.number_of_combs = ;// - RC.nrmac[module_idP]->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP; - RC.nrmac[module_idP]->UL_req[CC_id].header.message_id = NFAPI_UL_CONFIG_REQUEST; - ul_req->number_of_pdus++; - } // if (((10*frameP+subframeP) % srsPeriodicity) == srsOffset) - } // if (soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup) - } // if ((soundingRS_UL_ConfigDedicated = UE_info->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated)!=NULL) - } // for (UE_id ... - } // if((1<<tmp) & deltaTSFC) - - } // SRS config - } -} -*/ - bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot) { if (slot>=64) return false; //quickfix for FR2 where there are more than 64 slots (bitmap to be removed) @@ -278,8 +119,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, protocol_ctxt_t ctxt={0}; PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frame, slot,module_idP); - char stats_output[16384]; - gNB_MAC_INST *gNB = RC.nrmac[module_idP]; NR_COMMON_channels_t *cc = gNB->common_channels; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; @@ -307,8 +146,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, nr_rrc_trigger(&ctxt, 0 /*CC_id*/, frame, slot >> *scc->ssbSubcarrierSpacing); } - for (int i=0; i<MAX_NUM_CORESET; i++) - RC.nrmac[module_idP]->pdcch_cand[i] = 0; for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { //mbsfn_status[CC_id] = 0; @@ -341,13 +178,16 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, if ((slot == 0) && (frame & 127) == 0) { - stats_output[0]='\0'; - dump_mac_stats(RC.nrmac[module_idP],stats_output,16384,true); - LOG_I(NR_MAC,"Frame.Slot %d.%d\n%s\n",frame,slot,stats_output); + char stats_output[16384]; + stats_output[0] = '\0'; + dump_mac_stats(RC.nrmac[module_idP], stats_output, sizeof(stats_output), true); + LOG_I(NR_MAC, "Frame.Slot %d.%d\n%s\n", frame, slot, stats_output); } nr_mac_update_timers(module_idP, frame, slot); + schedule_nr_bwp_switch(module_idP, frame, slot); + // This schedules MIB schedule_nr_mib(module_idP, frame, slot); @@ -370,7 +210,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, schedule_nr_prach(module_idP, f, s); } - // Schedule CSI-RS transmission nr_csirs_scheduling(module_idP, frame, slot, nr_slots_per_frame[*scc->ssbSubcarrierSpacing]); @@ -396,10 +235,10 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, nr_schedule_ue_spec(module_idP, frame, slot); stop_meas(&gNB->schedule_dlsch); - nr_schedule_pucch(module_idP, frame, slot); + nr_schedule_pucch(RC.nrmac[module_idP], frame, slot); // This schedule SR after PUCCH for multiplexing - nr_sr_reporting(module_idP, frame, slot); + nr_sr_reporting(RC.nrmac[module_idP], frame, slot); stop_meas(&RC.nrmac[module_idP]->eNB_scheduler); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index a2d56036d48..ef7c91151b6 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -465,27 +465,24 @@ void nr_schedule_msg2(uint16_t rach_frame, uint16_t rach_slot, int FR = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] >= 257 ? nr_FR2 : nr_FR1; - uint8_t start_next_period = (rach_slot-(rach_slot%tdd_period_slot)+tdd_period_slot)%nr_slots_per_frame[mu]; - *msg2_slot = start_next_period + last_dl_slot_period; // initializing scheduling of slot to next mixed (or last dl) slot - *msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024; + uint8_t start_next_period = rach_slot-(rach_slot%tdd_period_slot)+tdd_period_slot; + int eff_slot = start_next_period + last_dl_slot_period; // initializing scheduling of slot to next mixed (or last dl) slot // we can't schedule msg2 before sl_ahead since prach - int eff_slot = *msg2_slot+(*msg2_frame-rach_frame)*nr_slots_per_frame[mu]; while ((eff_slot-rach_slot)<=sl_ahead) { - *msg2_slot = (*msg2_slot+tdd_period_slot)%nr_slots_per_frame[mu]; - *msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024; - eff_slot = *msg2_slot+(*msg2_frame-rach_frame)*nr_slots_per_frame[mu]; + eff_slot += tdd_period_slot; } if (FR==nr_FR2) { - int num_tdd_period = *msg2_slot/tdd_period_slot; + int num_tdd_period = (eff_slot%nr_slots_per_frame[mu])/tdd_period_slot; while((tdd_beam_association[num_tdd_period]!=-1)&&(tdd_beam_association[num_tdd_period]!=beam_index)) { - *msg2_slot = (*msg2_slot+tdd_period_slot)%nr_slots_per_frame[mu]; - *msg2_frame = ((*msg2_slot>(rach_slot))? rach_frame : (rach_frame+1))%1024; - num_tdd_period = *msg2_slot/tdd_period_slot; + eff_slot += tdd_period_slot; + num_tdd_period = (eff_slot % nr_slots_per_frame[mu])/tdd_period_slot; } if(tdd_beam_association[num_tdd_period] == -1) tdd_beam_association[num_tdd_period] = beam_index; } + *msg2_frame=(rach_frame + eff_slot/nr_slots_per_frame[mu])%1024; + *msg2_slot=eff_slot%nr_slots_per_frame[mu]; // go to previous slot if the current scheduled slot is beyond the response window // and if the slot is not among the PDCCH monitored ones (38.213 10.1) while (*msg2_frame > frame_limit @@ -540,158 +537,164 @@ void nr_initiate_ra_proc(module_id_t module_idP, } for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) { + NR_RA_t *ra = &cc->ra[i]; - pr_found = 0; - const int UE_id = find_nr_UE_id(module_idP, ra->rnti); - if (UE_id != -1) { + if (ra->state != RA_IDLE) continue; - } - if (ra->state == RA_IDLE) { - for(int j = 0; j < ra->preambles.num_preambles; j++) { - //check if the preamble received correspond to one of the listed or configured preambles - if (preamble_index == ra->preambles.preamble_list[j]) { - if (ra->rnti == 0 && get_softmodem_params()->nsa) - continue; - pr_found=1; - break; - } - } - if (pr_found == 0) { - continue; + + pr_found = 0; + + for(int j = 0; j < ra->preambles.num_preambles; j++) { + //check if the preamble received correspond to one of the listed or configured preambles + if (preamble_index == ra->preambles.preamble_list[j]) { + if (ra->rnti == 0 && get_softmodem_params()->nsa) + continue; + pr_found=1; + break; } + } + if (pr_found == 0) { + continue; + } - uint16_t ra_rnti; + uint16_t ra_rnti; - // ra_rnti from 5.1.3 in 38.321 - // FK: in case of long PRACH the phone seems to expect the subframe number instead of the slot number here. - if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.present - == NR_RACH_ConfigCommon__prach_RootSequenceIndex_PR_l839) - ra_rnti = 1 + symbol + (9 /*slotP*/ * 14) + (freq_index * 14 * 80) + (ul_carrier_id * 14 * 80 * 8); - else - ra_rnti = 1 + symbol + (slotP * 14) + (freq_index * 14 * 80) + (ul_carrier_id * 14 * 80 * 8); - - // This should be handled differently when we use the initialBWP for RA - ra->bwp_id = 0; - NR_BWP_Downlink_t *bwp=NULL; - if (ra->CellGroup && ra->CellGroup->spCellConfig && ra->CellGroup->spCellConfig->spCellConfigDedicated && - ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList) { - ra->bwp_id = 1; - bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1]; + // ra_rnti from 5.1.3 in 38.321 + // FK: in case of long PRACH the phone seems to expect the subframe number instead of the slot number here. + if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.present + == NR_RACH_ConfigCommon__prach_RootSequenceIndex_PR_l839) + ra_rnti = 1 + symbol + (9 /*slotP*/ * 14) + (freq_index * 14 * 80) + (ul_carrier_id * 14 * 80 * 8); + else + ra_rnti = 1 + symbol + (slotP * 14) + (freq_index * 14 * 80) + (ul_carrier_id * 14 * 80 * 8); + + // This should be handled differently when we use the initialBWP for RA + ra->dl_bwp_id = 0;//TODO + ra->ul_bwp_id = 0; + NR_BWP_Downlink_t *bwp=NULL; + if (ra->CellGroup && ra->CellGroup->spCellConfig && ra->CellGroup->spCellConfig->spCellConfigDedicated) { + if (ra->CellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id && + ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList) { + ra->dl_bwp_id = *ra->CellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id; + bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id - 1]; } + if (ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig && + ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id) + ra->ul_bwp_id = *ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id; + } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 1); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 1); - LOG_D(NR_MAC, - "[gNB %d][RAPROC] CC_id %d Frame %d, Slot %d Initiating RA procedure for preamble index %d\n", + LOG_D(NR_MAC, + "[gNB %d][RAPROC] CC_id %d Frame %d, Slot %d Initiating RA procedure for preamble index %d\n", + module_idP, + CC_id, + frameP, + slotP, + preamble_index); + + uint8_t beam_index = ssb_index_from_prach(module_idP, frameP, slotP, preamble_index, freq_index, symbol); + + // the UE sent a RACH either for starting RA procedure or RA procedure failed and UE retries + if (ra->cfra) { + // if the preamble received correspond to one of the listed + if (!(preamble_index == ra->preambles.preamble_list[beam_index])) { + LOG_E( + NR_MAC, + "[gNB %d][RAPROC] FAILURE: preamble %d does not correspond to any of the ones in rach_ConfigDedicated\n", module_idP, - CC_id, - frameP, - slotP, preamble_index); - - uint8_t beam_index = ssb_index_from_prach(module_idP, frameP, slotP, preamble_index, freq_index, symbol); - - // the UE sent a RACH either for starting RA procedure or RA procedure failed and UE retries - if (ra->cfra) { - // if the preamble received correspond to one of the listed - if (!(preamble_index == ra->preambles.preamble_list[beam_index])) { - LOG_E( - NR_MAC, - "[gNB %d][RAPROC] FAILURE: preamble %d does not correspond to any of the ones in rach_ConfigDedicated\n", - module_idP, - preamble_index); - continue; // if the PRACH preamble does not correspond to any of the ones sent through RRC abort RA proc - } + continue; // if the PRACH preamble does not correspond to any of the ones sent through RRC abort RA proc } - LOG_D(NR_MAC, "Frame %d, Slot %d: Activating RA process \n", frameP, slotP); - ra->state = Msg2; - ra->timing_offset = timing_offset; - ra->preamble_slot = slotP; - - NR_SearchSpaceId_t ra_SearchSpace = 0; - struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = NULL; - NR_BWP_t *genericParameters = NULL; - if(bwp) { - commonSearchSpaceList = bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList; - ra_SearchSpace = *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace; - genericParameters = &bwp->bwp_Common->genericParameters; - } else { - commonSearchSpaceList = scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList; - ra_SearchSpace = *scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->ra_SearchSpace; - genericParameters = &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters; - } - AssertFatal(commonSearchSpaceList->list.count > 0, "common SearchSpace list has 0 elements\n"); + } + LOG_D(NR_MAC, "Frame %d, Slot %d: Activating RA process \n", frameP, slotP); + ra->state = Msg2; + ra->timing_offset = timing_offset; + ra->preamble_slot = slotP; - // Common SearchSpace list - for (int i = 0; i < commonSearchSpaceList->list.count; i++) { - ss = commonSearchSpaceList->list.array[i]; - if (ss->searchSpaceId == ra_SearchSpace) - ra->ra_ss = ss; - } + NR_SearchSpaceId_t ra_SearchSpace = 0; + struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = NULL; + NR_BWP_t *genericParameters = NULL; + if(bwp) { + commonSearchSpaceList = bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList; + ra_SearchSpace = *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace; + genericParameters = &bwp->bwp_Common->genericParameters; + } else { + commonSearchSpaceList = scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList; + ra_SearchSpace = *scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->ra_SearchSpace; + genericParameters = &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters; + } + AssertFatal(commonSearchSpaceList->list.count > 0, "common SearchSpace list has 0 elements\n"); - AssertFatal(ra->ra_ss!=NULL,"SearchSpace cannot be null for RA\n"); - - ra->coreset = get_coreset(module_idP, scc, bwp, ra->ra_ss, NR_SearchSpace__searchSpaceType_PR_common); - ra->sched_pdcch = set_pdcch_structure(nr_mac, - ra->ra_ss, - ra->coreset, - scc, - genericParameters, - &nr_mac->type0_PDCCH_CSS_config[ra->beam_id]); - - // retrieving ra pdcch monitoring period and offset - find_monitoring_periodicity_offset_common(ra->ra_ss, &monitoring_slot_period, &monitoring_offset); - - nr_schedule_msg2(frameP, - slotP, - &msg2_frame, - &msg2_slot, - scc, - frame_type, - monitoring_slot_period, - monitoring_offset, - beam_index, - cc->num_active_ssb, - nr_mac->tdd_beam_association, - nr_mac->if_inst->sl_ahead); - - ra->Msg2_frame = msg2_frame; - ra->Msg2_slot = msg2_slot; - - LOG_D(NR_MAC, "%s() Msg2[%04d%d] SFN/SF:%04d%d\n", __FUNCTION__, ra->Msg2_frame, ra->Msg2_slot, frameP, slotP); - - int loop = 0; - if (ra->rnti == 0) { // This condition allows for the usage of a preconfigured rnti for the CFRA - do { - ra->rnti = (taus() % 65518) + 1; - loop++; - } while (loop != 100 - && !((find_nr_UE_id(module_idP, ra->rnti) == -1) && (find_nr_RA_id(module_idP, CC_id, ra->rnti) == -1) - && ra->rnti >= 1 && ra->rnti <= 65519)); - if (loop == 100) { - LOG_E(NR_MAC, "%s:%d:%s: [RAPROC] initialisation random access aborted\n", __FILE__, __LINE__, __FUNCTION__); - abort(); - } - } + // Common SearchSpace list + for (int i = 0; i < commonSearchSpaceList->list.count; i++) { + ss = commonSearchSpaceList->list.array[i]; + if (ss->searchSpaceId == ra_SearchSpace) + ra->ra_ss = ss; + } - ra->RA_rnti = ra_rnti; - ra->preamble_index = preamble_index; - ra->beam_id = beam_index; + AssertFatal(ra->ra_ss!=NULL,"SearchSpace cannot be null for RA\n"); + + ra->coreset = get_coreset(nr_mac, scc, bwp, ra->ra_ss, NR_SearchSpace__searchSpaceType_PR_common); + ra->sched_pdcch = set_pdcch_structure(nr_mac, + ra->ra_ss, + ra->coreset, + scc, + genericParameters, + &nr_mac->type0_PDCCH_CSS_config[ra->beam_id]); + + // retrieving ra pdcch monitoring period and offset + find_monitoring_periodicity_offset_common(ra->ra_ss, &monitoring_slot_period, &monitoring_offset); + + nr_schedule_msg2(frameP, + slotP, + &msg2_frame, + &msg2_slot, + scc, + frame_type, + monitoring_slot_period, + monitoring_offset, + beam_index, + cc->num_active_ssb, + nr_mac->tdd_beam_association, + nr_mac->if_inst->sl_ahead); + + ra->Msg2_frame = msg2_frame; + ra->Msg2_slot = msg2_slot; + + LOG_D(NR_MAC, "%s() Msg2[%04d%d] SFN/SF:%04d%d\n", __FUNCTION__, ra->Msg2_frame, ra->Msg2_slot, frameP, slotP); + + int loop = 0; + if (ra->rnti == 0) { // This condition allows for the usage of a preconfigured rnti for the CFRA + do { + ra->rnti = (taus() % 65518) + 1; + loop++; + } while (loop != 100 + && !((find_nr_UE(&nr_mac->UE_info, ra->rnti) == NULL) && (find_nr_RA_id(module_idP, CC_id, ra->rnti) == -1) + && ra->rnti >= 1 && ra->rnti <= 65519)); + if (loop == 100) { + LOG_E(NR_MAC, "%s:%d:%s: [RAPROC] initialisation random access aborted\n", __FILE__, __LINE__, __FUNCTION__); + abort(); + } + } - LOG_I(NR_MAC, - "[gNB %d][RAPROC] CC_id %d Frame %d Activating Msg2 generation in frame %d, slot %d using RA rnti %x SSB " - "index %u RA index %d\n", - module_idP, - CC_id, - frameP, - ra->Msg2_frame, - ra->Msg2_slot, - ra->RA_rnti, - cc->ssb_index[beam_index], - i); + ra->RA_rnti = ra_rnti; + ra->preamble_index = preamble_index; + ra->beam_id = beam_index; + + LOG_I(NR_MAC, + "[gNB %d][RAPROC] CC_id %d Frame %d Activating Msg2 generation in frame %d, slot %d using RA rnti %x SSB, new rnti %04x " + "index %u RA index %d\n", + module_idP, + CC_id, + frameP, + ra->Msg2_frame, + ra->Msg2_slot, + ra->RA_rnti, + ra->rnti, + cc->ssb_index[beam_index], + i); - return; - } + return; } LOG_E(NR_MAC, "[gNB %d][RAPROC] FAILURE: CC_id %d Frame %d initiating RA procedure for preamble index %d\n", module_idP, CC_id, frameP, preamble_index); @@ -741,7 +744,7 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL; NR_BWP_t *genericParameters = NULL; if(ra->CellGroup) { - ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id-1]; + ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->ul_bwp_id-1]; ubwpd = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP; genericParameters = &ubwp->bwp_Common->genericParameters; pusch_TimeDomainAllocationList = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList; @@ -781,8 +784,9 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t uint16_t *vrb_map_UL = &RC.nrmac[module_idP]->common_channels[CC_id].vrb_map_UL[sched_slot * MAX_BWP_SIZE]; - int BWPStart = nr_mac->type0_PDCCH_CSS_config[ra->beam_id].cset_start_rb; - int BWPSize = nr_mac->type0_PDCCH_CSS_config[ra->beam_id].num_rbs; + const int BWPSize = NRRIV2BW(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + const int BWPStart = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + int rbStart = 0; for (int i = 0; (i < ra->msg3_nb_rb) && (rbStart <= (BWPSize - ra->msg3_nb_rb)); i++) { if (vrb_map_UL[rbStart + BWPStart + i]&SL_to_bitmap(StartSymbolIndex, NrOfSymbols)) { @@ -888,7 +892,7 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t ra->Msg3_tda_id, ra->msg3_TPC, 0, // not used in format 0_0 - ra->bwp_id); + ra->ul_bwp_id); fill_dci_pdu_rel15(scc, ra->CellGroup, @@ -897,7 +901,8 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t NR_UL_DCI_FORMAT_0_0, NR_RNTI_TC, pusch_pdu->bwp_size, - ra->bwp_id, + ra->ul_bwp_id, + coresetid, nr_mac->cset0_bwp_size); // Mark the corresponding RBs as used @@ -1012,9 +1017,7 @@ void nr_get_Msg3alloc(module_id_t module_id, int bwpStart = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); if (ra->CellGroup) { - AssertFatal(ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1, - "downlinkBWP_ToAddModList has %d BWP!\n", ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count); - NR_BWP_Uplink_t *ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id - 1]; + NR_BWP_Uplink_t *ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->ul_bwp_id - 1]; int act_bwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); int act_bwp_size = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); if (!((bwpStart >= act_bwp_start) && ((bwpStart+bwpSize) <= (act_bwp_start+act_bwp_size)))) @@ -1087,13 +1090,16 @@ void fill_msg3_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, pusch_pdu->vrb_to_prb_mapping = 0; pusch_pdu->frequency_hopping = fh; - //pusch_pdu->tx_direct_current_location;//The uplink Tx Direct Current location for the carrier. Only values in the value range of this field between 0 and 3299, which indicate the subcarrier index within the carrier corresponding 1o the numerology of the corresponding uplink BWP and value 3300, which indicates "Outside the carrier" and value 3301, which indicates "Undetermined position within the carrier" are used. [TS38.331, UplinkTxDirectCurrentBWP IE] + //pusch_pdu->tx_direct_current_location; + //The uplink Tx Direct Current location for the carrier. Only values in the value range of this field between 0 and 3299, + //which indicate the subcarrier index within the carrier corresponding 1o the numerology of the corresponding uplink BWP and value 3300, + //which indicates "Outside the carrier" and value 3301, which indicates "Undetermined position within the carrier" are used. [TS38.331, UplinkTxDirectCurrentBWP IE] pusch_pdu->uplink_frequency_shift_7p5khz = 0; //Resource Allocation in time domain pusch_pdu->start_symbol_index = start_symbol_index; pusch_pdu->nr_of_symbols = nr_of_symbols; //Optional Data only included if indicated in pduBitmap - pusch_pdu->pusch_data.rv_index = nr_rv_round_map[round]; + pusch_pdu->pusch_data.rv_index = nr_rv_round_map[round%4]; pusch_pdu->pusch_data.harq_process_id = 0; pusch_pdu->pusch_data.new_data_indicator = 1; pusch_pdu->pusch_data.num_cb = 0; @@ -1104,10 +1110,11 @@ void fill_msg3_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, int TBS = 0; while(TBS<7) { // TBS for msg3 is 7 bytes (except for RRCResumeRequest1 currently not implemented) mcsindex++; - pusch_pdu->target_code_rate = nr_get_code_rate_ul(mcsindex,pusch_pdu->mcs_table); + int R = nr_get_code_rate_ul(mcsindex,pusch_pdu->mcs_table); + pusch_pdu->target_code_rate = R; pusch_pdu->qam_mod_order = nr_get_Qm_ul(mcsindex,pusch_pdu->mcs_table); TBS = nr_compute_tbs(pusch_pdu->qam_mod_order, - pusch_pdu->target_code_rate, + R, pusch_pdu->rb_size, pusch_pdu->nr_of_symbols, num_dmrs_symb*12, // nb dmrs set for no data in dmrs symbol @@ -1164,9 +1171,7 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t int mappingtype = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->mappingType; if (ra->CellGroup) { - AssertFatal(ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1, - "downlinkBWP_ToAddModList has %d BWP!\n", ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count); - NR_BWP_Uplink_t *ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id - 1]; + NR_BWP_Uplink_t *ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->ul_bwp_id - 1]; startSymbolAndLength = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->startSymbolAndLength; mappingtype = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->mappingType; @@ -1197,20 +1202,13 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t nr_fill_rar(module_idP, ra, RAR_pdu, pusch_pdu); } -void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP, NR_RA_t *ra) -{ +void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP, NR_RA_t *ra) { gNB_MAC_INST *nr_mac = RC.nrmac[module_idP]; NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id]; if ((ra->Msg2_frame == frameP) && (ra->Msg2_slot == slotP)) { - //TODO time domain assignment for msg2 needs to be improved - uint8_t time_domain_assignment; - if(cc->frame_type == TDD) - time_domain_assignment = 1; - else - time_domain_assignment = 0; int mcsIndex = -1; // initialization value int rbStart = 0; int rbSize = 8; @@ -1227,8 +1225,8 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra ra->CellGroup->spCellConfig && ra->CellGroup->spCellConfig->spCellConfigDedicated && ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList && - ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]) { - bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]; + ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1]) { + bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1]; genericParameters = &bwp->bwp_Common->genericParameters; pdsch_TimeDomainAllocationList = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; } @@ -1250,6 +1248,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } // Calculate number of symbols + int time_domain_assignment = get_dl_tda(nr_mac, scc, slotP); int startSymbolIndex, nrOfSymbols; const int startSymbolAndLength = pdsch_TimeDomainAllocationList->list.array[time_domain_assignment]->startSymbolAndLength; SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); @@ -1328,7 +1327,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra dl_req->nPDUs+=1; nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15; - LOG_D(NR_MAC,"[gNB %d][RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, rnti 0x%x, state %d, CoreSetType %d\n", + LOG_A(NR_MAC,"[gNB %d][RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg2 DCI, rnti 0x%x, state %d, CoreSetType %d\n", module_idP, CC_id, frameP, slotP, ra->RA_rnti, ra->state,pdcch_pdu_rel15->CoreSetType); // SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control @@ -1389,7 +1388,8 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra nr_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, nrOfSymbols, startSymbolIndex, - mappingtype, 1); + mappingtype, + 1); uint8_t tb_scaling = 0; int R, Qm; @@ -1424,6 +1424,11 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->TBSize[0] = TBS; } + int bw_tbslbrm = get_bw_tbslbrm(genericParameters, ra->CellGroup); + pdsch_pdu_rel15->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(mcsTableIdx, + bw_tbslbrm, + 1); + // Fill PDCCH DL DCI PDU nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci]; pdcch_pdu_rel15->numDlDci++; @@ -1477,6 +1482,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra NR_RNTI_RA, BWPSize, bwpid, + coresetid, nr_mac->cset0_bwp_size); // DL TX request @@ -1484,7 +1490,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra // Program UL processing for Msg3 NR_BWP_Uplink_t *ubwp = ra->CellGroup ? - ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id-1] : + ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1] : NULL; nr_get_Msg3alloc(module_idP, CC_id, scc, ubwp, slotP, frameP, ra, nr_mac->tdd_beam_association); nr_add_msg3(module_idP, CC_id, frameP, slotP, ra, (uint8_t *) &tx_req->TLVs[0].value.direct[0]); @@ -1516,7 +1522,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } ra->state = WAIT_Msg3; - LOG_D(NR_MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: RA state %d\n", module_idP, frameP, slotP, ra->state); + LOG_W(NR_MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: rnti %04x RA state %d\n", module_idP, frameP, slotP, ra->rnti, ra->state); } } @@ -1541,8 +1547,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra ra->CellGroup->spCellConfig && ra->CellGroup->spCellConfig->spCellConfigDedicated && ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList && - ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]) { - bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]; + ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1]) { + bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->dl_bwp_id-1]; pdsch_TimeDomainAllocationList = bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList; } else { @@ -1559,9 +1565,14 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra ra->rnti = ra->crnti; } - int UE_id = find_nr_UE_id(module_idP, ra->rnti); - NR_UE_info_t *UE_info = &nr_mac->UE_info; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UE_info_t * UE = find_nr_UE(&nr_mac->UE_info, ra->rnti); + if (!UE) { + LOG_E(NR_MAC,"want to generate Msg4, but rnti %04x not in the table\n", ra->rnti); + return; + } + + LOG_I(NR_MAC,"Generate msg4, rnti: %04x\n", ra->rnti); + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; NR_BWP_t *genericParameters = bwp ? & bwp->bwp_Common->genericParameters : &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters; @@ -1594,7 +1605,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra // Remove UE associated to TC-RNTI if(harq->round==0 && ra->msg3_dcch_dtch) { - mac_remove_nr_ue(module_idP, tc_rnti); + mac_remove_nr_ue(nr_mac, tc_rnti); } // get CCEindex, needed also for PUCCH and then later for PDCCH @@ -1625,7 +1636,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra LOG_D(NR_MAC,"[RAPROC] Msg4 r_pucch %d (CCEIndex %d, nb_of_candidates %d, delta_PRI %d)\n", r_pucch, CCEIndex, nr_of_candidates, delta_PRI); - int alloc = nr_acknack_scheduling(module_idP, UE_id, frameP, slotP, r_pucch, 1); + int alloc = nr_acknack_scheduling(module_idP, UE, frameP, slotP, r_pucch, 1); AssertFatal(alloc>=0,"Couldn't find a pucch allocation for ack nack (msg4)\n"); NR_sched_pucch_t *pucch = &sched_ctrl->sched_pucch[alloc]; harq->feedback_slot = pucch->ul_slot; @@ -1641,13 +1652,25 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } else { uint16_t mac_pdu_length = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, buf, 255, ra->cont_res_id); LOG_D(NR_MAC,"Encoded contention resolution mac_pdu_length %d\n",mac_pdu_length); - uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, &buf[mac_pdu_length+2]); - ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->R = 0; - ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->F = 0; - ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH; - ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->L = mac_sdu_length; - ra->mac_pdu_length = mac_pdu_length + mac_sdu_length + sizeof(NR_MAC_SUBHEADER_SHORT); - LOG_D(NR_MAC,"Encoded RRCSetup Piggyback (%d + %d bytes), mac_pdu_length %d\n", mac_sdu_length, (int)sizeof(NR_MAC_SUBHEADER_SHORT), ra->mac_pdu_length); + uint8_t buffer[CCCH_SDU_SIZE]; + uint8_t mac_subheader_len = sizeof(NR_MAC_SUBHEADER_SHORT); + uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, buffer); + if (mac_sdu_length < 256) { + ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->R = 0; + ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->F = 0; + ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH; + ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->L = mac_sdu_length; + ra->mac_pdu_length = mac_pdu_length + mac_sdu_length + sizeof(NR_MAC_SUBHEADER_SHORT); + } else { + mac_subheader_len = sizeof(NR_MAC_SUBHEADER_LONG); + ((NR_MAC_SUBHEADER_LONG *) &buf[mac_pdu_length])->R = 0; + ((NR_MAC_SUBHEADER_LONG *) &buf[mac_pdu_length])->F = 1; + ((NR_MAC_SUBHEADER_LONG *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH; + ((NR_MAC_SUBHEADER_LONG *) &buf[mac_pdu_length])->L = htons(mac_sdu_length); + ra->mac_pdu_length = mac_pdu_length + mac_sdu_length + sizeof(NR_MAC_SUBHEADER_LONG); + } + LOG_I(NR_MAC,"Encoded RRCSetup Piggyback (%d + %d bytes), mac_pdu_length %d\n", mac_sdu_length, mac_subheader_len, ra->mac_pdu_length); + memcpy(&buf[mac_pdu_length + mac_subheader_len], buffer, mac_sdu_length); } } @@ -1663,7 +1686,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra scc->dmrs_TypeA_Position, nrOfSymbols, startSymbolIndex, - mappingtype, 1); + mappingtype, + 1); uint16_t N_DMRS_SLOT = get_num_dmrs(dlDmrsSymbPos); @@ -1716,6 +1740,8 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra rbSize, nrOfSymbols, N_PRB_DMRS * N_DMRS_SLOT, 0, tb_scaling,1) >> 3; } while (harq->tb_size < ra->mac_pdu_length && mcsIndex<=28); + AssertFatal(harq->tb_size >= ra->mac_pdu_length,"Cannot allocate Msg4\n"); + int i = 0; while ((i < rbSize) && (rbStart + rbSize <= BWPSize)) { if (vrb_map[BWPStart + rbStart + i]&SL_to_bitmap(startSymbolIndex, nrOfSymbols)) { @@ -1762,7 +1788,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra dl_req->nPDUs+=1; nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdsch_pdu->pdsch_pdu.pdsch_pdu_rel15; - LOG_D(NR_MAC, "[gNB %d] [RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg4 DCI, state %d\n", module_idP, CC_id, frameP, slotP, ra->state); + LOG_A(NR_MAC, "[gNB %d] [RAPROC] CC_id %d Frame %d, slotP %d: Generating RA-Msg4 DCI, state %d\n", module_idP, CC_id, frameP, slotP, ra->state); // SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control // information to data and is reset every slot. @@ -1776,11 +1802,12 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra pdsch_pdu_rel15->SubcarrierSpacing = genericParameters->subcarrierSpacing; pdsch_pdu_rel15->CyclicPrefix = 0; pdsch_pdu_rel15->NrOfCodewords = 1; - pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(mcsIndex,mcsTableIdx); + int R = nr_get_code_rate_dl(mcsIndex,mcsTableIdx); + pdsch_pdu_rel15->targetCodeRate[0] = R; pdsch_pdu_rel15->qamModOrder[0] = 2; pdsch_pdu_rel15->mcsIndex[0] = mcsIndex; pdsch_pdu_rel15->mcsTable[0] = mcsTableIdx; - pdsch_pdu_rel15->rvIndex[0] = nr_rv_round_map[harq->round]; + pdsch_pdu_rel15->rvIndex[0] = nr_rv_round_map[harq->round%4]; pdsch_pdu_rel15->dataScramblingId = *scc->physCellId; pdsch_pdu_rel15->nrOfLayers = 1; pdsch_pdu_rel15->transmissionScheme = 0; @@ -1801,6 +1828,11 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra int x_Overhead = 0; nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, tb_scaling); + int bw_tbslbrm = get_bw_tbslbrm(genericParameters, ra->CellGroup); + pdsch_pdu_rel15->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(mcsTableIdx, + bw_tbslbrm, + 1); + pdsch_pdu_rel15->precodingAndBeamforming.num_prgs=1; pdsch_pdu_rel15->precodingAndBeamforming.prg_size=275; pdsch_pdu_rel15->precodingAndBeamforming.dig_bf_interfaces=1; @@ -1867,6 +1899,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra NR_RNTI_TC, pdsch_pdu_rel15->BWPSize, bwpid, + coresetid, nr_mac->cset0_bwp_size); // Add padding header and zero rest out if there is space left @@ -1920,10 +1953,10 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra if(ra->msg3_dcch_dtch) { // If the UE used MSG3 to transfer a DCCH or DTCH message, then contention resolution is successful upon transmission of PDCCH - LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) CBRA procedure succeeded!\n", UE_id, ra->rnti); + LOG_A(NR_MAC, "(ue rnti 0x%04x) CBRA procedure succeeded!\n", ra->rnti); nr_clear_ra_proc(module_idP, CC_id, frameP, ra); - UE_info->active[UE_id] = true; - UE_info->Msg4_ACKed[UE_id] = true; + UE->Msg3_dcch_dtch = true; + UE->Msg4_ACKed = true; remove_front_nr_list(&sched_ctrl->feedback_dl_harq); harq->feedback_slot = -1; @@ -1931,6 +1964,24 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra add_tail_nr_list(&sched_ctrl->available_dl_harq, current_harq_pid); harq->round = 0; harq->ndi ^= 1; + + // Pause scheduling according to: + // 3GPP TS 38.331 Section 12 Table 12.1-1: UE performance requirements for RRC procedures for UEs + const NR_COMMON_channels_t *common_channels = &RC.nrmac[module_idP]->common_channels[0]; + const NR_SIB1_t *sib1 = common_channels->sib1 ? common_channels->sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; + const NR_ServingCellConfig_t *servingCellConfig = UE->CellGroup ? UE->CellGroup->spCellConfig->spCellConfigDedicated : NULL; + NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp, + common_channels->ServingCellConfigCommon, + sib1); + uint32_t delay_ms = servingCellConfig && servingCellConfig->downlinkBWP_ToAddModList ? + NR_RRC_SETUP_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_SETUP_DELAY_MS; + + sched_ctrl->rrc_processing_timer = (delay_ms << genericParameters->subcarrierSpacing); + LOG_I(NR_MAC, "(%d.%d) Activating RRC processing timer for UE %04x with %d ms\n", frameP, slotP, UE->rnti, delay_ms); + + // Reset uplink failure flags/counters/timers at MAC so gNB will resume again scheduling resources for this UE + UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt = 0; + UE->UE_sched_ctrl.ul_failure = 0; } else { ra->state = WAIT_Msg4_ACK; LOG_D(NR_MAC,"[gNB %d][RAPROC] Frame %d, Subframe %d: RA state %d\n", module_idP, frameP, slotP, ra->state); @@ -1940,41 +1991,45 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_frame_t slot, NR_RA_t *ra) { - int UE_id = find_nr_UE_id(module_id, ra->rnti); + NR_UE_info_t * UE = find_nr_UE(&RC.nrmac[module_id]->UE_info, ra->rnti); const int current_harq_pid = ra->harq_pid; - NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid]; - NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id]; + NR_mac_stats_t *stats = &UE->mac_stats; - LOG_D(NR_MAC, "ue %d, rnti 0x%04x, harq is waiting %d, round %d, frame %d %d, harq id %d\n", UE_id, ra->rnti, harq->is_waiting, harq->round, frame, slot, current_harq_pid); + LOG_D(NR_MAC, "ue rnti 0x%04x, harq is waiting %d, round %d, frame %d %d, harq id %d\n", ra->rnti, harq->is_waiting, harq->round, frame, slot, current_harq_pid); if (harq->is_waiting == 0) { if (harq->round == 0) { - if (stats->dlsch_errors == 0) { - LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", UE_id, ra->rnti); - UE_info->active[UE_id] = true; - UE_info->Msg4_ACKed[UE_id] = true; - const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; + if (stats->dl.errors == 0) { + LOG_A(NR_MAC, "(UE RNTI 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", ra->rnti); + UE->Msg4_ACKed = true; + + // Pause scheduling according to: + // 3GPP TS 38.331 Section 12 Table 12.1-1: UE performance requirements for RRC procedures for UEs + const NR_COMMON_channels_t *common_channels = &RC.nrmac[module_id]->common_channels[0]; + const NR_SIB1_t *sib1 = common_channels->sib1 ? common_channels->sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; + const NR_ServingCellConfig_t *servingCellConfig = UE->CellGroup ? UE->CellGroup->spCellConfig->spCellConfigDedicated : NULL; NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp, - RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon, + common_channels->ServingCellConfigCommon, sib1); - // 3GPP TS 38.331 Section 12 Table 12.1-1: UE performance requirements for RRC procedures for UEs - sched_ctrl->rrc_processing_timer = (NR_RRC_SETUP_DELAY_MS << genericParameters->subcarrierSpacing); // RRCSetup 10 ms - } - else { - LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) RA Procedure failed at Msg4!\n", UE_id, ra->rnti); + uint32_t delay_ms = servingCellConfig && servingCellConfig->downlinkBWP_ToAddModList ? + NR_RRC_SETUP_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_SETUP_DELAY_MS; + + sched_ctrl->rrc_processing_timer = (delay_ms << genericParameters->subcarrierSpacing); + LOG_I(NR_MAC, "(%d.%d) Activating RRC processing timer for UE %04x with %d ms\n", frame, slot, UE->rnti, delay_ms); + } else { + LOG_I(NR_MAC, "(ue rnti 0x%04x) RA Procedure failed at Msg4!\n", ra->rnti); } nr_clear_ra_proc(module_id, CC_id, frame, ra); - if(sched_ctrl->retrans_dl_harq.head >= 0) { + if (sched_ctrl->retrans_dl_harq.head >= 0) { remove_nr_list(&sched_ctrl->retrans_dl_harq, current_harq_pid); } - } - else { - LOG_D(NR_MAC, "(ue %i, rnti 0x%04x) Received Nack of RA-Msg4. Preparing retransmission!\n", UE_id, ra->rnti); + } else { + LOG_I(NR_MAC, "(UE %04x) Received Nack of RA-Msg4. Preparing retransmission!\n", ra->rnti); ra->Msg4_frame = (frame + 1) % 1024; ra->Msg4_slot = 1; ra->state = Msg4; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index 9229cfbdbd2..a05c782fb06 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -54,52 +54,6 @@ extern RAN_CONTEXT_t RC; - -uint16_t get_ssboffset_pointa(NR_ServingCellConfigCommon_t *scc,const long band) { - - int ratio; - switch (*scc->ssbSubcarrierSpacing) { - case NR_SubcarrierSpacing_kHz15: - AssertFatal(band <= 95, - "Band %ld is not possible for SSB with 15 kHz SCS\n", - band); - // no band available above 3GHz using 15kHz - ratio = 3; // NRARFCN step is 5 kHz - break; - case NR_SubcarrierSpacing_kHz30: - AssertFatal(band <= 96, - "Band %ld is not possible for SSB with 30 kHz SCS\n", - band); - if (band == 46 || band == 48 || band == 77 || - band == 78 || band == 79 || band == 96) // above 3GHz - ratio = 2; // NRARFCN step is 15 kHz - else - ratio = 6; // NRARFCN step is 5 kHz - break; - case NR_SubcarrierSpacing_kHz120: - AssertFatal(band >= 257, - "Band %ld is not possible for SSB with 120 kHz SCS\n", - band); - ratio = 2; // NRARFCN step is 15 kHz - break; - case NR_SubcarrierSpacing_kHz240: - AssertFatal(band >= 257, - "Band %ld is not possible for SSB with 240 kHz SCS\n", - band); - ratio = 4; // NRARFCN step is 15 kHz - break; - default: - AssertFatal(1 == 0, "SCS %ld not allowed for SSB \n", - *scc->ssbSubcarrierSpacing); - } - - const uint32_t ssb_offset0 = *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA; - - return (ssb_offset0/(ratio*12) - 10); // absoluteFrequencySSB is the center of SSB - -} - - void schedule_ssb(frame_t frame, sub_frame_t slot, NR_ServingCellConfigCommon_t *scc, nfapi_nr_dl_tti_request_body_t *dl_req, @@ -190,7 +144,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) NR_SubcarrierSpacing_t scs = *scc->ssbSubcarrierSpacing; const long band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; - uint16_t offset_pointa = get_ssboffset_pointa(scc,band); + const uint16_t offset_pointa = gNB->ssb_OffsetPointA; uint8_t ssbSubcarrierOffset = gNB->ssb_SubcarrierOffset; const BIT_STRING_t *shortBitmap = &scc->ssb_PositionsInBurst->choice.shortBitmap; @@ -207,8 +161,9 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb); // if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters if ((ssb_start_symbol/14) == rel_slot){ + const int prb_offset = offset_pointa >> scs; schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1)); - fill_ssb_vrb_map(cc, offset_pointa, ssb_start_symbol, CC_id); + fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id); if (get_softmodem_params()->sa == 1) { get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb], frameP, @@ -221,7 +176,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) band, i_ssb, ssb_frame_periodicity, - offset_pointa); + prb_offset); gNB->type0_PDCCH_CSS_config[i_ssb].active = true; } } @@ -235,8 +190,9 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb); // if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters if ((ssb_start_symbol/14) == rel_slot){ + const int prb_offset = offset_pointa >> scs; schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1)); - fill_ssb_vrb_map(cc, offset_pointa, ssb_start_symbol, CC_id); + fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id); if (get_softmodem_params()->sa == 1) { get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb], frameP, @@ -249,7 +205,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) band, i_ssb, ssb_frame_periodicity, - offset_pointa); + prb_offset); gNB->type0_PDCCH_CSS_config[i_ssb].active = true; } } @@ -264,8 +220,9 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb); // if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters if ((ssb_start_symbol/14) == rel_slot){ + const int prb_offset = offset_pointa >> (scs-2); // reference 60kHz schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1)); - fill_ssb_vrb_map(cc, offset_pointa, ssb_start_symbol, CC_id); + fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id); const NR_TDD_UL_DL_Pattern_t *tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1; const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing]; // FR2 is only TDD, to be fixed for flexible TDD @@ -286,7 +243,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) band, i_ssb, ssb_frame_periodicity, - offset_pointa); + prb_offset); gNB->type0_PDCCH_CSS_config[i_ssb].active = true; } } @@ -306,7 +263,7 @@ void schedule_nr_SI(module_id_t module_idP, frame_t frameP, sub_frame_t subframe //---------------------------------------- } -void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, uint16_t symStart, int CC_id) { +void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, int ssb_subcarrier_offset, uint16_t symStart, int CC_id) { AssertFatal(*cc->ServingCellConfigCommon->ssbSubcarrierSpacing != NR_SubcarrierSpacing_kHz240, @@ -314,7 +271,8 @@ void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, uint16_t symStart uint16_t *vrb_map = cc[CC_id].vrb_map; - for (int rb = 0; rb < 20; rb++) + const int extra_prb = ssb_subcarrier_offset > 0; + for (int rb = 0; rb < 20+extra_prb; rb++) vrb_map[rbStart + rb] = SL_to_bitmap(symStart, 4); } @@ -327,7 +285,7 @@ uint32_t schedule_control_sib1(module_id_t module_id, int nrOfSymbols, uint16_t dlDmrsSymbPos, uint8_t candidate_idx, - int num_total_bytes) { + uint16_t num_total_bytes) { gNB_MAC_INST *gNB_mac = RC.nrmac[module_id]; NR_COMMON_channels_t *cc = &gNB_mac->common_channels[CC_id]; @@ -479,7 +437,7 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP, pdsch_pdu_rel15->qamModOrder[0] = 2; pdsch_pdu_rel15->mcsIndex[0] = gNB_mac->sched_ctrlCommon->sched_pdsch.mcs; pdsch_pdu_rel15->mcsTable[0] = 0; - pdsch_pdu_rel15->rvIndex[0] = nr_rv_round_map[0]; + pdsch_pdu_rel15->rvIndex[0] = 0; pdsch_pdu_rel15->dataScramblingId = *scc->physCellId; pdsch_pdu_rel15->nrOfLayers = 1; pdsch_pdu_rel15->transmissionScheme = 0; @@ -504,6 +462,10 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP, LOG_D(NR_MAC,"sib1:rbStart %d, rbSize %d\n",pdsch_pdu_rel15->rbStart,pdsch_pdu_rel15->rbSize); LOG_D(NR_MAC,"sib1:dlDmrsSymbPos = 0x%x\n", pdsch_pdu_rel15->dlDmrsSymbPos); + pdsch_pdu_rel15->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(0, + pdsch_pdu_rel15->BWPSize, + 1); + /* Fill PDCCH DL DCI PDU */ nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci]; pdcch_pdu_rel15->numDlDci++; @@ -548,6 +510,7 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP, rnti_type, pdsch_pdu_rel15->BWPSize, 0, + 0, gNB_mac->cset0_bwp_size); LOG_D(MAC,"BWPSize: %i\n", pdcch_pdu_rel15->BWPSize); @@ -607,7 +570,7 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) // Get SIB1 uint8_t sib1_payload[NR_MAX_SIB_LENGTH/8]; - uint8_t sib1_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, BCCH, SI_RNTI, 1, sib1_payload); + uint16_t sib1_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, BCCH, SI_RNTI, 1, sib1_payload); LOG_D(NR_MAC,"sib1_sdu_length = %i\n", sib1_sdu_length); LOG_D(NR_MAC,"SIB1: \n"); for (int k=0;k<sib1_sdu_length;k++) @@ -635,7 +598,8 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) startSymbolIndex, nrOfSymbols, dlDmrsSymbPos, - candidate_idx, sib1_sdu_length); + candidate_idx, + sib1_sdu_length); nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body; int pdu_index = gNB_mac->pdu_index[0]++; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index 3a67b7fca99..3517c124a57 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -53,105 +53,21 @@ #define WORD 32 //#define SIZE_OF_POINTER sizeof (void *) -void calculate_preferred_dl_tda(module_id_t module_id, const NR_BWP_Downlink_t *bwp) { - gNB_MAC_INST *nrmac = RC.nrmac[module_id]; - const int bwp_id = bwp ? bwp->bwp_Id : 0; +const int get_dl_tda(const gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *scc, int slot) { - if (nrmac->preferred_dl_tda[bwp_id]) - return; + const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL; + AssertFatal(tdd || nrmac->common_channels->frame_type == FDD, "Dynamic TDD not handled yet\n"); - /* there is a mixed slot only when in TDD */ - NR_ServingCellConfigCommon_t *scc = nrmac->common_channels->ServingCellConfigCommon; - frame_type_t frame_type = nrmac->common_channels->frame_type; - const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing]; - const NR_TDD_UL_DL_Pattern_t *tdd = - scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL; - int symb_dlMixed = 0; - int nr_mix_slots = 0; - int nr_slots_period = n; - - if (tdd) { - symb_dlMixed = (1 << tdd->nrofDownlinkSymbols) - 1; - nr_mix_slots = tdd->nrofDownlinkSymbols != 0 || tdd->nrofUplinkSymbols != 0; - nr_slots_period /= get_nb_periods_per_frame(tdd->dl_UL_TransmissionPeriodicity); - } else - // if TDD configuration is not present and the band is not FDD, it means it is a dynamic TDD configuration - AssertFatal(nrmac->common_channels->frame_type == FDD,"Dynamic TDD not handled yet\n"); - - int target_ss; - - if (bwp) { - target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific; - } else { - target_ss = NR_SearchSpace__searchSpaceType_PR_common; - } + // Use special TDA in case of CSI-RS + if(nrmac->UE_info.sched_csirs) + return 1; - const NR_SIB1_t *sib1 = nrmac->common_channels[0].sib1 ? nrmac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; - NR_SearchSpace_t *search_space = get_searchspace(sib1, - scc, - bwp ? bwp->bwp_Dedicated : NULL, - target_ss); - - NR_ControlResourceSet_t *coreset = get_coreset(module_id, scc, bwp ? bwp->bwp_Dedicated : NULL, search_space, target_ss); - // get coreset symbol "map" - const uint16_t symb_coreset = (1 << coreset->duration) - 1; - - NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList = get_pdsch_TimeDomainAllocationList(bwp, - scc, - sib1); - AssertFatal(tdaList->list.count >= 1, "need to have at least one TDA for DL slots\n"); - - /* check that TDA index 0 fits into DL and does not overlap CORESET */ - const NR_PDSCH_TimeDomainResourceAllocation_t *tdaP_DL = tdaList->list.array[0]; - AssertFatal(!tdaP_DL->k0 || *tdaP_DL->k0 == 0, - "TimeDomainAllocation at index 1: non-null k0 (%ld) is not supported by the scheduler\n", - *tdaP_DL->k0); - int start, len; - SLIV2SL(tdaP_DL->startSymbolAndLength, &start, &len); - const uint16_t symb_tda = ((1 << len) - 1) << start; - // check whether coreset and TDA overlap: then we cannot use it. Note that - // here we assume that the coreset is scheduled every slot (which it - // currently is) and starting at symbol 0 - AssertFatal((symb_coreset & symb_tda) == 0, "TDA index 0 for DL overlaps with CORESET\n"); - /* check that TDA index 1 fits into DL part of mixed slot, if it exists */ - int tdaMi = -1; - - if (frame_type == TDD && tdaList->list.count > 1) { - const NR_PDSCH_TimeDomainResourceAllocation_t *tdaP_Mi = tdaList->list.array[1]; - AssertFatal(!tdaP_Mi->k0 || *tdaP_Mi->k0 == 0, - "TimeDomainAllocation at index 1: non-null k0 (%ld) is not supported by the scheduler\n", - *tdaP_Mi->k0); - int start, len; - SLIV2SL(tdaP_Mi->startSymbolAndLength, &start, &len); - const uint16_t symb_tda = ((1 << len) - 1) << start; - - // check whether coreset and TDA overlap: then, we cannot use it. Also, - // check whether TDA is entirely within mixed slot DL. Note that - // here we assume that the coreset is scheduled every slot (which it - // currently is) - if ((symb_coreset & symb_tda) == 0 && (symb_dlMixed & symb_tda) == symb_tda) { - tdaMi = 1; - } else { - LOG_E(MAC, - "TDA index 1 DL overlaps with CORESET or is not entirely in mixed slot (symb_coreset %x symb_dlMixed %x symb_tda %x), won't schedule DL mixed slot\n", - symb_coreset, - symb_dlMixed, - symb_tda); - } - } - - nrmac->preferred_dl_tda[bwp_id] = malloc(n * sizeof(*nrmac->preferred_dl_tda[bwp_id])); - - for (int i = 0; i < n; ++i) { - nrmac->preferred_dl_tda[bwp_id][i] = -1; - - if (frame_type == FDD || i % nr_slots_period < tdd->nrofDownlinkSlots) - nrmac->preferred_dl_tda[bwp_id][i] = 0; - else if (nr_mix_slots && i % nr_slots_period == tdd->nrofDownlinkSlots) - nrmac->preferred_dl_tda[bwp_id][i] = tdaMi; - - LOG_D(MAC, "slot %d preferred_dl_tda %d\n", i, nrmac->preferred_dl_tda[bwp_id][i]); + if (tdd && tdd->nrofDownlinkSymbols > 1) { // if there is a mixed slot where we can transmit DL + const int nr_slots_period = tdd->nrofDownlinkSlots + tdd->nrofUplinkSlots + 1; + if ((slot%nr_slots_period) == tdd->nrofDownlinkSlots) + return 2; } + return 0; // if FDD or not mixed slot in TDD, for now use default TDA (TODO handle CSI-RS slots) } // Compute and write all MAC CEs and subheaders, and return number of written @@ -397,88 +313,12 @@ int nr_write_ce_dlsch_pdu(module_id_t module_idP, return offset; } -#define BLER_UPDATE_FRAME 10 -#define BLER_FILTER 0.9f -int get_mcs_from_bler(module_id_t mod_id, int CC_id, frame_t frame, sub_frame_t slot, int UE_id, int mcs_table) { - gNB_MAC_INST *nrmac = RC.nrmac[mod_id]; - const NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon; - const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing]; - int max_allowed_mcs = (mcs_table == 1) ? 27 : 28; - int max_mcs = nrmac->dl_max_mcs; - - if (nrmac->dl_max_mcs>max_allowed_mcs) - max_mcs = max_allowed_mcs; - - NR_DL_bler_stats_t *bler_stats = &nrmac->UE_info.UE_sched_ctrl[UE_id].dl_bler_stats; - - /* first call: everything is zero. Initialize to sensible default */ - if (bler_stats->last_frame_slot == 0 && bler_stats->mcs == 0) { - bler_stats->last_frame_slot = frame * n + slot; - bler_stats->mcs = 9; - bler_stats->bler = (nrmac->dl_bler_target_lower + nrmac->dl_bler_target_upper) / 2; - bler_stats->rd2_bler = nrmac->dl_rd2_bler_threshold; - } - - const int now = frame * n + slot; - int diff = now - bler_stats->last_frame_slot; - - if (diff < 0) // wrap around - diff += 1024 * n; - - const uint8_t old_mcs = bler_stats->mcs; - const NR_mac_stats_t *stats = &nrmac->UE_info.mac_stats[UE_id]; - - // TODO put back this condition when relevant - /*const int dret3x = stats->dlsch_rounds[3] - bler_stats->dlsch_rounds[3]; - if (dret3x > 0) { - if there is a third retransmission, decrease MCS for stabilization and - restart averaging window to stabilize transmission - bler_stats->last_frame_slot = now; - bler_stats->mcs = max(9, bler_stats->mcs - 1); - memcpy(bler_stats->dlsch_rounds, stats->dlsch_rounds, sizeof(stats->dlsch_rounds)); - LOG_D(MAC, "%4d.%2d: %d retx in 3rd round, setting MCS to %d and restarting window\n", frame, slot, dret3x, bler_stats->mcs); - return bler_stats->mcs; - }*/ - if (diff < BLER_UPDATE_FRAME * n) - return old_mcs; // no update - - // last update is longer than x frames ago - const int dtx = (int)(stats->dlsch_rounds[0] - bler_stats->dlsch_rounds[0]); - const int dretx = (int)(stats->dlsch_rounds[1] - bler_stats->dlsch_rounds[1]); - const int dretx2 = (int)(stats->dlsch_rounds[2] - bler_stats->dlsch_rounds[2]); - const float bler_window = dtx > 0 ? (float) dretx / dtx : bler_stats->bler; - const float rd2_bler_wnd = dtx > 0 ? (float) dretx2 / dtx : bler_stats->rd2_bler; - bler_stats->bler = BLER_FILTER * bler_stats->bler + (1 - BLER_FILTER) * bler_window; - bler_stats->rd2_bler = BLER_FILTER / 4 * bler_stats->rd2_bler + (1 - BLER_FILTER / 4) * rd2_bler_wnd; - int new_mcs = old_mcs; - - // TODO put back this condition when relevant - /* first ensure that number of 2nd retx is below threshold. If this is the - * case, use 1st retx to adjust faster - if (bler_stats->rd2_bler > nrmac->dl_rd2_bler_threshold && old_mcs > 6) { - new_mcs -= 2; - } else if (bler_stats->rd2_bler < nrmac->dl_rd2_bler_threshold) {*/ - if (bler_stats->bler < nrmac->dl_bler_target_lower && old_mcs < max_mcs && dtx > 9) - new_mcs += 1; - else if (bler_stats->bler > nrmac->dl_bler_target_upper && old_mcs > 6) - new_mcs -= 1; - - // else we are within threshold boundaries - bler_stats->last_frame_slot = now; - bler_stats->mcs = new_mcs; - memcpy(bler_stats->dlsch_rounds, stats->dlsch_rounds, sizeof(stats->dlsch_rounds)); - LOG_D(MAC, "%4d.%2d MCS %d -> %d (dtx %d, dretx %d, BLER wnd %.3f avg %.6f, dretx2 %d, RD2 BLER wnd %.3f avg %.6f)\n", - frame, slot, old_mcs, new_mcs, dtx, dretx, bler_window, bler_stats->bler, dretx2, rd2_bler_wnd, bler_stats->rd2_bler); - return new_mcs; -} - void nr_store_dlsch_buffer(module_id_t module_id, frame_t frame, sub_frame_t slot) { - NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info; - for (int UE_id = UE_info->list.head; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) { - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + UE_iterator(RC.nrmac[module_id]->UE_info.list, UE) { + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; sched_ctrl->num_total_bytes = 0; sched_ctrl->dl_pdus_total = 0; @@ -486,13 +326,11 @@ void nr_store_dlsch_buffer(module_id_t module_id, // Note: DL_SCH_LCID_DCCH, DL_SCH_LCID_DCCH1, DL_SCH_LCID_DTCH for (int i = 0; i < sched_ctrl->dl_lc_num; ++i) { const int lcid = sched_ctrl->dl_lc_ids[i]; - const uint16_t rnti = UE_info->rnti[UE_id]; - LOG_D(NR_MAC, "In %s: UE %d/%x: LCID %d\n", __FUNCTION__, UE_id, rnti, lcid); - + const uint16_t rnti = UE->rnti; + LOG_D(NR_MAC, "In %s: UE %x: LCID %d\n", __FUNCTION__, rnti, lcid); if (lcid == DL_SCH_LCID_DTCH && sched_ctrl->rrc_processing_timer > 0) { continue; } - start_meas(&RC.nrmac[module_id]->rlc_status_ind); sched_ctrl->rlc_status[lcid] = mac_rlc_status_ind(module_id, rnti, @@ -518,7 +356,7 @@ void nr_store_dlsch_buffer(module_id_t module_id, slot, lcid < 4 ? "DCCH":"DTCH", lcid, - UE_id, + UE->rnti, sched_ctrl->rlc_status[lcid].bytes_in_buffer, sched_ctrl->num_total_bytes, sched_ctrl->dl_pdus_total, @@ -527,21 +365,42 @@ void nr_store_dlsch_buffer(module_id_t module_id, } } +void abort_nr_dl_harq(NR_UE_info_t* UE, int8_t harq_pid) { + + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + NR_UE_harq_t *harq = &sched_ctrl->harq_processes[harq_pid]; + + harq->ndi ^= 1; + harq->round = 0; + UE->mac_stats.dl.errors++; + add_tail_nr_list(&sched_ctrl->available_dl_harq, harq_pid); + +} + bool allocate_dl_retransmission(module_id_t module_id, frame_t frame, sub_frame_t slot, uint16_t *rballoc_mask, int *n_rb_sched, - int UE_id, + NR_UE_info_t *UE, int current_harq_pid) { - gNB_MAC_INST *nr_mac = RC.nrmac[module_id]; const NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels->ServingCellConfigCommon; - NR_UE_info_t *UE_info = &nr_mac->UE_info; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; NR_sched_pdsch_t *retInfo = &sched_ctrl->harq_processes[current_harq_pid].sched_pdsch; - NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id]; + NR_CellGroupConfig_t *cg = UE->CellGroup; + NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static; + + //TODO remove this and handle retransmission with old nrOfLayers + // once ps structure is removed + if(ps->nrOfLayers < retInfo->nrOfLayers) { + LOG_W(NR_MAC,"Cannot schedule retransmission. RI changed from %d to %d\n", + retInfo->nrOfLayers, ps->nrOfLayers); + abort_nr_dl_harq(UE, current_harq_pid); + remove_front_nr_list(&sched_ctrl->retrans_dl_harq); + return false; + } NR_BWP_DownlinkDedicated_t *bwpd = cg && @@ -565,9 +424,8 @@ bool allocate_dl_retransmission(module_id_t module_id, const uint16_t bwpSize = coresetid == 0 ? RC.nrmac[module_id]->cset0_bwp_size : NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE); int rbStart = 0; // start wrt BWPstart - NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static; int rbSize = 0; - const int tda = RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0][slot]; + const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot); AssertFatal(tda>=0,"Unable to find PDSCH time domain allocation in list\n"); if (tda == retInfo->time_domain_allocation) { @@ -581,7 +439,7 @@ bool allocate_dl_retransmission(module_id_t module_id, rbStart++; if (rbStart >= bwpSize) { - LOG_D(NR_MAC, "cannot allocate retransmission for UE %d/RNTI %04x: no resources\n", UE_id, UE_info->rnti[UE_id]); + LOG_D(NR_MAC, "cannot allocate retransmission for RNTI %04x: no resources\n", UE->rnti); return false; } @@ -653,8 +511,8 @@ bool allocate_dl_retransmission(module_id_t module_id, } /* Find a free CCE */ - const int cid = sched_ctrl->coreset->controlResourceSetId; - const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]); + + const uint32_t Y = get_Y(sched_ctrl->search_space, slot, UE->rnti); uint8_t nr_of_candidates; for (int i=0; i<5; i++) { @@ -676,8 +534,8 @@ bool allocate_dl_retransmission(module_id_t module_id, Y); if (CCEIndex<0) { - LOG_D(MAC, "%4d.%2d could not find CCE for DL DCI retransmission UE %d/RNTI %04x\n", - frame, slot, UE_id, UE_info->rnti[UE_id]); + LOG_D(MAC, "%4d.%2d could not find CCE for DL DCI retransmission RNTI %04x\n", + frame, slot, UE->rnti); return false; } @@ -685,15 +543,13 @@ bool allocate_dl_retransmission(module_id_t module_id, * allocation after CCE alloc fail would be more complex) */ int r_pucch = nr_get_pucch_resource(sched_ctrl->coreset, sched_ctrl->active_ubwp, ubwpd, CCEIndex); - const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, r_pucch, 0); + const int alloc = nr_acknack_scheduling(module_id, UE, frame, slot, r_pucch, 0); if (alloc<0) { LOG_D(MAC, - "could not find PUCCH for UE %d/%04x@%d.%d\n", - UE_id, - UE_info->rnti[UE_id], + "could not find PUCCH for UE %04x@%d.%d\n", + UE->rnti, frame, slot); - RC.nrmac[module_id]->pdcch_cand[cid]--; return false; } @@ -716,48 +572,54 @@ bool allocate_dl_retransmission(module_id_t module_id, return true; } -float thr_ue[MAX_MOBILES_PER_GNB]; uint32_t pf_tbs[3][29]; // pre-computed, approximate TBS values for PF coefficient +typedef struct UEsched_s { + float coef; + NR_UE_info_t * UE; +} UEsched_t; + +static int comparator(const void *p, const void *q) { + return ((UEsched_t*)p)->coef < ((UEsched_t*)q)->coef; +} void pf_dl(module_id_t module_id, frame_t frame, sub_frame_t slot, - NR_list_t *UE_list, + NR_UE_info_t **UE_list, int max_num_ue, int n_rb_sched, uint16_t *rballoc_mask) { gNB_MAC_INST *mac = RC.nrmac[module_id]; - NR_UE_info_t *UE_info = &mac->UE_info; NR_ServingCellConfigCommon_t *scc=mac->common_channels[0].ServingCellConfigCommon; - float coeff_ue[MAX_MOBILES_PER_GNB]; // UEs that could be scheduled - int ue_array[MAX_MOBILES_PER_GNB]; - int layers[MAX_MOBILES_PER_GNB]; - NR_list_t UE_sched = { .head = -1, .next = ue_array, .tail = -1, .len = MAX_MOBILES_PER_GNB }; + UEsched_t UE_sched[MAX_MOBILES_PER_GNB] = {0}; + int remainUEs = max_num_ue; + int curUE = 0; /* Loop UE_info->list to check retransmission */ - for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { - if (UE_info->Msg4_ACKed[UE_id] != true) continue; + UE_iterator(UE_list, UE) { + if (UE->Msg4_ACKed != true) + continue; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; if (sched_ctrl->ul_failure==1 && get_softmodem_params()->phy_test==0) continue; + const NR_mac_dir_stats_t *stats = &UE->mac_stats.dl; NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch; NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static; /* get the PID of a HARQ process awaiting retrnasmission, or -1 otherwise */ sched_pdsch->dl_harq_pid = sched_ctrl->retrans_dl_harq.head; - layers[UE_id] = ps->nrOfLayers; // initialization of layers to the previous value in the strcuture + UE->layers = ps->nrOfLayers; // initialization of layers to the previous value in the structure /* Calculate Throughput */ const float a = 0.0005f; // corresponds to 200ms window - const uint32_t b = UE_info->mac_stats[UE_id].dlsch_current_bytes; - thr_ue[UE_id] = (1 - a) * thr_ue[UE_id] + a * b; + const uint32_t b = UE->mac_stats.dl.current_bytes; + UE->dl_thr_ue = (1 - a) * UE->dl_thr_ue + a * b; /* retransmission */ if (sched_pdsch->dl_harq_pid >= 0) { /* Allocate retransmission */ - bool r = allocate_dl_retransmission( - module_id, frame, slot, rballoc_mask, &n_rb_sched, UE_id, sched_pdsch->dl_harq_pid); + bool r = allocate_dl_retransmission(module_id, frame, slot, rballoc_mask, &n_rb_sched, UE, sched_pdsch->dl_harq_pid); if (!r) { LOG_D(NR_MAC, "%4d.%2d retransmission can NOT be allocated\n", frame, slot); @@ -765,18 +627,27 @@ void pf_dl(module_id_t module_id, } /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */ - max_num_ue--; + remainUEs--; + + // we have filled all with mandatory retransmissions + // no need to schedule new transmissions + if (remainUEs == 0) + return; - if (max_num_ue < 0) return; } else { /* Check DL buffer and skip this UE if no bytes and no TA necessary */ if (sched_ctrl->num_total_bytes == 0 && frame != (sched_ctrl->ta_frame + 10) % 1024) continue; /* Calculate coeff */ - set_dl_mcs(sched_pdsch,sched_ctrl,&mac->dl_max_mcs,ps->mcsTableIdx); - sched_pdsch->mcs = get_mcs_from_bler(module_id, /* CC_id = */ 0, frame, slot, UE_id, ps->mcsTableIdx); - layers[UE_id] = set_dl_nrOfLayers(sched_ctrl); + const NR_bler_options_t *bo = &mac->dl_bler; + const int max_mcs_table = ps->mcsTableIdx == 1 ? 27 : 28; + const int max_mcs = min(sched_ctrl->dl_max_mcs, max_mcs_table); + if (bo->harq_round_max == 1) + sched_pdsch->mcs = max_mcs; + else + sched_pdsch->mcs = get_mcs_from_bler(bo, stats, &sched_ctrl->dl_bler_stats, max_mcs, frame); + UE->layers = set_dl_nrOfLayers(sched_ctrl); const uint8_t Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx); const uint16_t R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx); uint32_t tbs = nr_compute_tbs(Qm, @@ -786,40 +657,26 @@ void pf_dl(module_id_t module_id, 0, /* N_PRB_DMRS * N_DMRS_SLOT */ 0 /* N_PRB_oh, 0 for initialBWP */, 0 /* tb_scaling */, - layers[UE_id]) >> 3; - coeff_ue[UE_id] = (float) tbs / thr_ue[UE_id]; - LOG_D(NR_MAC,"b %d, thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n", - b, UE_id, thr_ue[UE_id], tbs, UE_id, coeff_ue[UE_id]); + UE->layers) >> 3; + float coeff_ue = (float) tbs / UE->dl_thr_ue; + LOG_D(NR_MAC,"UE %04x b %d, thr_ue %f, tbs %d, coeff_ue %f\n", + UE->rnti, b, UE->dl_thr_ue, tbs, coeff_ue); /* Create UE_sched list for UEs eligible for new transmission*/ - add_tail_nr_list(&UE_sched, UE_id); + UE_sched[curUE].coef=coeff_ue; + UE_sched[curUE].UE=UE; + curUE++; } } + qsort(UE_sched, sizeof(*UE_sched), sizeofArray(UE_sched), comparator); + UEsched_t *iterator = UE_sched; + const int min_rbSize = 5; /* Loop UE_sched to find max coeff and allocate transmission */ - while (max_num_ue > 0 && n_rb_sched >= min_rbSize && UE_sched.head >= 0) { - /* Find max coeff from UE_sched*/ - int *max = &UE_sched.head; /* assume head is max */ - int *p = &UE_sched.next[*max]; - - while (*p >= 0) { - /* if the current one has larger coeff, save for later */ - if (coeff_ue[*p] > coeff_ue[*max]) - max = p; - - p = &UE_sched.next[*p]; - } - - /* remove the max one: do not use remove_nr_list() it goes through the - * whole list every time. Note that UE_sched.tail might not be set - * correctly anymore */ - const int UE_id = *max; - p = &UE_sched.next[*max]; - *max = UE_sched.next[*max]; - *p = -1; - NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id]; + while (remainUEs> 0 && n_rb_sched >= min_rbSize && iterator->UE != NULL) { + NR_CellGroupConfig_t *cg = iterator->UE->CellGroup; NR_BWP_DownlinkDedicated_t *bwpd = cg && @@ -834,26 +691,32 @@ void pf_dl(module_id_t module_id, cg->spCellConfig->spCellConfigDedicated->uplinkConfig ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - const uint16_t rnti = UE_info->rnti[UE_id]; - const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; + NR_UE_sched_ctrl_t *sched_ctrl = &iterator->UE->UE_sched_ctrl; + const uint16_t rnti = iterator->UE->rnti; + const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? + RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : + NULL; NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp, RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon, sib1); - const int coresetid = (sched_ctrl->active_bwp||bwpd) ? sched_ctrl->coreset->controlResourceSetId : RC.nrmac[module_id]->sched_ctrlCommon->coreset->controlResourceSetId; - const uint16_t bwpSize = coresetid == 0 ? RC.nrmac[module_id]->cset0_bwp_size : NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE); + const int coresetid = (sched_ctrl->active_bwp||bwpd) ? + sched_ctrl->coreset->controlResourceSetId : + RC.nrmac[module_id]->sched_ctrlCommon->coreset->controlResourceSetId; + const uint16_t bwpSize = coresetid == 0 ? + RC.nrmac[module_id]->cset0_bwp_size : + NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE); int rbStart = 0; // start wrt BWPstart if (sched_ctrl->available_dl_harq.head < 0) { - LOG_D(MAC, "UE %d RNTI %04x has no free HARQ process, skipping\n", UE_id, UE_info->rnti[UE_id]); + LOG_D(MAC, "RNTI %04x has no free HARQ process, skipping\n", iterator->UE->rnti); + iterator++; continue; } /* Find a free CCE */ - const int cid = sched_ctrl->coreset->controlResourceSetId; - const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]); + const uint32_t Y = get_Y(sched_ctrl->search_space, slot, iterator->UE->rnti); uint8_t nr_of_candidates; for (int i=0; i<5; i++) { @@ -875,7 +738,8 @@ void pf_dl(module_id_t module_id, Y); if (CCEIndex<0) { - LOG_D(NR_MAC, "%4d.%2d could not find CCE for DL DCI UE %d/RNTI %04x\n", frame, slot, UE_id, rnti); + LOG_D(NR_MAC, "%4d.%2d could not find CCE for DL DCI RNTI %04x\n", frame, slot, rnti); + iterator++; continue; } @@ -883,48 +747,39 @@ void pf_dl(module_id_t module_id, * allocation after CCE alloc fail would be more complex) */ int r_pucch = nr_get_pucch_resource(sched_ctrl->coreset, sched_ctrl->active_ubwp, ubwpd, CCEIndex); - const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, r_pucch, 0); + const int alloc = nr_acknack_scheduling(module_id, iterator->UE, frame, slot, r_pucch, 0); if (alloc<0) { LOG_D(NR_MAC, - "could not find PUCCH for UE %d/%04x@%d.%d\n", - UE_id, + "could not find PUCCH for %04x@%d.%d\n", rnti, frame, slot); - mac->pdcch_cand[cid]--; + iterator++; continue; } - /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE - * and PUCCH */ - max_num_ue--; - AssertFatal(max_num_ue >= 0, "Illegal max_num_ue %d\n", max_num_ue); sched_ctrl->cce_index = CCEIndex; fill_pdcch_vrb_map(mac, /* CC_id = */ 0, &sched_ctrl->sched_pdcch, CCEIndex, sched_ctrl->aggregation_level); - /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */ - max_num_ue--; - - if (max_num_ue < 0) return; /* MCS has been set above */ - const int tda = RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0][slot]; + const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot); AssertFatal(tda>=0,"Unable to find PDSCH time domain allocation in list\n"); NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch; NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static; - if (ps->nrOfLayers != layers[UE_id] || ps->time_domain_allocation != tda) { + if (ps->nrOfLayers != iterator->UE->layers || ps->time_domain_allocation != tda ) { nr_set_pdsch_semi_static(sib1, scc, - UE_info->CellGroup[UE_id], + iterator->UE->CellGroup, sched_ctrl->active_bwp, bwpd, tda, - layers[UE_id], + iterator->UE->layers, sched_ctrl, ps); } @@ -969,27 +824,25 @@ void pf_dl(module_id_t module_id, for (int rb = 0; rb < sched_pdsch->rbSize; rb++) rballoc_mask[rb + sched_pdsch->rbStart] ^= slbitmap; + + remainUEs--; + iterator++; } } void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t slot) { - NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info; + NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info; - if (UE_info->num_UEs == 0) + if (UE_info->list[0] == NULL) return; NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon; const int CC_id = 0; /* Get bwpSize and TDAfrom the first UE */ /* This is temporary and it assumes all UEs have the same BWP and TDA*/ - int UE_id = UE_info->list.head; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - const int bwp_id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0; - - if (!RC.nrmac[module_id]->preferred_dl_tda[bwp_id]) - return; - - const int tda = RC.nrmac[module_id]->preferred_dl_tda[bwp_id][slot]; + NR_UE_info_t *UE=UE_info->list[0]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot); int startSymbolIndex, nrOfSymbols; const struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList : @@ -998,17 +851,16 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength; SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); - const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; NR_BWP_t *genericParameters = get_dl_bwp_genericParameters(sched_ctrl->active_bwp, RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon, sib1); NR_BWP_DownlinkDedicated_t *bwpd = - UE_info->CellGroup[UE_id] && - UE_info->CellGroup[UE_id]->spCellConfig && - UE_info->CellGroup[UE_id]->spCellConfig->spCellConfigDedicated ? - UE_info->CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL; + UE->CellGroup && + UE->CellGroup->spCellConfig && + UE->CellGroup->spCellConfig->spCellConfigDedicated ? + UE->CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL; const int coresetid = (sched_ctrl->active_bwp||bwpd) ? sched_ctrl->coreset->controlResourceSetId : RC.nrmac[module_id]->sched_ctrlCommon->coreset->controlResourceSetId; @@ -1026,9 +878,9 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t rballoc_mask[i] = (~vrb_map[i+BWPStart])&0x3fff; //bitwise not and 14 symbols // if all the pdsch symbols are free - if((rballoc_mask[i]&slbitmap) == - slbitmap) + if ((rballoc_mask[i]&slbitmap) == slbitmap) { n_rb_sched++; + } } /* Retrieve amount of data to send for this UE */ @@ -1037,7 +889,7 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t pf_dl(module_id, frame, slot, - &UE_info->list, + UE_info->list, MAX_MOBILES_PER_GNB, n_rb_sched, rballoc_mask); @@ -1078,24 +930,21 @@ void nr_schedule_ue_spec(module_id_t module_id, if (!is_xlsch_in_slot(gNB_mac->dlsch_slot_bitmap[slot / 64], slot)) return; - //if (slot==7 || slot == 17) return; - /* PREPROCESSOR */ gNB_mac->pre_processor_dl(module_id, frame, slot); const int CC_id = 0; NR_ServingCellConfigCommon_t *scc = gNB_mac->common_channels[CC_id].ServingCellConfigCommon; - NR_UE_info_t *UE_info = &gNB_mac->UE_info; + NR_UEs_t *UE_info = &gNB_mac->UE_info; nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body; - NR_list_t *UE_list = &UE_info->list; - for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + UE_iterator(UE_info->list, UE) { + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; if (sched_ctrl->ul_failure==1 && get_softmodem_params()->phy_test==0) continue; NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch; - UE_info->mac_stats[UE_id].dlsch_current_bytes = 0; - NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id]; + UE->mac_stats.dl.current_bytes = 0; + NR_CellGroupConfig_t *cg = UE->CellGroup; NR_BWP_DownlinkDedicated_t *bwpd = cg && @@ -1109,13 +958,13 @@ void nr_schedule_ue_spec(module_id_t module_id, * If we add the CE, ta_apply will be reset */ if (frame == (sched_ctrl->ta_frame + 10) % 1024) { sched_ctrl->ta_apply = true; /* the timer is reset once TA CE is scheduled */ - LOG_D(NR_MAC, "[UE %d][%d.%d] UL timing alignment procedures: setting flag for Timing Advance command\n", UE_id, frame, slot); + LOG_D(NR_MAC, "[UE %04x][%d.%d] UL timing alignment procedures: setting flag for Timing Advance command\n", UE->rnti, frame, slot); } if (sched_pdsch->rbSize <= 0) continue; - const rnti_t rnti = UE_info->rnti[UE_id]; + const rnti_t rnti = UE->rnti; /* pre-computed PDSCH values that only change if time domain * allocation/DMRS parameters change. Updated in the preprocessor through * nr_set_pdsch_semi_static() */ @@ -1131,8 +980,8 @@ void nr_schedule_ue_spec(module_id_t module_id, /* PP has not selected a specific HARQ Process, get a new one */ current_harq_pid = sched_ctrl->available_dl_harq.head; AssertFatal(current_harq_pid >= 0, - "no free HARQ process available for UE %d\n", - UE_id); + "no free HARQ process available for UE %04x\n", + UE->rnti); remove_front_nr_list(&sched_ctrl->available_dl_harq); sched_pdsch->dl_harq_pid = current_harq_pid; } else { @@ -1152,12 +1001,11 @@ void nr_schedule_ue_spec(module_id_t module_id, harq->feedback_frame = pucch->frame; harq->feedback_slot = pucch->ul_slot; harq->is_waiting = true; - UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++; + UE->mac_stats.dl.rounds[harq->round]++; LOG_D(NR_MAC, - "%4d.%2d [DLSCH/PDSCH/PUCCH] UE %d RNTI %04x DCI L %d start %3d RBs %3d startSymbol %2d nb_symbol %2d dmrspos %x MCS %2d nrOfLayers %d TBS %4d HARQ PID %2d round %d RV %d NDI %d dl_data_to_ULACK %d (%d.%d) PUCCH allocation %d TPC %d\n", + "%4d.%2d [DLSCH/PDSCH/PUCCH] RNTI %04x DCI L %d start %3d RBs %3d startSymbol %2d nb_symbol %2d dmrspos %x MCS %2d nrOfLayers %d TBS %4d HARQ PID %2d round %d RV %d NDI %d dl_data_to_ULACK %d (%d.%d) PUCCH allocation %d TPC %d\n", frame, slot, - UE_id, rnti, sched_ctrl->aggregation_level, sched_pdsch->rbStart, @@ -1170,7 +1018,7 @@ void nr_schedule_ue_spec(module_id_t module_id, TBS, current_harq_pid, harq->round, - nr_rv_round_map[harq->round], + nr_rv_round_map[harq->round%4], harq->ndi, pucch->timing_indicator, pucch->frame, @@ -1186,7 +1034,7 @@ void nr_schedule_ue_spec(module_id_t module_id, NR_SearchSpace_t *ss = (bwp||bwpd) ? sched_ctrl->search_space : gNB_mac->sched_ctrlCommon->search_space; - const int bwpid = bwp ? bwp->bwp_Id : 0; + const int bwp_id = bwp ? bwp->bwp_Id : 0; const int coresetid = (bwp||bwpd) ? sched_ctrl->coreset->controlResourceSetId : gNB_mac->sched_ctrlCommon->coreset->controlResourceSetId; /* look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it */ @@ -1200,7 +1048,7 @@ void nr_schedule_ue_spec(module_id_t module_id, dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu)); dl_req->nPDUs += 1; pdcch_pdu = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15; - LOG_D(NR_MAC,"Trying to configure DL pdcch for UE %d, bwp %d, cs %d\n",UE_id,bwpid,coresetid); + LOG_D(NR_MAC,"Trying to configure DL pdcch for UE %04x, bwp %d, cs %d\n", UE->rnti, bwp_id, coresetid); NR_ControlResourceSet_t *coreset = (bwp||bwpd)? sched_ctrl->coreset:gNB_mac->sched_ctrlCommon->coreset; nr_configure_pdcch(pdcch_pdu, coreset, genericParameters, &sched_ctrl->sched_pdcch); gNB_mac->pdcch_pdu_idx[CC_id][coresetid] = pdcch_pdu; @@ -1232,13 +1080,14 @@ void nr_schedule_ue_spec(module_id_t module_id, pdsch_pdu->CyclicPrefix = genericParameters->cyclicPrefix ? *genericParameters->cyclicPrefix : 0; // Codeword information pdsch_pdu->NrOfCodewords = 1; + //number of information bits per 1024 coded bits expressed in 0.1 bit units pdsch_pdu->targetCodeRate[0] = R; pdsch_pdu->qamModOrder[0] = Qm; pdsch_pdu->mcsIndex[0] = sched_pdsch->mcs; pdsch_pdu->mcsTable[0] = ps->mcsTableIdx; AssertFatal(harq!=NULL,"harq is null\n"); - AssertFatal(harq->round<4,"%d",harq->round); - pdsch_pdu->rvIndex[0] = nr_rv_round_map[harq->round]; + AssertFatal(harq->round<gNB_mac->dl_bler.harq_round_max,"%d",harq->round); + pdsch_pdu->rvIndex[0] = nr_rv_round_map[harq->round%4]; pdsch_pdu->TBSize[0] = TBS; pdsch_pdu->dataScramblingId = *scc->physCellId; pdsch_pdu->nrOfLayers = nrOfLayers; @@ -1259,6 +1108,27 @@ void nr_schedule_ue_spec(module_id_t module_id, // Resource Allocation in time domain pdsch_pdu->StartSymbolIndex = ps->startSymbolIndex; pdsch_pdu->NrOfSymbols = ps->nrOfSymbols; + // Precoding + if (sched_ctrl->set_pmi) { + const int report_id = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.csi_report_id; + nr_csi_report_t *csi_report = &UE->csi_report_template[report_id]; + pdsch_pdu->precodingAndBeamforming.prg_size = pdsch_pdu->rbSize; + pdsch_pdu->precodingAndBeamforming.prgs_list[0].pm_idx = set_pm_index(sched_ctrl, + nrOfLayers, + csi_report->N1, + csi_report->N2, + gNB_mac->xp_pdsch_antenna_ports, + csi_report->codebook_mode); + } + // TBS_LBRM according to section 5.4.2.1 of 38.212 + long maxMIMO_Layers = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated ? *cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers : 1; + int nl_tbslbrm = maxMIMO_Layers < 4 ? maxMIMO_Layers : 4; + // Maximum number of PRBs across all configured DL BWPs + int bw_tbslbrm = get_bw_tbslbrm(genericParameters, cg); + pdsch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(ps->mcsTableIdx, + bw_tbslbrm, + nl_tbslbrm); + NR_PDSCH_Config_t *pdsch_Config=NULL; if (bwp && @@ -1312,19 +1182,18 @@ void nr_schedule_ue_spec(module_id_t module_id, dci_pdu_rel15_t dci_payload; memset(&dci_payload, 0, sizeof(dci_pdu_rel15_t)); // bwp indicator - const int n_dl_bwp = bwp ? UE_info->CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count : 0; - AssertFatal(n_dl_bwp <= 1, "downlinkBWP_ToAddModList has %d BWP!\n", n_dl_bwp); + const int n_dl_bwp = bwp ? cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count : 0; + AssertFatal(n_dl_bwp <= NR_MAX_NUM_BWP, "downlinkBWP_ToAddModList has %d BWP!\n", n_dl_bwp); + // as per table 7.3.1.1.2-1 in 38.212 dci_payload.bwp_indicator.val = bwp ? (n_dl_bwp < 4 ? bwp->bwp_Id : bwp->bwp_Id - 1) : 0; if (bwp) AssertFatal(bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation == NR_PDSCH_Config__resourceAllocation_resourceAllocationType1, "Only frequency resource allocation type 1 is currently supported\n"); - dci_payload.frequency_domain_assignment.val = - PRBalloc_to_locationandbandwidth0( - pdsch_pdu->rbSize, - pdsch_pdu->rbStart, - pdsch_pdu->BWPSize); + dci_payload.frequency_domain_assignment.val = PRBalloc_to_locationandbandwidth0(pdsch_pdu->rbSize, + pdsch_pdu->rbStart, + pdsch_pdu->BWPSize); dci_payload.format_indicator = 1; dci_payload.time_domain_assignment.val = ps->time_domain_allocation; dci_payload.mcs = sched_pdsch->mcs; @@ -1339,13 +1208,14 @@ void nr_schedule_ue_spec(module_id_t module_id, dci_payload.dmrs_sequence_initialization.val = pdsch_pdu->SCID; LOG_D(NR_MAC, "%4d.%2d DCI type 1 payload: freq_alloc %d (%d,%d,%d), " - "time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d tpc %d ti %d\n", + "nrOfLayers %d, time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d tpc %d ti %d\n", frame, slot, dci_payload.frequency_domain_assignment.val, pdsch_pdu->rbStart, pdsch_pdu->rbSize, pdsch_pdu->BWPSize, + pdsch_pdu->nrOfLayers, dci_payload.time_domain_assignment.val, dci_payload.vrb_to_prb_mapping.val, dci_payload.mcs, @@ -1355,19 +1225,19 @@ void nr_schedule_ue_spec(module_id_t module_id, dci_payload.tpc, pucch->timing_indicator); - int dci_format = ss && ss->searchSpaceType && ss->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_ue_Specific ? NR_DL_DCI_FORMAT_1_1 : NR_DL_DCI_FORMAT_1_0; const int rnti_type = NR_RNTI_C; fill_dci_pdu_rel15(scc, - UE_info->CellGroup[UE_id], + cg, dci_pdu, &dci_payload, dci_format, rnti_type, pdsch_pdu->BWPSize, - bwp? bwp->bwp_Id : 0, + bwp ? bwp->bwp_Id : 0, + coresetid, gNB_mac->cset0_bwp_size); LOG_D(NR_MAC, @@ -1381,17 +1251,16 @@ void nr_schedule_ue_spec(module_id_t module_id, * from RLC or encode MAC CEs. The TX_req structure is filled below * or copy data to FAPI structures */ LOG_D(NR_MAC, - "%d.%2d DL retransmission UE %d/RNTI %04x HARQ PID %d round %d NDI %d\n", + "%d.%2d DL retransmission RNTI %04x HARQ PID %d round %d NDI %d\n", frame, slot, - UE_id, rnti, current_harq_pid, harq->round, harq->ndi); AssertFatal(harq->sched_pdsch.tb_size == TBS, - "UE %d mismatch between scheduled TBS and buffered TB for HARQ PID %d\n", - UE_id, + "UE %04x mismatch between scheduled TBS and buffered TB for HARQ PID %d\n", + UE->rnti, current_harq_pid); T(T_GNB_MAC_RETRANSMISSION_DL_PDU_WITH_DATA, T_INT(module_id), T_INT(CC_id), T_INT(rnti), T_INT(frame), T_INT(slot), T_INT(current_harq_pid), T_INT(harq->round), T_BUFFER(harq->transportBlock, TBS)); @@ -1428,7 +1297,7 @@ void nr_schedule_ue_spec(module_id_t module_id, /* limit requested number of bytes to what preprocessor specified, or * such that TBS is full */ const rlc_buffer_occupancy_t ndata = min(sched_ctrl->rlc_status[lcid].bytes_in_buffer, - bufEnd-buf-sizeof(NR_MAC_SUBHEADER_LONG)); + bufEnd-buf-sizeof(NR_MAC_SUBHEADER_LONG)); tbs_size_t len = mac_rlc_data_req(module_id, rnti, module_id, @@ -1449,7 +1318,7 @@ void nr_schedule_ue_spec(module_id_t module_id, lcid < 4 ? "DCCH" : "DTCH", lcid, ndata, - bufEnd-buf-+sizeof(NR_MAC_SUBHEADER_LONG)); + bufEnd-buf-sizeof(NR_MAC_SUBHEADER_LONG)); if (len == 0) break; @@ -1463,7 +1332,7 @@ void nr_schedule_ue_spec(module_id_t module_id, lcid_bytes += len; } - UE_info->mac_stats[UE_id].lc_bytes_tx[lcid] += lcid_bytes; + UE->mac_stats.dl.lc_bytes[lcid] += lcid_bytes; } } else if (get_softmodem_params()->phy_test || get_softmodem_params()->do_ra) { /* we will need the large header, phy-test typically allocates all @@ -1480,6 +1349,8 @@ void nr_schedule_ue_spec(module_id_t module_id, header->L = htons(bufEnd-buf); dlsch_total_bytes += bufEnd-buf; + for (; ((intptr_t)buf) % 4; buf++) + *buf = lrand48() & 0xff; for (; buf < bufEnd - 3; buf += 4) { uint32_t *buf32 = (uint32_t *)buf; *buf32 = lrand48(); @@ -1501,23 +1372,25 @@ void nr_schedule_ue_spec(module_id_t module_id, buf=bufEnd; } - UE_info->mac_stats[UE_id].dlsch_total_bytes += TBS; - UE_info->mac_stats[UE_id].dlsch_current_bytes = TBS; + UE->mac_stats.dl.total_bytes += TBS; + UE->mac_stats.dl.current_bytes = TBS; /* save retransmission information */ harq->sched_pdsch = *sched_pdsch; /* save which time allocation has been used, to be used on * retransmissions */ harq->sched_pdsch.time_domain_allocation = ps->time_domain_allocation; + /* save nr of layers for retransmissions */ + harq->sched_pdsch.nrOfLayers = ps->nrOfLayers; // ta command is sent, values are reset if (sched_ctrl->ta_apply) { sched_ctrl->ta_apply = false; sched_ctrl->ta_frame = frame; LOG_D(NR_MAC, - "%d.%2d UE %d TA scheduled, resetting TA frame\n", + "%d.%2d UE %04x TA scheduled, resetting TA frame\n", frame, slot, - UE_id); + UE->rnti); } T(T_GNB_MAC_DL_PDU_WITH_DATA, T_INT(module_id), T_INT(CC_id), T_INT(rnti), diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index 5f23a40106a..808fc613f1a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -69,7 +69,6 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, nfapi_nr_pdu_t *TX_req; uint16_t rnti = 0x1234; - // int time_domain_assignment,k0; NR_ServingCellConfigCommon_t *scc=cc->ServingCellConfigCommon; @@ -152,8 +151,6 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, NrOfSymbols = NrOfSymbols_tmp; StartSymbolIndex = StartSymbolIndex_tmp; mappingtype = mappingtype_tmp; - // k0 = *scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->k0; - // time_domain_assignment = i; } } AssertFatal(StartSymbolIndex>=0,"StartSymbolIndex is negative\n"); @@ -163,80 +160,9 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, scc->dmrs_TypeA_Position, NrOfSymbols, StartSymbolIndex, - mappingtype, 1); - - /* - AssertFatal(k0==0,"k0 is not zero for Initial DL BWP TimeDomain Alloc\n"); - nr_configure_css_dci_initial(pdcch_pdu_rel15, - scs, - scs, - FR, - 0, - 0, - 0, - sfn_sf, slotP, - slots_per_frame, - dlBWP_carrier_bandwidth); - - - pdu_rel15->frequency_domain_assignment = PRBalloc_to_locationandbandwidth0(pdsch_pdu_rel15->rbSize, - pdsch_pdu_rel15->rbStart, - dlBWP_carrier_bandwidth); - pdu_rel15->time_domain_assignment = time_domain_assignment; - - pdu_rel15->vrb_to_prb_mapping = 1; - pdu_rel15->mcs = 9; - pdu_rel15->tb_scaling = 1; - - pdu_rel15->ra_preamble_index = 25; - pdu_rel15->format_indicator = 1; - pdu_rel15->ndi = 1; - pdu_rel15->rv = 0; - pdu_rel15->harq_pid = 0; - pdu_rel15->dai = 2; - pdu_rel15->tpc = 2; - pdu_rel15->pucch_resource_indicator = 7; - pdu_rel15->pdsch_to_harq_feedback_timing_indicator = 7; - - LOG_D(MAC, "[gNB scheduler phytest] DCI type 1 payload: freq_alloc %d, time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d ndi %d rv %d\n", - pdu_rel15->frequency_domain_assignment, - pdu_rel15->time_domain_assignment, - pdu_rel15->vrb_to_prb_mapping, - pdu_rel15->mcs, - pdu_rel15->tb_scaling, - pdu_rel15->ndi, - pdu_rel15->rv); - - params_rel15->rnti = rnti; - params_rel15->rnti_type = NFAPI_NR_RNTI_C; - params_rel15->dci_format = NFAPI_NR_DL_DCI_FORMAT_1_0; - //params_rel15->aggregation_level = 1; - LOG_D(MAC, "DCI type 1 params: rnti %x, rnti_type %d, dci_format %d\n \ - coreset params: mux_pattern %d, n_rb %d, n_symb %d, rb_offset %d \n \ - ss params : nb_ss_sets_per_slot %d, first symb %d, nb_slots %d, sfn_mod2 %d, first slot %d\n", - params_rel15->rnti, - params_rel15->rnti_type, - params_rel15->dci_format, - params_rel15->mux_pattern, - params_rel15->n_rb, - params_rel15->n_symb, - params_rel15->rb_offset, - params_rel15->nb_ss_sets_per_slot, - params_rel15->first_symbol, - params_rel15->nb_slots, - params_rel15->sfn_mod2, - params_rel15->first_slot); - nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, dl_tti_dci_pdu->dci_dl_pdu,0); - LOG_D(MAC, "DLSCH PDU: start PRB %d n_PRB %d start symbol %d nb_symbols %d nb_layers %d nb_codewords %d mcs %d\n", - pdsch_pdu_rel15->rbStart, - pdsch_pdu_rel15->rbSize, - pdsch_pdu_rel15->StartSymbolIndex, - pdsch_pdu_rel15->NrOfSymbols, - pdsch_pdu_rel15->nrOfLayers, - pdsch_pdu_rel15->NrOfCodewords, - pdsch_pdu_rel15->mcsIndex[0]); - */ - + mappingtype, + 1); + nr_mac->DL_req[CC_id].dl_tti_request_body.nPDUs+=2; TX_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs]; @@ -266,24 +192,21 @@ void nr_preprocessor_phytest(module_id_t module_id, { if (!is_xlsch_in_slot(dlsch_slot_bitmap, slot)) return; - NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info; + NR_UE_info_t *UE = RC.nrmac[module_id]->UE_info.list[0]; NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon; - const int UE_id = 0; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; const int CC_id = 0; - AssertFatal(UE_info->active[UE_id], - "%s(): expected UE %d to be active\n", - __func__, - UE_id); - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - const int tda = sched_ctrl->active_bwp ? RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp->bwp_Id][slot] : 1; + + const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot); NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static; ps->nrOfLayers = target_dl_Nl; if (ps->time_domain_allocation != tda || ps->nrOfLayers != target_dl_Nl) - nr_set_pdsch_semi_static(NULL, scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, NULL, tda, target_dl_Nl, sched_ctrl, ps); + nr_set_pdsch_semi_static(NULL, scc, UE->CellGroup, sched_ctrl->active_bwp, NULL, tda, target_dl_Nl,sched_ctrl , ps); /* find largest unallocated chunk */ const int bwpSize = NRRIV2BW(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); const int BWPStart = NRRIV2PRBOFFSET(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + int rbStart = 0; int rbSize = 0; if (target_dl_bw>bwpSize) @@ -314,7 +237,7 @@ void nr_preprocessor_phytest(module_id_t module_id, sched_ctrl->dl_lc_num = 1; const int lcid = DL_SCH_LCID_DTCH; sched_ctrl->dl_lc_ids[sched_ctrl->dl_lc_num - 1] = lcid; - const uint16_t rnti = UE_info->rnti[UE_id]; + const uint16_t rnti = UE->rnti; /* update sched_ctrl->num_total_bytes so that postprocessor schedules data, * if available */ sched_ctrl->rlc_status[lcid] = mac_rlc_status_ind(module_id, @@ -340,8 +263,7 @@ void nr_preprocessor_phytest(module_id_t module_id, } AssertFatal(nr_of_candidates>0,"nr_of_candidates is 0\n"); - const int cid = sched_ctrl->coreset->controlResourceSetId; - const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]); + const uint32_t Y = get_Y(sched_ctrl->search_space, slot, UE->rnti); int CCEIndex = find_pdcch_candidate(RC.nrmac[module_id], CC_id, @@ -352,21 +274,19 @@ void nr_preprocessor_phytest(module_id_t module_id, Y); AssertFatal(CCEIndex >= 0, - "%s(): could not find CCE for UE %d\n", + "%s(): could not find CCE for UE %04x\n", __func__, - UE_id); + UE->rnti); int r_pucch = nr_get_pucch_resource(sched_ctrl->coreset, sched_ctrl->active_ubwp, NULL, CCEIndex); - const int alloc = nr_acknack_scheduling(module_id, UE_id, frame, slot, r_pucch, 0); + const int alloc = nr_acknack_scheduling(module_id, UE, frame, slot, r_pucch, 0); if (alloc < 0) { LOG_D(MAC, - "%s(): could not find PUCCH for UE %d/%04x@%d.%d\n", + "%s(): could not find PUCCH for UE %04x@%d.%d\n", __func__, - UE_id, rnti, frame, slot); - RC.nrmac[module_id]->pdcch_cand[cid]--; return; } @@ -388,6 +308,7 @@ void nr_preprocessor_phytest(module_id_t module_id, sched_pdsch->rbSize = rbSize; sched_pdsch->mcs = target_dl_mcs; + sched_ctrl->dl_bler_stats.mcs = target_dl_mcs; /* for logging output */ sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx); sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx); sched_pdsch->tb_size = nr_compute_tbs(sched_pdsch->Qm, @@ -412,6 +333,7 @@ void nr_preprocessor_phytest(module_id_t module_id, uint32_t target_ul_mcs = 9; uint32_t target_ul_bw = 50; +uint32_t target_ul_Nl = 1; uint64_t ulsch_slot_bitmap = (1 << 8); bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_t slot) { @@ -419,32 +341,36 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_ NR_COMMON_channels_t *cc = nr_mac->common_channels; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; const int mu = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing; - NR_UE_info_t *UE_info = &nr_mac->UE_info; + NR_UE_info_t *UE = nr_mac->UE_info.list[0]; - AssertFatal(UE_info->num_UEs <= 1, - "%s() cannot handle more than one UE, but found %d\n", - __func__, - UE_info->num_UEs); - if (UE_info->num_UEs == 0) + AssertFatal(nr_mac->UE_info.list[1] == NULL, + "cannot handle more than one UE\n"); + if (UE == NULL) return false; - const int UE_id = 0; const int CC_id = 0; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; - const int tda = sched_ctrl->active_ubwp ? RC.nrmac[module_id]->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 1; - if (tda < 0) - return false; const struct NR_PUSCH_TimeDomainResourceAllocationList *tdaList = sched_ctrl->active_ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList; - AssertFatal(tda < tdaList->list.count, + const int temp_tda = get_ul_tda(nr_mac, scc, slot); + if (temp_tda < 0) + return false; + AssertFatal(temp_tda < tdaList->list.count, "time domain assignment %d >= %d\n", - tda, + temp_tda, tdaList->list.count); - int K2 = get_K2(scc,NULL,sched_ctrl->active_ubwp, tda, mu); + int K2 = get_K2(scc,NULL,sched_ctrl->active_ubwp, temp_tda, mu); const int sched_frame = frame + (slot + K2 >= nr_slots_per_frame[mu]); const int sched_slot = (slot + K2) % nr_slots_per_frame[mu]; + const int tda = get_ul_tda(nr_mac, scc, sched_slot); + if (tda < 0) + return false; + AssertFatal(tda < tdaList->list.count, + "time domain assignment %d >= %d\n", + tda, + tdaList->list.count); /* check if slot is UL, and that slot is 8 (assuming K2=6 because of UE * limitations). Note that if K2 or the TDD configuration is changed, below * conditions might exclude each other and never be true */ @@ -455,15 +381,19 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_ sched_ctrl->search_space->searchSpaceType->present == NR_SearchSpace__searchSpaceType_PR_ue_Specific) ? sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats : 0; const int dci_format = f ? NR_UL_DCI_FORMAT_0_1 : NR_UL_DCI_FORMAT_0_0; - const uint8_t num_dmrs_cdm_grps_no_data = 1; + uint8_t num_dmrs_cdm_grps_no_data = 1; + if ((target_ul_Nl==4)||(target_ul_Nl==3)) + num_dmrs_cdm_grps_no_data = 2; + /* we want to avoid a lengthy deduction of DMRS and other parameters in * every TTI if we can save it, so check whether dci_format, TDA, or * num_dmrs_cdm_grps_no_data has changed and only then recompute */ NR_pusch_semi_static_t *ps = &sched_ctrl->pusch_semi_static; if (ps->time_domain_allocation != tda || ps->dci_format != dci_format + || ps->nrOfLayers != target_ul_Nl || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) - nr_set_pusch_semi_static(NULL, scc, sched_ctrl->active_ubwp, NULL,dci_format, tda, num_dmrs_cdm_grps_no_data, ps); + nr_set_pusch_semi_static(NULL, scc, sched_ctrl->active_ubwp, NULL,dci_format, tda, num_dmrs_cdm_grps_no_data,target_ul_Nl,ps); uint16_t rbStart = 0; uint16_t rbSize; @@ -508,8 +438,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_ } AssertFatal(nr_of_candidates>0,"nr_of_candidates is 0\n"); - const int cid = sched_ctrl->coreset->controlResourceSetId; - const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]); + const uint32_t Y = get_Y(sched_ctrl->search_space, slot, UE->rnti); int CCEIndex = find_pdcch_candidate(nr_mac, CC_id, @@ -521,7 +450,6 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_ if (CCEIndex < 0) { LOG_E(MAC, "%s(): CCE list not empty, couldn't schedule PUSCH\n", __func__); - nr_mac->pdcch_cand[cid]--; return false; } @@ -530,12 +458,14 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_ const int mcs = target_ul_mcs; NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; sched_pusch->mcs = mcs; + sched_ctrl->ul_bler_stats.mcs = mcs; /* for logging output */ sched_pusch->rbStart = rbStart; sched_pusch->rbSize = rbSize; /* get the PID of a HARQ process awaiting retransmission, or -1 for "any new" */ sched_pusch->ul_harq_pid = sched_ctrl->retrans_ul_harq.head; /* Calculate TBS from MCS */ + ps->nrOfLayers = target_ul_Nl; sched_pusch->R = nr_get_code_rate_ul(mcs, ps->mcs_table); sched_pusch->Qm = nr_get_Qm_ul(mcs, ps->mcs_table); if (ps->pusch_Config->tp_pi2BPSK @@ -550,7 +480,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_ ps->N_PRB_DMRS * ps->num_dmrs_symb, 0, // nb_rb_oh 0, - 1 /* NrOfLayers */) + ps->nrOfLayers /* NrOfLayers */) >> 3; /* mark the corresponding RBs as used */ diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 3f7a908395d..4023c4ed4e1 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -113,18 +113,18 @@ uint8_t nr_ss_first_symb_idx_scs_120_120_mux3[4] = {4,8,2,6}; uint8_t nr_max_number_of_candidates_per_slot[4] = {44, 36, 22, 20}; uint8_t nr_max_number_of_cces_per_slot[4] = {56, 56, 48, 32}; -// CQI TABLES +// CQI TABLES (10 times the value in 214 to adequately compare with R) // Table 1 (38.214 5.2.2.1-2) -uint16_t cqi_table1[16][2] = {{0,0},{2,78},{2,120},{2,193},{2,308},{2,449},{2,602},{4,378}, - {4,490},{4,616},{6,466},{6,567},{6,666},{6,772},{6,873},{6,948}}; +uint16_t cqi_table1[16][2] = {{0,0},{2,780},{2,1200},{2,1930},{2,3080},{2,4490},{2,6020},{4,3780}, + {4,4900},{4,6160},{6,4660},{6,5670},{6,6660},{6,7720},{6,8730},{6,9480}}; // Table 2 (38.214 5.2.2.1-3) -uint16_t cqi_table2[16][2] = {{0,0},{2,78},{2,193},{2,449},{4,378},{4,490},{4,616},{6,466}, - {6,567},{6,666},{6,772},{6,873},{8,711},{8,797},{8,885},{8,948}}; +uint16_t cqi_table2[16][2] = {{0,0},{2,780},{2,1930},{2,4490},{4,3780},{4,4900},{4,6160},{6,4660}, + {6,5670},{6,6660},{6,7720},{6,8730},{8,7110},{8,7970},{8,8850},{8,9480}}; // Table 2 (38.214 5.2.2.1-4) -uint16_t cqi_table3[16][2] = {{0,0},{2,30},{2,50},{2,78},{2,120},{2,193},{2,308},{2,449}, - {2,602},{4,378},{4,490},{4,616},{6,466},{6,567},{6,666},{6,772}}; +uint16_t cqi_table3[16][2] = {{0,0},{2,300},{2,500},{2,780},{2,1200},{2,1930},{2,3080},{2,4490}, + {2,6020},{4,3780},{4,4900},{4,6160},{6,4660},{6,5670},{6,6660},{6,7720}}; static inline uint8_t get_max_candidates(uint8_t scs) { @@ -145,50 +145,68 @@ uint8_t set_dl_nrOfLayers(NR_UE_sched_ctrl_t *sched_ctrl) { } -void set_dl_mcs(NR_sched_pdsch_t *sched_pdsch, - NR_UE_sched_ctrl_t *sched_ctrl, - uint8_t *target_mcs, - uint8_t mcs_table_idx) { - - if (sched_ctrl->set_mcs) { - // TODO for wideband case and multiple TB - int cqi_idx = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb; - uint16_t target_coderate,target_qm; - if (cqi_idx>0) { - int cqi_table = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.cqi_table; - if (cqi_table != mcs_table_idx) - LOG_W(NR_MAC,"Indices of MCS tables don't correspond yet, cri_ri_li_pmi_cqi_report.cqi_table %d, mcs_table_index %d\n",cqi_table,mcs_table_idx); - switch (cqi_table) { - case 0: - target_qm = cqi_table1[cqi_idx][0]; - target_coderate = cqi_table1[cqi_idx][1]; - break; - case 1: - target_qm = cqi_table2[cqi_idx][0]; - target_coderate = cqi_table2[cqi_idx][1]; - break; - case 2: - target_qm = cqi_table3[cqi_idx][0]; - target_coderate = cqi_table3[cqi_idx][1]; - break; - default: - AssertFatal(1==0,"Invalid cqi table index %d\n",cqi_table); - } - int max_mcs = 28; - int R,Qm; - if (mcs_table_idx == 1) - max_mcs = 27; - for (int i=0; i<=max_mcs; i++) { - R = nr_get_code_rate_dl(i, mcs_table_idx); - Qm = nr_get_Qm_dl(i, mcs_table_idx); - if ((Qm == target_qm) && (target_coderate <= R)) { - *target_mcs = i; - break; - } - } - } - sched_ctrl->set_mcs = FALSE; +uint16_t set_pm_index(NR_UE_sched_ctrl_t *sched_ctrl, + int layers, + int N1, int N2, + int xp_pdsch_antenna_ports, + int codebook_mode) { + + int antenna_ports = (N1*N2)<<1; + if (xp_pdsch_antenna_ports == 1 && + antenna_ports>1) + return 0; //identity matrix (basic 5G configuration handled by PMI report is with XP antennas) + + int x1 = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1; + int x2 = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2; + LOG_D(NR_MAC,"PMI report: x1 %d x2 %d\n",x1,x2); + + sched_ctrl->set_pmi = false; + + if (antenna_ports == 2) + return x2; + else + AssertFatal(1==0,"More than 2 antenna ports not yet supported\n"); +} + +uint8_t get_mcs_from_cqi(int mcs_table, int cqi_table, int cqi_idx) +{ + if (cqi_idx <= 0) { + LOG_E(NR_MAC, "invalid cqi_idx %d, default to MCS 9\n", cqi_idx); + return 9; } + + if (mcs_table != cqi_table) { + LOG_E(NR_MAC, "indices of CQI (%d) and MCS (%d) tables don't correspond yet\n", cqi_table, mcs_table); + return 9; + } + + uint16_t target_coderate, target_qm; + switch (cqi_table) { + case 0: + target_qm = cqi_table1[cqi_idx][0]; + target_coderate = cqi_table1[cqi_idx][1]; + break; + case 1: + target_qm = cqi_table2[cqi_idx][0]; + target_coderate = cqi_table2[cqi_idx][1]; + break; + case 2: + target_qm = cqi_table3[cqi_idx][0]; + target_coderate = cqi_table3[cqi_idx][1]; + break; + default: + AssertFatal(1==0,"Invalid cqi table index %d\n",cqi_table); + } + const int max_mcs = mcs_table == 1 ? 27 : 28; + for (int i = 0; i <= max_mcs; i++) { + const int R = nr_get_code_rate_dl(i, mcs_table); + const int Qm = nr_get_Qm_dl(i, mcs_table); + if (Qm == target_qm && target_coderate <= R) + return i; + } + + LOG_E(NR_MAC, "could not find maximum MCS from cqi_idx %d, default to 9\n", cqi_idx); + return 9; } void set_dl_dmrs_ports(NR_pdsch_semi_static_t *ps) { @@ -270,7 +288,7 @@ NR_PDSCH_TimeDomainResourceAllocationList_t *get_pdsch_TimeDomainAllocationList( } -NR_ControlResourceSet_t *get_coreset(module_id_t module_idP, +NR_ControlResourceSet_t *get_coreset(gNB_MAC_INST *nrmac, NR_ServingCellConfigCommon_t *scc, void *bwp, NR_SearchSpace_t *ss, @@ -280,7 +298,7 @@ NR_ControlResourceSet_t *get_coreset(module_id_t module_idP, if (ss_type == NR_SearchSpace__searchSpaceType_PR_common) { // common search space NR_ControlResourceSet_t *coreset; if(coreset_id == 0) { - coreset = RC.nrmac[module_idP]->sched_ctrlCommon->coreset; // this is coreset 0 + coreset = nrmac->sched_ctrlCommon->coreset; // this is coreset 0 } else if (bwp) { coreset = ((NR_BWP_Downlink_t*)bwp)->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet; } else if (scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonControlResourceSet) { @@ -422,36 +440,17 @@ NR_sched_pdcch_t set_pdcch_structure(gNB_MAC_INST *gNB_mac, } -int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs) { - - int f; // interleaving function - if(R==0) - f = k; - else { - int c = k/R; - int r = k%R; - f = (r*C + c + n_shift)%(N_regs/L); - } - return f; -} - int find_pdcch_candidate(gNB_MAC_INST *mac, int cc_id, int aggregation, int nr_of_candidates, NR_sched_pdcch_t *pdcch, NR_ControlResourceSet_t *coreset, - uint16_t Y){ + uint32_t Y){ uint16_t *vrb_map = mac->common_channels[cc_id].vrb_map; - const int next_cand = mac->pdcch_cand[coreset->controlResourceSetId]; const int N_ci = 0; - if(next_cand>=nr_of_candidates) { - LOG_D(NR_MAC,"No more available candidates for this coreset\n"); - return -1; - } - const int N_rb = pdcch->n_rb; // nb of rbs of coreset per symbol const int N_symb = coreset->duration; // nb of coreset symbols const int N_regs = N_rb*N_symb; // nb of REGs per coreset @@ -463,9 +462,10 @@ int find_pdcch_candidate(gNB_MAC_INST *mac, // loop over all the available candidates // this implements TS 38.211 Sec. 7.3.2.2 - for(int m=next_cand; m<nr_of_candidates; m++) { // loop over candidates + for(int m=0; m<nr_of_candidates; m++) { // loop over candidates bool taken = false; // flag if the resource for a given candidate are taken int first_cce = aggregation * (( Y + CEILIDIV((m*N_cces),(aggregation*nr_of_candidates)) + N_ci ) % CEILIDIV(N_cces,aggregation)); + LOG_D(NR_MAC,"Candidate %d of %d first_cce %d (L %d N_cces %d Y %d)\n", m, nr_of_candidates, first_cce, aggregation, N_cces, Y); for (int j=first_cce; (j<first_cce+aggregation) && !taken; j++) { // loop over CCEs for (int k=6*j/L; (k<(6*j/L+6/L)) && !taken; k++) { // loop over REG bundles int f = cce_to_reg_interleaving(R, k, pdcch->ShiftIndex, C, L, N_regs); @@ -477,10 +477,8 @@ int find_pdcch_candidate(gNB_MAC_INST *mac, } } } - if(!taken){ - mac->pdcch_cand[coreset->controlResourceSetId] = m++; // using candidate m, next available is m+1 + if(!taken) return first_cce; - } } return -1; } @@ -511,7 +509,6 @@ void fill_pdcch_vrb_map(gNB_MAC_INST *mac, } } - bool nr_find_nb_rb(uint16_t Qm, uint16_t R, uint8_t nrOfLayers, @@ -572,8 +569,7 @@ void nr_set_pdsch_semi_static(const NR_SIB1_t *sib1, { bool reset_dmrs = false; - NR_BWP_DownlinkDedicated_t *bwpd; - + NR_BWP_DownlinkDedicated_t *bwpd = NULL; if (bwp && bwp->bwp_Dedicated) { bwpd = bwp->bwp_Dedicated; } else { @@ -600,26 +596,24 @@ void nr_set_pdsch_semi_static(const NR_SIB1_t *sib1, } LOG_D(NR_MAC,"MCS Table Index: %d\n",ps->mcsTableIdx); - NR_PDSCH_Config_t *pdsch_Config=NULL; - if (bwpd) pdsch_Config = bwpd->pdsch_Config->choice.setup; + NR_PDSCH_Config_t *pdsch_Config = NULL; + if (bwpd && bwpd->pdsch_Config) pdsch_Config = bwpd->pdsch_Config->choice.setup; LOG_D(NR_MAC,"tda %d, ps->time_domain_allocation %d,layers %d, ps->nrOfLayers %d, pdsch_config %p\n",tda,ps->time_domain_allocation,layers,ps->nrOfLayers,pdsch_Config); - if (ps->time_domain_allocation != tda) { - reset_dmrs = true; - ps->time_domain_allocation = tda; - NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList = get_pdsch_TimeDomainAllocationList(bwp, scc, sib1); - AssertFatal(tda < tdaList->list.count, "time_domain_allocation %d>=%d\n", tda, tdaList->list.count); - ps->mapping_type = tdaList->list.array[tda]->mappingType; - if (pdsch_Config) { - if (ps->mapping_type == NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeB) - ps->dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup->dmrs_Type == NULL ? 0 : 1; - else - ps->dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1; - } + reset_dmrs = true; + ps->time_domain_allocation = tda; + NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList = get_pdsch_TimeDomainAllocationList(bwp, scc, sib1); + AssertFatal(tda < tdaList->list.count, "time_domain_allocation %d>=%d\n", tda, tdaList->list.count); + ps->mapping_type = tdaList->list.array[tda]->mappingType; + if (pdsch_Config) { + if (ps->mapping_type == NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeB) + ps->dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup->dmrs_Type != NULL; else - ps->dmrsConfigType = NFAPI_NR_DMRS_TYPE1; - const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength; - SLIV2SL(startSymbolAndLength, &ps->startSymbolIndex, &ps->nrOfSymbols); + ps->dmrsConfigType = pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type != NULL; } + else + ps->dmrsConfigType = NFAPI_NR_DMRS_TYPE1; + const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength; + SLIV2SL(startSymbolAndLength, &ps->startSymbolIndex, &ps->nrOfSymbols); const long f = ((bwp || bwpd) && sched_ctrl->search_space && @@ -643,8 +637,8 @@ void nr_set_pdsch_semi_static(const NR_SIB1_t *sib1, ps->nrOfLayers = 1; } else { - if (ps->nrOfLayers != layers || - ps->numDmrsCdmGrpsNoData == 0) { + LOG_D(NR_MAC,"checking layers\n"); + if (ps->nrOfLayers != layers || ps->numDmrsCdmGrpsNoData == 0) { reset_dmrs = true; ps->nrOfLayers = layers; set_dl_dmrs_ports(ps); @@ -667,7 +661,9 @@ void nr_set_pusch_semi_static(const NR_SIB1_t *sib1, long dci_format, int tda, uint8_t num_dmrs_cdm_grps_no_data, + uint8_t nrOfLayers, NR_pusch_semi_static_t *ps) { + ps->dci_format = dci_format; ps->time_domain_allocation = tda; @@ -709,6 +705,7 @@ void nr_set_pusch_semi_static(const NR_SIB1_t *sib1, num_dmrs_cdm_grps_no_data = 2; // in case of transform precoding - no Data sent in DMRS symbol } + ps->nrOfLayers = nrOfLayers; ps->num_dmrs_cdm_grps_no_data = num_dmrs_cdm_grps_no_data; /* DMRS calculations */ @@ -742,6 +739,51 @@ void nr_set_pusch_semi_static(const NR_SIB1_t *sib1, : num_dmrs_cdm_grps_no_data * 4; } +#define BLER_UPDATE_FRAME 10 +#define BLER_FILTER 0.9f +int get_mcs_from_bler(const NR_bler_options_t *bler_options, + const NR_mac_dir_stats_t *stats, + NR_bler_stats_t *bler_stats, + int max_mcs, + frame_t frame) +{ + /* first call: everything is zero. Initialize to sensible default */ + if (bler_stats->last_frame == 0 && bler_stats->mcs == 0) { + bler_stats->last_frame = frame; + bler_stats->mcs = 9; + bler_stats->bler = (bler_options->lower + bler_options->upper) / 2.0f; + } + int diff = frame - bler_stats->last_frame; + if (diff < 0) // wrap around + diff += 1024; + + max_mcs = min(max_mcs, bler_options->max_mcs); + const uint8_t old_mcs = min(bler_stats->mcs, max_mcs); + if (diff < BLER_UPDATE_FRAME) + return old_mcs; // no update + + // last update is longer than x frames ago + const int dtx = (int)(stats->rounds[0] - bler_stats->rounds[0]); + const int dretx = (int)(stats->rounds[1] - bler_stats->rounds[1]); + const float bler_window = dtx > 0 ? (float) dretx / dtx : bler_stats->bler; + bler_stats->bler = BLER_FILTER * bler_stats->bler + (1 - BLER_FILTER) * bler_window; + + int new_mcs = old_mcs; + if (bler_stats->bler < bler_options->lower && old_mcs < max_mcs && dtx > 9) + new_mcs += 1; + else if ((bler_stats->bler > bler_options->upper && old_mcs > 6) // above threshold + || (dtx <= 3 && old_mcs > 9)) // no activity + new_mcs -= 1; + // else we are within threshold boundaries + + bler_stats->last_frame = frame; + bler_stats->mcs = new_mcs; + memcpy(bler_stats->rounds, stats->rounds, sizeof(stats->rounds)); + LOG_D(MAC, "frame %4d MCS %d -> %d (dtx %d, dretx %d, BLER wnd %.3f avg %.6f)\n", + frame, old_mcs, new_mcs, dtx, dretx, bler_window, bler_stats->bler); + return new_mcs; +} + void nr_configure_css_dci_initial(nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu, nr_scs_e scs_common, nr_scs_e pdcch_scs, @@ -1009,8 +1051,16 @@ void config_uldci(const NR_SIB1_t *sib1, "Non Codebook configuration non supported\n"); dci_pdu_rel15->srs_resource_indicator.val = 0; // taking resource 0 for SRS } + dci_pdu_rel15->precoding_information.val= 0; + if (pusch_pdu->nrOfLayers == 2) + dci_pdu_rel15->precoding_information.val = 4; + else if (pusch_pdu->nrOfLayers == 4) + dci_pdu_rel15->precoding_information.val = 11; + + // antenna_ports.val = 0 for transform precoder is disabled, dmrs-Type=1, maxLength=1, Rank=1/2/3/4 // Antenna Ports - dci_pdu_rel15->antenna_ports.val = 0; // TODO for now it is hardcoded, it should depends on cdm group no data and rank + dci_pdu_rel15->antenna_ports.val = 0; + // DMRS sequence initialization dci_pdu_rel15->dmrs_sequence_initialization.val = pusch_pdu->scid; break; @@ -1019,11 +1069,14 @@ void config_uldci(const NR_SIB1_t *sib1, } LOG_D(NR_MAC, - "%s() ULDCI type 0 payload: freq_alloc %d, time_alloc %d, freq_hop_flag %d, mcs %d tpc %d ndi %d rv %d\n", + "%s() ULDCI type 0 payload: dci_format %d, freq_alloc %d, time_alloc %d, freq_hop_flag %d, precoding_information.val %d antenna_ports.val %d mcs %d tpc %d ndi %d rv %d\n", __func__, + dci_format, dci_pdu_rel15->frequency_domain_assignment.val, dci_pdu_rel15->time_domain_assignment.val, dci_pdu_rel15->frequency_hopping_flag.val, + dci_pdu_rel15->precoding_information.val, + dci_pdu_rel15->antenna_ports.val, dci_pdu_rel15->mcs, dci_pdu_rel15->tpc, dci_pdu_rel15->ndi, @@ -1043,8 +1096,6 @@ int nr_get_default_pucch_res(int pucch_ResourceCommon) { return(default_pucch_csset[pucch_ResourceCommon]); } - - void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu, NR_ControlResourceSet_t *coreset, NR_BWP_t *bwp, @@ -1062,7 +1113,7 @@ void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu, for (int i=0;i<6;i++) pdcch_pdu->FreqDomainResource[i] = coreset->frequencyDomainResources.buf[i]; - LOG_D(MAC,"Coreset : BWPstart %d, BWPsize %d, SCS %d, freq %x, , duration %d, \n", + LOG_D(MAC,"Coreset : BWPstart %d, BWPsize %d, SCS %d, freq %x, , duration %d\n", pdcch_pdu->BWPStart,pdcch_pdu->BWPSize,(int)pdcch_pdu->SubcarrierSpacing,(int)coreset->frequencyDomainResources.buf[0],(int)coreset->duration); pdcch_pdu->CceRegMappingType = pdcch->CceRegMappingType; @@ -1385,7 +1436,6 @@ void set_r_pucch_parms(int rsetindex, *start_symbol_index = default_pucch_firstsymb[rsetindex]; } - void prepare_dci(const NR_CellGroupConfig_t *CellGroup, dci_pdu_rel15_t *dci_pdu_rel15, nr_dci_format_t format, @@ -1486,12 +1536,13 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc, int rnti_type, int N_RB, int bwp_id, + NR_ControlResourceSetId_t coreset_id, uint16_t cset0_bwp_size) { uint8_t fsize = 0, pos = 0; uint64_t *dci_pdu = (uint64_t *)pdcch_dci_pdu->Payload; *dci_pdu=0; - int dci_size = nr_dci_size(scc->downlinkConfigCommon->initialDownlinkBWP,scc->uplinkConfigCommon->initialUplinkBWP, CellGroup, dci_pdu_rel15, dci_format, rnti_type, N_RB, bwp_id, cset0_bwp_size); + int dci_size = nr_dci_size(scc->downlinkConfigCommon->initialDownlinkBWP,scc->uplinkConfigCommon->initialUplinkBWP, CellGroup, dci_pdu_rel15, dci_format, rnti_type, N_RB, bwp_id, coreset_id, cset0_bwp_size); pdcch_dci_pdu->PayloadSizeBits = dci_size; AssertFatal(dci_size <= 64, "DCI sizes above 64 bits not yet supported"); if (dci_format == NR_DL_DCI_FORMAT_1_1 || dci_format == NR_UL_DCI_FORMAT_0_1) @@ -2059,10 +2110,11 @@ int extract_length(int startSymbolAndLength) { /* * Dump the UL or DL UE_info into LOG_T(MAC) */ -void dump_nr_list(NR_list_t *listP) +void dump_nr_list(NR_UE_info_t **list) { - for (int j = listP->head; j >= 0; j = listP->next[j]) - LOG_T(NR_MAC, "NR list node %d => %d\n", j, listP->next[j]); + UE_iterator(list, UE) { + LOG_T(NR_MAC, "NR list UEs rntis %04x\n", (*list)->rnti); + } } /* @@ -2146,16 +2198,7 @@ void remove_nr_list(NR_list_t *listP, int id) prev = cur; cur = &listP->next[*cur]; } - if (*cur == -1) { - cur = &listP->head; - prev=&listP->head; - while (*cur != -1 && *cur != id) { - LOG_I(NR_MAC,"remove_nr_list : id %d, *cur %d\n",id,*cur); - prev = cur; - cur = &listP->next[*cur]; - } - AssertFatal(1==0, "ID %d not found in UE_list\n", id); - } + AssertFatal(*cur != -1, "ID %d not found in UE_list\n", id); int *next = &listP->next[*cur]; *cur = listP->next[*cur]; *next = -1; @@ -2200,35 +2243,17 @@ void remove_front_nr_list(NR_list_t *listP) listP->tail = -1; } -int find_nr_UE_id(module_id_t mod_idP, rnti_t rntiP) -//------------------------------------------------------------------------------ +NR_UE_info_t *find_nr_UE(NR_UEs_t *UEs, rnti_t rntiP) { - int UE_id; - NR_UE_info_t *UE_info = &RC.nrmac[mod_idP]->UE_info; - for (UE_id = 0; UE_id < MAX_MOBILES_PER_GNB; UE_id++) { - if (UE_info->active[UE_id]) { - if (UE_info->rnti[UE_id] == rntiP) { - return UE_id; - } + UE_iterator(UEs->list, UE) { + if (UE->rnti == rntiP) { + LOG_D(NR_MAC,"Search and found rnti: %04x\n", rntiP); + return UE; } } - - return -1; -} - -uint16_t get_Y(int cid, int slot, rnti_t rnti) { - - const int A[3] = {39827, 39829, 39839}; - const int D = 65537; - int Y; - - Y = (A[cid] * rnti) % D; - - for (int s = 0; s < slot; s++) - Y = (A[cid] * Y) % D; - - return Y; + LOG_W(NR_MAC,"Search for not existing rnti (ignore for RA): %04x\n", rntiP); + return NULL; } int find_nr_RA_id(module_id_t mod_idP, int CC_idP, rnti_t rntiP) { @@ -2287,42 +2312,86 @@ int get_ul_bwp_id(const NR_ServingCellConfig_t *servingCellConfig) return 1; } +/* hack data to remove UE in the phy */ +int rnti_to_remove[10]; +volatile int rnti_to_remove_count; +pthread_mutex_t rnti_to_remove_mutex = PTHREAD_MUTEX_INITIALIZER; + +void delete_nr_ue_data(NR_UE_info_t *UE, NR_COMMON_channels_t *ccPtr) +{ + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + destroy_nr_list(&sched_ctrl->available_dl_harq); + destroy_nr_list(&sched_ctrl->feedback_dl_harq); + destroy_nr_list(&sched_ctrl->retrans_dl_harq); + destroy_nr_list(&sched_ctrl->available_ul_harq); + destroy_nr_list(&sched_ctrl->feedback_ul_harq); + destroy_nr_list(&sched_ctrl->retrans_ul_harq); + LOG_I(NR_MAC, "Remove NR rnti 0x%04x\n", UE->rnti); + const rnti_t rnti = UE->rnti; + free(UE); + /* hack to remove UE in the phy */ + if (pthread_mutex_lock(&rnti_to_remove_mutex)) + exit(1); + if (rnti_to_remove_count == 10) + exit(1); + rnti_to_remove[rnti_to_remove_count] = rnti; + LOG_W(NR_MAC, "to remove in mac rnti_to_remove[%d] = 0x%04x\n", rnti_to_remove_count, rnti); + rnti_to_remove_count++; + if (pthread_mutex_unlock(&rnti_to_remove_mutex)) + exit(1); + + /* clear RA process(es?) associated to the UE */ + for (int cc_id = 0; cc_id < NFAPI_CC_MAX; cc_id++) { + for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) { + NR_COMMON_channels_t *cc = &ccPtr[cc_id]; + if (cc->ra[i].rnti == rnti) { + LOG_D(NR_MAC, "free RA process %d for rnti %04x\n", i, rnti); + /* is it enough? */ + cc->ra[i].cfra = false; + cc->ra[i].rnti = 0; + cc->ra[i].crnti = 0; + } + } + } +} + //------------------------------------------------------------------------------ -int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellGroup) +NR_UE_info_t *add_new_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rntiP, NR_CellGroupConfig_t *CellGroup) { - gNB_MAC_INST *nr_mac = RC.nrmac[mod_idP]; NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels[0].ServingCellConfigCommon; - NR_UE_info_t *UE_info = &nr_mac->UE_info; - LOG_I(NR_MAC, "[gNB %d] Adding UE with rnti 0x%04x (num_UEs %d)\n", - mod_idP, - rntiP, - UE_info->num_UEs); - dump_nr_list(&UE_info->list); - - for (int i = 0; i < MAX_MOBILES_PER_GNB; i++) { - if (UE_info->active[i]) { - LOG_D(NR_MAC,"UE %x is active, skipping\n",rntiP); - continue; - } - int UE_id = i; - UE_info->num_UEs++; - UE_info->active[UE_id] = true; - if (CellGroup) UE_info->Msg4_ACKed[UE_id] = true; - else UE_info->Msg4_ACKed[UE_id] = false; - UE_info->rnti[UE_id] = rntiP; - UE_info->CellGroup[UE_id] = CellGroup; - add_nr_list(&UE_info->list, UE_id); - memset(&UE_info->mac_stats[UE_id], 0, sizeof(NR_mac_stats_t)); - if (CellGroup && - CellGroup->spCellConfig && - CellGroup->spCellConfig->spCellConfigDedicated && - CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig && - CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup - ) - compute_csi_bitlen (CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info, UE_id, mod_idP); - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UEs_t *UE_info = &nr_mac->UE_info; + LOG_I(NR_MAC, "Adding UE with rnti 0x%04x\n", + rntiP); + dump_nr_list(UE_info->list); + + // We will attach at the end, to mitigate race conditions + // This is not good, but we will fix it progressively + NR_UE_info_t *UE=calloc(1,sizeof(NR_UE_info_t)); + if(!UE) { + LOG_E(NR_MAC,"want to add UE %04x but the fixed allocated size is full\n",rntiP); + return NULL; + } + + UE->rnti = rntiP; + UE->CellGroup = CellGroup; + + if (CellGroup) + UE->Msg4_ACKed = true; + else + UE->Msg4_ACKed = false; + + if (CellGroup && + CellGroup->spCellConfig && + CellGroup->spCellConfig->spCellConfigDedicated && + CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig && + CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup) { + compute_csi_bitlen(CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE->csi_report_template); + } + + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; memset(sched_ctrl, 0, sizeof(*sched_ctrl)); - sched_ctrl->set_mcs = true; + sched_ctrl->dl_max_mcs = 28; /* do not limit MCS for individual UEs */ + sched_ctrl->set_pmi = false; sched_ctrl->ta_frame = 0; sched_ctrl->ta_update = 31; sched_ctrl->ta_apply = false; @@ -2330,7 +2399,6 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG sched_ctrl->pucch_consecutive_dtx_cnt = 0; sched_ctrl->pusch_consecutive_dtx_cnt = 0; sched_ctrl->ul_failure = 0; - sched_ctrl->sched_srs.frame = -1; sched_ctrl->sched_srs.slot = -1; sched_ctrl->sched_srs.srs_scheduled = false; @@ -2340,11 +2408,8 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG sched_ctrl->pusch_semi_static.time_domain_allocation = -1; const NR_ServingCellConfig_t *servingCellConfig = CellGroup && CellGroup->spCellConfig ? CellGroup->spCellConfig->spCellConfigDedicated : NULL; - /* Set default BWPs */ - const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = servingCellConfig ? servingCellConfig->downlinkBWP_ToAddModList : NULL; - if (bwpList) AssertFatal(bwpList->list.count == 1, - "downlinkBWP_ToAddModList has %d BWP!\n", - bwpList->list.count); + /* Set default BWPs */ + const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = servingCellConfig ? servingCellConfig->downlinkBWP_ToAddModList : NULL; const int bwp_id = servingCellConfig ? *servingCellConfig->firstActiveDownlinkBWP_Id : 0; sched_ctrl->active_bwp = bwpList && bwp_id > 0 ? bwpList->list.array[bwp_id - 1] : NULL; @@ -2357,26 +2422,31 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG scc, sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Dedicated : NULL, target_ss); - sched_ctrl->coreset = get_coreset(mod_idP, scc, - sched_ctrl->active_bwp ? (void*)sched_ctrl->active_bwp->bwp_Dedicated : NULL, - sched_ctrl->search_space, target_ss); - sched_ctrl->sched_pdcch = set_pdcch_structure(RC.nrmac[mod_idP], + sched_ctrl->coreset = get_coreset(nr_mac, + scc, + sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Dedicated : NULL, + sched_ctrl->search_space, + target_ss); + sched_ctrl->sched_pdcch = set_pdcch_structure(nr_mac, sched_ctrl->search_space, sched_ctrl->coreset, scc, genericParameters, NULL); + sched_ctrl->next_dl_bwp_id = -1; + sched_ctrl->next_ul_bwp_id = -1; const struct NR_UplinkConfig__uplinkBWP_ToAddModList *ubwpList = servingCellConfig ? servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList : NULL; - if (ubwpList) AssertFatal(ubwpList->list.count == 1, - "uplinkBWP_ToAddModList has %d BWP!\n", - ubwpList->list.count); + AssertFatal(ubwpList == NULL || ubwpList->list.count <= NR_MAX_NUM_BWP, + "uplinkBWP_ToAddModList has %d BWP!\n", + ubwpList->list.count); const int ul_bwp_id = servingCellConfig ? *servingCellConfig->uplinkConfig->firstActiveUplinkBWP_Id : 0; sched_ctrl->active_ubwp = ubwpList && ul_bwp_id > 0 ? ubwpList->list.array[ul_bwp_id - 1] : NULL; /* get Number of HARQ processes for this UE */ - if (servingCellConfig) AssertFatal(servingCellConfig->pdsch_ServingCellConfig->present == NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup, - "no pdsch-ServingCellConfig found for UE %d\n", - UE_id); + AssertFatal(servingCellConfig == NULL + || servingCellConfig->pdsch_ServingCellConfig->present == NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup, + "no pdsch-ServingCellConfig found for UE %04x\n", + UE->rnti); const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL; // pdsch == NULL in SA -> will create default (8) number of HARQ processes create_dl_harq_list(sched_ctrl, pdsch); @@ -2387,21 +2457,27 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG add_tail_nr_list(&sched_ctrl->available_ul_harq, harq); create_nr_list(&sched_ctrl->feedback_ul_harq, 16); create_nr_list(&sched_ctrl->retrans_ul_harq, 16); - LOG_D(NR_MAC, "[gNB %d] Add NR UE_id %d : rnti %x\n", - mod_idP, - UE_id, - rntiP); - dump_nr_list(&UE_info->list); - return (UE_id); + + pthread_mutex_lock(&UE_info->mutex); + int i; + for(i=0; i<MAX_MOBILES_PER_GNB; i++) + if (UE_info->list[i] == NULL) { + UE_info->list[i] = UE; + break; + } + if (i == MAX_MOBILES_PER_GNB) { + LOG_E(NR_MAC,"Try to add UE %04x but the list is full\n", rntiP); + delete_nr_ue_data(UE, nr_mac->common_channels); + pthread_mutex_unlock(&UE_info->mutex); + return NULL; } + pthread_mutex_unlock(&UE_info->mutex); - // printf("MAC: cannot add new UE for rnti %x\n", rntiP); - LOG_E(NR_MAC, "error in add_new_ue(), could not find space in UE_info, Dumping UE list\n"); - dump_nr_list(&UE_info->list); - return -1; + LOG_D(NR_MAC, "Add NR rnti %x\n", rntiP); + dump_nr_list(UE_info->list); + return (UE); } - void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl, const NR_PDSCH_ServingCellConfig_t *pdsch) { const int nrofHARQ = pdsch && pdsch->nrofHARQ_ProcessesForPDSCH ? @@ -2434,68 +2510,70 @@ void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl, } } -/* hack data to remove UE in the phy */ -int rnti_to_remove[10]; -volatile int rnti_to_remove_count; -pthread_mutex_t rnti_to_remove_mutex = PTHREAD_MUTEX_INITIALIZER; +void reset_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl) { + int harq; + while ((harq = sched_ctrl->feedback_dl_harq.head) >= 0) { + remove_front_nr_list(&sched_ctrl->feedback_dl_harq); + add_tail_nr_list(&sched_ctrl->available_dl_harq, harq); + } -void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti) -{ - int UE_id; - int i; - int cc_id; - NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info; + while ((harq = sched_ctrl->retrans_dl_harq.head) >= 0) { + remove_front_nr_list(&sched_ctrl->retrans_dl_harq); + add_tail_nr_list(&sched_ctrl->available_dl_harq, harq); + } - for (i = 0; i < MAX_MOBILES_PER_GNB; i++) { + for (int i = 0; i < NR_MAX_NB_HARQ_PROCESSES; i++) { + sched_ctrl->harq_processes[i].feedback_slot = -1; + sched_ctrl->harq_processes[i].round = 0; + sched_ctrl->harq_processes[i].is_waiting = false; + } +} - if (UE_info->active[i] != TRUE) - continue; - if (UE_info->rnti[i] != rnti) - continue; +void reset_ul_harq_list(NR_UE_sched_ctrl_t *sched_ctrl) { + int harq; + while ((harq = sched_ctrl->feedback_ul_harq.head) >= 0) { + remove_front_nr_list(&sched_ctrl->feedback_ul_harq); + add_tail_nr_list(&sched_ctrl->available_ul_harq, harq); + } - /* UE found, remove it */ - UE_id = i; - - UE_info->num_UEs--; - UE_info->active[UE_id] = FALSE; - UE_info->rnti[UE_id] = 0; - remove_nr_list(&UE_info->list, UE_id); - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - destroy_nr_list(&sched_ctrl->available_dl_harq); - destroy_nr_list(&sched_ctrl->feedback_dl_harq); - destroy_nr_list(&sched_ctrl->retrans_dl_harq); - destroy_nr_list(&sched_ctrl->available_ul_harq); - destroy_nr_list(&sched_ctrl->feedback_ul_harq); - destroy_nr_list(&sched_ctrl->retrans_ul_harq); - LOG_I(NR_MAC, "[gNB %d] Remove NR UE_id %d: rnti 0x%04x\n", - mod_id, - UE_id, - rnti); - - /* hack to remove UE in the phy */ - if (pthread_mutex_lock(&rnti_to_remove_mutex)) exit(1); - if (rnti_to_remove_count == 10) exit(1); - rnti_to_remove[rnti_to_remove_count] = rnti; - LOG_W(NR_MAC, "to remove in mac rnti_to_remove[%d] = 0x%04x\n", rnti_to_remove_count, rnti); - rnti_to_remove_count++; - if (pthread_mutex_unlock(&rnti_to_remove_mutex)) exit(1); + while ((harq = sched_ctrl->retrans_ul_harq.head) >= 0) { + remove_front_nr_list(&sched_ctrl->retrans_ul_harq); + add_tail_nr_list(&sched_ctrl->available_ul_harq, harq); } - /* clear RA process(es?) associated to the UE */ - for (cc_id = 0; cc_id < NFAPI_CC_MAX; cc_id++) { - NR_COMMON_channels_t *cc = &RC.nrmac[mod_id]->common_channels[cc_id]; - for (i = 0; i < NR_NB_RA_PROC_MAX; i++) { - if (cc->ra[i].rnti == rnti) { - LOG_D(NR_MAC, "free RA process %d for rnti %d\n", i, rnti); - /* is it enough? */ - cc->ra[i].cfra = false; - cc->ra[i].rnti = 0; - cc->ra[i].crnti = 0; - } - } + for (int i = 0; i < NR_MAX_NB_HARQ_PROCESSES; i++) { + sched_ctrl->ul_harq_processes[i].feedback_slot = -1; + sched_ctrl->ul_harq_processes[i].round = 0; + sched_ctrl->ul_harq_processes[i].is_waiting = false; } } +void mac_remove_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rnti) +{ + NR_UEs_t *UE_info = &nr_mac->UE_info; + pthread_mutex_lock(&UE_info->mutex); + UE_iterator(UE_info->list, UE) { + if (UE->rnti==rnti) + break; + } + + if (!UE) { + LOG_W(NR_MAC,"Call to del rnti %04x, but not existing\n", rnti); + pthread_mutex_unlock(&UE_info->mutex); + return; + } + + NR_UE_info_t * newUEs[MAX_MOBILES_PER_GNB+1]={0}; + int newListIdx=0; + for (int i=0; i<MAX_MOBILES_PER_GNB; i++) + if(UE_info->list[i] && UE_info->list[i]->rnti != rnti) + newUEs[newListIdx++]=UE_info->list[i]; + memcpy(UE_info->list, newUEs, sizeof(UE_info->list)); + pthread_mutex_unlock(&UE_info->mutex); + + delete_nr_ue_data(UE, nr_mac->common_channels); +} + void nr_mac_remove_ra_rnti(module_id_t mod_id, rnti_t rnti) { // Hack to remove UE in the phy (following the same procedure as in function mac_remove_nr_ue) if (pthread_mutex_lock(&rnti_to_remove_mutex)) exit(1); @@ -2517,20 +2595,18 @@ uint8_t nr_get_tpc(int target, uint8_t cqi, int incr) { } -void get_pdsch_to_harq_feedback(int Mod_idP, - int UE_id, +void get_pdsch_to_harq_feedback(NR_UE_info_t *UE, int bwp_id, NR_SearchSpace__searchSpaceType_PR ss_type, int *max_fb_time, uint8_t *pdsch_to_harq_feedback) { - NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info; - NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id]; + NR_CellGroupConfig_t *CellGroup = UE->CellGroup; NR_BWP_DownlinkDedicated_t *bwpd=NULL; NR_BWP_UplinkDedicated_t *ubwpd=NULL; if (ss_type == NR_SearchSpace__searchSpaceType_PR_ue_Specific) { - AssertFatal(CellGroup!=NULL,"Cellgroup is not defined for UE_id %d\n",UE_id); + AssertFatal(CellGroup!=NULL,"Cellgroup is not defined for UE %04x\n",UE->rnti); AssertFatal(CellGroup->spCellConfig!=NULL,"Cellgroup->spCellConfig is null\n"); AssertFatal(CellGroup->spCellConfig->spCellConfigDedicated!=NULL,"CellGroup->spCellConfig->spCellConfigDedicated is null\n"); } @@ -2588,7 +2664,6 @@ void get_pdsch_to_harq_feedback(int Mod_idP, pdsch_to_harq_feedback[i] = i+1; if(pdsch_to_harq_feedback[i]>*max_fb_time) *max_fb_time = pdsch_to_harq_feedback[i]; - } } else { @@ -2606,28 +2681,25 @@ void get_pdsch_to_harq_feedback(int Mod_idP, } } - - void nr_csirs_scheduling(int Mod_idP, frame_t frame, sub_frame_t slot, int n_slots_frame){ int CC_id = 0; - NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info; - NR_list_t *UE_list = &UE_info->list; + NR_UEs_t *UE_info = &RC.nrmac[Mod_idP]->UE_info; gNB_MAC_INST *gNB_mac = RC.nrmac[Mod_idP]; uint16_t *vrb_map = gNB_mac->common_channels[CC_id].vrb_map; - for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { + UE_info->sched_csirs = false; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + UE_iterator(UE_info->list, UE) { + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; if (sched_ctrl->rrc_processing_timer > 0) { continue; } - - NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id]; + NR_CellGroupConfig_t *CellGroup = UE->CellGroup; if (!CellGroup || !CellGroup->spCellConfig || !CellGroup->spCellConfig->spCellConfigDedicated || !CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig) continue; @@ -2640,9 +2712,10 @@ void nr_csirs_scheduling(int Mod_idP, int period, offset; nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body; - NR_BWP_t *genericParameters = sched_ctrl->active_bwp ? - &sched_ctrl->active_bwp->bwp_Common->genericParameters: + NR_BWP_t *genericParameters = sched_ctrl->active_bwp ? + &sched_ctrl->active_bwp->bwp_Common->genericParameters : &gNB_mac->common_channels[0].ServingCellConfigCommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters; + for (int id = 0; id < csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.count; id++){ nzpcsi = csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.array[id]; NR_CSI_RS_ResourceMapping_t resourceMapping = nzpcsi->resourceMapping; @@ -2651,6 +2724,7 @@ void nr_csirs_scheduling(int Mod_idP, if((frame*n_slots_frame+slot-offset)%period == 0) { LOG_D(NR_MAC,"Scheduling CSI-RS in frame %d slot %d\n",frame,slot); + UE_info->sched_csirs = true; nfapi_nr_dl_tti_request_pdu_t *dl_tti_csirs_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs]; memset((void*)dl_tti_csirs_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t)); @@ -2659,16 +2733,27 @@ void nr_csirs_scheduling(int Mod_idP, nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csirs_pdu_rel15 = &dl_tti_csirs_pdu->csi_rs_pdu.csi_rs_pdu_rel15; - csirs_pdu_rel15->bwp_size = NRRIV2BW(genericParameters->locationAndBandwidth,275); - csirs_pdu_rel15->bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,275); csirs_pdu_rel15->subcarrier_spacing = genericParameters->subcarrierSpacing; if (genericParameters->cyclicPrefix) csirs_pdu_rel15->cyclic_prefix = *genericParameters->cyclicPrefix; else csirs_pdu_rel15->cyclic_prefix = 0; - csirs_pdu_rel15->start_rb = resourceMapping.freqBand.startingRB; - csirs_pdu_rel15->nr_of_rbs = resourceMapping.freqBand.nrofRBs; + // According to last paragraph of TS 38.214 5.2.2.3.1 + uint16_t BWPSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE); + uint16_t BWPStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE); + if (resourceMapping.freqBand.startingRB < BWPStart) { + csirs_pdu_rel15->start_rb = BWPStart; + } else { + csirs_pdu_rel15->start_rb = resourceMapping.freqBand.startingRB; + } + if (resourceMapping.freqBand.nrofRBs > (BWPStart + BWPSize - csirs_pdu_rel15->start_rb)) { + csirs_pdu_rel15->nr_of_rbs = BWPStart + BWPSize - csirs_pdu_rel15->start_rb; + } else { + csirs_pdu_rel15->nr_of_rbs = resourceMapping.freqBand.nrofRBs; + } + AssertFatal(csirs_pdu_rel15->nr_of_rbs >= 24, "CSI-RS has %d RBs, but the minimum is 24\n", csirs_pdu_rel15->nr_of_rbs); + csirs_pdu_rel15->csi_type = 1; // NZP-CSI-RS csirs_pdu_rel15->symb_l0 = resourceMapping.firstOFDMSymbolInTimeDomain; if (resourceMapping.firstOFDMSymbolInTimeDomain2) @@ -2689,20 +2774,20 @@ void nr_csirs_scheduling(int Mod_idP, csirs_pdu_rel15->row = 1; csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row1.buf[0])>>4)&0x0f; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1); + vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1); break; case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row2: csirs_pdu_rel15->row = 2; csirs_pdu_rel15->freq_domain = (((resourceMapping.frequencyDomainAllocation.choice.row2.buf[1]>>4)&0x0f) | ((resourceMapping.frequencyDomainAllocation.choice.row2.buf[0]<<4)&0xff0)); for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1); + vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1); break; case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row4: csirs_pdu_rel15->row = 4; csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row4.buf[0])>>5)&0x07; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1); + vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1); break; case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_other: csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.other.buf[0])>>2)&0x3f; @@ -2714,18 +2799,18 @@ void nr_csirs_scheduling(int Mod_idP, case NR_CSI_RS_ResourceMapping__nrofPorts_p2: csirs_pdu_rel15->row = 3; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1); + vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1); break; case NR_CSI_RS_ResourceMapping__nrofPorts_p4: csirs_pdu_rel15->row = 5; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2); + vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2); break; case NR_CSI_RS_ResourceMapping__nrofPorts_p8: if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) { csirs_pdu_rel15->row = 8; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2); + vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2); } else{ int num_k = 0; @@ -2734,12 +2819,12 @@ void nr_csirs_scheduling(int Mod_idP, if(num_k==4) { csirs_pdu_rel15->row = 6; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1); + vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1); } else { csirs_pdu_rel15->row = 7; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2); + vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2); } } break; @@ -2747,12 +2832,12 @@ void nr_csirs_scheduling(int Mod_idP, if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) { csirs_pdu_rel15->row = 10; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2); + vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2); } else { csirs_pdu_rel15->row = 9; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1); + vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 1); } break; case NR_CSI_RS_ResourceMapping__nrofPorts_p16: @@ -2761,24 +2846,24 @@ void nr_csirs_scheduling(int Mod_idP, else csirs_pdu_rel15->row = 11; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2); + vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2); break; case NR_CSI_RS_ResourceMapping__nrofPorts_p24: if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) { csirs_pdu_rel15->row = 14; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2)); + vrb_map[rb] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2)); } else{ if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4) { csirs_pdu_rel15->row = 15; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 3); + vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 3); } else { csirs_pdu_rel15->row = 13; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2)); + vrb_map[rb] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2)); } } break; @@ -2786,18 +2871,18 @@ void nr_csirs_scheduling(int Mod_idP, if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) { csirs_pdu_rel15->row = 17; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2)); + vrb_map[rb] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2)); } else{ if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4) { csirs_pdu_rel15->row = 18; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 3); + vrb_map[rb] |= SL_to_bitmap(csirs_pdu_rel15->symb_l0, 3); } else { csirs_pdu_rel15->row = 16; for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++) - vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2)); + vrb_map[rb] |= (SL_to_bitmap(csirs_pdu_rel15->symb_l0, 2) | SL_to_bitmap(csirs_pdu_rel15->symb_l1, 2)); } } break; @@ -2818,30 +2903,127 @@ void nr_csirs_scheduling(int Mod_idP, void nr_mac_update_timers(module_id_t module_id, frame_t frame, sub_frame_t slot) { - NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info; - const NR_list_t *UE_list = &UE_info->list; - for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info; + + UE_iterator(UE_info->list, UE) { + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; if (sched_ctrl->rrc_processing_timer > 0) { sched_ctrl->rrc_processing_timer--; if (sched_ctrl->rrc_processing_timer == 0) { - LOG_I(NR_MAC, "(%d.%d) De-activating RRC processing timer for UE %d\n", frame, slot, UE_id); + LOG_I(NR_MAC, "(%d.%d) De-activating RRC processing timer for UE %04x\n", frame, slot, UE->rnti); const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; + + NR_CellGroupConfig_t *cg = NULL; + uper_decode(NULL, + &asn_DEF_NR_CellGroupConfig, //might be added prefix later + (void **)&cg, + (uint8_t *)UE->cg_buf, + (UE->enc_rval.encoded+7)/8, 0, 0); + UE->CellGroup = cg; + + if (LOG_DEBUGFLAG(DEBUG_ASN1)) { + xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *) UE->CellGroup); + } + NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon; - NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id]; + const NR_ServingCellConfig_t *spCellConfigDedicated = cg && cg->spCellConfig ? cg->spCellConfig->spCellConfigDedicated : NULL; + LOG_I(NR_MAC,"Modified rnti %04x with CellGroup\n", UE->rnti); + process_CellGroup(cg,&UE->UE_sched_ctrl); + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + + const NR_PDSCH_ServingCellConfig_t *pdsch = spCellConfigDedicated ? spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup : NULL; + if (get_softmodem_params()->sa) { + // add all available DL HARQ processes for this UE in SA + create_dl_harq_list(sched_ctrl, pdsch); + } + + // If needed, update the Dedicated BWP + const int current_bwp_id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0; + const int current_ubwp_id = sched_ctrl->active_ubwp ? sched_ctrl->active_ubwp->bwp_Id : 0; + if (UE->Msg3_dcch_dtch) { + // 3GPP TS 38.321 Section 5.15 Bandwidth Part (BWP) operation + // Currently there are no PRACH occasions configured for any Dedicated BWP, so UE will switch to the initialDownlinkBWP + sched_ctrl->active_bwp = NULL; + if (current_bwp_id != 0) { + LOG_I(NR_MAC, "(%d.%d) Switching to initialDownlinkBWP\n", frame, slot); + } + // 3GPP TS 38.321 Section 5.15 Bandwidth Part (BWP) operation + // Currently there are no PRACH occasions configured for any Dedicated BWP, so UE will switch to the initialUplinkBWP + sched_ctrl->active_ubwp = NULL; + if (current_ubwp_id != 0) { + LOG_I(NR_MAC, "(%d.%d) Switching to initialUplinkBWP\n", frame, slot); + } + UE->Msg3_dcch_dtch = false; + + // Schedule BWP switching to the first active BWP (previous active BWP before RA with Msg3 carrying DCCH or DTCH message) + sched_ctrl->next_dl_bwp_id = current_bwp_id; + sched_ctrl->next_ul_bwp_id = current_ubwp_id; + } else if (spCellConfigDedicated && + spCellConfigDedicated->downlinkBWP_ToAddModList && + spCellConfigDedicated->uplinkConfig && + spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList) { + sched_ctrl->active_bwp = spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[*spCellConfigDedicated->firstActiveDownlinkBWP_Id - 1]; + if (*spCellConfigDedicated->firstActiveDownlinkBWP_Id != current_bwp_id) { + LOG_I(NR_MAC, "(%d.%d) Switching to DL-BWP %li\n", frame, slot, sched_ctrl->active_bwp->bwp_Id); + } + sched_ctrl->active_ubwp = spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[*spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id - 1]; + if (*spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id != current_ubwp_id) { + LOG_I(NR_MAC, "(%d.%d) Switching to UL-BWP %li\n", frame, slot, sched_ctrl->active_ubwp->bwp_Id); + } + + // Update next_dl_bwp_id to not trigger BWP switching, UE should be already on active_bwp + sched_ctrl->next_dl_bwp_id = sched_ctrl->active_bwp->bwp_Id; + // Update next_ul_bwp_id to not trigger BWP switching, UE should be already on active_ubwp + sched_ctrl->next_ul_bwp_id = sched_ctrl->active_ubwp->bwp_Id; + } else { + sched_ctrl->active_bwp = NULL; + sched_ctrl->active_ubwp = NULL; + + // Update next_dl_bwp_id to not trigger BWP switching, UE should be already on Initial BWP + sched_ctrl->next_dl_bwp_id = 0; + // Update next_ul_bwp_id to not trigger BWP switching, UE should be already on Initial BWP + sched_ctrl->next_ul_bwp_id = 0; + } + + // Update coreset/searchspace NR_BWP_Downlink_t *bwp = sched_ctrl->active_bwp; - NR_BWP_DownlinkDedicated_t *bwpd = cg && - cg->spCellConfig && - cg->spCellConfig->spCellConfigDedicated ? - cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL; - int **preferred_dl_tda = RC.nrmac[module_id]->preferred_dl_tda; - NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static; + NR_BWP_DownlinkDedicated_t *bwpd = NULL; + NR_BWP_t *genericParameters = NULL; + int target_ss = NR_SearchSpace__searchSpaceType_PR_common; + if (bwp) { + target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific; + bwpd = sched_ctrl->active_bwp->bwp_Dedicated; + genericParameters = &sched_ctrl->active_bwp->bwp_Common->genericParameters; + } else if (cg && + cg->spCellConfig && + cg->spCellConfig->spCellConfigDedicated && + (cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)) { + target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific; + bwpd = cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP; + genericParameters = &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters; + } + sched_ctrl->search_space = get_searchspace(sib1, scc, (void*)bwpd, target_ss); + sched_ctrl->coreset = get_coreset(RC.nrmac[module_id], scc, (void*)bwpd, sched_ctrl->search_space, target_ss); + sched_ctrl->sched_pdcch = set_pdcch_structure(RC.nrmac[module_id], + sched_ctrl->search_space, + sched_ctrl->coreset, + scc, + genericParameters, + RC.nrmac[module_id]->type0_PDCCH_CSS_config); + sched_ctrl->maxL = 2; + if (cg && + cg->spCellConfig && + cg->spCellConfig->spCellConfigDedicated && + cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig && + cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup) { + compute_csi_bitlen (cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE->csi_report_template); + } + NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static; const uint8_t layers = set_dl_nrOfLayers(sched_ctrl); - const int tda = bwp && preferred_dl_tda[bwp->bwp_Id][slot] >= 0 ? - preferred_dl_tda[bwp->bwp_Id][slot] : (ps->time_domain_allocation >= 0 ? ps->time_domain_allocation : 0); + const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot); nr_set_pdsch_semi_static(sib1, scc, @@ -2854,18 +3036,21 @@ void nr_mac_update_timers(module_id_t module_id, ps); NR_BWP_Uplink_t *ubwp = sched_ctrl->active_ubwp; - NR_BWP_UplinkDedicated_t *ubwpd = cg && - cg->spCellConfig && - cg->spCellConfig->spCellConfigDedicated && - cg->spCellConfig->spCellConfigDedicated->uplinkConfig ? - cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL; - int **preferred_ul_tda = RC.nrmac[module_id]->preferred_ul_tda; - NR_pusch_semi_static_t *ups = &sched_ctrl->pusch_semi_static; + NR_BWP_UplinkDedicated_t *ubwpd = NULL; + if (ubwp) { + ubwpd = sched_ctrl->active_ubwp->bwp_Dedicated; + } else if (cg && + cg->spCellConfig && + cg->spCellConfig->spCellConfigDedicated && + (cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)) { + ubwpd = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP; + } + NR_pusch_semi_static_t *ups = &sched_ctrl->pusch_semi_static; int dci_format = get_dci_format(sched_ctrl); const uint8_t num_dmrs_cdm_grps_no_data = (ubwp || ubwpd) ? 1 : 2; - const int utda = ubwp && preferred_ul_tda[ubwp->bwp_Id][slot] >= 0 ? - preferred_ul_tda[ubwp->bwp_Id][slot] : (ups->time_domain_allocation >= 0 ? ups->time_domain_allocation : 0); + const uint8_t nrOfLayers = 1; + const int utda = get_ul_tda(RC.nrmac[module_id], scc, slot); nr_set_pusch_semi_static(sib1, scc, @@ -2874,312 +3059,63 @@ void nr_mac_update_timers(module_id_t module_id, dci_format, utda, num_dmrs_cdm_grps_no_data, + nrOfLayers, ups); } } } } -/*void fill_nfapi_coresets_and_searchspaces(NR_CellGroupConfig_t *cg, - nfapi_nr_coreset_t *coreset, - nfapi_nr_search_space_t *search_space) { - - nfapi_nr_coreset_t *cs; - nfapi_nr_search_space_t *ss; - NR_ServingCellConfigCommon_t *scc=cg->spCellConfig->reconfigurationWithSync->spCellConfigCommon; - AssertFatal(cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1, - "downlinkBWP_ToAddModList has %d BWP!\n", - cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count); - - NR_BWP_Downlink_t *bwp=cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[0]; - struct NR_PDCCH_Config__controlResourceSetToAddModList *coreset_list = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList; - AssertFatal(coreset_list->list.count>0, - "cs list has 0 elements\n"); - for (int i=0;i<coreset_list->list.count;i++) { - NR_ControlResourceSet_t *coreset_i=coreset_list->list.array[i]; - cs = coreset + coreset_i->controlResourceSetId; - - cs->coreset_id = coreset_i->controlResourceSetId; - AssertFatal(coreset_i->frequencyDomainResources.size <=8 && coreset_i->frequencyDomainResources.size>0, - "coreset_i->frequencyDomainResources.size=%d\n", - (int)coreset_i->frequencyDomainResources.size); - - for (int f=0;f<coreset_i->frequencyDomainResources.size;f++) - ((uint8_t*)&cs->frequency_domain_resources)[coreset_i->frequencyDomainResources.size-1-f]=coreset_i->frequencyDomainResources.buf[f]; - - cs->frequency_domain_resources>>=coreset_i->frequencyDomainResources.bits_unused; - - cs->duration = coreset_i->duration; - // Need to add information about TCI_StateIDs - - if (coreset_i->cce_REG_MappingType.present == NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved) - cs->cce_reg_mapping_type = NFAPI_NR_CCE_REG_MAPPING_NON_INTERLEAVED; - else { - cs->cce_reg_mapping_type = NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED; +void schedule_nr_bwp_switch(module_id_t module_id, + frame_t frame, + sub_frame_t slot) { - if (coreset_i->cce_REG_MappingType.choice.interleaved->reg_BundleSize==NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6) - cs->reg_bundle_size = 6; - else cs->reg_bundle_size = 2+coreset_i->cce_REG_MappingType.choice.interleaved->reg_BundleSize; + NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info; - if (coreset_i->cce_REG_MappingType.choice.interleaved->interleaverSize==NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n6) - cs->interleaver_size = 6; - else cs->interleaver_size = 2+coreset_i->cce_REG_MappingType.choice.interleaved->interleaverSize; + // TODO: Implementation of a algorithm to perform: + // - DL BWP selection: sched_ctrl->next_dl_bwp_id = dl_bwp_id + // - UL BWP selection: sched_ctrl->next_ul_bwp_id = ul_bwp_id - if (coreset_i->cce_REG_MappingType.choice.interleaved->shiftIndex) - cs->shift_index = *coreset_i->cce_REG_MappingType.choice.interleaved->shiftIndex; - else cs->shift_index = 0; - } - - if (coreset_i->precoderGranularity == NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle) - cs->precoder_granularity = NFAPI_NR_CSET_SAME_AS_REG_BUNDLE; - else cs->precoder_granularity = NFAPI_NR_CSET_ALL_CONTIGUOUS_RBS; - if (coreset_i->tci_PresentInDCI == NULL) cs->tci_present_in_dci = 0; - else cs->tci_present_in_dci = 1; - - if (coreset_i->tci_PresentInDCI == NULL) cs->dmrs_scrambling_id = 0; - else cs->dmrs_scrambling_id = *coreset_i->tci_PresentInDCI; - } - - struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList; - AssertFatal(commonSearchSpaceList->list.count>0, - "common SearchSpace list has 0 elements\n"); - // Common searchspace list - for (int i=0;i<commonSearchSpaceList->list.count;i++) { - NR_SearchSpace_t *searchSpace_i=commonSearchSpaceList->list.array[i]; - ss=search_space + searchSpace_i->searchSpaceId; - if (searchSpace_i->controlResourceSetId) ss->coreset_id = *searchSpace_i->controlResourceSetId; - switch(searchSpace_i->monitoringSlotPeriodicityAndOffset->present) { - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL1; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl2: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL2; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl2; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl4: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL4; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl4; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl5: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL5; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl5; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl8: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL8; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl8; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl10: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL10; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl10; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl16: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL16; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl16; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl20: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL20; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl20; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl40: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL40; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl40; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl80: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL80; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl80; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl160: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL160; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl160; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl320: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL320; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl320; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl640: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL640; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl640; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1280: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL1280; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl1280; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl2560: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL2560; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl2560; - break; - default: - AssertFatal(1==0,"Shouldn't get here\n"); - break; - } - if (searchSpace_i->duration) ss->duration = *searchSpace_i->duration; - else ss->duration = 1; - - - AssertFatal(searchSpace_i->monitoringSymbolsWithinSlot->size == 2, - "ss_i->monitoringSymbolsWithinSlot = %d != 2\n", - (int)searchSpace_i->monitoringSymbolsWithinSlot->size); - ((uint8_t*)&ss->monitoring_symbols_in_slot)[1] = searchSpace_i->monitoringSymbolsWithinSlot->buf[0]; - ((uint8_t*)&ss->monitoring_symbols_in_slot)[0] = searchSpace_i->monitoringSymbolsWithinSlot->buf[1]; - - AssertFatal(searchSpace_i->nrofCandidates!=NULL,"searchSpace_%d->nrofCandidates is null\n",(int)searchSpace_i->searchSpaceId); - if (searchSpace_i->nrofCandidates->aggregationLevel1 == NR_SearchSpace__nrofCandidates__aggregationLevel1_n8) - ss->number_of_candidates[0] = 8; - else ss->number_of_candidates[0] = searchSpace_i->nrofCandidates->aggregationLevel1; - if (searchSpace_i->nrofCandidates->aggregationLevel2 == NR_SearchSpace__nrofCandidates__aggregationLevel2_n8) - ss->number_of_candidates[1] = 8; - else ss->number_of_candidates[1] = searchSpace_i->nrofCandidates->aggregationLevel2; - if (searchSpace_i->nrofCandidates->aggregationLevel4 == NR_SearchSpace__nrofCandidates__aggregationLevel4_n8) - ss->number_of_candidates[2] = 8; - else ss->number_of_candidates[2] = searchSpace_i->nrofCandidates->aggregationLevel4; - if (searchSpace_i->nrofCandidates->aggregationLevel8 == NR_SearchSpace__nrofCandidates__aggregationLevel8_n8) - ss->number_of_candidates[3] = 8; - else ss->number_of_candidates[3] = searchSpace_i->nrofCandidates->aggregationLevel8; - if (searchSpace_i->nrofCandidates->aggregationLevel16 == NR_SearchSpace__nrofCandidates__aggregationLevel16_n8) - ss->number_of_candidates[4] = 8; - else ss->number_of_candidates[4] = searchSpace_i->nrofCandidates->aggregationLevel16; - - AssertFatal(searchSpace_i->searchSpaceType->present==NR_SearchSpace__searchSpaceType_PR_common, - "searchspace %d is not common\n",(int)searchSpace_i->searchSpaceId); - AssertFatal(searchSpace_i->searchSpaceType->choice.common!=NULL, - "searchspace %d common is null\n",(int)searchSpace_i->searchSpaceId); - ss->search_space_type = NFAPI_NR_SEARCH_SPACE_TYPE_COMMON; - if (searchSpace_i->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0) - ss->css_formats_0_0_and_1_0 = 1; - if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_0) { - ss->css_format_2_0 = 1; - // add aggregation info - } - if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_1) - ss->css_format_2_1 = 1; - if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_2) - ss->css_format_2_2 = 1; - if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_3) - ss->css_format_2_3 = 1; - } - - struct NR_PDCCH_Config__searchSpacesToAddModList *dedicatedSearchSpaceList = bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList; - AssertFatal(dedicatedSearchSpaceList->list.count>0, - "Dedicated Search Space list has 0 elements\n"); - // Dedicated searchspace list - for (int i=0;i<dedicatedSearchSpaceList->list.count;i++) { - NR_SearchSpace_t *searchSpace_i=dedicatedSearchSpaceList->list.array[i]; - ss=search_space + searchSpace_i->searchSpaceId; - ss->search_space_id = searchSpace_i->searchSpaceId; - if (searchSpace_i->controlResourceSetId) ss->coreset_id = *searchSpace_i->controlResourceSetId; - switch(searchSpace_i->monitoringSlotPeriodicityAndOffset->present) { - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL1; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl2: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL2; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl2; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl4: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL4; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl4; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl5: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL5; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl5; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl8: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL8; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl8; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl10: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL10; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl10; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl16: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL16; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl16; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl20: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL20; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl20; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl40: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL40; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl40; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl80: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL80; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl80; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl160: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL160; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl160; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl320: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL320; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl320; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl640: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL640; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl640; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1280: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL1280; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl1280; - break; - case NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl2560: - ss->slot_monitoring_periodicity = NFAPI_NR_SS_PERIODICITY_SL2560; - ss->slot_monitoring_offset = searchSpace_i->monitoringSlotPeriodicityAndOffset->choice.sl2560; - break; - default: - AssertFatal(1==0,"Shouldn't get here\n"); - break; - } - if (searchSpace_i->duration) ss->duration = *searchSpace_i->duration; - else ss->duration = 1; - - - AssertFatal(searchSpace_i->monitoringSymbolsWithinSlot->size == 2, - "ss_i->monitoringSymbolsWithinSlot = %d != 2\n", - (int)searchSpace_i->monitoringSymbolsWithinSlot->size); - ((uint8_t*)&ss->monitoring_symbols_in_slot)[1] = searchSpace_i->monitoringSymbolsWithinSlot->buf[0]; - ((uint8_t*)&ss->monitoring_symbols_in_slot)[0] = searchSpace_i->monitoringSymbolsWithinSlot->buf[1]; - - AssertFatal(searchSpace_i->nrofCandidates!=NULL,"searchSpace_%d->nrofCandidates is null\n",(int)searchSpace_i->searchSpaceId); - if (searchSpace_i->nrofCandidates->aggregationLevel1 == NR_SearchSpace__nrofCandidates__aggregationLevel1_n8) - ss->number_of_candidates[0] = 8; - else ss->number_of_candidates[0] = searchSpace_i->nrofCandidates->aggregationLevel1; - if (searchSpace_i->nrofCandidates->aggregationLevel2 == NR_SearchSpace__nrofCandidates__aggregationLevel2_n8) - ss->number_of_candidates[1] = 8; - else ss->number_of_candidates[1] = searchSpace_i->nrofCandidates->aggregationLevel2; - if (searchSpace_i->nrofCandidates->aggregationLevel4 == NR_SearchSpace__nrofCandidates__aggregationLevel4_n8) - ss->number_of_candidates[2] = 8; - else ss->number_of_candidates[2] = searchSpace_i->nrofCandidates->aggregationLevel4; - if (searchSpace_i->nrofCandidates->aggregationLevel8 == NR_SearchSpace__nrofCandidates__aggregationLevel8_n8) - ss->number_of_candidates[3] = 8; - else ss->number_of_candidates[3] = searchSpace_i->nrofCandidates->aggregationLevel8; - if (searchSpace_i->nrofCandidates->aggregationLevel16 == NR_SearchSpace__nrofCandidates__aggregationLevel16_n8) - ss->number_of_candidates[4] = 8; - else ss->number_of_candidates[4] = searchSpace_i->nrofCandidates->aggregationLevel16; - - if (searchSpace_i->searchSpaceType->present==NR_SearchSpace__searchSpaceType_PR_ue_Specific && searchSpace_i->searchSpaceType->choice.ue_Specific!=NULL) { - - ss->search_space_type = NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC; - - ss->uss_dci_formats = searchSpace_i->searchSpaceType->choice.ue_Specific-> dci_Formats; - - } else if (searchSpace_i->searchSpaceType->present==NR_SearchSpace__searchSpaceType_PR_common && searchSpace_i->searchSpaceType->choice.common!=NULL) { - ss->search_space_type = NFAPI_NR_SEARCH_SPACE_TYPE_COMMON; - - if (searchSpace_i->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0) - ss->css_formats_0_0_and_1_0 = 1; - if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_0) { - ss->css_format_2_0 = 1; - // add aggregation info + UE_iterator(UE_info->list, UE) { + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + if (sched_ctrl->rrc_processing_timer == 0 && UE->Msg4_ACKed && sched_ctrl->next_dl_bwp_id >= 0) { + + int schedule_bwp_switching = false; + if (sched_ctrl->active_bwp == NULL) { + // Switching from Initial BWP to Dedicated BWP + if (sched_ctrl->next_dl_bwp_id > 0 && sched_ctrl->next_ul_bwp_id > 0) { + schedule_bwp_switching = true; + LOG_W(NR_MAC,"%4d.%2d UE %04x Schedule BWP switch from Initial DL BWP to %ld and from Initial UL BWP to %ld\n", + frame, slot, UE->rnti, sched_ctrl->next_dl_bwp_id, sched_ctrl->next_ul_bwp_id); + } + } else if (sched_ctrl->active_bwp->bwp_Id != sched_ctrl->next_dl_bwp_id && sched_ctrl->active_ubwp->bwp_Id != sched_ctrl->next_ul_bwp_id) { + // Switching between Dedicated BWPs + schedule_bwp_switching = true; + LOG_W(NR_MAC,"%4d.%2d UE %04x Schedule BWP switch from dl_bwp_id %ld to %ld and from ul_bwp_id %ld to %ld\n", + frame, slot, UE->rnti, sched_ctrl->active_bwp->bwp_Id, sched_ctrl->next_dl_bwp_id, sched_ctrl->active_ubwp->bwp_Id, sched_ctrl->next_ul_bwp_id); + } + + if (schedule_bwp_switching) { + AssertFatal(sched_ctrl->next_dl_bwp_id > 0 && sched_ctrl->next_ul_bwp_id > 0, "BWP switching from a Dedicated BWP to the Initial BWP not handled yet!"); + nr_mac_rrc_bwp_switch_req(module_id, frame, slot, UE->rnti, sched_ctrl->next_dl_bwp_id, sched_ctrl->next_ul_bwp_id); } - if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_1) - ss->css_format_2_1 = 1; - if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_2) - ss->css_format_2_2 = 1; - if (searchSpace_i->searchSpaceType->choice.common->dci_Format2_3) - ss->css_format_2_3 = 1; } } } -*/ + +void UL_tti_req_ahead_initialization(gNB_MAC_INST * gNB, NR_ServingCellConfigCommon_t *scc, int n, int CCid) { + + if(gNB->UL_tti_req_ahead[CCid]) return; + + gNB->UL_tti_req_ahead[CCid] = calloc(n, sizeof(nfapi_nr_ul_tti_request_t)); + AssertFatal(gNB->UL_tti_req_ahead[CCid], + "could not allocate memory for RC.nrmac[]->UL_tti_req_ahead[]\n"); + /* fill in slot/frame numbers: slot is fixed, frame will be updated by scheduler + * consider that scheduler runs sl_ahead: the first sl_ahead slots are + * already "in the past" and thus we put frame 1 instead of 0! */ + for (int i = 0; i < n; ++i) { + nfapi_nr_ul_tti_request_t *req = &gNB->UL_tti_req_ahead[CCid][i]; + req->SFN = i < (gNB->if_inst->sl_ahead-1); + req->Slot = i; + } +} diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c index 8680cc25d13..4be176714ec 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c @@ -34,22 +34,22 @@ extern RAN_CONTEXT_t RC; -void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int module_id, int CC_id, int UE_id, NR_SRS_Resource_t *srs_resource) { +void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int module_id, int CC_id,NR_UE_info_t* UE, NR_SRS_Resource_t *srs_resource) { gNB_MAC_INST *nrmac = RC.nrmac[module_id]; NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon; - NR_UE_info_t *UE_info = &nrmac->UE_info; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; - NR_BWP_t ubwp = sched_ctrl->active_ubwp ? - sched_ctrl->active_ubwp->bwp_Common->genericParameters : - scc->uplinkConfigCommon->initialUplinkBWP->genericParameters; + const NR_SIB1_t *sib1 = nrmac->common_channels[0].sib1 ? nrmac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; + const NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp, + scc, + sib1); - srs_pdu->rnti = UE_info->rnti[UE_id]; + srs_pdu->rnti = UE->rnti; srs_pdu->handle = 0; - srs_pdu->bwp_size = NRRIV2BW(ubwp.locationAndBandwidth, MAX_BWP_SIZE);; - srs_pdu->bwp_start = NRRIV2PRBOFFSET(ubwp.locationAndBandwidth, MAX_BWP_SIZE);; - srs_pdu->subcarrier_spacing = ubwp.subcarrierSpacing; + srs_pdu->bwp_size = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);; + srs_pdu->bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);; + srs_pdu->subcarrier_spacing = genericParameters->subcarrierSpacing; srs_pdu->cyclic_prefix = 0; srs_pdu->num_ant_ports = srs_resource->nrofSRS_Ports; srs_pdu->num_symbols = srs_resource->resourceMapping.nrofSymbols; @@ -82,7 +82,7 @@ void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int module_id, int CC_id, int srs_pdu->t_offset = get_nr_srs_offset(srs_resource->resourceType.choice.periodic->periodicityAndOffset_p); } -void nr_fill_nfapi_srs(int module_id, int CC_id, int UE_id, sub_frame_t slot, NR_SRS_Resource_t *srs_resource) { +void nr_fill_nfapi_srs(int module_id, int CC_id, NR_UE_info_t* UE, sub_frame_t slot, NR_SRS_Resource_t *srs_resource) { nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_id]->UL_tti_req_ahead[0][slot]; AssertFatal(future_ul_tti_req->n_pdus < @@ -94,7 +94,7 @@ void nr_fill_nfapi_srs(int module_id, int CC_id, int UE_id, sub_frame_t slot, NR memset(srs_pdu, 0, sizeof(nfapi_nr_srs_pdu_t)); future_ul_tti_req->n_pdus += 1; - nr_configure_srs(srs_pdu, module_id, CC_id, UE_id, srs_resource); + nr_configure_srs(srs_pdu, module_id, CC_id, UE, srs_resource); } /******************************************************************* @@ -111,32 +111,38 @@ void nr_fill_nfapi_srs(int module_id, int CC_id, int UE_id, sub_frame_t slot, NR void nr_schedule_srs(int module_id, frame_t frame) { gNB_MAC_INST *nrmac = RC.nrmac[module_id]; - NR_UE_info_t *UE_info = &nrmac->UE_info; - const NR_list_t *UE_list = &UE_info->list; - - for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { + NR_UEs_t *UE_info = &nrmac->UE_info; + UE_iterator(UE_info->list, UE) { const int CC_id = 0; NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[CC_id].ServingCellConfigCommon; - NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id]; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_CellGroupConfig_t *cg = UE->CellGroup; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; sched_ctrl->sched_srs.frame = -1; sched_ctrl->sched_srs.slot = -1; sched_ctrl->sched_srs.srs_scheduled = false; - if(!UE_info->Msg4_ACKed[UE_id] || sched_ctrl->rrc_processing_timer > 0) { + if((sched_ctrl->ul_failure == 1 && get_softmodem_params()->phy_test==0) || + sched_ctrl->rrc_processing_timer > 0) { continue; } NR_SRS_Config_t *srs_config = NULL; - if (cg && - cg->spCellConfig && - cg->spCellConfig->spCellConfigDedicated && - cg->spCellConfig->spCellConfigDedicated->uplinkConfig && - cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) { + if (sched_ctrl->active_ubwp) { + if (sched_ctrl->active_ubwp->bwp_Dedicated && + sched_ctrl->active_ubwp->bwp_Dedicated->srs_Config) { + srs_config = sched_ctrl->active_ubwp->bwp_Dedicated->srs_Config->choice.setup; + } + } else if (cg && + cg->spCellConfig && + cg->spCellConfig->spCellConfigDedicated && + cg->spCellConfig->spCellConfigDedicated->uplinkConfig && + cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) { srs_config = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup; - } else { + } + + if (!srs_config) { continue; } @@ -166,23 +172,24 @@ void nr_schedule_srs(int module_id, frame_t frame) { continue; } - NR_BWP_t ubwp = sched_ctrl->active_ubwp ? - sched_ctrl->active_ubwp->bwp_Common->genericParameters : - scc->uplinkConfigCommon->initialUplinkBWP->genericParameters; + const NR_SIB1_t *sib1 = nrmac->common_channels[0].sib1 ? nrmac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; + const NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp, + scc, + sib1); uint16_t period = srs_period[srs_resource->resourceType.choice.periodic->periodicityAndOffset_p.present]; uint16_t offset = get_nr_srs_offset(srs_resource->resourceType.choice.periodic->periodicityAndOffset_p); - int n_slots_frame = nr_slots_per_frame[ubwp.subcarrierSpacing]; + const int n_slots_frame = nr_slots_per_frame[genericParameters->subcarrierSpacing]; // Check if UE will transmit the SRS in this frame if ( ((frame - offset/n_slots_frame)*n_slots_frame)%period == 0) { LOG_D(NR_MAC,"Scheduling SRS reception for %d.%d\n", frame, offset%n_slots_frame); - nr_fill_nfapi_srs(module_id, CC_id, UE_id, offset%n_slots_frame, srs_resource); + nr_fill_nfapi_srs(module_id, CC_id, UE, offset%n_slots_frame, srs_resource); sched_ctrl->sched_srs.frame = frame; sched_ctrl->sched_srs.slot = offset%n_slots_frame; sched_ctrl->sched_srs.srs_scheduled = true; } } } -} \ No newline at end of file +} diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index dda9e097211..b5e90a4dcce 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -38,30 +38,29 @@ extern RAN_CONTEXT_t RC; -void nr_fill_nfapi_pucch(module_id_t mod_id, - frame_t frame, - sub_frame_t slot, - const NR_sched_pucch_t *pucch, - int UE_id) -{ - gNB_MAC_INST *nr_mac = RC.nrmac[mod_id]; - NR_UE_info_t *UE_info = &nr_mac->UE_info; +static void nr_fill_nfapi_pucch(gNB_MAC_INST *nrmac, + frame_t frame, + sub_frame_t slot, + const NR_sched_pucch_t *pucch, + NR_UE_info_t* UE) +{ nfapi_nr_ul_tti_request_t *future_ul_tti_req = - &RC.nrmac[mod_id]->UL_tti_req_ahead[0][pucch->ul_slot]; - - if (future_ul_tti_req->SFN != pucch->frame || future_ul_tti_req->Slot != pucch->ul_slot) - LOG_W(MAC, - "Current %d.%d : future UL_tti_req's frame.slot %4d.%2d does not match PUCCH %4d.%2d\n", - frame,slot, - future_ul_tti_req->SFN, - future_ul_tti_req->Slot, - pucch->frame, - pucch->ul_slot); - AssertFatal(future_ul_tti_req->n_pdus < - sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]), - "Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus); - + &nrmac->UL_tti_req_ahead[0][pucch->ul_slot]; + AssertFatal(future_ul_tti_req->SFN == pucch->frame + && future_ul_tti_req->Slot == pucch->ul_slot, + "Current %4d.%2d : future UL_tti_req's frame.slot %4d.%2d does not match PUCCH %4d.%2d\n", + frame,slot, + future_ul_tti_req->SFN, + future_ul_tti_req->Slot, + pucch->frame, + pucch->ul_slot); + // n_pdus is number of pdus, so, in the array, it is the index of the next free element + if (future_ul_tti_req->n_pdus >= sizeofArray(future_ul_tti_req->pdus_list) ) { + LOG_E(NR_MAC,"future_ul_tti_req->n_pdus %d is full, slot: %d, sr flag %d dropping request\n", + future_ul_tti_req->n_pdus, pucch->ul_slot, pucch->sr_flag); + return; + } future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE; future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pucch_pdu_t); nfapi_nr_pucch_pdu_t *pucch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pucch_pdu; @@ -79,9 +78,9 @@ void nr_fill_nfapi_pucch(module_id_t mod_id, pucch->dai_c, pucch->csi_bits, pucch->resource_indicator); - - NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels->ServingCellConfigCommon; - NR_CellGroupConfig_t *cg=UE_info->CellGroup[UE_id]; + NR_COMMON_channels_t * common_ch=nrmac->common_channels; + NR_ServingCellConfigCommon_t *scc = common_ch->ServingCellConfigCommon; + NR_CellGroupConfig_t *cg=UE->CellGroup; NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated && cg->spCellConfig->spCellConfigDedicated->uplinkConfig ? @@ -90,14 +89,14 @@ void nr_fill_nfapi_pucch(module_id_t mod_id, LOG_D(NR_MAC,"%4d.%2d Calling nr_configure_pucch (ubwpd %p,r_pucch %d) pucch to be scheduled in %4d.%2d\n", frame,slot,ubwpd,pucch->r_pucch,pucch->frame,pucch->ul_slot); - const NR_SIB1_t *sib1 = nr_mac->common_channels[0].sib1 ? nr_mac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; + const NR_SIB1_t *sib1 = common_ch->sib1 ? common_ch->sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; nr_configure_pucch(sib1, pucch_pdu, scc, - UE_info->CellGroup[UE_id], - UE_info->UE_sched_ctrl[UE_id].active_ubwp, + UE->CellGroup, + UE->UE_sched_ctrl.active_ubwp, ubwpd, - UE_info->rnti[UE_id], + UE->rnti, pucch->resource_indicator, pucch->csi_bits, pucch->dai_c, @@ -141,22 +140,18 @@ int diff_rsrp_ssb_csi_meas_10_1_6_1_2[16] = { }; -void nr_schedule_pucch(int Mod_idP, +void nr_schedule_pucch(gNB_MAC_INST *nrmac, frame_t frameP, sub_frame_t slotP) { - gNB_MAC_INST *nrmac = RC.nrmac[Mod_idP]; if (!is_xlsch_in_slot(nrmac->ulsch_slot_bitmap[slotP / 64], slotP)) return; - NR_UE_info_t *UE_info = &nrmac->UE_info; - const NR_list_t *UE_list = &UE_info->list; - - for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + UE_iterator(nrmac->UE_info.list, UE) { + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; const int n = sizeof(sched_ctrl->sched_pucch) / sizeof(*sched_ctrl->sched_pucch); for (int i = 0; i < n; i++) { - NR_sched_pucch_t *curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[i]; + NR_sched_pucch_t *curr_pucch = &UE->UE_sched_ctrl.sched_pucch[i]; const uint16_t O_ack = curr_pucch->dai_c; const uint16_t O_csi = curr_pucch->csi_bits; const uint8_t O_sr = curr_pucch->sr_flag; @@ -164,537 +159,16 @@ void nr_schedule_pucch(int Mod_idP, || frameP != curr_pucch->frame || slotP != curr_pucch->ul_slot) continue; - if (O_csi > 0) LOG_D(NR_MAC,"Scheduling PUCCH[%d] RX for UE %d in %4d.%2d O_ack %d, O_sr %d, O_csi %d\n", - i,UE_id,curr_pucch->frame,curr_pucch->ul_slot,O_ack,O_sr,O_csi); - nr_fill_nfapi_pucch(Mod_idP, frameP, slotP, curr_pucch, UE_id); - memset(curr_pucch, 0, sizeof(*curr_pucch)); - } - } -} - - -//! Calculating number of bits set -uint8_t number_of_bits_set (uint8_t buf){ - uint8_t nb_of_bits_set = 0; - uint8_t mask = 0xff; - uint8_t index = 0; - - for (index=7; (buf & mask) && (index>=0) ; index--){ - if (buf & (1<<index)) - nb_of_bits_set++; - - mask>>=1; - } - return nb_of_bits_set; -} - - -void compute_rsrp_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, - uint8_t nb_resources, - nr_csi_report_t *csi_report) { - - if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled == csi_reportconfig->groupBasedBeamReporting.present) { - if (NULL != csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS) - csi_report->CSI_report_bitlen.nb_ssbri_cri = *(csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1; - else - /*! From Spec 38.331 - * nrofReportedRS - * The number (N) of measured RS resources to be reported per report setting in a non-group-based report. N <= N_max, where N_max is either 2 or 4 depending on UE - * capability. FFS: The signaling mechanism for the gNB to select a subset of N beams for the UE to measure and report. - * When the field is absent the UE applies the value 1 - */ - csi_report->CSI_report_bitlen.nb_ssbri_cri= 1; - } else - csi_report->CSI_report_bitlen.nb_ssbri_cri= 2; - - if (nb_resources) { - csi_report->CSI_report_bitlen.cri_ssbri_bitlen =ceil(log2 (nb_resources)); - csi_report->CSI_report_bitlen.rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP - csi_report->CSI_report_bitlen.diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP - } else { - csi_report->CSI_report_bitlen.cri_ssbri_bitlen =0; - csi_report->CSI_report_bitlen.rsrp_bitlen = 0; - csi_report->CSI_report_bitlen.diff_rsrp_bitlen =0; - } -} - - -uint8_t compute_ri_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, - nr_csi_report_t *csi_report){ - - struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig; - uint8_t nb_allowed_ri, ri_bitlen; - uint8_t ri_restriction = 0; - - if (codebookConfig == NULL) { - csi_report->csi_meas_bitlen.ri_bitlen=0; - return ri_restriction; - } - - // codebook type1 single panel - if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==codebookConfig->codebookType.choice.type1->subType.present){ - struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel *type1single = codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel; - if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two){ - - ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0]; - - nb_allowed_ri = number_of_bits_set(ri_restriction); - ri_bitlen = ceil(log2(nb_allowed_ri)); - - ri_bitlen = ri_bitlen<1?ri_bitlen:1; //from the spec 38.212 and table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel - csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen; - } - if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo){ - if (type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present == - NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction) { - // 4 ports - - ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0]; - - nb_allowed_ri = number_of_bits_set(ri_restriction); - ri_bitlen = ceil(log2(nb_allowed_ri)); - - ri_bitlen = ri_bitlen<2?ri_bitlen:2; //from the spec 38.212 and table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel - csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen; - } - else { - // more than 4 ports - - ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0]; - - nb_allowed_ri = number_of_bits_set(ri_restriction); - ri_bitlen = ceil(log2(nb_allowed_ri)); - - csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen; - } - } - return ri_restriction; - } - else - AssertFatal(1==0,"Other configurations not yet implemented\n"); - return -1; -} - -void compute_li_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, - uint8_t ri_restriction, - nr_csi_report_t *csi_report){ - - struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig; - for(int i=0; i<8; i++) { - if (codebookConfig == NULL || ((ri_restriction>>i)&0x01) == 0) - csi_report->csi_meas_bitlen.li_bitlen[i]=0; - else { - // codebook type1 single panel - if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==codebookConfig->codebookType.choice.type1->subType.present) - csi_report->csi_meas_bitlen.li_bitlen[i]=ceil(log2(i+1))<2?ceil(log2(i+1)):2; - else - AssertFatal(1==0,"Other configurations not yet implemented\n"); - } - } -} - - -void get_n1n2_o1o2_singlepanel(int *n1, int *n2, int *o1, int *o2, - struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo *morethantwo) { - - // Table 5.2.2.2.1-2 in 38.214 for supported configurations - switch(morethantwo->n1_n2.present){ - case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction): - *n1 = 2; - *n2 = 1; - *o1 = 4; - *o2 = 1; - break; - case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_two_TypeI_SinglePanel_Restriction): - *n1 = 2; - *n2 = 2; - *o1 = 4; - *o2 = 4; - break; - case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_one_TypeI_SinglePanel_Restriction): - *n1 = 4; - *n2 = 1; - *o1 = 4; - *o2 = 1; - break; - case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_three_two_TypeI_SinglePanel_Restriction): - *n1 = 3; - *n2 = 2; - *o1 = 4; - *o2 = 4; - break; - case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_one_TypeI_SinglePanel_Restriction): - *n1 = 6; - *n2 = 1; - *o1 = 4; - *o2 = 1; - break; - case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_two_TypeI_SinglePanel_Restriction): - *n1 = 4; - *n2 = 2; - *o1 = 4; - *o2 = 4; - break; - case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_one_TypeI_SinglePanel_Restriction): - *n1 = 8; - *n2 = 1; - *o1 = 4; - *o2 = 1; - break; - case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_three_TypeI_SinglePanel_Restriction): - *n1 = 4; - *n2 = 3; - *o1 = 4; - *o2 = 4; - break; - case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_two_TypeI_SinglePanel_Restriction): - *n1 = 4; - *n2 = 2; - *o1 = 4; - *o2 = 4; - break; - case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_twelve_one_TypeI_SinglePanel_Restriction): - *n1 = 12; - *n2 = 1; - *o1 = 4; - *o2 = 1; - break; - case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_four_TypeI_SinglePanel_Restriction): - *n1 = 4; - *n2 = 4; - *o1 = 4; - *o2 = 4; - break; - case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_two_TypeI_SinglePanel_Restriction): - *n1 = 8; - *n2 = 2; - *o1 = 4; - *o2 = 4; - break; - case (NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_sixteen_one_TypeI_SinglePanel_Restriction): - *n1 = 16; - *n2 = 1; - *o1 = 4; - *o2 = 1; - break; - default: - AssertFatal(1==0,"Not supported configuration for n1_n2 in codebook configuration"); - } -} - -void get_x1x2_bitlen_singlepanel(int n1, int n2, int o1, int o2, - int *x1, int *x2, int rank, int codebook_mode) { - - // Table 6.3.1.1.2-1 in 38.212 - switch(rank){ - case 1: - if(n2>1) { - if (codebook_mode == 1) { - *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); - *x2 = 2; - } - else { - *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2/2)); - *x2 = 4; - } - } - else{ - if (codebook_mode == 1) { - *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); - *x2 = 2; - } - else { - *x1 = ceil(log2(n1*o1/2)); - *x2 = 4; - } - } - break; - case 2: - if(n1*n2 == 2) { - if (codebook_mode == 1) { - *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); - *x2 = 1; - } - else { - *x1 = ceil(log2(n1*o1/2)); - *x2 = 3; - } - *x1 += 1; - } - else { - if(n2>1) { - if (codebook_mode == 1) { - *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); - *x2 = 3; - } - else { - *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2/2)); - *x2 = 3; - } - } - else{ - if (codebook_mode == 1) { - *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); - *x2 = 1; - } - else { - *x1 = ceil(log2(n1*o1/2)); - *x2 = 3; - } - } - *x1 += 2; - } - break; - case 3: - case 4: - if(n1*n2 == 2) { - *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); - *x2 = 1; - } - else { - if(n1*n2 >= 8) { - *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2)) + 2; - *x2 = 1; - } - else { - *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)) + 2; - *x2 = 1; - } - } - break; - case 5: - case 6: - *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); - *x2 = 1; - break; - case 7: - case 8: - if(n1 == 4 && n2 == 1) { - *x1 = ceil(log2(n1*o1/2)) + ceil(log2(n2*o2)); - *x2 = 1; - } - else { - if(n1 > 2 && n2 == 2) { - *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2/2)); - *x2 = 1; - } - else { - *x1 = ceil(log2(n1*o1)) + ceil(log2(n2*o2)); - *x2 = 1; - } - } - break; - default: - AssertFatal(1==0,"Invalid rank in x1 x2 bit length computation\n"); - } -} - -void compute_pmi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, - uint8_t ri_restriction, - nr_csi_report_t *csi_report){ - - struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig; - for(int i=0; i<8; i++) { - csi_report->csi_meas_bitlen.pmi_x1_bitlen[i]=0; - csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=0; - if (codebookConfig == NULL || ((ri_restriction>>i)&0x01) == 0) - return; - else { - if(codebookConfig->codebookType.present == NR_CodebookConfig__codebookType_PR_type1) { - if(codebookConfig->codebookType.choice.type1->subType.present == NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel) { - if(codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present == - NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two) { - if (i==0) - csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=2; - if (i==1) - csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=1; - } - else { // more than two - int n1,n2,o1,o2,x1,x2; - get_n1n2_o1o2_singlepanel(&n1,&n2,&o1,&o2,codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo); - get_x1x2_bitlen_singlepanel(n1,n2,o1,o2,&x1,&x2,i+1,codebookConfig->codebookType.choice.type1->codebookMode); - csi_report->csi_meas_bitlen.pmi_x1_bitlen[i]=x1; - csi_report->csi_meas_bitlen.pmi_x2_bitlen[i]=x2; - } - } - else - AssertFatal(1==0,"Type1 Multi-panel Codebook Config not yet implemented\n"); - } - else - AssertFatal(1==0,"Type2 Codebook Config not yet implemented\n"); - } - } -} - -void compute_cqi_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig, - uint8_t ri_restriction, - nr_csi_report_t *csi_report){ - - struct NR_CodebookConfig *codebookConfig = csi_reportconfig->codebookConfig; - struct NR_CSI_ReportConfig__reportFreqConfiguration *freq_config = csi_reportconfig->reportFreqConfiguration; - - if (*freq_config->cqi_FormatIndicator == NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI) { - for(int i=0; i<8; i++) { - if ((ri_restriction>>i)&0x01) { - csi_report->csi_meas_bitlen.cqi_bitlen[i] = 4; - if(codebookConfig != NULL) { - if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel == codebookConfig->codebookType.choice.type1->subType.present){ - struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel *type1single = codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel; - if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo) { - if (type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present > - NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction) { - // more than 4 antenna ports - if (i > 4) - csi_report->csi_meas_bitlen.cqi_bitlen[i] += 4; // CQI for second TB - } - } - } - } - } - else - csi_report->csi_meas_bitlen.cqi_bitlen[i] = 0; - } - } - else - AssertFatal(1==0,"Sub-band CQI reporting not yet supported"); -} - - -//!TODO : same function can be written to handle csi_resources -void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_info, int UE_id, module_id_t Mod_idP){ - uint8_t csi_report_id = 0; - uint8_t nb_resources = 0; - NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type; - NR_CSI_ResourceConfigId_t csi_ResourceConfigId; - struct NR_CSI_ResourceConfig *csi_resourceconfig; - - // for each CSI measurement report configuration (list of CSI-ReportConfig) - LOG_D(NR_MAC,"Searching %d csi_reports\n",csi_MeasConfig->csi_ReportConfigToAddModList->list.count); - for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){ - struct NR_CSI_ReportConfig *csi_reportconfig = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]; - // MAC structure for CSI measurement reports (per UE and per report) - nr_csi_report_t *csi_report = &UE_info->csi_report_template[UE_id][csi_report_id]; - // csi-ResourceConfigId of a CSI-ResourceConfig included in the configuration - // (either CSI-RS or SSB) - csi_ResourceConfigId = csi_reportconfig->resourcesForChannelMeasurement; - // looking for CSI-ResourceConfig - int found_resource = 0; - int csi_resourceidx = 0; - while (found_resource == 0 && csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count) { - csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]; - if ( csi_resourceconfig->csi_ResourceConfigId == csi_ResourceConfigId) - found_resource = 1; - csi_resourceidx++; - } - AssertFatal(found_resource==1,"Not able to found any CSI-ResourceConfig with csi-ResourceConfigId %ld\n", - csi_ResourceConfigId); - - long resourceType = csi_resourceconfig->resourceType; - - reportQuantity_type = csi_reportconfig->reportQuantity.present; - csi_report->reportQuantity_type = reportQuantity_type; - - // setting the CSI or SSB index list - if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == csi_report->reportQuantity_type) { - for (int csi_idx = 0; csi_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_idx++) { - if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceSetId == - *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])){ - //We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig - nb_resources= csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceList.list.count; - csi_report->SSB_Index_list = csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_idx]->csi_SSB_ResourceList.list.array; - csi_report->CSI_Index_list = NULL; - break; - } - } - } - else { - if (resourceType == NR_CSI_ResourceConfig__resourceType_periodic) { - AssertFatal(csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList != NULL, - "Wrong settings! Report quantity requires CSI-RS but csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList is NULL\n"); - for (int csi_idx = 0; csi_idx < csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.count; csi_idx++) { - if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_ResourceSetId == - *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) { - //For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1 for spec 38.212 - nb_resources = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_RS_Resources.list.count; - csi_report->CSI_Index_list = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_idx]->nzp_CSI_RS_Resources.list.array; - csi_report->SSB_Index_list = NULL; - break; - } - } - } - else AssertFatal(1==0,"Only periodic resource configuration currently supported\n"); - } - LOG_D(NR_MAC,"nb_resources %d\n",nb_resources); - // computation of bit length depending on the report type - switch(reportQuantity_type){ - case (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP): - compute_rsrp_bitlen(csi_reportconfig, nb_resources, csi_report); - break; - case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP): - compute_rsrp_bitlen(csi_reportconfig, nb_resources, csi_report); - break; - case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI): - csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources)); - csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report); - compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); - break; - case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI): - csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources)); - csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report); - compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); - compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); - break; - case (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI): - csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2(nb_resources)); - csi_report->csi_meas_bitlen.ri_restriction = compute_ri_bitlen(csi_reportconfig, csi_report); - compute_li_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); - compute_cqi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); - compute_pmi_bitlen(csi_reportconfig, csi_report->csi_meas_bitlen.ri_restriction, csi_report); - break; - default: - AssertFatal(1==0,"Not yet supported CSI report quantity type"); + if (O_csi > 0) + LOG_D(NR_MAC,"Scheduling PUCCH[%d] RX for UE %04x in %4d.%2d O_ack %d, O_sr %d, O_csi %d\n", + i,UE->rnti,curr_pucch->frame,curr_pucch->ul_slot,O_ack,O_sr,O_csi); + nr_fill_nfapi_pucch(nrmac, frameP, slotP, curr_pucch, UE); + memset(curr_pucch, 0, sizeof(*curr_pucch)); } } } - -uint16_t nr_get_csi_bitlen(int Mod_idP, - int UE_id, - uint8_t csi_report_id) { - - uint16_t csi_bitlen = 0; - uint16_t max_bitlen = 0; - NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info; - L1_RSRP_bitlen_t * CSI_report_bitlen = NULL; - CSI_Meas_bitlen_t * csi_meas_bitlen = NULL; - - if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP==UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type|| - NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP==UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type){ - CSI_report_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements - csi_bitlen+= ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) + - CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen * - (CSI_report_bitlen->nb_ssbri_cri -1 ))); - } else{ - csi_meas_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].csi_meas_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements - uint16_t temp_bitlen; - for (int i=0; i<8; i++) { - temp_bitlen = (csi_meas_bitlen->cri_bitlen+ - csi_meas_bitlen->ri_bitlen+ - csi_meas_bitlen->li_bitlen[i]+ - csi_meas_bitlen->cqi_bitlen[i]+ - csi_meas_bitlen->pmi_x1_bitlen[i]+ - csi_meas_bitlen->pmi_x2_bitlen[i]); - if(temp_bitlen>max_bitlen) - max_bitlen = temp_bitlen; - } - csi_bitlen += max_bitlen; - } - - return csi_bitlen; -} - - void nr_csi_meas_reporting(int Mod_idP, frame_t frame, sub_frame_t slot) { @@ -702,11 +176,9 @@ void nr_csi_meas_reporting(int Mod_idP, NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon; const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing]; - NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info; - NR_list_t *UE_list = &UE_info->list; - for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { - const NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id]; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + UE_iterator(RC.nrmac[Mod_idP]->UE_info.list, UE ) { + const NR_CellGroupConfig_t *CellGroup = UE->CellGroup; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; if ((sched_ctrl->rrc_processing_timer > 0) || (sched_ctrl->ul_failure==1 && get_softmodem_params()->phy_test==0)) { continue; } @@ -718,16 +190,15 @@ void nr_csi_meas_reporting(int Mod_idP, NR_PUCCH_Config_t *pucch_Config = NULL; if (sched_ctrl->active_ubwp) { pucch_Config = sched_ctrl->active_ubwp->bwp_Dedicated->pucch_Config->choice.setup; - } else if (RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id] && - RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig && - RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated && - RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig && - RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP && - RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) { - pucch_Config = RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup; + } else if (CellGroup && + CellGroup->spCellConfig && + CellGroup->spCellConfig->spCellConfigDedicated && + CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig && + CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP && + CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) { + pucch_Config = CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup; } - for (int csi_report_id = 0; csi_report_id < csi_measconfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){ NR_CSI_ReportConfig_t *csirep = csi_measconfig->csi_ReportConfigToAddModList->list.array[csi_report_id]; @@ -750,7 +221,7 @@ void nr_csi_meas_reporting(int Mod_idP, if (*pucchresset->resourceList.list.array[res_index] == pucchcsires->pucch_Resource) break; AssertFatal(res_index < n, - "CSI pucch resource %ld not found among PUCCH resources\n",pucchcsires->pucch_Resource); + "CSI pucch resource %ld not found among PUCCH resources\n", pucchcsires->pucch_Resource); // find free PUCCH that is in order with possibly existing PUCCH // schedulings (other CSI, SR) @@ -759,13 +230,12 @@ void nr_csi_meas_reporting(int Mod_idP, && !curr_pucch->sr_flag && curr_pucch->dai_c == 0, "PUCCH not free at index 1 for UE %04x\n", - UE_info->rnti[UE_id]); + UE->rnti); curr_pucch->r_pucch = -1; curr_pucch->frame = frame; curr_pucch->ul_slot = sched_slot; curr_pucch->resource_indicator = res_index; - curr_pucch->csi_bits += - nr_get_csi_bitlen(Mod_idP,UE_id,csi_report_id); + curr_pucch->csi_bits += nr_get_csi_bitlen(UE->csi_report_template, csi_report_id); const NR_SIB1_t *sib1 = RC.nrmac[Mod_idP]->common_channels[0].sib1 ? RC.nrmac[Mod_idP]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp, @@ -817,37 +287,30 @@ void nr_csi_meas_reporting(int Mod_idP, } } -__attribute__((unused)) -static void handle_dl_harq(module_id_t mod_id, - int UE_id, +static void handle_dl_harq(NR_UE_info_t * UE, int8_t harq_pid, - bool success) + bool success, + int harq_round_max) { - NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info; - NR_UE_harq_t *harq = &UE_info->UE_sched_ctrl[UE_id].harq_processes[harq_pid]; + NR_UE_harq_t *harq = &UE->UE_sched_ctrl.harq_processes[harq_pid]; harq->feedback_slot = -1; harq->is_waiting = false; if (success) { - add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].available_dl_harq, harq_pid); + add_tail_nr_list(&UE->UE_sched_ctrl.available_dl_harq, harq_pid); harq->round = 0; harq->ndi ^= 1; - } else if (harq->round >= RC.nrmac[mod_id]->harq_round_max - 1) { - add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].available_dl_harq, harq_pid); - harq->round = 0; - harq->ndi ^= 1; - NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id]; - stats->dlsch_errors++; - LOG_D(NR_MAC, "retransmission error for UE %d (total %"PRIu64")\n", UE_id, stats->dlsch_errors); + } else if (harq->round >= harq_round_max - 1) { + abort_nr_dl_harq(UE, harq_pid); + LOG_D(NR_MAC, "retransmission error for UE %04x (total %"PRIu64")\n", UE->rnti, UE->mac_stats.dl.errors); } else { - LOG_D(PHY,"NACK for: pid %d, ue %x\n",harq_pid, UE_id); - add_tail_nr_list(&UE_info->UE_sched_ctrl[UE_id].retrans_dl_harq, harq_pid); + LOG_D(PHY,"NACK for: pid %d, ue %04x\n",harq_pid, UE->rnti); + add_tail_nr_list(&UE->UE_sched_ctrl.retrans_dl_harq, harq_pid); harq->round++; } } -int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, int Mod_idP, int UE_id) { - NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info; - NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id] ; +int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, NR_UE_info_t * UE) { + NR_CellGroupConfig_t *CellGroup = UE->CellGroup; int nb_tci_states = CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.count; NR_TCI_State_t *tci =NULL; int i; @@ -872,15 +335,13 @@ int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, int Mod_idP, i return -1; } -int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, int Mod_idP, int UE_id) { - NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info; - NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id] ; +int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, NR_UE_info_t *UE) { + NR_CellGroupConfig_t *CellGroup = UE->CellGroup ; int nb_tci_states = CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.count; NR_TCI_State_t *tci =NULL; NR_TCI_StateId_t *tci_id = NULL; - int bwp_id = 1; - NR_BWP_Downlink_t *bwp = CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1]; - NR_ControlResourceSet_t *coreset = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[bwp_id-1]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + NR_ControlResourceSet_t *coreset = sched_ctrl->coreset; int i; int flag = 0; int tci_stateID = -1; @@ -934,7 +395,7 @@ int get_diff_rsrp(uint8_t index, int strongest_rsrp) { //identifies the target SSB Beam index //keeps the required date for PDCCH and PDSCH TCI state activation/deactivation CE consutruction globally //handles triggering of PDCCH and PDSCH MAC CEs -void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) { +void tci_handling(NR_UE_info_t *UE, frame_t frame, slot_t slot) { int strongest_ssb_rsrp = 0; int cqi_idx = 0; @@ -946,23 +407,20 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) { int ssb_index[MAX_NUM_SSB] = {0}; int ssb_rsrp[MAX_NUM_SSB] = {0}; uint8_t idx = 0; - NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - int bwp_id = sched_ctrl->active_bwp ? 1 : 0; - NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id]; - NR_BWP_Downlink_t *bwp = bwp_id>0 ? - sched_ctrl->active_bwp: - NULL; - - + + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + const int bwp_id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0; + NR_CellGroupConfig_t *CellGroup = UE->CellGroup; + //bwp indicator int n_dl_bwp=0; - if (CellGroup->spCellConfig->spCellConfigDedicated && + if (CellGroup->spCellConfig && + CellGroup->spCellConfig->spCellConfigDedicated && CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList) - n_dl_bwp = CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count; + n_dl_bwp = CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count; uint8_t nr_ssbri_cri = 0; - uint8_t nb_of_csi_ssb_report = UE_info->csi_report_template[UE_id][cqi_idx].nb_of_csi_ssb_report; + uint8_t nb_of_csi_ssb_report = UE->csi_report_template[cqi_idx].nb_of_csi_ssb_report; int better_rsrp_reported = -140-(-0); /*minimum_measured_RSRP_value - minimum_differntail_RSRP_value*///considering the minimum RSRP value as better RSRP initially uint8_t diff_rsrp_idx = 0; uint8_t i, j; @@ -1033,7 +491,7 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) { The length of the field is 7 bits */ if(sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.coresetId == 0) { - int tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index[target_ssb_beam_index], Mod_idP, UE_id); + int tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index[target_ssb_beam_index], UE); if( tci_state_id != -1) sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id; @@ -1043,7 +501,7 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) { int flag = 0; for(i =0; ssb_index_sorted[i]!=0; i++) { - tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index_sorted[i], Mod_idP, UE_id) ; + tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index_sorted[i],UE) ; if(tci_state_id != -1 && ssb_rsrp_sorted[i] > ssb_rsrp[curr_ssb_beam_index] && ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) { sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id; @@ -1057,7 +515,7 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) { } } } else { - int tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index[target_ssb_beam_index], Mod_idP, UE_id); + int tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index[target_ssb_beam_index], UE); if (tci_state_id !=-1) sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id; @@ -1067,7 +525,7 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) { int flag = 0; for(i =0; ssb_index_sorted[i]!=0; i++) { - tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index_sorted[i], Mod_idP, UE_id); + tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index_sorted[i], UE); if( tci_state_id != -1 && ssb_rsrp_sorted[i] > ssb_rsrp[curr_ssb_beam_index] && ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) { sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id; @@ -1082,10 +540,8 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) { } } - sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI = bwp ? - bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[bwp_id-1]->tci_PresentInDCI : - CellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[0]->tci_PresentInDCI; - + sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI = sched_ctrl->coreset ? + sched_ctrl->coreset->tci_PresentInDCI : NULL; //filling pdsch tci state activation deactivation mac ce structure fields if(sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI) { @@ -1130,15 +586,14 @@ uint8_t pickandreverse_bits(uint8_t *payload, uint16_t bitlen, uint8_t start_bit } -void evaluate_rsrp_report(NR_UE_info_t *UE_info, +void evaluate_rsrp_report(NR_UE_info_t *UE, NR_UE_sched_ctrl_t *sched_ctrl, - int UE_id, uint8_t csi_report_id, uint8_t *payload, int *cumul_bits, NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type){ - nr_csi_report_t *csi_report = &UE_info->csi_report_template[UE_id][csi_report_id]; + nr_csi_report_t *csi_report = &UE->csi_report_template[csi_report_id]; uint8_t cri_ssbri_bitlen = csi_report->CSI_report_bitlen.cri_ssbri_bitlen; uint16_t curr_payload; @@ -1190,13 +645,12 @@ void evaluate_rsrp_report(NR_UE_info_t *UE_info, } csi_report->nb_of_csi_ssb_report++; int strongest_ssb_rsrp = get_measured_rsrp(sched_ctrl->CSI_report.ssb_cri_report.RSRP); - NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id]; + NR_mac_stats_t *stats = &UE->mac_stats; // including ssb rsrp in mac stats stats->cumul_rsrp += strongest_ssb_rsrp; stats->num_rsrp_meas++; } - void evaluate_cri_report(uint8_t *payload, uint8_t cri_bitlen, int cumul_bits, @@ -1254,7 +708,12 @@ void evaluate_cqi_report(uint8_t *payload, sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_2tb = temp_cqi; LOG_D(MAC,"Wide-band CQI for the second TB %d\n", temp_cqi); } - sched_ctrl->set_mcs = TRUE; + + // TODO for wideband case and multiple TB + const int cqi_idx = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb; + const int mcs_table = sched_ctrl->pdsch_semi_static.mcsTableIdx; + const int cqi_table = sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.cqi_table; + sched_ctrl->dl_max_mcs = get_mcs_from_cqi(mcs_table, cqi_table, cqi_idx); } @@ -1277,6 +736,7 @@ uint8_t evaluate_pmi_report(uint8_t *payload, sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1, sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2); + sched_ctrl->set_pmi = true; return tot_bitlen; } @@ -1322,22 +782,19 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig, const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu, frame_t frame, slot_t slot, - int UE_id, - module_id_t Mod_idP) { - + NR_UE_info_t *UE, + NR_ServingCellConfigCommon_t *scc) +{ /** From Table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel */ - NR_ServingCellConfigCommon_t *scc = - RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon; const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing]; uint8_t *payload = uci_pdu->csi_part1.csi_part1_payload; uint16_t bitlen = uci_pdu->csi_part1.csi_part1_bit_len; NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type = NR_CSI_ReportConfig__reportQuantity_PR_NOTHING; - NR_UE_info_t *UE_info = &(RC.nrmac[Mod_idP]->UE_info); - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; int cumul_bits = 0; int r_index = -1; for (int csi_report_id = 0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++ ) { - nr_csi_report_t *csi_report = &UE_info->csi_report_template[UE_id][csi_report_id]; + nr_csi_report_t *csi_report = &UE->csi_report_template[csi_report_id]; csi_report->nb_of_csi_ssb_report = 0; uint8_t cri_bitlen = 0; uint8_t ri_bitlen = 0; @@ -1352,10 +809,10 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig, LOG_D(MAC,"SFN/SF:%d/%d reportQuantity type = %d\n",frame,slot,reportQuantity_type); switch(reportQuantity_type){ case NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP: - evaluate_rsrp_report(UE_info,sched_ctrl,UE_id,csi_report_id,payload,&cumul_bits,reportQuantity_type); + evaluate_rsrp_report(UE,sched_ctrl,csi_report_id,payload,&cumul_bits,reportQuantity_type); break; case NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP: - evaluate_rsrp_report(UE_info,sched_ctrl,UE_id,csi_report_id,payload,&cumul_bits,reportQuantity_type); + evaluate_rsrp_report(UE,sched_ctrl,csi_report_id,payload,&cumul_bits,reportQuantity_type); break; case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI: cri_bitlen = csi_report->csi_meas_bitlen.cri_bitlen; @@ -1382,6 +839,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig, if (r_index != -1) skip_zero_padding(&cumul_bits,csi_report,r_index,bitlen); pmi_bitlen = evaluate_pmi_report(payload,csi_report,cumul_bits,r_index,sched_ctrl); + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.csi_report_id = csi_report_id; cumul_bits += pmi_bitlen; evaluate_cqi_report(payload,csi_report,cumul_bits,r_index,sched_ctrl,csirep->cqi_Table); break; @@ -1399,6 +857,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig, if (r_index != -1) skip_zero_padding(&cumul_bits,csi_report,r_index,bitlen); pmi_bitlen = evaluate_pmi_report(payload,csi_report,cumul_bits,r_index,sched_ctrl); + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.csi_report_id = csi_report_id; cumul_bits += pmi_bitlen; evaluate_cqi_report(payload,csi_report,cumul_bits,r_index,sched_ctrl,csirep->cqi_Table); break; @@ -1409,7 +868,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig, } } -static NR_UE_harq_t *find_harq(module_id_t mod_id, frame_t frame, sub_frame_t slot, int UE_id) +static NR_UE_harq_t *find_harq(frame_t frame, sub_frame_t slot, NR_UE_info_t * UE, int harq_round_max) { /* In case of realtime problems: we can only identify a HARQ process by * timing. If the HARQ process's feedback_frame/feedback_slot is not the one we @@ -1417,7 +876,7 @@ static NR_UE_harq_t *find_harq(module_id_t mod_id, frame_t frame, sub_frame_t sl * skip this HARQ process, which is what happens in the loop below. * Similarly, we might be "in advance", in which case we need to skip * this result. */ - NR_UE_sched_ctrl_t *sched_ctrl = &RC.nrmac[mod_id]->UE_info.UE_sched_ctrl[UE_id]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; int8_t pid = sched_ctrl->feedback_dl_harq.head; if (pid < 0) return NULL; @@ -1433,7 +892,7 @@ static NR_UE_harq_t *find_harq(module_id_t mod_id, frame_t frame, sub_frame_t sl frame, slot); remove_front_nr_list(&sched_ctrl->feedback_dl_harq); - handle_dl_harq(mod_id, UE_id, pid, 0); + handle_dl_harq(UE, pid, 0, harq_round_max); pid = sched_ctrl->feedback_dl_harq.head; if (pid < 0) return NULL; @@ -1458,20 +917,19 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id, sub_frame_t slot, const nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_01) { - int UE_id = find_nr_UE_id(mod_id, uci_01->rnti); - if (UE_id < 0) { + NR_UE_info_t * UE = find_nr_UE(&RC.nrmac[mod_id]->UE_info, uci_01->rnti); + if (!UE) { LOG_E(NR_MAC, "%s(): unknown RNTI %04x in PUCCH UCI\n", __func__, uci_01->rnti); return; } - NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; if (((uci_01->pduBitmap >> 1) & 0x01)) { // iterate over received harq bits for (int harq_bit = 0; harq_bit < uci_01->harq->num_harq; harq_bit++) { const uint8_t harq_value = uci_01->harq->harq_list[harq_bit].harq_value; const uint8_t harq_confidence = uci_01->harq->harq_confidence_level; - NR_UE_harq_t *harq = find_harq(mod_id, frame, slot, UE_id); + NR_UE_harq_t *harq = find_harq(frame, slot, UE, RC.nrmac[mod_id]->dl_bler.harq_round_max); if (!harq) { LOG_E(NR_MAC, "Oh no! Could not find a harq in %s!\n", __FUNCTION__); break; @@ -1480,8 +938,8 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id, const int8_t pid = sched_ctrl->feedback_dl_harq.head; remove_front_nr_list(&sched_ctrl->feedback_dl_harq); LOG_D(NR_MAC,"%4d.%2d bit %d pid %d ack/nack %d\n",frame, slot, harq_bit,pid,harq_value); - handle_dl_harq(mod_id, UE_id, pid, harq_value == 0 && harq_confidence == 0); - if (harq_confidence == 1) UE_info->mac_stats[UE_id].pucch0_DTX++; + handle_dl_harq(UE, pid, harq_value == 0 && harq_confidence == 0, RC.nrmac[mod_id]->dl_bler.harq_round_max); + if (harq_confidence == 1) UE->mac_stats.pucch0_DTX++; } } @@ -1506,19 +964,21 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id, sub_frame_t slot, const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_234) { - int UE_id = find_nr_UE_id(mod_id, uci_234->rnti); - if (UE_id < 0) { + NR_UE_info_t * UE = find_nr_UE(&RC.nrmac[mod_id]->UE_info, uci_234->rnti); + if (!UE) { LOG_E(NR_MAC, "%s(): unknown RNTI %04x in PUCCH UCI\n", __func__, uci_234->rnti); return; } - AssertFatal(RC.nrmac[mod_id]->UE_info.CellGroup[UE_id],"Cellgroup is null for UE %d/%x\n",UE_id,uci_234->rnti); - AssertFatal(RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig, "Cellgroup->spCellConfig is null for UE %d/%x\n",UE_id,uci_234->rnti); - AssertFatal(RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated, "Cellgroup->spCellConfig->spCellConfigDedicated is null for UE %d/%x\n",UE_id,uci_234->rnti); - if ( RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->csi_MeasConfig==NULL) return; + AssertFatal(UE->CellGroup,"Cellgroup is null for UE %04x\n", uci_234->rnti); + AssertFatal(UE->CellGroup->spCellConfig, + "Cellgroup->spCellConfig is null for UE %04x\n", uci_234->rnti); + AssertFatal(UE->CellGroup->spCellConfig->spCellConfigDedicated, + "Cellgroup->spCellConfig->spCellConfigDedicated is null for UE %04x\n", uci_234->rnti); + if ( UE->CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig==NULL) + return; - NR_CSI_MeasConfig_t *csi_MeasConfig = RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup; - NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_CSI_MeasConfig_t *csi_MeasConfig = UE->CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; // tpc (power control) // TODO PUCCH2 SNR computation is not correct -> ignore the following @@ -1531,20 +991,20 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id, // iterate over received harq bits for (int harq_bit = 0; harq_bit < uci_234->harq.harq_bit_len; harq_bit++) { const int acknack = ((uci_234->harq.harq_payload[harq_bit >> 3]) >> harq_bit) & 0x01; - NR_UE_harq_t *harq = find_harq(mod_id, frame, slot, UE_id); + NR_UE_harq_t *harq = find_harq(frame, slot, UE, RC.nrmac[mod_id]->dl_bler.harq_round_max); if (!harq) break; DevAssert(harq->is_waiting); const int8_t pid = sched_ctrl->feedback_dl_harq.head; remove_front_nr_list(&sched_ctrl->feedback_dl_harq); - handle_dl_harq(mod_id, UE_id, pid, uci_234->harq.harq_crc != 1 && acknack); + handle_dl_harq(UE, pid, uci_234->harq.harq_crc != 1 && acknack, RC.nrmac[mod_id]->dl_bler.harq_round_max); } } if ((uci_234->pduBitmap >> 2) & 0x01) { //API to parse the csi report and store it into sched_ctrl - extract_pucch_csi_report(csi_MeasConfig, uci_234, frame, slot, UE_id, mod_id); + extract_pucch_csi_report(csi_MeasConfig, uci_234, frame, slot, UE, RC.nrmac[mod_id]->common_channels->ServingCellConfigCommon); //TCI handling function - tci_handling(mod_id, UE_id,frame, slot); + tci_handling(UE,frame, slot); } if ((uci_234->pduBitmap >> 3) & 0x01) { //@TODO:Handle CSI Report 2 @@ -1606,18 +1066,16 @@ bool test_acknack_vrb_occupation(NR_UE_sched_ctrl_t *sched_ctrl, return true; } - // this function returns an index to NR_sched_pucch structure // currently this structure contains PUCCH0 at index 0 and PUCCH2 at index 1 // if the function returns -1 it was not possible to schedule acknack // when current pucch is ready to be scheduled nr_fill_nfapi_pucch is called int nr_acknack_scheduling(int mod_id, - int UE_id, + NR_UE_info_t *UE, frame_t frame, sub_frame_t slot, int r_pucch, int is_common) { - const int CC_id = 0; const int minfbtime = RC.nrmac[mod_id]->minRXTXTIMEpdsch; const NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels[CC_id].ServingCellConfigCommon; @@ -1635,8 +1093,8 @@ int nr_acknack_scheduling(int mod_id, * * SR uses format 0 and is allocated in the first UL (mixed) slot (and not * later) * * each UE has dedicated PUCCH Format 0 resources, and we use index 0! */ - NR_UE_sched_ctrl_t *sched_ctrl = &RC.nrmac[mod_id]->UE_info.UE_sched_ctrl[UE_id]; - NR_CellGroupConfig_t *cg = RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + NR_CellGroupConfig_t *cg = UE->CellGroup; NR_PUCCH_Config_t *pucch_Config = NULL; if (sched_ctrl->active_ubwp) { @@ -1671,11 +1129,13 @@ int nr_acknack_scheduling(int mod_id, const int f = pucch->frame; const int s = pucch->ul_slot; LOG_D(NR_MAC, "In %s: %4d.%2d DAI = 2 pucch currently in %4d.%2d, advancing by 1 slot\n", __FUNCTION__, frame, slot, f, s); - if (!(csi_pucch - && csi_pucch->csi_bits > 0 - && csi_pucch->frame == f - && csi_pucch->ul_slot == s)) - nr_fill_nfapi_pucch(mod_id, frame, slot, pucch, UE_id); + + if (!(csi_pucch + && csi_pucch->csi_bits > 0 + && csi_pucch->frame == f + && csi_pucch->ul_slot == s)) + nr_fill_nfapi_pucch(RC.nrmac[mod_id], frame, slot, pucch, UE); + memset(pucch, 0, sizeof(*pucch)); pucch->frame = s == n_slots_frame - 1 ? (f + 1) % 1024 : f; if(((s + 1)%nr_slots_period) == 0) @@ -1686,13 +1146,14 @@ int nr_acknack_scheduling(int mod_id, // skip the CSI PUCCH if it is present and if in the next frame/slot // and if we don't multiplex csi_pucch->r_pucch=-1; - if (csi_pucch + if (csi_pucch && csi_pucch->csi_bits > 0 && csi_pucch->frame == pucch->frame && csi_pucch->ul_slot == pucch->ul_slot && !csi_pucch->simultaneous_harqcsi) { LOG_D(NR_MAC,"Cannot multiplex csi_pucch for %d.%d\n",csi_pucch->frame,csi_pucch->ul_slot); - nr_fill_nfapi_pucch(mod_id, frame, slot, csi_pucch, UE_id); + nr_fill_nfapi_pucch(RC.nrmac[mod_id], frame, slot, csi_pucch, UE); + memset(csi_pucch, 0, sizeof(*csi_pucch)); pucch->frame = pucch->ul_slot == n_slots_frame - 1 ? (pucch->frame + 1) % 1024 : pucch->frame; if(((pucch->ul_slot + 1)%nr_slots_period) == 0) @@ -1716,11 +1177,10 @@ int nr_acknack_scheduling(int mod_id, NR_SearchSpace__searchSpaceType_PR ss_type = (is_common==0 && (sched_ctrl->active_bwp || ubwpd)) ? NR_SearchSpace__searchSpaceType_PR_ue_Specific: NR_SearchSpace__searchSpaceType_PR_common; uint8_t pdsch_to_harq_feedback[8]; - int bwp_Id = 0; - if (sched_ctrl->active_ubwp) bwp_Id = sched_ctrl->active_ubwp->bwp_Id; + const int bwp_id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0; int max_fb_time = 0; - get_pdsch_to_harq_feedback(mod_id, UE_id, bwp_Id, ss_type, &max_fb_time, pdsch_to_harq_feedback); + get_pdsch_to_harq_feedback(UE, bwp_id, ss_type, &max_fb_time, pdsch_to_harq_feedback); LOG_D(NR_MAC, "In %s: 1b. DL %4d.%2d, UL_ACK %4d.%2d, DAI_C %d\n", __FUNCTION__, frame,slot,pucch->frame,pucch->ul_slot,pucch->dai_c); /* there is a HARQ. Check whether we can use it for this ACKNACK */ @@ -1747,14 +1207,14 @@ int nr_acknack_scheduling(int mod_id, csi_pucch->csi_bits > 0 && csi_pucch->frame == f && csi_pucch->ul_slot == s)) - nr_fill_nfapi_pucch(mod_id, frame, slot, pucch, UE_id); + nr_fill_nfapi_pucch(RC.nrmac[mod_id], frame, slot, pucch, UE); memset(pucch, 0, sizeof(*pucch)); pucch->frame = s == n_slots_frame - 1 ? (f + 1) % 1024 : f; if(((s + 1)%nr_slots_period) == 0) pucch->ul_slot = (s + 1 + first_ul_slot_period) % n_slots_frame; else pucch->ul_slot = (s + 1) % n_slots_frame; - return nr_acknack_scheduling(mod_id, UE_id, frame, slot, r_pucch,is_common); + return nr_acknack_scheduling(mod_id, UE, frame, slot, r_pucch,is_common); } pucch->timing_indicator = i; @@ -1780,8 +1240,8 @@ int nr_acknack_scheduling(int mod_id, ((pucch->frame*n_slots_frame + pucch->ul_slot) < (frame*n_slots_frame + slot))) { AssertFatal(pucch->sr_flag + pucch->dai_c == 0, - "expected no SR/AckNack for UE %d in %4d.%2d, but has %d/%d for %4d.%2d\n", - UE_id, frame, slot, pucch->sr_flag, pucch->dai_c, pucch->frame, pucch->ul_slot); + "expected no SR/AckNack for UE %04x in %4d.%2d, but has %d/%d for %4d.%2d\n", + UE->rnti, frame, slot, pucch->sr_flag, pucch->dai_c, pucch->frame, pucch->ul_slot); const int s = next_ul_slot; pucch->frame = s < n_slots_frame ? frame : (frame + 1) % 1024; pucch->ul_slot = s % n_slots_frame; @@ -1831,11 +1291,11 @@ int nr_acknack_scheduling(int mod_id, } if (ind_found==-1) { LOG_D(NR_MAC, - "%4d.%2d could not find pdsch_to_harq_feedback for UE %d: earliest " + "%4d.%2d could not find pdsch_to_harq_feedback for UE %04x: earliest " "ack slot %d\n", frame, slot, - UE_id, + UE->rnti, pucch->ul_slot); return -1; } @@ -1850,7 +1310,7 @@ int nr_acknack_scheduling(int mod_id, if(!csi_pucch->simultaneous_harqcsi || ((csi_pucch->csi_bits + csi_pucch->dai_c) >= 11)) { LOG_D(NR_MAC,"Cannot multiplex csi_pucch %d +csi_pucch->dai_c %d for %d.%d\n",csi_pucch->csi_bits,csi_pucch->dai_c,csi_pucch->frame,csi_pucch->ul_slot); - nr_fill_nfapi_pucch(mod_id, frame, slot, csi_pucch, UE_id); + nr_fill_nfapi_pucch(RC.nrmac[mod_id], frame, slot, csi_pucch, UE); memset(csi_pucch, 0, sizeof(*csi_pucch)); /* advance the UL slot information in PUCCH by one so we won't schedule in * the same slot again */ @@ -1862,7 +1322,7 @@ int nr_acknack_scheduling(int mod_id, pucch->ul_slot = (s + 1 + first_ul_slot_period) % n_slots_frame; else pucch->ul_slot = (s + 1) % n_slots_frame; - return nr_acknack_scheduling(mod_id, UE_id, frame, slot, r_pucch,is_common); + return nr_acknack_scheduling(mod_id, UE, frame, slot, r_pucch,is_common); } // multiplexing harq and csi in a pucch else { @@ -1899,31 +1359,27 @@ int nr_acknack_scheduling(int mod_id, } -void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot) +void nr_sr_reporting(gNB_MAC_INST *nrmac, frame_t SFN, sub_frame_t slot) { - gNB_MAC_INST *nrmac = RC.nrmac[Mod_idP]; if (!is_xlsch_in_slot(nrmac->ulsch_slot_bitmap[slot / 64], slot)) return; NR_ServingCellConfigCommon_t *scc = nrmac->common_channels->ServingCellConfigCommon; const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing]; - NR_UE_info_t *UE_info = &nrmac->UE_info; - NR_list_t *UE_list = &UE_info->list; - for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + UE_iterator(nrmac->UE_info.list, UE) { + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; - if (sched_ctrl->ul_failure==1) continue; + if (sched_ctrl->ul_failure==1 || sched_ctrl->rrc_processing_timer>0) continue; NR_PUCCH_Config_t *pucch_Config = NULL; if (sched_ctrl->active_ubwp) { pucch_Config = sched_ctrl->active_ubwp->bwp_Dedicated->pucch_Config->choice.setup; - } else if (RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id] && - RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig && - RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated && - RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig && - RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP && - RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) { - pucch_Config = RC.nrmac[Mod_idP]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup; + } else if (UE->CellGroup && + UE->CellGroup->spCellConfig && + UE->CellGroup->spCellConfig->spCellConfigDedicated && + UE->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig && + UE->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP && + UE->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) { + pucch_Config = UE->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup; } - else continue; if (!pucch_Config->schedulingRequestResourceToAddModList) continue; @@ -1968,7 +1424,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot) continue; nfapi_nr_pucch_pdu_t *pdu = &ul_tti_req->pdus_list[i].pucch_pdu; /* check that it is our PUCCH F0. Assuming there can be only one */ - if (pdu->rnti == UE_info->rnti[UE_id] + if (pdu->rnti == UE->rnti && pdu->format_type == 0 // does not use NR_PUCCH_Resource__format_PR_format0 && pdu->initial_cyclic_shift == pucch_res->format.choice.format0->initialCyclicShift && pdu->nr_of_symbols == pucch_res->format.choice.format0->nrofSymbols @@ -1977,8 +1433,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot) pdu->sr_flag = 1; nfapi_allocated = true; break; - } - else if (pdu->rnti == UE_info->rnti[UE_id] + } else if (pdu->rnti == UE->rnti && pdu->format_type == 2 // does not use NR_PUCCH_Resource__format_PR_format0 && pdu->nr_of_symbols == pucch_res->format.choice.format2->nrofSymbols && pdu->start_symbol_index == pucch_res->format.choice.format2->startingSymbolIndex) { @@ -1986,9 +1441,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot) pdu->sr_flag = 1; nfapi_allocated = true; break; - - } - else if (pdu->rnti == UE_info->rnti[UE_id] + } else if (pdu->rnti == UE->rnti && pdu->format_type == 1 // does not use NR_PUCCH_Resource__format_PR_format0 && pdu->nr_of_symbols == pucch_res->format.choice.format1->nrofSymbols && pdu->start_symbol_index == pucch_res->format.choice.format1->startingSymbolIndex) { @@ -1996,9 +1449,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot) pdu->sr_flag = 1; nfapi_allocated = true; break; - - } - else if (pdu->rnti == UE_info->rnti[UE_id] + } else if (pdu->rnti == UE->rnti && pdu->format_type == 3 // does not use NR_PUCCH_Resource__format_PR_format0 && pdu->nr_of_symbols == pucch_res->format.choice.format3->nrofSymbols && pdu->start_symbol_index == pucch_res->format.choice.format3->startingSymbolIndex) { @@ -2006,9 +1457,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot) pdu->sr_flag = 1; nfapi_allocated = true; break; - - } - else if (pdu->rnti == UE_info->rnti[UE_id] + } else if (pdu->rnti == UE->rnti && pdu->format_type == 4 // does not use NR_PUCCH_Resource__format_PR_format0 && pdu->nr_of_symbols == pucch_res->format.choice.format4->nrofSymbols && pdu->start_symbol_index == pucch_res->format.choice.format4->startingSymbolIndex) { @@ -2016,7 +1465,6 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot) pdu->sr_flag = 1; nfapi_allocated = true; break; - } } @@ -2040,7 +1488,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot) .resource_indicator = found, .r_pucch = -1 }; - nr_fill_nfapi_pucch(Mod_idP, SFN, slot, &sched_sr, UE_id); + nr_fill_nfapi_pucch(nrmac, SFN, slot, &sched_sr, UE); } } } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 8831a69f0c5..a6e20a7e4d9 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -36,6 +36,9 @@ #include <openair2/UTIL/OPT/opt.h> #include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h" +extern void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl); + +//#define SRS_IND_DEBUG int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl) { @@ -46,138 +49,18 @@ int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl) { return(dci_format); } -void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ubwp) -{ - gNB_MAC_INST *nrmac = RC.nrmac[module_id]; - const int bwp_id = ubwp->bwp_Id; - if (nrmac->preferred_ul_tda[bwp_id]) - return; +const int get_ul_tda(const gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *scc, int slot) { /* there is a mixed slot only when in TDD */ - NR_ServingCellConfigCommon_t *scc = nrmac->common_channels->ServingCellConfigCommon; - frame_type_t frame_type = nrmac->common_channels->frame_type; - const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing]; - - NR_ServingCellConfigCommonSIB_t *scc_sib1 = get_softmodem_params()->sa ? - RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1->servingCellConfigCommon : NULL; - - AssertFatal(scc!=NULL || scc_sib1!=NULL,"We need one serving cell config common\n"); - - const int mu = scc ? scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing : - scc_sib1->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing; - - NR_TDD_UL_DL_Pattern_t *tdd = NULL; - if (scc && scc->tdd_UL_DL_ConfigurationCommon) { - tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1; - } else if (scc_sib1 && scc_sib1->tdd_UL_DL_ConfigurationCommon) { - tdd = &scc_sib1->tdd_UL_DL_ConfigurationCommon->pattern1; - } - - /* Uplink symbols are at the end of the slot */ - int symb_ulMixed = 0; - int nr_mix_slots = 0; - int nr_slots_period = n; - if (tdd) { - symb_ulMixed = ((1 << tdd->nrofUplinkSymbols) - 1) << (14 - tdd->nrofUplinkSymbols); - nr_mix_slots = tdd->nrofDownlinkSymbols != 0 || tdd->nrofUplinkSymbols != 0; - nr_slots_period /= get_nb_periods_per_frame(tdd->dl_UL_TransmissionPeriodicity); - } - else - // if TDD configuration is not present and the band is not FDD, it means it is a dynamic TDD configuration - AssertFatal(nrmac->common_channels->frame_type == FDD,"Dynamic TDD not handled yet\n"); - - const struct NR_PUCCH_Config__resourceToAddModList *resList = ubwp->bwp_Dedicated->pucch_Config->choice.setup->resourceToAddModList; - // for the moment, just block any symbol that might hold a PUCCH, regardless - // of the RB. This is a big simplification, as most RBs will NOT have a PUCCH - // in the respective symbols, but it simplifies scheduling - uint16_t symb_pucch = 0; - for (int i = 0; i < resList->list.count; ++i) { - const NR_PUCCH_Resource_t *resource = resList->list.array[i]; - int nrofSymbols = 0; - int startingSymbolIndex = 0; - switch (resource->format.present) { - case NR_PUCCH_Resource__format_PR_format0: - nrofSymbols = resource->format.choice.format0->nrofSymbols; - startingSymbolIndex = resource->format.choice.format0->startingSymbolIndex; - break; - case NR_PUCCH_Resource__format_PR_format1: - nrofSymbols = resource->format.choice.format1->nrofSymbols; - startingSymbolIndex = resource->format.choice.format1->startingSymbolIndex; - break; - case NR_PUCCH_Resource__format_PR_format2: - nrofSymbols = resource->format.choice.format2->nrofSymbols; - startingSymbolIndex = resource->format.choice.format2->startingSymbolIndex; - break; - case NR_PUCCH_Resource__format_PR_format3: - nrofSymbols = resource->format.choice.format3->nrofSymbols; - startingSymbolIndex = resource->format.choice.format3->startingSymbolIndex; - break; - case NR_PUCCH_Resource__format_PR_format4: - nrofSymbols = resource->format.choice.format4->nrofSymbols; - startingSymbolIndex = resource->format.choice.format4->startingSymbolIndex; - break; - default: - AssertFatal(0, "found NR_PUCCH format index %d\n", resource->format.present); - break; - } - symb_pucch |= ((1 << nrofSymbols) - 1) << startingSymbolIndex; - } - - /* check that TDA index 1 fits into UL slot and does not overlap with PUCCH */ - const struct NR_PUSCH_TimeDomainResourceAllocationList *tdaList = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList; - const NR_PUSCH_TimeDomainResourceAllocation_t *tdaP_UL = tdaList->list.array[0]; - const int k2 = get_K2(scc, scc_sib1, (NR_BWP_Uplink_t*)ubwp,0, mu); - int start, len; - SLIV2SL(tdaP_UL->startSymbolAndLength, &start, &len); - const uint16_t symb_tda = ((1 << len) - 1) << start; - // check whether PUCCH and TDA overlap: then, we cannot use it. Note that - // here we assume that the PUCCH is scheduled in every slot, and on all RBs - // (which is mostly not true, this is a simplification) - AssertFatal((symb_pucch & symb_tda) == 0, "TDA index 0 for UL overlaps with PUCCH\n"); - - // get largest time domain allocation (TDA) for UL slot and UL in mixed slot - int tdaMi = -1; - if (nr_mix_slots>0) { - const NR_PUSCH_TimeDomainResourceAllocation_t *tdaP_Mi = tdaList->list.array[1]; - AssertFatal(k2 == get_K2(scc, scc_sib1, (NR_BWP_Uplink_t*)ubwp, 1, mu), - "scheduler cannot handle different k2 for UL slot (%d) and UL Mixed slot (%ld)\n", - k2, - get_K2(scc, scc_sib1, (NR_BWP_Uplink_t*)ubwp, 1, mu)); - SLIV2SL(tdaP_Mi->startSymbolAndLength, &start, &len); - const uint16_t symb_tda_mi = ((1 << len) - 1) << start; - // check whether PUCCH and TDA overlap: then, we cannot use it. Also, check - // whether TDA is entirely within mixed slot, UL. Note that here we assume - // that the PUCCH is scheduled in every slot, and on all RBs (which is - // mostly not true, this is a simplification) - if ((symb_pucch & symb_tda_mi) == 0 && (symb_ulMixed & symb_tda_mi) == symb_tda_mi) { - tdaMi = 1; - } else { - LOG_E(NR_MAC, - "TDA index 1 UL overlaps with PUCCH or is not entirely in mixed slot (symb_pucch %x symb_ulMixed %x symb_tda_mi %x), won't schedule UL mixed slot\n", - symb_pucch, - symb_ulMixed, - symb_tda_mi); - } - } - - nrmac->preferred_ul_tda[bwp_id] = malloc(n * sizeof(*nrmac->preferred_ul_tda[bwp_id])); - - for (int slot = 0; slot < n; ++slot) { - const int sched_slot = (slot + k2) % n; - nrmac->preferred_ul_tda[bwp_id][slot] = -1; - if (frame_type == FDD || sched_slot % nr_slots_period >= tdd->nrofDownlinkSlots + nr_mix_slots) - nrmac->preferred_ul_tda[bwp_id][slot] = 0; - else if (nr_mix_slots && sched_slot % nr_slots_period == tdd->nrofDownlinkSlots) - nrmac->preferred_ul_tda[bwp_id][slot] = tdaMi; - LOG_D(MAC, "DL slot %d UL slot %d preferred_ul_tda %d\n", slot, sched_slot, nrmac->preferred_ul_tda[bwp_id][slot]); - } + const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL; + AssertFatal(tdd || nrmac->common_channels->frame_type == FDD, "Dynamic TDD not handled yet\n"); - if (tdd && k2 < tdd->nrofUplinkSlots) { - LOG_W(NR_MAC, - "k2 %d < tdd->nrofUplinkSlots %ld: not all UL slots can be scheduled\n", - k2, - tdd->nrofUplinkSlots); + if (tdd && tdd->nrofUplinkSymbols > 1) { // if there is uplink symbols in mixed slot + const int nr_slots_period = tdd->nrofDownlinkSlots + tdd->nrofUplinkSlots + 1; + if ((slot%nr_slots_period) == tdd->nrofDownlinkSlots) + return 1; } + return 0; // if FDD or not mixed slot in TDD, for now use default TDA (TODO handle CSI-RS slots) } // For both UL-SCH except: @@ -204,8 +87,8 @@ void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ub // F: length of L is 0:8 or 1:16 bits wide // R: Reserved bit, set to zero. -int nr_process_mac_pdu(module_id_t module_idP, - int UE_id, +int nr_process_mac_pdu( instance_t module_idP, + NR_UE_info_t* UE, uint8_t CC_id, frame_t frameP, sub_frame_t slot, @@ -216,11 +99,10 @@ int nr_process_mac_pdu(module_id_t module_idP, uint8_t done = 0; - NR_UE_info_t *UE_info = &RC.nrmac[module_idP]->UE_info; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; if ( pduP[0] != UL_SCH_LCID_PADDING ) - trace_NRpdu(DIRECTION_UPLINK, pduP, pdu_len, UE_id, WS_C_RNTI, UE_info->rnti[UE_id], frameP, 0, 0, 0); + trace_NRpdu(DIRECTION_UPLINK, pduP, pdu_len, WS_C_RNTI, UE->rnti, frameP, 0, 0, 0); #ifdef ENABLE_MAC_PAYLOAD_DEBUG LOG_I(NR_MAC, "In %s: dumping MAC PDU in %d.%d:\n", __func__, frameP, slot); @@ -317,7 +199,7 @@ int nr_process_mac_pdu(module_id_t module_idP, for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) { NR_RA_t *ra = &RC.nrmac[module_idP]->common_channels[CC_id].ra[i]; - if (ra->state >= WAIT_Msg3 && ra->rnti == UE_info->rnti[UE_id]) { + if (ra->state >= WAIT_Msg3 && ra->rnti == UE->rnti) { ra->crnti = ((pduP[1]&0xFF)<<8)|(pduP[2]&0xFF); ra->msg3_dcch_dtch = true; LOG_I(NR_MAC, "Received UL_SCH_LCID_C_RNTI with C-RNTI 0x%04x\n", ra->crnti); @@ -378,22 +260,23 @@ int nr_process_mac_pdu(module_id_t module_idP, if (!get_mac_len(pduP, pdu_len, &mac_len, &mac_subheader_len)) return 0; - rnti_t crnti = UE_info->rnti[UE_id]; - int UE_idx = UE_id; + rnti_t crnti = UE->rnti; + NR_UE_info_t* UE_idx = UE; for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) { NR_RA_t *ra = &RC.nrmac[module_idP]->common_channels[CC_id].ra[i]; - if (ra->state >= WAIT_Msg3 && ra->rnti == UE_info->rnti[UE_id]) { + if (ra->state >= WAIT_Msg3 && ra->rnti == UE->rnti) { uint8_t *next_subpduP = pduP + mac_subheader_len + mac_len; if ((pduP[mac_subheader_len+mac_len] & 0x3F) == UL_SCH_LCID_C_RNTI) { crnti = ((next_subpduP[1]&0xFF)<<8)|(next_subpduP[2]&0xFF); - UE_idx = find_nr_UE_id(module_idP, crnti); + LOG_W(NR_MAC, " UL_SCH_LCID_SRB for rnti %04x\n", crnti); + UE_idx = find_nr_UE(&RC.nrmac[module_idP]->UE_info, crnti); break; } } } - if (UE_info->CellGroup[UE_idx]) { - LOG_D(NR_MAC, "[UE %d] Frame %d : ULSCH -> UL-DCCH %d (gNB %d, %d bytes), rnti: 0x%04x \n", module_idP, frameP, rx_lcid, module_idP, mac_len, crnti); + if (UE_idx->CellGroup) { + LOG_D(NR_MAC, "Frame %d : ULSCH -> UL-DCCH %d (gNB %ld, %d bytes), rnti: 0x%04x \n", frameP, rx_lcid, module_idP, mac_len, crnti); mac_rlc_data_ind(module_idP, crnti, module_idP, @@ -406,7 +289,7 @@ int nr_process_mac_pdu(module_id_t module_idP, 1, NULL); } else { - AssertFatal(1==0,"[UE %d] Frame/Slot %d.%d : Received LCID %d which is not configured, dropping packet\n",UE_id,frameP,slot,rx_lcid); + AssertFatal(1==0,"[UE %04x] Frame/Slot %d.%d : Received LCID %d which is not configured, dropping packet\n",UE->rnti,frameP,slot,rx_lcid); } break; case UL_SCH_LCID_SRB3: @@ -444,46 +327,50 @@ int nr_process_mac_pdu(module_id_t module_idP, frameP, 0, 0, - UE_info->rnti[UE_id], + UE->rnti, CCCH, pduP + mac_subheader_len, mac_len, 0); break; - case UL_SCH_LCID_DTCH: + case UL_SCH_LCID_DTCH ... (UL_SCH_LCID_DTCH + 28): // check if LCID is valid at current time. - if (!get_mac_len(pduP, pdu_len, &mac_len, &mac_subheader_len)) - return 0; + if (!get_mac_len(pduP, pdu_len, &mac_len, &mac_subheader_len)) { + return 0; + } - LOG_D(NR_MAC, "[UE %x] %d.%d: ULSCH -> UL-%s %d (gNB %d, %d bytes)\n", - UE_info->rnti[UE_id], - frameP, - slot, - rx_lcid<4?"DCCH":"DTCH", - rx_lcid, - module_idP, - mac_len); - UE_info->mac_stats[UE_id].lc_bytes_rx[rx_lcid] += mac_len; - - mac_rlc_data_ind(module_idP, - UE_info->rnti[UE_id], - module_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - rx_lcid, - (char *)(pduP + mac_subheader_len), - mac_len, - 1, - NULL); - - /* Updated estimated buffer when receiving data */ - if (sched_ctrl->estimated_ul_buffer >= mac_len) - sched_ctrl->estimated_ul_buffer -= mac_len; - else - sched_ctrl->estimated_ul_buffer = 0; - break; + + LOG_D(NR_MAC, "[UE %04x] %d.%d : ULSCH -> UL-%s %d (gNB %ld, %d bytes)\n", + UE->rnti, + frameP, + slot, + rx_lcid<4?"DCCH":"DTCH", + rx_lcid, + module_idP, + mac_len); + UE->mac_stats.ul.lc_bytes[rx_lcid] += mac_len; + + mac_rlc_data_ind(module_idP, + UE->rnti, + module_idP, + frameP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + rx_lcid, + (char *)(pduP + mac_subheader_len), + mac_len, + 1, + NULL); + + /* Updated estimated buffer when receiving data */ + if (sched_ctrl->estimated_ul_buffer >= mac_len) { + sched_ctrl->estimated_ul_buffer -= mac_len; + } else { + sched_ctrl->estimated_ul_buffer = 0; + } + + break; default: LOG_E(NR_MAC, "Received unknown MAC header (LCID = 0x%02x)\n", rx_lcid); @@ -518,15 +405,14 @@ int nr_process_mac_pdu(module_id_t module_idP, return 0; } -void abort_nr_ul_harq(module_id_t mod_id, int UE_id, int8_t harq_pid) +void abort_nr_ul_harq(NR_UE_info_t *UE, int8_t harq_pid) { - NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; NR_UE_ul_harq_t *harq = &sched_ctrl->ul_harq_processes[harq_pid]; harq->ndi ^= 1; harq->round = 0; - UE_info->mac_stats[UE_id].ulsch_errors++; + UE->mac_stats.ul.errors++; add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid); /* the transmission failed: the UE won't send the data we expected initially, @@ -542,11 +428,11 @@ void handle_nr_ul_harq(const int CC_idP, sub_frame_t slot, const nfapi_nr_crc_t *crc_pdu) { - gNB_MAC_INST *gNB_mac = RC.nrmac[mod_id]; - int UE_id = find_nr_UE_id(mod_id, crc_pdu->rnti); - if (UE_id < 0) { + NR_UE_info_t* UE = find_nr_UE(&RC.nrmac[mod_id]->UE_info, crc_pdu->rnti); + if (!UE) { + LOG_W(NR_MAC, "handle harq for rnti %04x, in RA process\n", crc_pdu->rnti); for (int i = 0; i < NR_NB_RA_PROC_MAX; ++i) { - NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[i]; + NR_RA_t *ra = &RC.nrmac[mod_id]->common_channels[CC_idP].ra[i]; if (ra->state >= WAIT_Msg3 && ra->rnti == crc_pdu->rnti) return; @@ -554,8 +440,7 @@ void handle_nr_ul_harq(const int CC_idP, LOG_E(NR_MAC, "%s(): unknown RNTI 0x%04x in PUSCH\n", __func__, crc_pdu->rnti); return; } - NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; int8_t harq_pid = sched_ctrl->feedback_ul_harq.head; LOG_D(NR_MAC, "Comparing crc_pdu->harq_id vs feedback harq_pid = %d %d\n",crc_pdu->harq_id, harq_pid); while (crc_pdu->harq_id != harq_pid || harq_pid < 0) { @@ -569,8 +454,9 @@ void handle_nr_ul_harq(const int CC_idP, remove_front_nr_list(&sched_ctrl->feedback_ul_harq); sched_ctrl->ul_harq_processes[harq_pid].is_waiting = false; - if(sched_ctrl->ul_harq_processes[harq_pid].round >= gNB_mac->harq_round_max - 1) { - abort_nr_ul_harq(mod_id, UE_id, harq_pid); + + if(sched_ctrl->ul_harq_processes[harq_pid].round >= RC.nrmac[mod_id]->ul_bler.harq_round_max - 1) { + abort_nr_ul_harq(UE, harq_pid); } else { sched_ctrl->ul_harq_processes[harq_pid].round++; add_tail_nr_list(&sched_ctrl->retrans_ul_harq, harq_pid); @@ -590,8 +476,8 @@ void handle_nr_ul_harq(const int CC_idP, harq_pid, crc_pdu->rnti); add_tail_nr_list(&sched_ctrl->available_ul_harq, harq_pid); - } else if (harq->round >= gNB_mac->harq_round_max - 1) { - abort_nr_ul_harq(mod_id, UE_id, harq_pid); + } else if (harq->round >= RC.nrmac[mod_id]->ul_bler.harq_round_max - 1) { + abort_nr_ul_harq(UE, harq_pid); LOG_D(NR_MAC, "RNTI %04x: Ulharq id %d crc failed in all rounds\n", crc_pdu->rnti, @@ -621,15 +507,15 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, const uint16_t rssi){ gNB_MAC_INST *gNB_mac = RC.nrmac[gnb_mod_idP]; - NR_UE_info_t *UE_info = &gNB_mac->UE_info; const int current_rnti = rntiP; - const int UE_id = find_nr_UE_id(gnb_mod_idP, current_rnti); + LOG_D(NR_MAC, "rx_sdu for rnti %04x\n", current_rnti); const int target_snrx10 = gNB_mac->pusch_target_snrx10; const int pusch_failure_thres = gNB_mac->pusch_failure_thres; - - if (UE_id != -1) { - NR_UE_sched_ctrl_t *UE_scheduling_control = &UE_info->UE_sched_ctrl[UE_id]; + + NR_UE_info_t* UE = find_nr_UE(&gNB_mac->UE_info, current_rnti); + if (UE) { + NR_UE_sched_ctrl_t *UE_scheduling_control = &UE->UE_sched_ctrl; const int8_t harq_pid = UE_scheduling_control->feedback_ul_harq.head; if (sduP) @@ -637,15 +523,14 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, T_INT(rntiP), T_INT(frameP), T_INT(slotP), T_INT(harq_pid), T_BUFFER(sduP, sdu_lenP)); - UE_info->mac_stats[UE_id].ulsch_total_bytes_rx += sdu_lenP; - LOG_D(NR_MAC, "[gNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu from PHY (rnti %x, UE_id %d) ul_cqi %d TA %d sduP %p, rssi %d\n", + UE->mac_stats.ul.total_bytes += sdu_lenP; + LOG_D(NR_MAC, "[gNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu from PHY (rnti %04x) ul_cqi %d TA %d sduP %p, rssi %d\n", gnb_mod_idP, harq_pid, CC_idP, frameP, slotP, current_rnti, - UE_id, ul_cqi, timing_advance, sduP, @@ -658,10 +543,11 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, UE_scheduling_control->ta_update = timing_advance; UE_scheduling_control->raw_rssi = rssi; UE_scheduling_control->pusch_snrx10 = ul_cqi * 5 - 640; - LOG_D(NR_MAC, "[UE %d] PUSCH TPC %d(SNRx10 %d) and TA %d\n",UE_id,UE_scheduling_control->tpc0,UE_scheduling_control->pusch_snrx10,UE_scheduling_control->ta_update); + + LOG_D(NR_MAC, "[UE %04x] PUSCH TPC %d and TA %d\n",UE->rnti,UE_scheduling_control->tpc0,UE_scheduling_control->ta_update); } else{ - LOG_D(NR_MAC,"[UE %d] Detected DTX : increasing UE TX power\n",UE_id); + LOG_D(NR_MAC,"[UE %04x] Detected DTX : increasing UE TX power\n",UE->rnti); UE_scheduling_control->tpc0 = 1; } @@ -680,13 +566,13 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, if (sduP != NULL){ LOG_D(NR_MAC, "Received PDU at MAC gNB \n"); - UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt = 0; + UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt = 0; const uint32_t tb_size = UE_scheduling_control->ul_harq_processes[harq_pid].sched_pusch.tb_size; UE_scheduling_control->sched_ul_bytes -= tb_size; if (UE_scheduling_control->sched_ul_bytes < 0) UE_scheduling_control->sched_ul_bytes = 0; - nr_process_mac_pdu(gnb_mod_idP, UE_id, CC_idP, frameP, slotP, sduP, sdu_lenP); + nr_process_mac_pdu(gnb_mod_idP, UE, CC_idP, frameP, slotP, sduP, sdu_lenP); } else { NR_UE_ul_harq_t *cur_harq = &UE_scheduling_control->ul_harq_processes[harq_pid]; @@ -698,13 +584,15 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, UE_scheduling_control->sched_ul_bytes = 0; } if (ul_cqi <= 128) { - UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt++; - UE_info->mac_stats[UE_id].ulsch_DTX++; + UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt++; + UE->mac_stats.ulsch_DTX++; } - if (!get_softmodem_params()->phy_test && UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt >= pusch_failure_thres) { - LOG_W(NR_MAC,"%d.%d Detected UL Failure on PUSCH after %d PUSCH DTX, stopping scheduling\n", - frameP,slotP,UE_info->UE_sched_ctrl[UE_id].pusch_consecutive_dtx_cnt); - UE_info->UE_sched_ctrl[UE_id].ul_failure = 1; + + if (!get_softmodem_params()->phy_test && UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt >= pusch_failure_thres) { + LOG_W(NR_MAC,"Detected UL Failure on PUSCH after %d PUSCH DTX, stopping scheduling\n", + UE->UE_sched_ctrl.pusch_consecutive_dtx_cnt); + UE->UE_sched_ctrl.ul_failure = 1; + nr_mac_gNB_rrc_ul_failure(gnb_mod_idP,CC_idP,frameP,slotP,rntiP); } } @@ -725,7 +613,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, T(T_GNB_MAC_UL_PDU_WITH_DATA, T_INT(gnb_mod_idP), T_INT(CC_idP), T_INT(rntiP), T_INT(frameP), T_INT(slotP), T_INT(-1) /* harq_pid */, T_BUFFER(sduP, sdu_lenP)); - + /* we don't know this UE (yet). Check whether there is a ongoing RA (Msg 3) * and check the corresponding UE's RNTI match, in which case we activate * it. */ @@ -733,7 +621,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[i]; if (ra->state != WAIT_Msg3) continue; - + if(no_sig) { LOG_D(NR_MAC, "Random Access %i failed at state %i (no signal)\n", i, ra->state); nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti); @@ -756,20 +644,20 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, continue; } - int UE_id=-1; - UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti, ra->CellGroup); - if (UE_id<0) { - LOG_D(NR_MAC, "Random Access %i discarded at state %i (TC_RNTI %04x RNTI %04x): max number of users achieved!\n", i, ra->state,ra->rnti,current_rnti); + NR_UE_info_t* UE = add_new_nr_ue(gNB_mac, ra->rnti, ra->CellGroup); + if (!UE) { + LOG_W(NR_MAC, "Random Access %i discarded at state %i (TC_RNTI %04x RNTI %04x): max number of users achieved!\n", i, ra->state,ra->rnti,current_rnti); + nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti); nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); return; } - UE_info->UE_beam_index[UE_id] = ra->beam_id; + UE->UE_beam_index = ra->beam_id; // re-initialize ta update variables after RA procedure completion - UE_info->UE_sched_ctrl[UE_id].ta_frame = frameP; + UE->UE_sched_ctrl.ta_frame = frameP; LOG_D(NR_MAC, "reset RA state information for RA-RNTI 0x%04x/index %d\n", @@ -778,27 +666,24 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, LOG_I(NR_MAC, "[gNB %d][RAPROC] PUSCH with TC_RNTI 0x%04x received correctly, " - "adding UE MAC Context UE_id %d/RNTI 0x%04x\n", + "adding UE MAC Context RNTI 0x%04x\n", gnb_mod_idP, current_rnti, - UE_id, ra->rnti); - NR_UE_sched_ctrl_t *UE_scheduling_control = &UE_info->UE_sched_ctrl[UE_id]; + NR_UE_sched_ctrl_t *UE_scheduling_control = &UE->UE_sched_ctrl; UE_scheduling_control->tpc0 = nr_get_tpc(target_snrx10,ul_cqi,30); if (timing_advance != 0xffff) UE_scheduling_control->ta_update = timing_advance; UE_scheduling_control->raw_rssi = rssi; UE_scheduling_control->pusch_snrx10 = ul_cqi * 5 - 640; - LOG_D(NR_MAC, "[UE %d] PUSCH TPC %d and TA %d\n",UE_id,UE_scheduling_control->tpc0,UE_scheduling_control->ta_update); + LOG_D(NR_MAC, "[UE %04x] PUSCH TPC %d and TA %d\n",UE->rnti,UE_scheduling_control->tpc0,UE_scheduling_control->ta_update); if(ra->cfra) { - LOG_A(NR_MAC, "(ue %i, rnti 0x%04x) CFRA procedure succeeded!\n", UE_id, ra->rnti); + LOG_A(NR_MAC, "(rnti 0x%04x) CFRA procedure succeeded!\n", ra->rnti); nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti); nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); - UE_info->active[UE_id] = true; - process_CellGroup(ra->CellGroup, UE_scheduling_control); } else { @@ -814,26 +699,28 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, // First byte corresponds to R/LCID MAC sub-header memcpy(ra->cont_res_id, &sduP[1], sizeof(uint8_t) * 6); - if (nr_process_mac_pdu(gnb_mod_idP, UE_id, CC_idP, frameP, slotP, sduP, sdu_lenP) == 0) { + if (nr_process_mac_pdu(gnb_mod_idP, UE, CC_idP, frameP, slotP, sduP, sdu_lenP) == 0) { ra->state = Msg4; ra->Msg4_frame = (frameP + 2) % 1024; ra->Msg4_slot = 1; if (ra->msg3_dcch_dtch) { // Check if the UE identified by C-RNTI still exists at the gNB - int UE_id_C = find_nr_UE_id(gnb_mod_idP, ra->crnti); - if (UE_id_C < 0) { + NR_UE_info_t * UE_C = find_nr_UE(&gNB_mac->UE_info, ra->crnti); + if (!UE_C) { // The UE identified by C-RNTI no longer exists at the gNB // Let's abort the current RA, so the UE will trigger a new RA later but using RRCSetupRequest instead. A better solution may be implemented - mac_remove_nr_ue(gnb_mod_idP, ra->rnti); + mac_remove_nr_ue(gNB_mac, ra->rnti); nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); return; } else { // The UE identified by C-RNTI still exists at the gNB - // Reset uplink failure flags/counters/timers at MAC and at RRC so gNB will resume again scheduling resources for this UE - UE_info->UE_sched_ctrl[UE_id_C].pusch_consecutive_dtx_cnt = 0; - UE_info->UE_sched_ctrl[UE_id_C].ul_failure = 0; + // Reset uplink failure flags/counters/timers at RRC nr_mac_gNB_rrc_ul_failure_reset(gnb_mod_idP, frameP, slotP, ra->crnti); + + // Reset HARQ processes + reset_dl_harq_list(&UE_C->UE_sched_ctrl); + reset_ul_harq_list(&UE_C->UE_sched_ctrl); } } LOG_I(NR_MAC, "Scheduling RA-Msg4 for TC_RNTI 0x%04x (state %d, frame %d, slot %d)\n", @@ -864,20 +751,71 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, return; } - if (ra->msg3_round >= MAX_HARQ_ROUNDS - 1) { - LOG_D(NR_MAC, "Random Access %i failed at state %i (Reached msg3 max harq rounds)\n", i, ra->state); + if (ra->msg3_round >= gNB_mac->ul_bler.harq_round_max - 1) { + LOG_W(NR_MAC, "Random Access %i failed at state %i (Reached msg3 max harq rounds)\n", i, ra->state); nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti); nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); return; } LOG_D(NR_MAC, "Random Access %i Msg3 CRC did not pass)\n", i); + ra->msg3_round++; ra->state = Msg3_retransmission; } } } +void handle_nr_srs_measurements(const module_id_t module_id, + const frame_t frame, + const sub_frame_t slot, + const rnti_t rnti, + const uint16_t timing_advance, + const uint8_t num_symbols, + const uint8_t wide_band_snr, + const uint8_t num_reported_symbols, + nfapi_nr_srs_indication_reported_symbol_t* reported_symbol_list) { + + LOG_D(NR_MAC, "(%d.%d) Received SRS indication for rnti: 0x%04x\n", frame, slot, rnti); + +#ifdef SRS_IND_DEBUG + LOG_I(NR_MAC, "frame = %i\n", frame); + LOG_I(NR_MAC, "slot = %i\n", slot); + LOG_I(NR_MAC, "rnti = 0x%04x\n", rnti); + LOG_I(NR_MAC, "timing_advance = %i\n", timing_advance); + LOG_I(NR_MAC, "num_symbols = %i\n", num_symbols); + LOG_I(NR_MAC, "wide_band_snr = %i (%i dB)\n", wide_band_snr, (wide_band_snr>>1)-64); + LOG_I(NR_MAC, "num_reported_symbols = %i\n", num_reported_symbols); + LOG_I(NR_MAC, "reported_symbol_list[0].num_rbs = %i\n", reported_symbol_list[0].num_rbs); + for(int rb = 0; rb < reported_symbol_list[0].num_rbs; rb++) { + LOG_I(NR_MAC, "reported_symbol_list[0].rb_list[%3i].rb_snr = %i (%i dB)\n", + rb, reported_symbol_list[0].rb_list[rb].rb_snr, (reported_symbol_list[0].rb_list[rb].rb_snr>>1)-64); + } +#endif + + NR_UE_info_t *UE = find_nr_UE(&RC.nrmac[module_id]->UE_info, rnti); + if (!UE) { + LOG_W(NR_MAC, "Could not find UE for RNTI 0x%04x\n", rnti); + return; + } + + gNB_MAC_INST *nr_mac = RC.nrmac[module_id]; + NR_mac_stats_t *stats = &UE->mac_stats; + stats->srs_wide_band_snr = (wide_band_snr>>1)-64; + + const int ul_prbblack_SNR_threshold = nr_mac->ul_prbblack_SNR_threshold; + uint16_t *ulprbbl = nr_mac->ulprbbl; + + memset(ulprbbl, 0, reported_symbol_list[0].num_rbs*sizeof(uint16_t)); + for (int rb = 0; rb < reported_symbol_list[0].num_rbs; rb++) { + int snr = (reported_symbol_list[0].rb_list[rb].rb_snr>>1)-64; + if (snr < ul_prbblack_SNR_threshold) { + ulprbbl[rb] = 0x3FFF; // all symbols taken + } + LOG_D(NR_MAC, "ulprbbl[%3i] = 0x%x\n", rb, ulprbbl[rb]); + } +} + long get_K2(NR_ServingCellConfigCommon_t *scc, NR_ServingCellConfigCommonSIB_t *scc_sib1, NR_BWP_Uplink_t *ubwp, @@ -903,37 +841,35 @@ long get_K2(NR_ServingCellConfigCommon_t *scc, return 3; } -bool nr_UE_is_to_be_scheduled(module_id_t mod_id, int CC_id, int UE_id, frame_t frame, sub_frame_t slot) +static bool nr_UE_is_to_be_scheduled(const NR_ServingCellConfigCommon_t *scc, + int CC_id, NR_UE_info_t* UE, frame_t frame, sub_frame_t slot, uint32_t ulsch_max_frame_inactivity) { - const NR_ServingCellConfigCommon_t *scc = RC.nrmac[mod_id]->common_channels->ServingCellConfigCommon; const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing]; const int now = frame * n + slot; - const struct gNB_MAC_INST_s *nrmac = RC.nrmac[mod_id]; - const NR_UE_sched_ctrl_t *sched_ctrl = &nrmac->UE_info.UE_sched_ctrl[UE_id]; + const NR_UE_sched_ctrl_t *sched_ctrl =&UE->UE_sched_ctrl; const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL; int num_slots_per_period; - int last_ul_slot,last_ul_sched; + int last_ul_slot; int tdd_period_len[8] = {500,625,1000,1250,2000,2500,5000,10000}; if (tdd) { // Force the default transmission in a full slot as early as possible in the UL portion of TDD period (last_ul_slot) num_slots_per_period = n*tdd_period_len[tdd->dl_UL_TransmissionPeriodicity]/10000; last_ul_slot=1+tdd->nrofDownlinkSlots; - } - else { + } else { num_slots_per_period = n; - last_ul_slot = sched_ctrl->last_ul_slot; + last_ul_slot = sched_ctrl->last_ul_slot; } - last_ul_sched = sched_ctrl->last_ul_frame * n + last_ul_slot; + const int last_ul_sched = sched_ctrl->last_ul_frame * n + last_ul_slot; const int diff = (now - last_ul_sched + 1024 * n) % (1024 * n); /* UE is to be scheduled if * (1) we think the UE has more bytes awaiting than what we scheduled * (2) there is a scheduling request * (3) or we did not schedule it in more than 10 frames */ const bool has_data = sched_ctrl->estimated_ul_buffer > sched_ctrl->sched_ul_bytes; - const bool high_inactivity = diff >= (nrmac->ulsch_max_frame_inactivity>0 ? (nrmac->ulsch_max_frame_inactivity * n) : num_slots_per_period); + const bool high_inactivity = diff >= (ulsch_max_frame_inactivity > 0 ? ulsch_max_frame_inactivity * n : num_slots_per_period); LOG_D(NR_MAC, "%4d.%2d UL inactivity %d slots has_data %d SR %d\n", frame, @@ -944,43 +880,34 @@ bool nr_UE_is_to_be_scheduled(module_id_t mod_id, int CC_id, int UE_id, frame_t return has_data || sched_ctrl->SR || high_inactivity; } -int next_list_entry_looped(NR_list_t *list, int UE_id) -{ - if (UE_id < 0) - return list->head; - return list->next[UE_id] < 0 ? list->head : list->next[UE_id]; -} - -bool allocate_ul_retransmission(module_id_t module_id, - frame_t frame, - sub_frame_t slot, - uint16_t *rballoc_mask, - int *n_rb_sched, - int UE_id, - int harq_pid) +static bool allocate_ul_retransmission(gNB_MAC_INST *nrmac, + frame_t frame, + sub_frame_t slot, + uint16_t *rballoc_mask, + int *n_rb_sched, + NR_UE_info_t* UE, + int harq_pid, + const NR_SIB1_t *sib1, + const NR_ServingCellConfigCommon_t *scc, + const int tda) { const int CC_id = 0; - gNB_MAC_INST *nr_mac = RC.nrmac[module_id]; - const NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels[CC_id].ServingCellConfigCommon; - NR_UE_info_t *UE_info = &nr_mac->UE_info; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; NR_sched_pusch_t *retInfo = &sched_ctrl->ul_harq_processes[harq_pid].sched_pusch; - NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id]; + NR_CellGroupConfig_t *cg = UE->CellGroup; NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated && cg->spCellConfig->spCellConfigDedicated->uplinkConfig ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL; - const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp, (NR_ServingCellConfigCommon_t *)scc, sib1); int rbStart = 0; // wrt BWP start const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE); - + const uint8_t nrOfLayers = 1; const uint8_t num_dmrs_cdm_grps_no_data = (sched_ctrl->active_bwp || ubwpd) ? 1 : 2; - const int tda = sched_ctrl->active_ubwp ? RC.nrmac[module_id]->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0; LOG_D(NR_MAC,"retInfo->time_domain_allocation = %d, tda = %d\n", retInfo->time_domain_allocation, tda); LOG_D(NR_MAC,"num_dmrs_cdm_grps_no_data %d, tbs %d\n",num_dmrs_cdm_grps_no_data, retInfo->tb_size); if (tda == retInfo->time_domain_allocation) { @@ -992,6 +919,7 @@ bool allocate_ul_retransmission(module_id_t module_id, if (ps->time_domain_allocation != tda || ps->dci_format != dci_format + || ps->nrOfLayers != nrOfLayers || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) { nr_set_pusch_semi_static(sib1, scc, @@ -1000,6 +928,7 @@ bool allocate_ul_retransmission(module_id_t module_id, dci_format, tda, num_dmrs_cdm_grps_no_data, + nrOfLayers, ps); } @@ -1008,7 +937,7 @@ bool allocate_ul_retransmission(module_id_t module_id, while (rbStart < bwpSize && (rballoc_mask[rbStart] & slbitmap) != slbitmap) rbStart++; if (rbStart + retInfo->rbSize > bwpSize) { - LOG_W(NR_MAC, "cannot allocate retransmission of UE %d/RNTI %04x: no resources (rbStart %d, retInfo->rbSize %d, bwpSize %d\n", UE_id, UE_info->rnti[UE_id], rbStart, retInfo->rbSize, bwpSize); + LOG_W(NR_MAC, "cannot allocate retransmission of RNTI %04x: no resources (rbStart %d, retInfo->rbSize %d, bwpSize %d\n", UE->rnti, rbStart, retInfo->rbSize, bwpSize); return false; } LOG_D(NR_MAC, "%s(): retransmission keeping TDA %d and TBS %d\n", __func__, tda, retInfo->tb_size); @@ -1022,6 +951,7 @@ bool allocate_ul_retransmission(module_id_t module_id, dci_format, tda, num_dmrs_cdm_grps_no_data, + nrOfLayers, &temp_ps); /* the retransmission will use a different time domain allocation, check * that we have enough resources */ @@ -1057,8 +987,7 @@ bool allocate_ul_retransmission(module_id_t module_id, } /* Find a free CCE */ - const int cid = sched_ctrl->coreset->controlResourceSetId; - const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]); + const uint32_t Y = get_Y(sched_ctrl->search_space, slot, UE->rnti); uint8_t nr_of_candidates; for (int i=0; i<5; i++) { // for now taking the lowest value among the available aggregation levels @@ -1068,7 +997,7 @@ bool allocate_ul_retransmission(module_id_t module_id, 1<<i); if(nr_of_candidates>0) break; } - int CCEIndex = find_pdcch_candidate(RC.nrmac[module_id], + int CCEIndex = find_pdcch_candidate(nrmac, CC_id, sched_ctrl->aggregation_level, nr_of_candidates, @@ -1077,12 +1006,12 @@ bool allocate_ul_retransmission(module_id_t module_id, Y); if (CCEIndex<0) { - LOG_D(NR_MAC, "%4d.%2d no free CCE for retransmission UL DCI UE %04x\n", frame, slot, UE_info->rnti[UE_id]); + LOG_D(NR_MAC, "%4d.%2d no free CCE for retransmission UL DCI UE %04x\n", frame, slot, UE->rnti); return false; } sched_ctrl->cce_index = CCEIndex; - fill_pdcch_vrb_map(RC.nrmac[module_id], + fill_pdcch_vrb_map(nrmac, CC_id, &sched_ctrl->sched_pdcch, CCEIndex, @@ -1098,11 +1027,10 @@ bool allocate_ul_retransmission(module_id_t module_id, NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; LOG_D(NR_MAC, - "%4d.%2d Allocate UL retransmission UE %d/RNTI %04x sched %4d.%2d (%d RBs)\n", + "%4d.%2d Allocate UL retransmission RNTI %04x sched %4d.%2d (%d RBs)\n", frame, slot, - UE_id, - UE_info->rnti[UE_id], + UE->rnti, sched_pusch->frame, sched_pusch->slot, sched_pusch->rbSize); @@ -1129,12 +1057,20 @@ void update_ul_ue_R_Qm(NR_sched_pusch_t *sched_pusch, const NR_pusch_semi_static } } -float ul_thr_ue[MAX_MOBILES_PER_GNB]; uint32_t ul_pf_tbs[3][29]; // pre-computed, approximate TBS values for PF coefficient +typedef struct UEsched_s { + float coef; + NR_UE_info_t * UE; +} UEsched_t; + +static int comparator(const void *p, const void *q) { + return ((UEsched_t*)p)->coef < ((UEsched_t*)q)->coef; +} + void pf_ul(module_id_t module_id, frame_t frame, sub_frame_t slot, - NR_list_t *UE_list, + NR_UE_info_t *UE_list[], int max_num_ue, int n_rb_sched, uint16_t *rballoc_mask) { @@ -1142,28 +1078,29 @@ void pf_ul(module_id_t module_id, const int CC_id = 0; gNB_MAC_INST *nrmac = RC.nrmac[module_id]; NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon; - NR_UE_info_t *UE_info = &nrmac->UE_info; const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; - const int min_rb = nrmac->min_grant_prb; - float coeff_ue[MAX_MOBILES_PER_GNB]; + + const int min_rb = 5; // UEs that could be scheduled - int ue_array[MAX_MOBILES_PER_GNB]; - NR_list_t UE_sched = { .head = -1, .next = ue_array, .tail = -1, .len = MAX_MOBILES_PER_GNB }; + UEsched_t UE_sched[MAX_MOBILES_PER_GNB] = {0}; + int remainUEs=max_num_ue; + int curUE=0; /* Loop UE_list to calculate throughput and coeff */ - for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { + UE_iterator(UE_list, UE) { - if (UE_info->Msg4_ACKed[UE_id] != true) continue; + if (UE->Msg4_ACKed != true) + continue; - LOG_D(NR_MAC,"pf_ul: preparing UL scheduling for UE %d\n",UE_id); - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + LOG_D(NR_MAC,"pf_ul: preparing UL scheduling for UE %04x\n",UE->rnti); + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp, scc, sib1); int rbStart = 0; // wrt BWP start - NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id]; + NR_CellGroupConfig_t *cg = UE->CellGroup; NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated && cg->spCellConfig->spCellConfigDedicated->uplinkConfig ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL; @@ -1171,48 +1108,58 @@ void pf_ul(module_id_t module_id, const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE); NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; NR_pusch_semi_static_t *ps = &sched_ctrl->pusch_semi_static; + const NR_mac_dir_stats_t *stats = &UE->mac_stats.ul; /* Calculate throughput */ const float a = 0.0005f; // corresponds to 200ms window - const uint32_t b = UE_info->mac_stats[UE_id].ulsch_current_bytes; - ul_thr_ue[UE_id] = (1 - a) * ul_thr_ue[UE_id] + a * b; + const uint32_t b = stats->current_bytes; + UE->ul_thr_ue = (1 - a) * UE->ul_thr_ue + a * b; /* Check if retransmission is necessary */ sched_pusch->ul_harq_pid = sched_ctrl->retrans_ul_harq.head; - LOG_D(NR_MAC,"pf_ul: UE %d harq_pid %d\n",UE_id,sched_pusch->ul_harq_pid); + LOG_D(NR_MAC,"pf_ul: UE %04x harq_pid %d\n",UE->rnti,sched_pusch->ul_harq_pid); if (sched_pusch->ul_harq_pid >= 0) { /* Allocate retransmission*/ - bool r = allocate_ul_retransmission( - module_id, frame, slot, rballoc_mask, &n_rb_sched, UE_id, sched_pusch->ul_harq_pid); + const int tda = get_ul_tda(nrmac, scc, sched_pusch->slot); + bool r = allocate_ul_retransmission(nrmac, frame, slot, rballoc_mask, &n_rb_sched, UE, sched_pusch->ul_harq_pid, sib1, scc, tda); if (!r) { - LOG_D(NR_MAC, "%4d.%2d UL retransmission UE RNTI %04x can NOT be allocated\n", frame, slot, UE_info->rnti[UE_id]); + LOG_D(NR_MAC, "%4d.%2d UL retransmission UE RNTI %04x can NOT be allocated\n", frame, slot, UE->rnti); continue; } - else LOG_D(NR_MAC,"%4d.%2d UL Retransmission UE RNTI %04x to be allocated, max_num_ue %d\n",frame,slot,UE_info->rnti[UE_id],max_num_ue); + else LOG_D(NR_MAC,"%4d.%2d UL Retransmission UE RNTI %04x to be allocated, max_num_ue %d\n",frame,slot,UE->rnti,max_num_ue); /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */ - max_num_ue--; - if (max_num_ue < 0) - return; - continue; - } + remainUEs--; + + // we have filled all with mandatory retransmissions + // no need to schedule new transmissions + if (remainUEs == 0) + return; + continue; + } const int B = max(0, sched_ctrl->estimated_ul_buffer - sched_ctrl->sched_ul_bytes); /* preprocessor computed sched_frame/sched_slot */ - const bool do_sched = nr_UE_is_to_be_scheduled(module_id, 0, UE_id, sched_pusch->frame, sched_pusch->slot); + const bool do_sched = nr_UE_is_to_be_scheduled(scc, 0, UE, sched_pusch->frame, sched_pusch->slot, nrmac->ulsch_max_frame_inactivity); - LOG_D(NR_MAC,"pf_ul: do_sched UE %d => %s\n",UE_id,do_sched ? "yes" : "no"); + LOG_D(NR_MAC,"pf_ul: do_sched UE %04x => %s\n",UE->rnti,do_sched ? "yes" : "no"); if ((B == 0 && !do_sched) || (sched_ctrl->rrc_processing_timer > 0)) { continue; } + const NR_bler_options_t *bo = &nrmac->ul_bler; + const int max_mcs = bo->max_mcs; /* no per-user maximum MCS yet */ + if (bo->harq_round_max == 1) + sched_pusch->mcs = max_mcs; + else + sched_pusch->mcs = get_mcs_from_bler(bo, stats, &UE->UE_sched_ctrl.ul_bler_stats, max_mcs, frame); + /* Schedule UE on SR or UL inactivity and no data (otherwise, will be scheduled * based on data to transmit) */ if (B == 0 && do_sched) { /* if no data, pre-allocate 5RB */ /* Find a free CCE */ - const int cid = sched_ctrl->coreset->controlResourceSetId; - const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]); + const uint32_t Y = get_Y(sched_ctrl->search_space, slot, UE->rnti); uint8_t nr_of_candidates; for (int i=0; i<5; i++) { // for now taking the lowest value among the available aggregation levels @@ -1223,31 +1170,37 @@ void pf_ul(module_id_t module_id, if(nr_of_candidates>0) break; } int CCEIndex = find_pdcch_candidate(RC.nrmac[module_id], - CC_id, - sched_ctrl->aggregation_level, - nr_of_candidates, - &sched_ctrl->sched_pdcch, - sched_ctrl->coreset, - Y); + CC_id, + sched_ctrl->aggregation_level, + nr_of_candidates, + &sched_ctrl->sched_pdcch, + sched_ctrl->coreset, + Y); if (CCEIndex<0) { - LOG_D(NR_MAC, "%4d.%2d no free CCE for UL DCI UE %04x (BSR 0)\n", frame, slot, UE_info->rnti[UE_id]); + LOG_D(NR_MAC, "%4d.%2d no free CCE for UL DCI UE %04x (BSR 0)\n", frame, slot, UE->rnti); continue; } + /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */ - max_num_ue--; - if (max_num_ue < 0) + remainUEs--; + + // we have filled all with mandatory retransmissions + // no need to schedule new transmissions + if (remainUEs == 0) return; /* Save PUSCH field */ /* we want to avoid a lengthy deduction of DMRS and other parameters in * every TTI if we can save it, so check whether dci_format, TDA, or * num_dmrs_cdm_grps_no_data has changed and only then recompute */ + const uint8_t nrOfLayers = 1; const uint8_t num_dmrs_cdm_grps_no_data = (sched_ctrl->active_ubwp || ubwpd) ? 1 : 2; int dci_format = get_dci_format(sched_ctrl); - const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0; + const int tda = get_ul_tda(nrmac, scc, sched_pusch->slot); if (ps->time_domain_allocation != tda || ps->dci_format != dci_format + || ps->nrOfLayers != nrOfLayers || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) { nr_set_pusch_semi_static(sib1, scc, @@ -1256,16 +1209,18 @@ void pf_ul(module_id_t module_id, dci_format, tda, num_dmrs_cdm_grps_no_data, + nrOfLayers, ps); } - LOG_D(NR_MAC,"Looking for min_rb %d RBs, starting at %d\n", min_rb, rbStart); + LOG_D(NR_MAC,"Looking for min_rb %d RBs, starting at %d num_dmrs_cdm_grps_no_data %d\n", + min_rb, rbStart, ps->num_dmrs_cdm_grps_no_data); const uint16_t slbitmap = SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols); while (rbStart < bwpSize && (rballoc_mask[rbStart] & slbitmap) != slbitmap) rbStart++; if (rbStart + min_rb >= bwpSize) { - LOG_W(NR_MAC, "cannot allocate continuous UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n", - UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize); + LOG_W(NR_MAC, "cannot allocate continuous UL data for RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n", + UE->rnti,rbStart,min_rb,bwpSize); return; } @@ -1277,7 +1232,7 @@ void pf_ul(module_id_t module_id, sched_ctrl->aggregation_level); NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; - sched_pusch->mcs = nrmac->min_grant_mcs; + sched_pusch->mcs = min(nrmac->min_grant_mcs, sched_pusch->mcs); update_ul_ue_R_Qm(sched_pusch, ps); sched_pusch->rbStart = rbStart; sched_pusch->rbSize = min_rb; @@ -1288,7 +1243,7 @@ void pf_ul(module_id_t module_id, ps->N_PRB_DMRS * ps->num_dmrs_symb, 0, // nb_rb_oh 0, - 1 /* NrOfLayers */) + ps->nrOfLayers) >> 3; /* Mark the corresponding RBs as used */ @@ -1300,41 +1255,26 @@ void pf_ul(module_id_t module_id, } /* Create UE_sched for UEs eligibale for new data transmission*/ - add_tail_nr_list(&UE_sched, UE_id); - /* Calculate coefficient*/ - sched_pusch->mcs = nrmac->min_grant_mcs; const uint32_t tbs = ul_pf_tbs[ps->mcs_table][sched_pusch->mcs]; - coeff_ue[UE_id] = (float) tbs / ul_thr_ue[UE_id]; - LOG_D(NR_MAC,"b %d, ul_thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n", - b, UE_id, ul_thr_ue[UE_id], tbs, UE_id, coeff_ue[UE_id]); + float coeff_ue = (float) tbs / UE->ul_thr_ue; + LOG_D(NR_MAC,"rnti %04x b %d, ul_thr_ue %f, tbs %d, coeff_ue %f\n", + UE->rnti, b, UE->ul_thr_ue, tbs, coeff_ue); + UE_sched[curUE].coef=coeff_ue; + UE_sched[curUE].UE=UE; + curUE++; } - + qsort(UE_sched, sizeof(*UE_sched), sizeofArray(UE_sched), comparator); + UEsched_t *iterator=UE_sched; + const int min_rbSize = 5; /* Loop UE_sched to find max coeff and allocate transmission */ - while (UE_sched.head >= 0 && max_num_ue> 0 && n_rb_sched >= min_rbSize) { - /* Find max coeff */ - int *max = &UE_sched.head; /* Find max coeff: assume head is max */ - int *p = &UE_sched.next[*max]; - while (*p >= 0) { - /* Find max coeff: if the current one has larger coeff, save for later */ - if (coeff_ue[*p] > coeff_ue[*max]) - max = p; - p = &UE_sched.next[*p]; - } - /* Find max coeff: remove the max one: do not use remove_nr_list() since it - * goes through the whole list every time. Note that UE_sched.tail might - * not be set correctly anymore */ - const int UE_id = *max; - p = &UE_sched.next[*max]; - *max = UE_sched.next[*max]; - *p = -1; - - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - - const int cid = sched_ctrl->coreset->controlResourceSetId; - const uint16_t Y = get_Y(cid%3, slot, UE_info->rnti[UE_id]); + while (remainUEs> 0 && n_rb_sched >= min_rbSize && iterator->UE != NULL) { + + NR_UE_sched_ctrl_t *sched_ctrl = &iterator->UE->UE_sched_ctrl; + + const uint32_t Y = get_Y(sched_ctrl->search_space, slot, iterator->UE->rnti); uint8_t nr_of_candidates; for (int i=0; i<5; i++) { // for now taking the lowest value among the available aggregation levels @@ -1342,7 +1282,8 @@ void pf_ul(module_id_t module_id, &nr_of_candidates, sched_ctrl->search_space, 1<<i); - if(nr_of_candidates>0) break; + if(nr_of_candidates>0) + break; } int CCEIndex = find_pdcch_candidate(RC.nrmac[module_id], CC_id, @@ -1352,16 +1293,13 @@ void pf_ul(module_id_t module_id, sched_ctrl->coreset, Y); if (CCEIndex<0) { - LOG_D(NR_MAC, "%4d.%2d no free CCE for UL DCI UE %04x\n", frame, slot, UE_info->rnti[UE_id]); + LOG_D(NR_MAC, "%4d.%2d no free CCE for UL DCI UE %04x\n", frame, slot, iterator->UE->rnti); + iterator++; continue; } - else LOG_D(NR_MAC, "%4d.%2d free CCE for UL DCI UE %04x\n",frame,slot, UE_info->rnti[UE_id]); - - /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */ - max_num_ue--; - AssertFatal(max_num_ue >= 0, "Illegal max_num_ue %d\n", max_num_ue); + else LOG_D(NR_MAC, "%4d.%2d free CCE for UL DCI UE %04x\n",frame,slot, iterator->UE->rnti); - NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id]; + NR_CellGroupConfig_t *cg = iterator->UE->CellGroup; NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated && cg->spCellConfig->spCellConfigDedicated->uplinkConfig ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL; @@ -1379,11 +1317,13 @@ void pf_ul(module_id_t module_id, /* we want to avoid a lengthy deduction of DMRS and other parameters in * every TTI if we can save it, so check whether dci_format, TDA, or * num_dmrs_cdm_grps_no_data has changed and only then recompute */ + const uint8_t nrOfLayers = 1; const uint8_t num_dmrs_cdm_grps_no_data = (sched_ctrl->active_ubwp || ubwpd) ? 1 : 2; int dci_format = get_dci_format(sched_ctrl); - const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0; + const int tda = get_ul_tda(nrmac, scc, sched_pusch->slot); if (ps->time_domain_allocation != tda || ps->dci_format != dci_format + || ps->nrOfLayers != nrOfLayers || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) { nr_set_pusch_semi_static(sib1, scc, @@ -1392,6 +1332,7 @@ void pf_ul(module_id_t module_id, dci_format, tda, num_dmrs_cdm_grps_no_data, + nrOfLayers, ps); } update_ul_ue_R_Qm(sched_pusch, ps); @@ -1405,18 +1346,18 @@ void pf_ul(module_id_t module_id, max_rbSize++; if (rbStart + min_rb >= bwpSize) { - LOG_W(NR_MAC, "cannot allocate UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n", - UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize); + LOG_W(NR_MAC, "cannot allocate UL data for RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d)\n", + iterator->UE->rnti,rbStart,min_rb,bwpSize); return; } - else LOG_D(NR_MAC,"allocating UL data for UE %d/RNTI %04x (rbStsart %d, min_rb %d, bwpSize %d\n",UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize); - + else + LOG_D(NR_MAC,"allocating UL data for RNTI %04x (rbStsart %d, min_rb %d, bwpSize %d)\n", iterator->UE->rnti,rbStart,min_rb,bwpSize); /* Calculate the current scheduling bytes and the necessary RBs */ const int B = cmax(sched_ctrl->estimated_ul_buffer - sched_ctrl->sched_ul_bytes, 0); uint16_t rbSize = 0; uint32_t TBS = 0; - + nr_find_nb_rb(sched_pusch->Qm, sched_pusch->R, 1, // layers @@ -1444,6 +1385,10 @@ void pf_ul(module_id_t module_id, n_rb_sched -= sched_pusch->rbSize; for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++) rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] ^= slbitmap; + + /* reduce max_num_ue once we are sure UE can be allocated, i.e., has CCE */ + remainUEs--; + iterator++; } } @@ -1460,9 +1405,8 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t const int mu = scc ? scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing : scc_sib1->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing; - NR_UE_info_t *UE_info = &nr_mac->UE_info; - - if (UE_info->num_UEs == 0) + // no UEs + if (nr_mac->UE_info.list[0] == NULL) return false; const int CC_id = 0; @@ -1471,14 +1415,15 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t * have the same K2 (we don't support multiple/different K2s via different * TDAs yet). If the TDA is negative, it means that there is no UL slot to * schedule now (slot + k2 is not UL slot) */ - int UE_id = UE_info->list.head; - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - const int tda = sched_ctrl->active_ubwp ? nr_mac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0; + NR_UE_sched_ctrl_t *sched_ctrl = &nr_mac->UE_info.list[0]->UE_sched_ctrl; + const int temp_tda = get_ul_tda(nr_mac, scc, slot); + int K2 = get_K2(scc, scc_sib1, sched_ctrl->active_ubwp, temp_tda, mu); + const int sched_frame = (frame + (slot + K2 >= nr_slots_per_frame[mu])) & 1023; + const int sched_slot = (slot + K2) % nr_slots_per_frame[mu]; + const int tda = get_ul_tda(nr_mac, scc, sched_slot); if (tda < 0) return false; - int K2 = get_K2(scc, scc_sib1, sched_ctrl->active_ubwp, tda, mu); - const int sched_frame = (frame + (slot + K2 >= nr_slots_per_frame[mu])) % 1024; - const int sched_slot = (slot + K2) % nr_slots_per_frame[mu]; + DevAssert(K2 == get_K2(scc, scc_sib1, sched_ctrl->active_ubwp, tda, mu)); if (!is_xlsch_in_slot(nr_mac->ulsch_slot_bitmap[sched_slot / 64], sched_slot)) return false; @@ -1496,9 +1441,8 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t return false; // Avoid slots with the SRS - const NR_list_t *UE_list = &UE_info->list; - for (int UE_idx = UE_list->head; UE_idx >= 0; UE_idx = UE_list->next[UE_idx]) { - NR_sched_srs_t sched_srs = UE_info->UE_sched_ctrl[UE_idx].sched_srs; + UE_iterator(nr_mac->UE_info.list, UE) { + NR_sched_srs_t sched_srs = UE->UE_sched_ctrl.sched_srs; if(sched_srs.srs_scheduled && sched_srs.frame==sched_frame && sched_srs.slot==sched_slot) { return false; } @@ -1506,10 +1450,10 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t sched_ctrl->sched_pusch.slot = sched_slot; sched_ctrl->sched_pusch.frame = sched_frame; - for (UE_id = UE_info->list.next[UE_id]; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) { - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + UE_iterator(nr_mac->UE_info.list, UE2) { + NR_UE_sched_ctrl_t *sched_ctrl = &UE2->UE_sched_ctrl; AssertFatal(K2 == get_K2(scc,scc_sib1,sched_ctrl->active_ubwp, tda, mu), - "Different K2, %d(UE%d) != %ld(UE%d)\n", K2, 0, get_K2(scc,scc_sib1,sched_ctrl->active_ubwp, tda, mu), UE_id); + "Different K2, %d(UE%d) != %ld(UE%04x)\n", K2, 0, get_K2(scc,scc_sib1,sched_ctrl->active_ubwp, tda, mu), UE2->rnti); sched_ctrl->sched_pusch.slot = sched_slot; sched_ctrl->sched_pusch.frame = sched_frame; } @@ -1569,7 +1513,7 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t pf_ul(module_id, frame, slot, - &UE_info->list, + nr_mac->UE_info.list, 2, len, rballoc_mask); @@ -1590,7 +1534,7 @@ nr_pp_impl_ul nr_init_fr1_ulsch_preprocessor(module_id_t module_id, int CC_id) if (mcs > 27 && mcsTableIdx == 1) continue; const uint8_t Qm = nr_get_Qm_dl(mcs, mcsTableIdx); - const uint16_t R = nr_get_code_rate_dl(mcs, mcsTableIdx); + const uint16_t R = nr_get_code_rate_ul(mcs, mcsTableIdx); /* note: we do not update R/Qm based on low MCS or pi2BPSK */ ul_pf_tbs[mcsTableIdx][mcs] = nr_compute_tbs(Qm, R, @@ -1630,29 +1574,28 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon; - NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info; + NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info; const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL; - const NR_list_t *UE_list = &UE_info->list; - for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { - NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + UE_iterator( UE_info->list, UE) { + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; if (sched_ctrl->ul_failure == 1 && get_softmodem_params()->phy_test==0) continue; - NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id]; + NR_CellGroupConfig_t *cg = UE->CellGroup; NR_BWP_UplinkDedicated_t *ubwpd = cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated && cg->spCellConfig->spCellConfigDedicated->uplinkConfig ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL; - UE_info->mac_stats[UE_id].ulsch_current_bytes = 0; + UE->mac_stats.ul.current_bytes = 0; /* dynamic PUSCH values (RB alloc, MCS, hence R, Qm, TBS) that change in * every TTI are pre-populated by the preprocessor and used below */ NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; - LOG_D(NR_MAC,"UE %x : sched_pusch->rbSize %d\n",UE_info->rnti[UE_id],sched_pusch->rbSize); + LOG_D(NR_MAC,"UE %04x : sched_pusch->rbSize %d\n",UE->rnti,sched_pusch->rbSize); if (sched_pusch->rbSize <= 0) continue; - uint16_t rnti = UE_info->rnti[UE_id]; + uint16_t rnti = UE->rnti; sched_ctrl->SR = false; int8_t harq_id = sched_pusch->ul_harq_pid; @@ -1660,8 +1603,8 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) /* PP has not selected a specific HARQ Process, get a new one */ harq_id = sched_ctrl->available_ul_harq.head; AssertFatal(harq_id >= 0, - "no free HARQ process available for UE %d\n", - UE_id); + "no free HARQ process available for UE %04x\n", + UE->rnti); remove_front_nr_list(&sched_ctrl->available_ul_harq); sched_pusch->ul_harq_pid = harq_id; } else { @@ -1687,10 +1630,10 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) NR_pusch_semi_static_t *ps = &sched_ctrl->pusch_semi_static; /* Statistics */ - AssertFatal(cur_harq->round < 8, "Indexing ulsch_rounds[%d] is out of bounds\n", cur_harq->round); - UE_info->mac_stats[UE_id].ulsch_rounds[cur_harq->round]++; + AssertFatal(cur_harq->round < nr_mac->ul_bler.harq_round_max, "Indexing ulsch_rounds[%d] is out of bounds\n", cur_harq->round); + UE->mac_stats.ul.rounds[cur_harq->round]++; if (cur_harq->round == 0) { - UE_info->mac_stats[UE_id].ulsch_total_bytes_scheduled += sched_pusch->tb_size; + UE->mac_stats.ulsch_total_bytes_scheduled += sched_pusch->tb_size; /* Save information on MCS, TBS etc for the current initial transmission * so we have access to it when retransmitting */ cur_harq->sched_pusch = *sched_pusch; @@ -1710,12 +1653,12 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) cur_harq->round, cur_harq->ndi); } - UE_info->mac_stats[UE_id].ulsch_current_bytes = sched_pusch->tb_size; + UE->mac_stats.ul.current_bytes = sched_pusch->tb_size; sched_ctrl->last_ul_frame = sched_pusch->frame; sched_ctrl->last_ul_slot = sched_pusch->slot; LOG_D(NR_MAC, - "ULSCH/PUSCH: %4d.%2d RNTI %04x UL sched %4d.%2d DCI L %d start %2d RBS %3d startSymbol %2d nb_symbol %2d dmrs_pos %x MCS %2d TBS %4d HARQ PID %2d round %d RV %d NDI %d est %6d sched %6d est BSR %6d TPC %d\n", + "ULSCH/PUSCH: %4d.%2d RNTI %04x UL sched %4d.%2d DCI L %d start %2d RBS %3d startSymbol %2d nb_symbol %2d dmrs_pos %x MCS %2d nrOfLayers %2d num_dmrs_cdm_grps_no_data %2d TBS %4d HARQ PID %2d round %d RV %d NDI %d est %6d sched %6d est BSR %6d TPC %d\n", frame, slot, rnti, @@ -1728,10 +1671,12 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) ps->nrOfSymbols, ps->ul_dmrs_symb_pos, sched_pusch->mcs, + ps->nrOfLayers, + ps->num_dmrs_cdm_grps_no_data, sched_pusch->tb_size, harq_id, cur_harq->round, - nr_rv_round_map[cur_harq->round], + nr_rv_round_map[cur_harq->round%4], cur_harq->ndi, sched_ctrl->estimated_ul_buffer, sched_ctrl->sched_ul_bytes, @@ -1785,7 +1730,8 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) pusch_pdu->data_scrambling_id = *ps->pusch_Config->dataScramblingIdentityPUSCH; else pusch_pdu->data_scrambling_id = *scc->physCellId; - pusch_pdu->nrOfLayers = 1; + pusch_pdu->nrOfLayers = ps->nrOfLayers; + pusch_pdu->num_dmrs_cdm_grps_no_data = ps->num_dmrs_cdm_grps_no_data; /* FAPI: DMRS */ pusch_pdu->ul_dmrs_symb_pos = ps->ul_dmrs_symb_pos; @@ -1810,7 +1756,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) } pusch_pdu->scid = 0; // DMRS sequence initialization [TS38.211, sec 6.4.1.1.1] pusch_pdu->num_dmrs_cdm_grps_no_data = ps->num_dmrs_cdm_grps_no_data; - pusch_pdu->dmrs_ports = 1; + pusch_pdu->dmrs_ports = ((1<<ps->nrOfLayers) - 1); /* FAPI: Pusch Allocation in frequency domain */ pusch_pdu->resource_alloc = 1; //type 1 @@ -1827,13 +1773,15 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) pusch_pdu->nr_of_symbols = ps->nrOfSymbols; /* PUSCH PDU */ - AssertFatal(cur_harq->round < 4, "Indexing nr_rv_round_map[%d] is out of bounds\n", cur_harq->round); - pusch_pdu->pusch_data.rv_index = nr_rv_round_map[cur_harq->round]; + AssertFatal(cur_harq->round < nr_mac->ul_bler.harq_round_max, "Indexing nr_rv_round_map[%d] is out of bounds\n", cur_harq->round%4); + pusch_pdu->pusch_data.rv_index = nr_rv_round_map[cur_harq->round%4]; pusch_pdu->pusch_data.harq_process_id = harq_id; pusch_pdu->pusch_data.new_data_indicator = cur_harq->ndi; pusch_pdu->pusch_data.tb_size = sched_pusch->tb_size; pusch_pdu->pusch_data.num_cb = 0; //CBG not supported + pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = 0; + LOG_D(NR_MAC,"PUSCH PDU : data_scrambling_identity %x, dmrs_scrambling_id %x\n",pusch_pdu->data_scrambling_id,pusch_pdu->ul_dmrs_scrambling_id); /* TRANSFORM PRECODING --------------------------------------------------------*/ @@ -1873,7 +1821,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) /* look up the PDCCH PDU for this BWP and CORESET. If it does not exist, * create it */ - const int bwpid = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0; + const int bwp_id = sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Id : 0; NR_SearchSpace_t *ss = (sched_ctrl->active_bwp || ubwpd) ? sched_ctrl->search_space: RC.nrmac[module_id]->sched_ctrlCommon->search_space; NR_ControlResourceSet_t *coreset = (sched_ctrl->active_bwp || ubwpd) ? sched_ctrl->coreset: RC.nrmac[module_id]->sched_ctrlCommon->coreset; const int coresetid = coreset->controlResourceSetId; @@ -1889,7 +1837,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) pdcch_pdu_coreset[coresetid] = pdcch_pdu; } - LOG_D(NR_MAC,"Configuring ULDCI/PDCCH in %d.%d at CCE %d, rnti %x\n", frame,slot,sched_ctrl->cce_index,rnti); + LOG_D(NR_MAC,"Configuring ULDCI/PDCCH in %d.%d at CCE %d, rnti %04x\n", frame,slot,sched_ctrl->cce_index,rnti); /* Fill PDCCH DL DCI PDU */ nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu->dci_pdu[pdcch_pdu->numDlDci]; @@ -1927,9 +1875,9 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) &uldci_payload, ps->dci_format, ps->time_domain_allocation, - UE_info->UE_sched_ctrl[UE_id].tpc0, + UE->UE_sched_ctrl.tpc0, n_ubwp, - bwpid); + bwp_id); fill_dci_pdu_rel15(scc, cg, dci_pdu, @@ -1937,10 +1885,10 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) ps->dci_format, rnti_types[0], pusch_pdu->bwp_size, - bwpid, + bwp_id, + coresetid, nr_mac->cset0_bwp_size); memset(sched_pusch, 0, sizeof(*sched_pusch)); } } - diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index 9cb4dd88b27..75902ca60a6 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -41,8 +41,7 @@ void mac_top_init_gNB(void); void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl); void config_common(int Mod_idP, - int ssb_SubcarrierOffset, - rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts, + int pdsch_AntennaPorts, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc); @@ -52,7 +51,6 @@ int nr_mac_enable_ue_rrc_processing_timer(module_id_t Mod_idP, uint32_t rrc_reconfiguration_delay); int rrc_mac_config_req_gNB(module_id_t Mod_idP, - int ssb_SubcarrierOffset, rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts, int pusch_AntennaPorts, int sib1_tda, @@ -76,6 +74,10 @@ void nr_mac_update_timers(module_id_t module_id, void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frame_rxP, sub_frame_t slot_rxP); +void schedule_nr_bwp_switch(module_id_t module_id, + frame_t frame, + sub_frame_t slot); + /* \brief main DL scheduler function. Calls a preprocessor to decide on * resource allocation, then "post-processes" resource allocation (nFAPI * messages, statistics, HARQ handling, CEs, ... */ @@ -91,7 +93,7 @@ uint32_t schedule_control_sib1(module_id_t module_id, int nrOfSymbols, uint16_t dlDmrsSymbPos, uint8_t candidate_idx, - int num_total_bytes); + uint16_t num_total_bytes); /* \brief default FR1 DL preprocessor init routine, returns preprocessor to call */ nr_pp_impl_dl nr_init_fr1_dlsch_preprocessor(module_id_t module_id, int CC_id); @@ -199,7 +201,7 @@ void config_uldci(const NR_SIB1_t *sib1, int n_ubwp, int bwp_id); -void nr_schedule_pucch(int Mod_idP, +void nr_schedule_pucch(gNB_MAC_INST *nrmac, frame_t frameP, sub_frame_t slotP); @@ -215,14 +217,13 @@ void nr_csi_meas_reporting(int Mod_idP, sub_frame_t slotP); int nr_acknack_scheduling(int Mod_idP, - int UE_id, - frame_t frameP, - sub_frame_t slotP, - int r_pucch, - int do_common); + NR_UE_info_t *UE, + frame_t frameP, + sub_frame_t slotP, + int r_pucch, + int do_common); -void get_pdsch_to_harq_feedback(int Mod_idP, - int UE_id, +void get_pdsch_to_harq_feedback(NR_UE_info_t *, int bwp_id, NR_SearchSpace__searchSpaceType_PR ss_type, int *max_fb_time, @@ -287,7 +288,7 @@ int find_pdcch_candidate(gNB_MAC_INST *mac, int nr_of_candidates, NR_sched_pdcch_t *pdcch, NR_ControlResourceSet_t *coreset, - uint16_t Y); + uint32_t Y); void fill_pdcch_vrb_map(gNB_MAC_INST *mac, int CC_id, @@ -303,6 +304,7 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc, int rnti_types, int N_RB, int bwp_id, + NR_ControlResourceSetId_t coreset_id, uint16_t cset0_bwp_size); void prepare_dci(const NR_CellGroupConfig_t *CellGroup, @@ -331,7 +333,7 @@ NR_PDSCH_TimeDomainResourceAllocationList_t *get_pdsch_TimeDomainAllocationList( const NR_SIB1_t *sib1); /* find coreset within the search space */ -NR_ControlResourceSet_t *get_coreset(module_id_t module_idP, +NR_ControlResourceSet_t *get_coreset(gNB_MAC_INST *nrmac, NR_ServingCellConfigCommon_t *scc, void *bwp, NR_SearchSpace_t *ss, @@ -366,10 +368,9 @@ void nr_set_pusch_semi_static(const NR_SIB1_t *sib1, long dci_format, int tda, uint8_t num_dmrs_cdm_grps_no_data, + uint8_t nrOfLayers, NR_pusch_semi_static_t *ps); -uint16_t get_Y(int cid, int slot, rnti_t rnti); - uint8_t nr_get_tpc(int target, uint8_t cqi, int incr); int get_spf(nfapi_nr_config_request_scf_t *cfg); @@ -382,20 +383,12 @@ void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu, int x_overhead, uint8_t numdmrscdmgroupnodata, uint8_t tb_scaling); -/** \brief Computes Q based on I_MCS PDSCH and table_idx for downlink. Implements MCS Tables from 38.214. */ -uint8_t nr_get_Qm_dl(uint8_t Imcs, uint8_t table_idx); -uint32_t nr_get_code_rate_dl(uint8_t Imcs, uint8_t table_idx); - -/** \brief Computes Q based on I_MCS PDSCH and table_idx for uplink. Implements MCS Tables from 38.214. */ -uint8_t nr_get_Qm_ul(uint8_t Imcs, uint8_t table_idx); -uint32_t nr_get_code_rate_ul(uint8_t Imcs, uint8_t table_idx); int NRRIV2BW(int locationAndBandwidth,int N_RB); int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB); /* Functions to manage an NR_list_t */ -void dump_nr_list(NR_list_t *listP); void create_nr_list(NR_list_t *listP, int len); void resize_nr_list(NR_list_t *list, int new_len); void destroy_nr_list(NR_list_t *list); @@ -405,44 +398,24 @@ void add_tail_nr_list(NR_list_t *listP, int id); void add_front_nr_list(NR_list_t *listP, int id); void remove_front_nr_list(NR_list_t *listP); -int find_nr_UE_id(module_id_t mod_idP, rnti_t rntiP); +NR_UE_info_t * find_nr_UE(NR_UEs_t* UEs, rnti_t rntiP); int find_nr_RA_id(module_id_t mod_idP, int CC_idP, rnti_t rntiP); -int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellGroup); +NR_UE_info_t*add_new_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rntiP, NR_CellGroupConfig_t *CellGroup); -void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti); +void mac_remove_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rnti); void nr_mac_remove_ra_rnti(module_id_t mod_id, rnti_t rnti); -int allocate_nr_CCEs(gNB_MAC_INST *nr_mac, - NR_BWP_Downlink_t *bwp, - NR_ControlResourceSet_t *coreset, - int aggregation, - uint16_t Y, - int m, - int nr_of_candidates); - int nr_get_default_pucch_res(int pucch_ResourceCommon); -void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_info, int UE_id, module_id_t Mod_idP); - int get_dlscs(nfapi_nr_config_request_t *cfg); int get_ulscs(nfapi_nr_config_request_t *cfg); int get_symbolsperslot(nfapi_nr_config_request_t *cfg); -void config_nr_mib(int Mod_idP, - int CC_idP, - int p_gNBP, - int subCarrierSpacingCommon, - uint32_t ssb_SubcarrierOffset, - int dmrs_TypeA_Position, - uint32_t pdcch_ConfigSIB1, - int cellBarred, - int intraFreqReselection); - int nr_write_ce_dlsch_pdu(module_id_t module_idP, const NR_UE_sched_ctrl_t *ue_sched_ctl, unsigned char *mac_pdu, @@ -459,7 +432,7 @@ int binomial(int n, int k); bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot); -void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, uint16_t symStart, int CC_id); +void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, int ssb_subcarrier_offset, uint16_t symStart, int CC_id); /* \brief Function to indicate a received SDU on ULSCH. @@ -485,15 +458,29 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl, const NR_PDSCH_ServingCellConfig_t *pdsch); +void reset_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl); + +void reset_ul_harq_list(NR_UE_sched_ctrl_t *sched_ctrl); + void handle_nr_ul_harq(const int CC_idP, module_id_t mod_id, frame_t frame, sub_frame_t slot, const nfapi_nr_crc_t *crc_pdu); +void handle_nr_srs_measurements(const module_id_t module_id, + const frame_t frame, + const sub_frame_t slot, + const rnti_t rnti, + const uint16_t timing_advance, + const uint8_t num_symbols, + const uint8_t wide_band_snr, + const uint8_t num_reported_symbols, + nfapi_nr_srs_indication_reported_symbol_t* reported_symbol_list); + int16_t ssb_index_from_prach(module_id_t module_idP, frame_t frameP, - sub_frame_t slotP, + sub_frame_t slotP, uint16_t preamble_index, uint8_t freq_index, uint8_t symbol); @@ -502,18 +489,21 @@ void find_SSB_and_RO_available(module_id_t module_idP); void set_dl_dmrs_ports(NR_pdsch_semi_static_t *ps); -void set_dl_mcs(NR_sched_pdsch_t *sched_pdsch, - NR_UE_sched_ctrl_t *sched_ctrl, - uint8_t *target_mcs, - uint8_t mcs_table_idx); +uint16_t set_pm_index(NR_UE_sched_ctrl_t *sched_ctrl, + int layers, + int N1, int N2, + int xp_pdsch_antenna_ports, + int codebook_mode); + +uint8_t get_mcs_from_cqi(int mcs_table, int cqi_table, int cqi_idx); uint8_t set_dl_nrOfLayers(NR_UE_sched_ctrl_t *sched_ctrl); int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl); -void calculate_preferred_dl_tda(module_id_t module_id, const NR_BWP_Downlink_t *bwp); -void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ubwp); +const int get_dl_tda(const gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *scc, int slot); +const int get_ul_tda(const gNB_MAC_INST *nrmac, const NR_ServingCellConfigCommon_t *scc, int slot); -bool find_free_CCE(module_id_t module_id, sub_frame_t slot, int UE_id); +bool find_free_CCE(sub_frame_t slot, NR_UE_info_t *UE); bool nr_find_nb_rb(uint16_t Qm, uint16_t R, @@ -526,10 +516,20 @@ bool nr_find_nb_rb(uint16_t Qm, uint32_t *tbs, uint16_t *nb_rb); -void nr_sr_reporting(int Mod_idP, frame_t frameP, sub_frame_t slotP); +int get_mcs_from_bler(const NR_bler_options_t *bler_options, + const NR_mac_dir_stats_t *stats, + NR_bler_stats_t *bler_stats, + int max_mcs, + frame_t frame); -void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen, bool reset_rsrp); +void UL_tti_req_ahead_initialization(gNB_MAC_INST * gNB, NR_ServingCellConfigCommon_t *scc, int n, int CCid); + +void nr_sr_reporting(gNB_MAC_INST *nrmac, frame_t frameP, sub_frame_t slotP); + +size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset_rsrp); void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl); +void abort_nr_dl_harq(NR_UE_info_t* UE, int8_t harq_pid); + #endif /*__LAYER2_NR_MAC_PROTO_H__*/ diff --git a/openair2/LAYER2/NR_MAC_gNB/main.c b/openair2/LAYER2/NR_MAC_gNB/main.c index e047494b529..12c9846037f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/main.c +++ b/openair2/LAYER2/NR_MAC_gNB/main.c @@ -45,107 +45,138 @@ extern RAN_CONTEXT_t RC; -#define MACSTATSSTRLEN 16384 +#define MACSTATSSTRLEN 65536 void *nrmac_stats_thread(void *arg) { gNB_MAC_INST *gNB = (gNB_MAC_INST *)arg; - char output[MACSTATSSTRLEN]; - memset(output,0,MACSTATSSTRLEN); - FILE *fd=fopen("nrMAC_stats.log","w"); - AssertFatal(fd!=NULL,"Cannot open nrMAC_stats.log, error %s\n",strerror(errno)); + char output[MACSTATSSTRLEN] = {0}; + const char *end = output + MACSTATSSTRLEN; + FILE *file = fopen("nrMAC_stats.log","w"); + AssertFatal(file!=NULL,"Cannot open nrMAC_stats.log, error %s\n",strerror(errno)); while (oai_exit == 0) { - dump_mac_stats(gNB,output,MACSTATSSTRLEN,false); - fprintf(fd,"%s\n",output); - fflush(fd); - usleep(200000); - fseek(fd,0,SEEK_SET); + char *p = output; + p += dump_mac_stats(gNB, p, end - p, false); + p += snprintf(p, end - p, "\n"); + p += print_meas_log(&gNB->eNB_scheduler, "DL & UL scheduling timing", NULL, NULL, p, end - p); + p += print_meas_log(&gNB->schedule_dlsch, "dlsch scheduler", NULL, NULL, p, end - p); + p += print_meas_log(&gNB->rlc_data_req, "rlc_data_req", NULL, NULL, p, end - p); + p += print_meas_log(&gNB->rlc_status_ind, "rlc_status_ind", NULL, NULL, p, end - p); + fwrite(output, p - output, 1, file); + fflush(file); + sleep(1); + fseek(file,0,SEEK_SET); } - fclose(fd); + fclose(file); return NULL; } void clear_mac_stats(gNB_MAC_INST *gNB) { - memset((void*)gNB->UE_info.mac_stats,0,MAX_MOBILES_PER_GNB*sizeof(NR_mac_stats_t)); + UE_iterator(gNB->UE_info.list, UE) { + memset(&UE->mac_stats,0,sizeof(UE->mac_stats)); + } } -void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen, bool reset_rsrp) +size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset_rsrp) { - NR_UE_info_t *UE_info = &gNB->UE_info; int num = 1; - - int stroff=0; - if (UE_info->num_UEs == 0) return; - - for (int UE_id = UE_info->list.head; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) { + const char *begin = output; + const char *end = output + strlen; - const NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id]; + pthread_mutex_lock(&gNB->UE_info.mutex); + UE_iterator(gNB->UE_info.list, UE) { + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; + NR_mac_stats_t *stats = &UE->mac_stats; const int avg_rsrp = stats->num_rsrp_meas > 0 ? stats->cumul_rsrp / stats->num_rsrp_meas : 0; - stroff+=sprintf(output+stroff,"UE ID %d RNTI %04x (%d/%d) PH %d dB PCMAX %d dBm, average RSRP %d (%d meas)\n", - UE_id, - UE_info->rnti[UE_id], - num++, - UE_info->num_UEs, - sched_ctrl->ph, - sched_ctrl->pcmax, - avg_rsrp, - stats->num_rsrp_meas); - stroff+=sprintf(output+stroff,"UE %d: CQI %d, RI %d, PMI (%d,%d)\n", - UE_id, - UE_info->UE_sched_ctrl[UE_id].CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb, - UE_info->UE_sched_ctrl[UE_id].CSI_report.cri_ri_li_pmi_cqi_report.ri+1, - UE_info->UE_sched_ctrl[UE_id].CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1, - UE_info->UE_sched_ctrl[UE_id].CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2); - - stroff+=sprintf(output+stroff,"UE %d: dlsch_rounds %"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64", dlsch_errors %"PRIu64", pucch0_DTX %d, BLER %.5f MCS %d\n", - UE_id, - stats->dlsch_rounds[0], stats->dlsch_rounds[1], - stats->dlsch_rounds[2], stats->dlsch_rounds[3], - stats->dlsch_errors, - stats->pucch0_DTX, - sched_ctrl->dl_bler_stats.bler, - sched_ctrl->dl_bler_stats.mcs); + + output += snprintf(output, + end - output, + "UE RNTI %04x (%d) PH %d dB PCMAX %d dBm, average RSRP %d (%d meas), UL-SNR %d dB\n", + UE->rnti, + num++, + sched_ctrl->ph, + sched_ctrl->pcmax, + avg_rsrp, + stats->num_rsrp_meas, + stats->srs_wide_band_snr); + output += snprintf(output, + end - output, + "UE %04x: CQI %d, RI %d, PMI (%d,%d)\n", + UE->rnti, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.ri+1, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2); + + output += snprintf(output, + end - output, + "UE %04x: dlsch_rounds ", UE->rnti); + output += snprintf(output, end - output, "%"PRIu64, stats->dl.rounds[0]); + for (int i = 1; i < gNB->dl_bler.harq_round_max; i++) + output += snprintf(output, end - output, "/%"PRIu64, stats->dl.rounds[i]); + + output += snprintf(output, + end - output, + ", dlsch_errors %"PRIu64", pucch0_DTX %d, BLER %.5f MCS %d\n", + stats->dl.errors, + stats->pucch0_DTX, + sched_ctrl->dl_bler_stats.bler, + sched_ctrl->dl_bler_stats.mcs); if (reset_rsrp) { stats->num_rsrp_meas = 0; stats->cumul_rsrp = 0; } - stroff+=sprintf(output+stroff,"UE %d: dlsch_total_bytes %"PRIu64"\n", UE_id, stats->dlsch_total_bytes); - stroff+=sprintf(output+stroff,"UE %d: ulsch_rounds %"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64", ulsch_DTX %d, ulsch_errors %"PRIu64"\n", - UE_id, - stats->ulsch_rounds[0], stats->ulsch_rounds[1], - stats->ulsch_rounds[2], stats->ulsch_rounds[3], - stats->ulsch_DTX, - stats->ulsch_errors); - stroff+=sprintf(output+stroff, - "UE %d: ulsch_total_bytes_scheduled %"PRIu64", ulsch_total_bytes_received %"PRIu64"\n", - UE_id, - stats->ulsch_total_bytes_scheduled, stats->ulsch_total_bytes_rx); + output += snprintf(output, + end - output, + "UE %04x: dlsch_total_bytes %"PRIu64"\n", + UE->rnti, stats->dl.total_bytes); + output += snprintf(output, + end - output, + "UE %04x: ulsch_rounds ", UE->rnti); + output += snprintf(output, end - output, "%"PRIu64, stats->ul.rounds[0]); + for (int i = 1; i < gNB->ul_bler.harq_round_max; i++) + output += snprintf(output, end - output, "/%"PRIu64, stats->ul.rounds[i]); + + output += snprintf(output, + end - output, + ", ulsch_DTX %d, ulsch_errors %"PRIu64", BLER %.5f MCS %d\n", + stats->ulsch_DTX, + stats->ul.errors, + sched_ctrl->ul_bler_stats.bler, + sched_ctrl->ul_bler_stats.mcs); + output += snprintf(output, + end - output, + "UE %04x: ulsch_total_bytes_scheduled %"PRIu64", ulsch_total_bytes_received %"PRIu64"\n", + UE->rnti, + stats->ulsch_total_bytes_scheduled, stats->ul.total_bytes); + for (int lc_id = 0; lc_id < 63; lc_id++) { - if (stats->lc_bytes_tx[lc_id] > 0) { - stroff+=sprintf(output+stroff, "UE %d: LCID %d: %"PRIu64" bytes TX\n", UE_id, lc_id, stats->lc_bytes_tx[lc_id]); - LOG_D(NR_MAC, "UE %d: LCID %d: %"PRIu64" bytes TX\n", UE_id, lc_id, stats->lc_bytes_tx[lc_id]); - } - if (stats->lc_bytes_rx[lc_id] > 0) { - stroff+=sprintf(output+stroff, "UE %d: LCID %d: %"PRIu64" bytes RX\n", UE_id, lc_id, stats->lc_bytes_rx[lc_id]); - LOG_D(NR_MAC, "UE %d: LCID %d: %"PRIu64" bytes RX\n", UE_id, lc_id, stats->lc_bytes_rx[lc_id]); - } + if (stats->dl.lc_bytes[lc_id] > 0) + output += snprintf(output, + end - output, + "UE %04x: LCID %d: %"PRIu64" bytes TX\n", + UE->rnti, + lc_id, + stats->dl.lc_bytes[lc_id]); + if (stats->ul.lc_bytes[lc_id] > 0) + output += snprintf(output, + end - output, + "UE %04x: LCID %d: %"PRIu64" bytes RX\n", + UE->rnti, + lc_id, + stats->ul.lc_bytes[lc_id]); } } - print_meas(&gNB->eNB_scheduler, "DL & UL scheduling timing stats", NULL, NULL); - print_meas(&gNB->schedule_dlsch,"dlsch scheduler",NULL,NULL); - print_meas(&gNB->rlc_data_req, "rlc_data_req",NULL,NULL); - print_meas(&gNB->rlc_status_ind,"rlc_status_ind",NULL,NULL); + pthread_mutex_unlock(&gNB->UE_info.mutex); + return output - begin; } void mac_top_init_gNB(void) { module_id_t i; - int list_el; - NR_UE_info_t *UE_info; gNB_MAC_INST *nrmac; LOG_I(MAC, "[MAIN] Init function start:nb_nr_macrlc_inst=%d\n",RC.nb_nr_macrlc_inst); @@ -179,6 +210,8 @@ void mac_top_init_gNB(void) RC.nrmac[i]->first_MIB = true; + pthread_mutex_init(&RC.nrmac[i]->UE_info.mutex, NULL); + if (get_softmodem_params()->phy_test) { RC.nrmac[i]->pre_processor_dl = nr_preprocessor_phytest; RC.nrmac[i]->pre_processor_ul = nr_ul_preprocessor_phytest; @@ -186,8 +219,8 @@ void mac_top_init_gNB(void) RC.nrmac[i]->pre_processor_dl = nr_init_fr1_dlsch_preprocessor(i, 0); RC.nrmac[i]->pre_processor_ul = nr_init_fr1_ulsch_preprocessor(i, 0); } - pthread_create(&RC.nrmac[i]->stats_thread,NULL,nrmac_stats_thread,(void*)RC.nrmac[i]); - + if (!IS_SOFTMODEM_NOSTATS_BIT) + pthread_create(&RC.nrmac[i]->stats_thread, NULL, nrmac_stats_thread, (void*)RC.nrmac[i]); }//END for (i = 0; i < RC.nb_nr_macrlc_inst; i++) AssertFatal(rlc_module_init(1) == 0,"Could not initialize RLC layer\n"); @@ -207,16 +240,9 @@ void mac_top_init_gNB(void) // Initialize Linked-List for Active UEs for (i = 0; i < RC.nb_nr_macrlc_inst; i++) { - nrmac = RC.nrmac[i]; nrmac->if_inst = NR_IF_Module_init(i); - - UE_info = &nrmac->UE_info; - UE_info->num_UEs = 0; - create_nr_list(&UE_info->list, MAX_MOBILES_PER_GNB); - for (list_el = 0; list_el < MAX_MOBILES_PER_GNB; list_el++) { - UE_info->active[list_el] = false; - } + memset(&nrmac->UE_info, 0, sizeof(nrmac->UE_info)); } srand48(0); diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index a2c77234c0c..3ec0de57e48 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -72,14 +72,15 @@ /* Defs */ -#define MAX_NUM_BWP 2 +#define MAX_NUM_BWP 5 #define MAX_NUM_CORESET 12 #define MAX_NUM_CCE 90 -#define MAX_HARQ_ROUNDS 4 /*!\brief Maximum number of random access process */ #define NR_NB_RA_PROC_MAX 4 #define MAX_NUM_OF_SSB 64 +#define MIN_NUM_PRBS_TO_SCHEDULE 5 + /*! \brief NR_list_t is a "list" (of users, HARQ processes, slices, ...). * Especially useful in the scheduler and to keep "classes" of users. */ typedef struct { @@ -89,6 +90,7 @@ typedef struct { int len; } NR_list_t; + typedef enum { RA_IDLE = 0, Msg2 = 1, @@ -121,8 +123,10 @@ typedef struct NR_sched_pdcch { typedef struct { /// Flag to indicate this process is active RA_gNB_state_t state; - /// BWP id of RA process - int bwp_id; + /// DL BWP id of RA process + int dl_bwp_id; + /// UL BWP id of RA process + int ul_bwp_id; /// CORESET0 configured flag int coreset0_configured; /// Slot where preamble was received @@ -343,6 +347,7 @@ typedef struct NR_sched_pucch { typedef struct NR_pusch_semi_static_t { int dci_format; int time_domain_allocation; + uint8_t nrOfLayers; uint8_t num_dmrs_cdm_grps_no_data; int startSymbolIndex; @@ -434,6 +439,7 @@ typedef struct NR_sched_pdsch { /// only important for retransmissions; otherwise, the TDA in /// NR_pdsch_semi_static_t has precedence int time_domain_allocation; + uint8_t nrOfLayers; } NR_sched_pdsch_t; typedef struct NR_UE_harq { @@ -454,13 +460,12 @@ typedef struct NR_UE_harq { //! fixme : need to enhace for the multiple TB CQI report -typedef struct NR_DL_bler_stats { - frame_t last_frame_slot; +typedef struct NR_bler_stats { + frame_t last_frame; float bler; - float rd2_bler; uint8_t mcs; - uint64_t dlsch_rounds[8]; -} NR_DL_bler_stats_t; + uint64_t rounds[8]; +} NR_bler_stats_t; // /*! As per spec 38.214 section 5.2.1.4.2 @@ -486,6 +491,7 @@ struct CRI_RI_LI_PMI_CQI { uint8_t wb_cqi_1tb; uint8_t wb_cqi_2tb; uint8_t cqi_table; + uint8_t csi_report_id; }; typedef struct CRI_SSB_RSRP { @@ -502,35 +508,6 @@ struct CSI_Report { #define MAX_SR_BITLEN 8 -typedef struct { - uint8_t nb_ssbri_cri; - uint8_t cri_ssbri_bitlen; - uint8_t rsrp_bitlen; - uint8_t diff_rsrp_bitlen; -}L1_RSRP_bitlen_t; - -typedef struct{ - uint8_t ri_restriction; - uint8_t cri_bitlen; - uint8_t ri_bitlen; - uint8_t li_bitlen[8]; - uint8_t pmi_x1_bitlen[8]; - uint8_t pmi_x2_bitlen[8]; - uint8_t cqi_bitlen[8]; -} CSI_Meas_bitlen_t; - -typedef struct nr_csi_report { - NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type; - long periodicity; - uint16_t offset; - long ** SSB_Index_list; - long ** CSI_Index_list; -// uint8_t nb_of_nzp_csi_report; - uint8_t nb_of_csi_ssb_report; - L1_RSRP_bitlen_t CSI_report_bitlen; - CSI_Meas_bitlen_t csi_meas_bitlen; -} nr_csi_report_t; - /*! As per the spec 38.212 and table: 6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report the number of CSI_report will depend on number of CSI resource sets that are configured in CSI-ResourceConfig RRC IE From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set @@ -561,6 +538,12 @@ typedef struct { NR_BWP_Downlink_t *active_bwp; /// the currently active BWP in UL NR_BWP_Uplink_t *active_ubwp; + + /// the next active BWP ID in DL + NR_BWP_Id_t next_dl_bwp_id; + /// the next active BWP ID in UL + NR_BWP_Id_t next_ul_bwp_id; + /// CCE index and aggregation, should be coherent with cce_list NR_SearchSpace_t *search_space; NR_ControlResourceSet_t *coreset; @@ -598,6 +581,9 @@ typedef struct { NR_pdsch_semi_static_t pdsch_semi_static; /// Sched PDSCH: scheduling decisions, copied into HARQ and cleared every TTI NR_sched_pdsch_t sched_pdsch; + /// UE-estimated maximum MCS (from CSI-RS) + uint8_t dl_max_mcs; + /// For UL synchronization: store last UL scheduling grant frame_t last_ul_frame; sub_frame_t last_ul_slot; @@ -609,7 +595,8 @@ typedef struct { mac_rlc_status_resp_t rlc_status[NR_MAX_NUM_LCID]; /// Estimation of HARQ from BLER - NR_DL_bler_stats_t dl_bler_stats; + NR_bler_stats_t dl_bler_stats; + NR_bler_stats_t ul_bler_stats; uint16_t ta_frame; int16_t ta_update; @@ -626,7 +613,7 @@ typedef struct { int ul_failure; struct CSI_Report CSI_report; bool SR; - bool set_mcs; + bool set_pmi; /// information about every HARQ process NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES]; /// HARQ processes that are free @@ -654,49 +641,68 @@ typedef struct { } NR_UE_sched_ctrl_t; typedef struct { - boolean_t fiveG_connected; uicc_t *uicc; } NRUEcontext_t; -typedef struct { - uint64_t lc_bytes_tx[64]; - uint64_t lc_bytes_rx[64]; - uint64_t dlsch_rounds[8]; - uint64_t dlsch_errors; - uint64_t dlsch_total_bytes; - int dlsch_current_bytes; - uint64_t ulsch_rounds[8]; - uint64_t ulsch_errors; +typedef struct NR_mac_dir_stats { + uint64_t lc_bytes[64]; + uint64_t rounds[8]; + uint64_t errors; + uint64_t total_bytes; + uint32_t current_bytes; +} NR_mac_dir_stats_t; + +typedef struct NR_mac_stats { + NR_mac_dir_stats_t dl; + NR_mac_dir_stats_t ul; uint32_t ulsch_DTX; uint64_t ulsch_total_bytes_scheduled; - uint64_t ulsch_total_bytes_rx; - int ulsch_current_bytes; uint32_t pucch0_DTX; int cumul_rsrp; uint8_t num_rsrp_meas; + int8_t srs_wide_band_snr; } NR_mac_stats_t; +typedef struct NR_bler_options { + double upper; + double lower; + uint8_t max_mcs; + uint8_t harq_round_max; +} NR_bler_options_t; /*! \brief UE list used by gNB to order UEs/CC for scheduling*/ -#define MAX_CSI_REPORTCONFIG 48 typedef struct { + rnti_t rnti; /// scheduling control info - nr_csi_report_t csi_report_template[MAX_MOBILES_PER_GNB][MAX_CSI_REPORTCONFIG]; - NR_UE_sched_ctrl_t UE_sched_ctrl[MAX_MOBILES_PER_GNB]; - NR_mac_stats_t mac_stats[MAX_MOBILES_PER_GNB]; - NR_list_t list; - int num_UEs; - bool active[MAX_MOBILES_PER_GNB]; - rnti_t rnti[MAX_MOBILES_PER_GNB]; - NR_CellGroupConfig_t *CellGroup[MAX_MOBILES_PER_GNB]; + nr_csi_report_t csi_report_template[MAX_CSI_REPORTCONFIG]; + NR_UE_sched_ctrl_t UE_sched_ctrl; + NR_mac_stats_t mac_stats; + NR_CellGroupConfig_t *CellGroup; + char cg_buf[32768]; /* arbitrary size */ + asn_enc_rval_t enc_rval; /// CCE indexing - int m[MAX_MOBILES_PER_GNB]; + int m; // UE selected beam index - uint8_t UE_beam_index[MAX_MOBILES_PER_GNB]; - bool Msg4_ACKed[MAX_MOBILES_PER_GNB]; - + uint8_t UE_beam_index; + bool Msg3_dcch_dtch; + bool Msg4_ACKed; + /// Sched CSI-RS: scheduling decisions + NR_gNB_UCI_STATS_t uci_statS; + float ul_thr_ue; + float dl_thr_ue; + int layers; } NR_UE_info_t; +typedef struct { + /// scheduling control info + // last element always NULL + pthread_mutex_t mutex; + NR_UE_info_t *list[MAX_MOBILES_PER_GNB+1]; + bool sched_csirs; +} NR_UEs_t; + +#define UE_iterator(BaSe, VaR) NR_UE_info_t ** VaR##pptr=BaSe, *VaR; while ((VaR=*(VaR##pptr++))) + typedef void (*nr_pp_impl_dl)(module_id_t mod_id, frame_t frame, sub_frame_t slot); @@ -721,12 +727,15 @@ typedef struct gNB_MAC_INST_s { int pusch_target_snrx10; /// Pucch target SNR int pucch_target_snrx10; + /// SNR threshold needed to put or not a PRB in the black list + int ul_prbblack_SNR_threshold; /// PUCCH Failure threshold (compared to consecutive PUCCH DTX) int pucch_failure_thres; /// PUSCH Failure threshold (compared to consecutive PUSCH DTX) int pusch_failure_thres; /// Subcarrier Offset int ssb_SubcarrierOffset; + int ssb_OffsetPointA; /// SIB1 Time domain allocation int sib1_tda; int minRXTXTIMEpdsch; @@ -735,7 +744,7 @@ typedef struct gNB_MAC_INST_s { /// current PDU index (BCH,DLSCH) uint16_t pdu_index[NFAPI_CC_MAX]; int num_ulprbbl; - uint16_t ulprbbl[275]; + uint16_t ulprbbl[MAX_BWP_SIZE]; /// NFAPI Config Request Structure nfapi_nr_config_request_scf_t config[NFAPI_CC_MAX]; /// NFAPI DL Config Request Structure @@ -754,8 +763,8 @@ typedef struct gNB_MAC_INST_s { nfapi_nr_ul_dci_request_t UL_dci_req[NFAPI_CC_MAX]; /// NFAPI DL PDU structure nfapi_nr_tx_data_request_t TX_req[NFAPI_CC_MAX]; - int pdcch_cand[MAX_NUM_CORESET]; - NR_UE_info_t UE_info; + + NR_UEs_t UE_info; /// UL handle uint32_t ul_handle; @@ -791,15 +800,8 @@ typedef struct gNB_MAC_INST_s { /// bitmap of DLSCH slots, can hold up to 160 slots uint64_t dlsch_slot_bitmap[3]; - /// Lookup for preferred time domain allocation for BWP, in DL, slots - /// dynamically allocated - int *preferred_dl_tda[MAX_NUM_BWP]; /// bitmap of ULSCH slots, can hold up to 160 slots uint64_t ulsch_slot_bitmap[3]; - /// Lookup for preferred time domain allocation for UL BWP, dynamically - /// allocated. The index refers to the DL slot, and the indicated TDA's k2 - /// points to the right UL slot - int *preferred_ul_tda[MAX_NUM_BWP]; /// maximum number of slots before a UE will be scheduled ULSCH automatically uint32_t ulsch_max_frame_inactivity; @@ -814,12 +816,11 @@ typedef struct gNB_MAC_INST_s { uint16_t cset0_bwp_size; NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config[64]; + int xp_pdsch_antenna_ports; + bool first_MIB; - double dl_bler_target_upper; - double dl_bler_target_lower; - double dl_rd2_bler_threshold; - uint8_t dl_max_mcs; - uint8_t harq_round_max; + NR_bler_options_t dl_bler; + NR_bler_options_t ul_bler; uint8_t min_grant_prb; uint8_t min_grant_mcs; } gNB_MAC_INST; diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index 108a5dbe914..9adc6ecb5df 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -139,7 +139,7 @@ extern volatile int oai_exit; pthread_t pdcp_stats_thread_desc; // will be called when 4G F1 implementation will use GTP-U instead of protobuf -boolean_t cu_f1u_data_req( +bool cu_f1u_data_req( protocol_ctxt_t *ctxt_pP, const srb_flag_t srb_flagP, const rb_id_t rb_id, @@ -228,7 +228,7 @@ rlc_op_status_t cu_send_to_du(const protocol_ctxt_t *const ctxt, __func__, rb_id, size); extern instance_t CUuniqInstance; itti_send_msg_to_task(TASK_GTPV1_U, CUuniqInstance, message_p); - return TRUE; + return true; } //----------------------------------------------------------------------------- @@ -239,18 +239,16 @@ rlc_op_status_t cu_send_to_du(const protocol_ctxt_t *const ctxt, * this mem_block_t to be dissected for testing purposes. For further details see test * code at targets/TEST/PDCP/test_pdcp.c:test_pdcp_data_req() */ -boolean_t pdcp_data_req( - protocol_ctxt_t *ctxt_pP, - const srb_flag_t srb_flagP, - const rb_id_t rb_idP, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_buffer_sizeP, - unsigned char *const sdu_buffer_pP, - const pdcp_transmission_mode_t modeP, - const uint32_t *const sourceL2Id, - const uint32_t *const destinationL2Id -) +bool pdcp_data_req(protocol_ctxt_t *ctxt_pP, + const srb_flag_t srb_flagP, + const rb_id_t rb_idP, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_buffer_sizeP, + unsigned char *const sdu_buffer_pP, + const pdcp_transmission_mode_t modeP, + const uint32_t *const sourceL2Id, + const uint32_t *const destinationL2Id) //----------------------------------------------------------------------------- { pdcp_t *pdcp_p = NULL; @@ -261,7 +259,7 @@ boolean_t pdcp_data_req( uint16_t current_sn = 0; mem_block_t *pdcp_pdu_p = NULL; rlc_op_status_t rlc_status; - boolean_t ret = TRUE; + bool ret = true; hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE; hashtable_rc_t h_rc; uint8_t rb_offset= (srb_flagP == 0) ? DTCH -1 : 0; @@ -277,7 +275,7 @@ boolean_t pdcp_data_req( if (sdu_buffer_sizeP == 0) { LOG_W(PDCP, "Handed SDU is of size 0! Ignoring...\n"); - return FALSE; + return false; } /* @@ -287,12 +285,12 @@ boolean_t pdcp_data_req( sdu_buffer_sizeP, MAX_IP_PACKET_SIZE); if (modeP == PDCP_TRANSMISSION_MODE_TRANSPARENT) { - AssertError (rb_idP < NB_RB_MBMS_MAX, return FALSE, "RB id is too high (%ld/%d) %u %u!\n", rb_idP, NB_RB_MBMS_MAX, ctxt_pP->module_id, ctxt_pP->rnti); + AssertError (rb_idP < NB_RB_MBMS_MAX, return false, "RB id is too high (%ld/%d) %u %u!\n", rb_idP, NB_RB_MBMS_MAX, ctxt_pP->module_id, ctxt_pP->rnti); } else { if (srb_flagP) { - AssertError (rb_idP < 3, return FALSE, "RB id is too high (%ld/%d) %u %u!\n", rb_idP, 3, ctxt_pP->module_id, ctxt_pP->rnti); + AssertError (rb_idP < 3, return false, "RB id is too high (%ld/%d) %u %u!\n", rb_idP, 3, ctxt_pP->module_id, ctxt_pP->rnti); } else { - AssertError (rb_idP < LTE_maxDRB, return FALSE, "RB id is too high (%ld/%d) %u %u!\n", rb_idP, LTE_maxDRB, ctxt_pP->module_id, ctxt_pP->rnti); + AssertError (rb_idP < LTE_maxDRB, return false, "RB id is too high (%ld/%d) %u %u!\n", rb_idP, LTE_maxDRB, ctxt_pP->module_id, ctxt_pP->rnti); } } @@ -304,7 +302,7 @@ boolean_t pdcp_data_req( LOG_W(PDCP, PROTOCOL_CTXT_FMT" Instance is not configured for rb_id %ld Ignoring SDU...\n", PROTOCOL_CTXT_ARGS(ctxt_pP), rb_idP); - return FALSE; + return false; } } @@ -371,7 +369,7 @@ boolean_t pdcp_data_req( memset(&pdu_header.mac_i[0],0,PDCP_CONTROL_PLANE_DATA_PDU_MAC_I_SIZE); memset(&pdcp_pdu_p->data[sdu_buffer_sizeP + pdcp_header_len],0,PDCP_CONTROL_PLANE_DATA_PDU_MAC_I_SIZE); - if (pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer((unsigned char *)pdcp_pdu_p->data, &pdu_header) == FALSE) { + if (pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer((unsigned char *)pdcp_pdu_p->data, &pdu_header) == false) { LOG_E(PDCP, PROTOCOL_PDCP_CTXT_FMT" Cannot fill PDU buffer with relevant header fields!\n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_p)); @@ -382,7 +380,7 @@ boolean_t pdcp_data_req( } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_REQ,VCD_FUNCTION_OUT); - return FALSE; + return false; } } else { pdcp_user_plane_data_pdu_header_with_long_sn pdu_header; @@ -390,7 +388,7 @@ boolean_t pdcp_data_req( pdu_header.sn = pdcp_get_next_tx_seq_number(pdcp_p); current_sn = pdu_header.sn ; - if (pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer((unsigned char *)pdcp_pdu_p->data, &pdu_header) == FALSE) { + if (pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer((unsigned char *)pdcp_pdu_p->data, &pdu_header) == false) { LOG_E(PDCP, PROTOCOL_PDCP_CTXT_FMT" Cannot fill PDU buffer with relevant header fields!\n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_p)); @@ -401,7 +399,7 @@ boolean_t pdcp_data_req( } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_REQ,VCD_FUNCTION_OUT); - return FALSE; + return false; } } @@ -422,7 +420,7 @@ boolean_t pdcp_data_req( } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_REQ,VCD_FUNCTION_OUT); - return FALSE; + return false; } LOG_D(PDCP, "Sequence number %d is assigned to current PDU\n", current_sn); @@ -481,7 +479,7 @@ boolean_t pdcp_data_req( ctxt_pP->module_id, rb_idP); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_REQ,VCD_FUNCTION_OUT); - return FALSE; + return false; } /* @@ -497,16 +495,16 @@ boolean_t pdcp_data_req( if (ctxt_pP->enb_flag == ENB_FLAG_YES && NODE_IS_DU(RC.rrc[ctxt_pP->module_id]->node_type)) { LOG_E(PDCP, "Can't be DU, bad node type %d \n", RC.rrc[ctxt_pP->module_id]->node_type); - ret=FALSE; + ret = false; } else { rlc_status = pdcp_params.send_rlc_data_req_func(ctxt_pP, srb_flagP, MBMS_FLAG_NO, rb_idP, muiP, confirmP, pdcp_pdu_size, pdcp_pdu_p,sourceL2Id, destinationL2Id); - ret=FALSE; + ret = false; switch (rlc_status) { case RLC_OP_STATUS_OK: LOG_D(PDCP, "Data sending request over RLC succeeded!\n"); - ret=TRUE; + ret=true; break; case RLC_OP_STATUS_BAD_PARAMETER: @@ -544,7 +542,7 @@ boolean_t pdcp_data_req( itti_send_msg_to_task (TASK_CU_F1, ctxt_pP->module_id, message_p); //CU_send_DL_RRC_MESSAGE_TRANSFER(ctxt_pP->module_id, message_p); LOG_I(PDCP, "Send F1AP_DL_RRC_MESSAGE with ITTI\n"); - ret=TRUE; + ret=true; } else { rlc_status = rlc_data_req(ctxt_pP , srb_flagP @@ -561,27 +559,27 @@ boolean_t pdcp_data_req( switch (rlc_status) { case RLC_OP_STATUS_OK: LOG_D(PDCP, "Data sending request over RLC succeeded!\n"); - ret=TRUE; + ret=true; break; case RLC_OP_STATUS_BAD_PARAMETER: LOG_W(PDCP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n"); - ret= FALSE; + ret= false; break; case RLC_OP_STATUS_INTERNAL_ERROR: LOG_W(PDCP, "Data sending request over RLC failed with 'Internal Error' reason!\n"); - ret= FALSE; + ret= false; break; case RLC_OP_STATUS_OUT_OF_RESSOURCES: LOG_W(PDCP, "Data sending request over RLC failed with 'Out of Resources' reason!\n"); - ret= FALSE; + ret= false; break; default: LOG_W(PDCP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status); - ret= FALSE; + ret= false; break; } // switch case } @@ -596,7 +594,7 @@ boolean_t pdcp_data_req( /* * Control arrives here only if rlc_data_req() returns RLC_OP_STATUS_OK - * so we return TRUE afterwards + * so we return true afterwards */ for (pdcp_uid=0; pdcp_uid< MAX_MOBILES_PER_ENB; pdcp_uid++) { @@ -619,7 +617,7 @@ boolean_t pdcp_data_req( //----------------------------------------------------------------------------- -boolean_t +bool pdcp_data_ind( const protocol_ctxt_t *const ctxt_pP, const srb_flag_t srb_flagP, @@ -638,7 +636,7 @@ pdcp_data_ind( pdcp_sn_t sequence_number = 0; volatile sdu_size_t payload_offset = 0; rb_id_t rb_id = rb_idP; - boolean_t packet_forwarded = FALSE; + bool packet_forwarded = false; hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE; hashtable_rc_t h_rc; uint8_t rb_offset= (srb_flagP == 0) ? DTCH -1 :0; @@ -654,7 +652,7 @@ pdcp_data_ind( "[MSG] PDCP UL %s PDU on rb_id %ld\n", (srb_flagP)? "CONTROL" : "DATA", rb_idP); if (MBMS_flagP) { - AssertError (rb_idP < NB_RB_MBMS_MAX, return FALSE, + AssertError (rb_idP < NB_RB_MBMS_MAX, return false, "RB id is too high (%ld/%d) %u rnti %x!\n", rb_idP, NB_RB_MBMS_MAX, @@ -680,12 +678,12 @@ pdcp_data_ind( } } else { rb_id = rb_idP % LTE_maxDRB; - AssertError (rb_id < LTE_maxDRB, return FALSE, "RB id is too high (%ld/%d) %u UE %x!\n", + AssertError (rb_id < LTE_maxDRB, return false, "RB id is too high (%ld/%d) %u UE %x!\n", rb_id, LTE_maxDRB, ctxt_pP->module_id, ctxt_pP->rnti); - AssertError (rb_id > 0, return FALSE, "RB id is too low (%ld/%d) %u UE %x!\n", + AssertError (rb_id > 0, return false, "RB id is too low (%ld/%d) %u UE %x!\n", rb_id, LTE_maxDRB, ctxt_pP->module_id, @@ -700,14 +698,14 @@ pdcp_data_ind( key); free_mem_block(sdu_buffer_pP, __func__); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_IND,VCD_FUNCTION_OUT); - return FALSE; + return false; } } if (sdu_buffer_sizeP == 0) { LOG_W(PDCP, "SDU buffer size is zero! Ignoring this chunk!\n"); - return FALSE; + return false; } if (ctxt_pP->enb_flag) { @@ -764,13 +762,13 @@ pdcp_data_ind( } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_IND,VCD_FUNCTION_OUT); - return FALSE; + return false; } #if 0 /* Removed by Cedric */ - if (pdcp_is_rx_seq_number_valid(sequence_number, pdcp_p, srb_flagP) == TRUE) { + if (pdcp_is_rx_seq_number_valid(sequence_number, pdcp_p, srb_flagP) == true) { LOG_T(PDCP, "Incoming PDU has a sequence number (%d) in accordance with RX window\n", sequence_number); /* if (dc == PDCP_DATA_PDU ) LOG_D(PDCP, "Passing piggybacked SDU to NAS driver...\n"); @@ -788,7 +786,7 @@ pdcp_data_ind( */ LOG_W(PDCP, "Ignoring PDU...\n"); free_mem_block(sdu_buffer_pP, __func__); - return FALSE; + return false; } #endif @@ -837,7 +835,7 @@ pdcp_data_ind( LOG_W(PDCP, "Ignoring PDU...\n"); free_mem_block(sdu_buffer_pP, __func__); /* TODO: indicate integrity verification failure to upper layer */ - return FALSE; + return false; } if (sequence_number < pdcp_p->next_pdcp_rx_sn) @@ -864,7 +862,7 @@ pdcp_data_ind( } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_IND,VCD_FUNCTION_OUT); - return TRUE; + return true; } /* if (srb_flagP) */ /* @@ -892,7 +890,7 @@ pdcp_data_ind( LOG_W(PDCP, "Ignoring PDU...\n"); free_mem_block(sdu_buffer_pP, __func__); /* TODO: indicate integrity verification failure to upper layer */ - return FALSE; + return false; } else if (pdcp_p->next_pdcp_rx_sn - sequence_number > reordering_window) { pdcp_p->rx_hfn++; rx_hfn_for_count = pdcp_p->rx_hfn; @@ -948,7 +946,7 @@ pdcp_data_ind( LOG_W(PDCP, "Ignoring PDU...\n"); free_mem_block(sdu_buffer_pP, __func__); /* TODO: indicate integrity verification failure to upper layer */ - return FALSE; + return false; } /* TODO: specs say we have to store this PDU in a list and then deliver @@ -1015,7 +1013,7 @@ pdcp_data_ind( LOG_W(PDCP, "Ignoring PDU...\n"); free_mem_block(sdu_buffer_pP, __func__); /* TODO: indicate integrity verification failure to upper layer */ - return FALSE; + return false; } break; @@ -1039,7 +1037,7 @@ pdcp_data_ind( } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_IND,VCD_FUNCTION_OUT); - return TRUE; + return true; } // XXX Decompression would be done at this point @@ -1051,7 +1049,7 @@ pdcp_data_ind( */ if (LINK_ENB_PDCP_TO_GTPV1U) { - if ((TRUE == ctxt_pP->enb_flag) && (FALSE == srb_flagP)) { + if ((true == ctxt_pP->enb_flag) && (false == srb_flagP)) { LOG_D(PDCP, "Sending packet to GTP, Calling GTPV1U_ENB_TUNNEL_DATA_REQ ue %x rab %ld len %u\n", ctxt_pP->rnti, rb_id + 4, @@ -1069,10 +1067,10 @@ pdcp_data_ind( GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).rnti = ctxt_pP->rnti; GTPV1U_ENB_TUNNEL_DATA_REQ(message_p).rab_id = rb_id + 4; itti_send_msg_to_task(TASK_GTPV1_U, INSTANCE_DEFAULT, message_p); - packet_forwarded = TRUE; + packet_forwarded = true; } } else { - packet_forwarded = FALSE; + packet_forwarded = false; } #ifdef MBMS_MULTICAST_OUT @@ -1086,13 +1084,13 @@ pdcp_data_ind( // dest_addr.sin_addr.s_addr = ip_header->daddr; // sendto(mbms_socket, &sdu_buffer_pP->data[payload_offset], sdu_buffer_sizeP - payload_offset, MSG_DONTWAIT, (struct sockaddr*)&dest_addr, sizeof(dest_addr)); - // //packet_forwarded = TRUE; + // //packet_forwarded = true; } #endif - if (FALSE == packet_forwarded) { + if (false == packet_forwarded) { notifiedFIFO_elt_t * new_sdu_p = newNotifiedFIFO_elt(sdu_buffer_sizeP - payload_offset + sizeof (pdcp_data_ind_header_t), 0, NULL, NULL); if ((MBMS_flagP == 0) && (pdcp_p->rlc_mode == RLC_MODE_AM)) { @@ -1185,7 +1183,7 @@ pdcp_data_ind( } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_IND,VCD_FUNCTION_OUT); - return TRUE; + return true; } void pdcp_update_stats(const protocol_ctxt_t *const ctxt_pP) { @@ -1297,7 +1295,7 @@ pdcp_run ( NULL, NULL ); - if (result != TRUE) + if (result != true) LOG_E(PDCP, "PDCP data request failed!\n"); // Message buffer has been processed, free it now. @@ -1420,7 +1418,7 @@ pdcp_mbms_run ( // NULL, NULL // ); // -// if (result != TRUE) +// if (result != true) // LOG_E(PDCP, "PDCP data request failed!\n"); // // // Message buffer has been processed, free it now. @@ -1549,10 +1547,7 @@ void pdcp_add_UE(const protocol_ctxt_t *const ctxt_pP) { } //----------------------------------------------------------------------------- -boolean_t -pdcp_remove_UE( - const protocol_ctxt_t *const ctxt_pP -) +bool pdcp_remove_UE(const protocol_ctxt_t *const ctxt_pP) //----------------------------------------------------------------------------- { LTE_DRB_Identity_t srb_id = 0; @@ -1599,19 +1594,17 @@ pdcp_remove_UE( //----------------------------------------------------------------------------- -boolean_t -rrc_pdcp_config_asn1_req ( - const protocol_ctxt_t *const ctxt_pP, - LTE_SRB_ToAddModList_t *const srb2add_list_pP, - LTE_DRB_ToAddModList_t *const drb2add_list_pP, - LTE_DRB_ToReleaseList_t *const drb2release_list_pP, - const uint8_t security_modeP, - uint8_t *const kRRCenc_pP, - uint8_t *const kRRCint_pP, - uint8_t *const kUPenc_pP, - LTE_PMCH_InfoList_r9_t *const pmch_InfoList_r9_pP, - rb_id_t *const defaultDRB -) +bool +rrc_pdcp_config_asn1_req(const protocol_ctxt_t *const ctxt_pP, + LTE_SRB_ToAddModList_t *const srb2add_list_pP, + LTE_DRB_ToAddModList_t *const drb2add_list_pP, + LTE_DRB_ToReleaseList_t *const drb2release_list_pP, + const uint8_t security_modeP, + uint8_t *const kRRCenc_pP, + uint8_t *const kRRCint_pP, + uint8_t *const kUPenc_pP, + LTE_PMCH_InfoList_r9_t *const pmch_InfoList_r9_pP, + rb_id_t *const defaultDRB) //----------------------------------------------------------------------------- { long int lc_id = 0; @@ -1669,7 +1662,7 @@ rrc_pdcp_config_asn1_req ( PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p), key); free(pdcp_p); - return TRUE; + return true; } else { LOG_D(PDCP, PROTOCOL_PDCP_CTXT_FMT" CONFIG_ACTION_ADD key 0x%"PRIx64"\n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p), @@ -1784,13 +1777,13 @@ rrc_pdcp_config_asn1_req ( PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p), key_defaultDRB); free(pdcp_p); - return TRUE; + return true; } else if (h_rc != HASH_TABLE_OK) { LOG_E(PDCP, PROTOCOL_PDCP_CTXT_FMT" CONFIG_ACTION_ADD ADD key 0x%"PRIx64" FAILED\n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p), key); free(pdcp_p); - return TRUE; + return true; } else { LOG_D(PDCP, PROTOCOL_PDCP_CTXT_FMT" CONFIG_ACTION_ADD ADD key 0x%"PRIx64"\n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p), @@ -1944,7 +1937,7 @@ rrc_pdcp_config_asn1_req ( if (ctxt_pP->enb_flag) { drb_id = (mch_id * LTE_maxSessionPerPMCH ) + lc_id ;//+ (LTE_maxDRB + 3)*MAX_MOBILES_PER_ENB; // 1 - if (pdcp_mbms_array_eNB[ctxt_pP->module_id][mch_id][lc_id].instanciated_instance == TRUE) { + if (pdcp_mbms_array_eNB[ctxt_pP->module_id][mch_id][lc_id].instanciated_instance == true) { action = CONFIG_ACTION_MBMS_MODIFY; } else { action = CONFIG_ACTION_MBMS_ADD; @@ -1952,7 +1945,7 @@ rrc_pdcp_config_asn1_req ( } else { drb_id = (mch_id * LTE_maxSessionPerPMCH ) + lc_id; // + (LTE_maxDRB + 3); // 15 - if (pdcp_mbms_array_ue[ctxt_pP->module_id][mch_id][lc_id].instanciated_instance == TRUE) { + if (pdcp_mbms_array_ue[ctxt_pP->module_id][mch_id][lc_id].instanciated_instance == true) { action = CONFIG_ACTION_MBMS_MODIFY; } else { action = CONFIG_ACTION_MBMS_ADD; @@ -1990,23 +1983,22 @@ rrc_pdcp_config_asn1_req ( } //----------------------------------------------------------------------------- -boolean_t -pdcp_config_req_asn1 ( - const protocol_ctxt_t *const ctxt_pP, - pdcp_t *const pdcp_pP, - const srb_flag_t srb_flagP, - const rlc_mode_t rlc_modeP, - const config_action_t actionP, - const uint16_t lc_idP, - const uint16_t mch_idP, - const rb_id_t rb_idP, - const uint8_t rb_snP, - const uint8_t rb_reportP, - const uint16_t header_compression_profileP, - const uint8_t security_modeP, - uint8_t *const kRRCenc_pP, - uint8_t *const kRRCint_pP, - uint8_t *const kUPenc_pP) +bool +pdcp_config_req_asn1(const protocol_ctxt_t *const ctxt_pP, + pdcp_t *const pdcp_pP, + const srb_flag_t srb_flagP, + const rlc_mode_t rlc_modeP, + const config_action_t actionP, + const uint16_t lc_idP, + const uint16_t mch_idP, + const rb_id_t rb_idP, + const uint8_t rb_snP, + const uint8_t rb_reportP, + const uint16_t header_compression_profileP, + const uint8_t security_modeP, + uint8_t *const kRRCenc_pP, + uint8_t *const kRRCint_pP, + uint8_t *const kUPenc_pP) //----------------------------------------------------------------------------- { @@ -2015,7 +2007,7 @@ pdcp_config_req_asn1 ( DevAssert(pdcp_pP != NULL); if (ctxt_pP->enb_flag == ENB_FLAG_YES) { - pdcp_pP->is_ue = FALSE; + pdcp_pP->is_ue = false; pdcp_add_UE(ctxt_pP); //pdcp_eNB_UE_instance_to_rnti[ctxtP->module_id] = ctxt_pP->rnti; @@ -2035,11 +2027,11 @@ pdcp_config_req_asn1 ( //pdcp_eNB_UE_instance_to_rnti_index = (pdcp_eNB_UE_instance_to_rnti_index + 1) % MAX_MOBILES_PER_ENB; } else { - pdcp_pP->is_ue = TRUE; + pdcp_pP->is_ue = true; pdcp_UE_UE_module_id_to_rnti[ctxt_pP->module_id] = ctxt_pP->rnti; } - pdcp_pP->is_srb = (srb_flagP == SRB_FLAG_YES) ? TRUE : FALSE; + pdcp_pP->is_srb = srb_flagP == SRB_FLAG_YES; pdcp_pP->lcid = lc_idP; pdcp_pP->rb_id = rb_idP; pdcp_pP->header_compression_profile = header_compression_profileP; @@ -2162,10 +2154,10 @@ pdcp_config_req_asn1 ( rb_idP); if (ctxt_pP->enb_flag == ENB_FLAG_YES) { - pdcp_mbms_array_eNB[ctxt_pP->module_id][mch_idP][lc_idP].instanciated_instance = TRUE ; + pdcp_mbms_array_eNB[ctxt_pP->module_id][mch_idP][lc_idP].instanciated_instance = true ; pdcp_mbms_array_eNB[ctxt_pP->module_id][mch_idP][lc_idP].rb_id = rb_idP; } else { - pdcp_mbms_array_ue[ctxt_pP->module_id][mch_idP][lc_idP].instanciated_instance = TRUE ; + pdcp_mbms_array_ue[ctxt_pP->module_id][mch_idP][lc_idP].instanciated_instance = true ; pdcp_mbms_array_ue[ctxt_pP->module_id][mch_idP][lc_idP].rb_id = rb_idP; } @@ -2245,10 +2237,10 @@ void rrc_pdcp_config_req ( pdcp_p->rb_id = rb_idP; if (ctxt_pP->enb_flag == ENB_FLAG_NO) { - pdcp_p->is_ue = TRUE; + pdcp_p->is_ue = true; pdcp_UE_UE_module_id_to_rnti[ctxt_pP->module_id] = ctxt_pP->rnti; } else { - pdcp_p->is_ue = FALSE; + pdcp_p->is_ue = false; } pdcp_p->next_pdcp_tx_sn = 0; @@ -2321,10 +2313,10 @@ void rrc_pdcp_config_req ( pdcp_p->rb_id = rb_idP; if (ctxt_pP->enb_flag == ENB_FLAG_NO) { - pdcp_p->is_ue = TRUE; + pdcp_p->is_ue = true; pdcp_UE_UE_module_id_to_rnti[ctxt_pP->module_id] = ctxt_pP->rnti; } else { - pdcp_p->is_ue = FALSE; + pdcp_p->is_ue = false; } pdcp_p->next_pdcp_tx_sn = 0; diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h index 332ee382d71..8cbc49d7563 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h @@ -51,7 +51,7 @@ typedef rlc_op_status_t (*send_rlc_data_req_func_t)(const protocol_ctxt_t *cons const rb_id_t, const mui_t, confirm_t, sdu_size_t, mem_block_t *,const uint32_t *const, const uint32_t *const); -typedef boolean_t (pdcp_data_ind_t)( const protocol_ctxt_t *, const srb_flag_t, +typedef bool (pdcp_data_ind_t)( const protocol_ctxt_t *, const srb_flag_t, const MBMS_flag_t, const rb_id_t, const sdu_size_t, mem_block_t *,const uint32_t *const, const uint32_t *const); typedef pdcp_data_ind_t* pdcp_data_ind_func_t; @@ -153,14 +153,13 @@ typedef struct pdcp_stats_s { typedef struct pdcp_s { - //boolean_t instanciated_instance; uint16_t header_compression_profile; /* SR: added this flag to distinguish UE/eNB instance as pdcp_run for virtual * mode can receive data on NETLINK for eNB while eNB_flag = 0 and for UE when eNB_flag = 1 */ - boolean_t is_ue; - boolean_t is_srb; + bool is_ue; + bool is_srb; /* Configured security algorithms */ uint8_t cipheringAlgorithm; @@ -217,7 +216,7 @@ typedef struct pdcp_s { } pdcp_t; typedef struct pdcp_mbms_s { - boolean_t instanciated_instance; + bool instanciated_instance; rb_id_t rb_id; } pdcp_mbms_t; @@ -230,7 +229,7 @@ typedef struct pdcp_mbms_s { * under targets/TEST/PDCP/ */ -/*! \fn boolean_t pdcp_data_req(const protocol_ctxt_t* const , srb_flag_t , rb_id_t , mui_t , confirm_t ,sdu_size_t , unsigned char* , pdcp_transmission_mode_t ) +/*! \fn bool pdcp_data_req(const protocol_ctxt_t* const , srb_flag_t , rb_id_t , mui_t , confirm_t ,sdu_size_t , unsigned char* , pdcp_transmission_mode_t ) * \brief This functions handles data transfer requests coming either from RRC or from IP * \param[in] ctxt_pP Running context. * \param[in] rab_id Radio Bearer ID @@ -239,38 +238,34 @@ typedef struct pdcp_mbms_s { * \param[in] sdu_buffer_size Size of incoming SDU in bytes * \param[in] sdu_buffer Buffer carrying SDU * \param[in] mode flag to indicate whether the userplane data belong to the control plane or data plane or transparent -* \return TRUE on success, FALSE otherwise +* \return true on success, false otherwise * \note None * @ingroup _pdcp */ -boolean_t pdcp_data_req( - protocol_ctxt_t *ctxt_pP, - const srb_flag_t srb_flagP, - const rb_id_t rb_id, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer, - const pdcp_transmission_mode_t mode, - const uint32_t * sourceL2Id, - const uint32_t * destinationL2Id -); - -boolean_t cu_f1u_data_req( - protocol_ctxt_t *ctxt_pP, - const srb_flag_t srb_flagP, - const rb_id_t rb_id, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer, - const pdcp_transmission_mode_t mode, - const uint32_t *const sourceL2Id, - const uint32_t *const destinationL2Id - ); - -/*! \fn boolean_t pdcp_data_ind(const protocol_ctxt_t* const, srb_flag_t, MBMS_flag_t, rb_id_t, sdu_size_t, mem_block_t*, boolean_t) +bool pdcp_data_req(protocol_ctxt_t *ctxt_pP, + const srb_flag_t srb_flagP, + const rb_id_t rb_id, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t mode, + const uint32_t * sourceL2Id, + const uint32_t * destinationL2Id); + +bool cu_f1u_data_req(protocol_ctxt_t *ctxt_pP, + const srb_flag_t srb_flagP, + const rb_id_t rb_id, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t mode, + const uint32_t *const sourceL2Id, + const uint32_t *const destinationL2Id); + +/*! \fn bool pdcp_data_ind(const protocol_ctxt_t* const, srb_flag_t, MBMS_flag_t, rb_id_t, sdu_size_t, mem_block_t*, bool) * \brief This functions handles data transfer indications coming from RLC * \param[in] ctxt_pP Running context. * \param[in] Shows if rb is SRB @@ -279,7 +274,7 @@ boolean_t cu_f1u_data_req( * \param[in] sdu_buffer_size Size of incoming SDU in bytes * \param[in] sdu_buffer Buffer carrying SDU * \param[in] is_data_plane flag to indicate whether the userplane data belong to the control plane or data plane -* \return TRUE on success, FALSE otherwise +* \return TRUE on success, false otherwise * \note None * @ingroup _pdcp */ @@ -316,20 +311,18 @@ void rrc_pdcp_config_req ( * \param[in] defaultDRB Default DRB ID * \return A status about the processing, OK or error code. */ -boolean_t rrc_pdcp_config_asn1_req ( - const protocol_ctxt_t *const ctxt_pP, - LTE_SRB_ToAddModList_t *const srb2add_list, - LTE_DRB_ToAddModList_t *const drb2add_list, - LTE_DRB_ToReleaseList_t *const drb2release_list, - const uint8_t security_modeP, - uint8_t *const kRRCenc, - uint8_t *const kRRCint, - uint8_t *const kUPenc, - LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9, - rb_id_t *const defaultDRB -); - -/*! \fn boolean_t pdcp_config_req_asn1 (const protocol_ctxt_t* const ctxt_pP, srb_flag_t srb_flagP, uint32_t action, rb_id_t rb_id, uint8_t rb_sn, uint8_t rb_report, uint16_t header_compression_profile, uint8_t security_mode) +bool rrc_pdcp_config_asn1_req(const protocol_ctxt_t *const ctxt_pP, + LTE_SRB_ToAddModList_t *const srb2add_list, + LTE_DRB_ToAddModList_t *const drb2add_list, + LTE_DRB_ToReleaseList_t *const drb2release_list, + const uint8_t security_modeP, + uint8_t *const kRRCenc, + uint8_t *const kRRCint, + uint8_t *const kUPenc, + LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9, + rb_id_t *const defaultDRB); + +/*! \fn bool pdcp_config_req_asn1 (const protocol_ctxt_t* const ctxt_pP, srb_flag_t srb_flagP, uint32_t action, rb_id_t rb_id, uint8_t rb_sn, uint8_t rb_report, uint16_t header_compression_profile, uint8_t security_mode) * \brief Function for RRC to configure a Radio Bearer. * \param[in] ctxt_pP Running context. * \param[in] pdcp_pP Pointer on PDCP structure. @@ -349,22 +342,21 @@ boolean_t rrc_pdcp_config_asn1_req ( * \param[in] kUPenc User-Plane encryption key * \return A status about the processing, OK or error code. */ -boolean_t pdcp_config_req_asn1 ( - const protocol_ctxt_t *const ctxt_pP, - pdcp_t *const pdcp_pP, - const srb_flag_t srb_flagP, - const rlc_mode_t rlc_mode, - const uint32_t action, - const uint16_t lc_id, - const uint16_t mch_id, - const rb_id_t rb_id, - const uint8_t rb_sn, - const uint8_t rb_report, - const uint16_t header_compression_profile, - const uint8_t security_mode, - uint8_t *const kRRCenc, - uint8_t *const kRRCint, - uint8_t *const kUPenc); +bool pdcp_config_req_asn1(const protocol_ctxt_t *const ctxt_pP, + pdcp_t *const pdcp_pP, + const srb_flag_t srb_flagP, + const rlc_mode_t rlc_mode, + const uint32_t action, + const uint16_t lc_id, + const uint16_t mch_id, + const rb_id_t rb_id, + const uint8_t rb_sn, + const uint8_t rb_report, + const uint16_t header_compression_profile, + const uint8_t security_mode, + uint8_t *const kRRCenc, + uint8_t *const kRRCint, + uint8_t *const kUPenc); /*! \fn void pdcp_add_UE(const protocol_ctxt_t* const ctxt_pP) * \brief Function (for RRC) to add a new UE in PDCP module @@ -373,13 +365,12 @@ boolean_t pdcp_config_req_asn1 ( */ void pdcp_add_UE(const protocol_ctxt_t *const ctxt_pP); -/*! \fn boolean_t pdcp_remove_UE(const protocol_ctxt_t* const ctxt_pP) +/*! \fn bool pdcp_remove_UE(const protocol_ctxt_t* const ctxt_pP) * \brief Function for RRC to remove UE from PDCP module hashtable * \param[in] ctxt_pP Running context. * \return A status about the processing, OK or error code. */ -boolean_t pdcp_remove_UE( - const protocol_ctxt_t *const ctxt_pP); +bool pdcp_remove_UE(const protocol_ctxt_t *const ctxt_pP); /*! \fn void rrc_pdcp_config_release( const protocol_ctxt_t* const, rb_id_t) * \brief This functions is unused diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c index ef674132c45..77d3cf3857a 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c @@ -32,7 +32,7 @@ #include "pdcp.h" #include "pdcp_primitives.h" -extern boolean_t util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index); +extern bool util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index); /* * Parses data/control field out of buffer of User Plane PDCP Data PDU with @@ -123,13 +123,13 @@ uint8_t pdcp_get_sequence_number_of_pdu_with_SRB_sn(unsigned char* pdu_buffer) * Fills the incoming buffer with the fields of the header for srb sn * * @param pdu_buffer PDCP PDU buffer - * @return TRUE on success, FALSE otherwise + * @return true on success, false otherwise */ -boolean_t pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer(unsigned char* pdu_buffer, \ - pdcp_control_plane_data_pdu_header* pdu) +bool pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer(unsigned char* pdu_buffer, + pdcp_control_plane_data_pdu_header* pdu) { if (pdu_buffer == NULL || pdu == NULL) { - return FALSE; + return false; } /* @@ -138,20 +138,20 @@ boolean_t pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer(unsigned char uint8_t sequence_number = pdu->sn; pdu_buffer[0] = sequence_number & 0x1F; // 5bit sn - return TRUE; + return true; } /* * Fills the incoming buffer with the fields of the header for long sn * * @param pdu_buffer PDCP PDU buffer - * @return TRUE on success, FALSE otherwise + * @return true on success, false otherwise */ -boolean_t pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char* pdu_buffer, \ - pdcp_user_plane_data_pdu_header_with_long_sn* pdu) +bool pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char* pdu_buffer, + pdcp_user_plane_data_pdu_header_with_long_sn* pdu) { if (pdu_buffer == NULL || pdu == NULL) { - return FALSE; + return false; } /* @@ -170,7 +170,7 @@ boolean_t pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char* pdu_buffer[0] |= 0x80; // set the first bit as 1 } - return TRUE; + return true; } /* @@ -178,13 +178,14 @@ boolean_t pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char* * * @param pdu_buffer The buffer that PDU will be serialized into * @param pdu A status report header - * @return TRUE on success, FALSE otherwise + * @return true on success, false otherwise */ -boolean_t pdcp_serialize_control_pdu_for_pdcp_status_report(unsigned char* pdu_buffer, \ - uint8_t bitmap[512], pdcp_control_pdu_for_pdcp_status_report* pdu) +bool pdcp_serialize_control_pdu_for_pdcp_status_report(unsigned char* pdu_buffer, + uint8_t bitmap[512], + pdcp_control_pdu_for_pdcp_status_report* pdu) { if (pdu_buffer == NULL || pdu == NULL) { - return FALSE; + return false; } /* @@ -205,6 +206,6 @@ boolean_t pdcp_serialize_control_pdu_for_pdcp_status_report(unsigned char* pdu_b */ memcpy(pdu_buffer + 2, bitmap, 512); - return TRUE; + return true; } diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h index 8b5ebe7287c..423f69afc9c 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h @@ -142,18 +142,18 @@ uint8_t pdcp_get_sequence_number_of_pdu_with_SRB_sn(unsigned char* pdu_buffer); * Fills the incoming buffer with the fields of the header for SRB1 * * @param pdu_buffer PDCP PDU buffer - * @return TRUE on success, FALSE otherwise + * @return true on success, false otherwise */ -boolean_t pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer(unsigned char* pdu_buffer, \ - pdcp_control_plane_data_pdu_header* pdu); +bool pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer(unsigned char* pdu_buffer, + pdcp_control_plane_data_pdu_header* pdu); /* * Fills the incoming buffer with the fields of the header for long SN (RLC UM and AM) * * @param pdu_buffer PDCP PDU buffer - * @return TRUE on success, FALSE otherwise + * @return true on success, false otherwise */ -boolean_t pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char* pdu_buffer, \ - pdcp_user_plane_data_pdu_header_with_long_sn* pdu); +bool pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char* pdu_buffer, + pdcp_user_plane_data_pdu_header_with_long_sn* pdu); /* * Fills the incoming status report header with given value of bitmap @@ -162,10 +162,11 @@ boolean_t pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer(unsigned char* * @param FMS First Missing PDCP SN * @param bitmap Received/Missing sequence number bitmap * @param pdu A status report header - * @return TRUE on success, FALSE otherwise + * @return true on success, false otherwise */ -boolean_t pdcp_serialize_control_pdu_for_pdcp_status_report(unsigned char* pdu_buffer, \ - uint8_t bitmap[512], pdcp_control_pdu_for_pdcp_status_report* pdu); +bool pdcp_serialize_control_pdu_for_pdcp_status_report(unsigned char* pdu_buffer, + uint8_t bitmap[512], + pdcp_control_pdu_for_pdcp_status_report* pdu); int pdcp_netlink_dequeue_element(const protocol_ctxt_t* const ctxt_pP, struct pdcp_netlink_element_s **data_ppP); diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c index cdc583ef217..31beb3a9e06 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c @@ -33,12 +33,12 @@ /* * Initializes sequence numbering state * @param pdcp_entity The PDCP entity to be initialized - * @return boolean_t TRUE on success, FALSE otherwise + * @return bool true on success, false otherwise */ -boolean_t pdcp_init_seq_numbers(pdcp_t* pdcp_entity) +bool pdcp_init_seq_numbers(pdcp_t* pdcp_entity) { if (pdcp_entity == NULL) { - return FALSE; + return false; } /* Sequence number state variables */ @@ -55,34 +55,34 @@ boolean_t pdcp_init_seq_numbers(pdcp_t* pdcp_entity) // Shall UE and eNB behave differently on initialization? (see 7.1.e) pdcp_entity->last_submitted_pdcp_rx_sn = 4095; - return TRUE; + return true; } -boolean_t pdcp_is_seq_num_size_valid(pdcp_t* pdcp_entity) +bool pdcp_is_seq_num_size_valid(pdcp_t* pdcp_entity) { if (pdcp_entity == NULL) { - return FALSE; + return false; } // Check if the size of SN is valid (see 3GPP TS 36.323 v10.1.0 item 6.3.2) if (pdcp_entity->seq_num_size != 5 && pdcp_entity->seq_num_size != 7 && pdcp_entity->seq_num_size != 12) { LOG_W(PDCP, "Incoming SN size is invalid! (Expected: {5 | 7 | 12}, Received: %d\n", pdcp_entity->seq_num_size); - return FALSE; + return false; } - return TRUE; + return true; } /** * Check if SN number is in the range according to SN size */ -boolean_t pdcp_is_seq_num_valid(uint16_t seq_num, uint8_t seq_num_size) +bool pdcp_is_seq_num_valid(uint16_t seq_num, uint8_t seq_num_size) { if (seq_num >= 0 && seq_num <= pdcp_calculate_max_seq_num_for_given_size(seq_num_size)) { - return TRUE; + return true; } - return FALSE; + return false; } uint16_t pdcp_calculate_max_seq_num_for_given_size(uint8_t seq_num_size) @@ -96,7 +96,7 @@ uint16_t pdcp_calculate_max_seq_num_for_given_size(uint8_t seq_num_size) uint16_t pdcp_get_next_tx_seq_number(pdcp_t* pdcp_entity) { - if (pdcp_is_seq_num_size_valid(pdcp_entity) == FALSE) { + if (pdcp_is_seq_num_size_valid(pdcp_entity) == false) { return -1; } @@ -118,10 +118,10 @@ uint16_t pdcp_get_next_tx_seq_number(pdcp_t* pdcp_entity) return pdcp_seq_num; } -boolean_t pdcp_advance_rx_window(pdcp_t* pdcp_entity) +bool pdcp_advance_rx_window(pdcp_t* pdcp_entity) { - if (pdcp_is_seq_num_size_valid(pdcp_entity) == FALSE) { - return FALSE; + if (pdcp_is_seq_num_size_valid(pdcp_entity) == false) { + return false; } /* @@ -137,10 +137,10 @@ boolean_t pdcp_advance_rx_window(pdcp_t* pdcp_entity) pdcp_entity->next_pdcp_rx_sn++; } - return TRUE; + return true; } -boolean_t pdcp_mark_current_pdu_as_received(uint16_t seq_num, pdcp_t* pdcp_entity) +bool pdcp_mark_current_pdu_as_received(uint16_t seq_num, pdcp_t* pdcp_entity) { /* * Incoming sequence number and PDCP entity were already @@ -158,5 +158,5 @@ boolean_t pdcp_mark_current_pdu_as_received(uint16_t seq_num, pdcp_t* pdcp_entit LOG_D(PDCP, "Marking %d. bit of %d. octet of status bitmap\n", (seq_num % 8) + 1, octet_index); util_mark_nth_bit_of_octet(&pdcp_entity->missing_pdu_bitmap[octet_index], seq_num % 8); util_print_binary_representation((uint8_t*)"Current state of relevant octet: ", pdcp_entity->missing_pdu_bitmap[octet_index]); - return TRUE; + return true; } diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h index 172c9810e69..bff98d1b00e 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h @@ -35,17 +35,17 @@ * @param pdcp_entity The PDCP entity to be initialized * @return none */ -boolean_t pdcp_init_seq_numbers(pdcp_t* pdcp_entity); +bool pdcp_init_seq_numbers(pdcp_t* pdcp_entity); /** * Checks if incoming PDCP entitiy pointer and relevant sequence number size is valid - * @return TRUE (0x01) if it is valid, FALSE (0x00) otherwise + * @return true (0x01) if it is valid, false (0x00) otherwise */ -boolean_t pdcp_is_seq_num_size_valid(pdcp_t* pdcp_entity); +bool pdcp_is_seq_num_size_valid(pdcp_t* pdcp_entity); /** * Check if SN number is in the range according to SN size - * @return TRUE if it is valid, FALSE otherwise + * @return true if it is valid, false otherwise */ -boolean_t pdcp_is_seq_num_valid(uint16_t seq_num, uint8_t seq_num_size); +bool pdcp_is_seq_num_valid(uint16_t seq_num, uint8_t seq_num_size); /** * Returns the maximum allowed sequence number value for given size of SN field * @return Max sequence number value @@ -58,11 +58,11 @@ uint16_t pdcp_get_next_tx_seq_number(pdcp_t* pdcp_entity); /** * Advances the RX window state of given PDCP entity upon successfull receipt of a SDU */ -boolean_t pdcp_advance_rx_window(pdcp_t* pdcp_entity); +bool pdcp_advance_rx_window(pdcp_t* pdcp_entity); /** * Updates missing PDU bitmap with incoming sequence number -* @return TRUE if successful, FALSE otherwise +* @return true if successful, false otherwise */ -boolean_t pdcp_mark_current_pdu_as_received(uint16_t seq_num, pdcp_t* pdcp_entity); +bool pdcp_mark_current_pdu_as_received(uint16_t seq_num, pdcp_t* pdcp_entity); #endif diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c index cf8218829fe..79f6d688203 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c @@ -130,9 +130,9 @@ void util_print_binary_representation(unsigned char* message, uint8_t octet) * * @param octet 8-bit data * @param index Index of bit to be set - * @return TRUE on success, FALSE otherwise + * @return true on success, false otherwise */ -boolean_t util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index) +bool util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index) { uint8_t mask = 0x80; @@ -148,6 +148,6 @@ boolean_t util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index) */ *octet |= mask; - return TRUE; + return true; } diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h index 49846c7a9fb..89b8ff672f7 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h @@ -66,8 +66,8 @@ void util_print_binary_representation(unsigned char* message, uint8_t octet); * * @param octet Octet * @param index Index - * @return TRUE on success, FALSE otherwise + * @return true on success, false otherwise */ -boolean_t util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index); +bool util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index); #endif // PDCP_UTIL_H diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c index 4eb0907046a..ddc7bf85e85 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c @@ -52,7 +52,7 @@ rlc_am_get_status_pdu_buffer_occupancy( rlc_sn_t sn_cursor = rlc_pP->vr_r; rlc_sn_t sn_prev = rlc_pP->vr_r; rlc_sn_t sn_end = rlc_pP->vr_ms; - boolean_t segment_loop_end = false; + bool segment_loop_end = false; if (sn_prev != sn_end) { while ((RLC_AM_DIFF_SN(sn_prev,rlc_pP->vr_r) < RLC_AM_DIFF_SN(sn_end,rlc_pP->vr_r)) && (cursor_p != NULL)) { diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h index 1b6d8375655..95c47943a49 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h @@ -54,7 +54,7 @@ typedef struct rlc_am_entity_s { rb_id_t rb_id; /*!< \brief Radio bearer identifier, for statistics and trace purpose. */ logical_chan_id_t channel_id; /*!< \brief Transport channel identifier. */ - boolean_t is_data_plane; /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */ + bool is_data_plane; /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */ rlc_buffer_occupancy_t sdu_buffer_occupancy; /*!< \brief Number of bytes of unsegmented SDUs. */ rlc_buffer_occupancy_t status_buffer_occupancy; /*!< \brief Number of bytes of control PDUs waiting for transmission. */ @@ -76,7 +76,7 @@ typedef struct rlc_am_entity_s { rlc_am_tx_data_pdu_management_t *tx_data_pdu_buffer; /*!< \brief Transmission PDU data buffer. Used also for retransmissions */ signed int retrans_num_pdus; /*!< \brief Number of PDUs in the retransmission buffer. */ signed int retrans_num_bytes_to_retransmit; /*!< \brief Number of bytes in the retransmission buffer to be retransmitted. Only payload is taken into account */ - boolean_t force_poll; /*!< \brief force poll due to t_poll_retransmit time-out. */ + bool force_poll; /*!< \brief force poll due to t_poll_retransmit time-out. */ //--------------------------------------------------------------------- // RX BUFFERS @@ -186,8 +186,8 @@ typedef struct rlc_am_entity_s { // note occupancy of other buffers is deducted from nb elements in lists rlc_buffer_occupancy_t buffer_occupancy_retransmission_buffer; /*!< \brief Number of PDUs. */ - boolean_t initialized; /*!< \brief Boolean for rlc_am_entity_t struct initialization. */ - boolean_t configured; /*!< \brief Boolean for rlc_am_entity_t struct configuration. */ + bool initialized; /*!< \brief Boolean for rlc_am_entity_t struct initialization. */ + bool configured; /*!< \brief Boolean for rlc_am_entity_t struct configuration. */ } rlc_am_entity_t; /** @} */ # endif diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c index cb09f24855a..8ff29fa44bf 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c @@ -32,7 +32,7 @@ rlc_am_init( const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlc_pP) { - if (rlc_pP->initialized == TRUE) { + if (rlc_pP->initialized == true) { LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[AM INIT] INITIALIZATION ALREADY DONE, DOING NOTHING\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); } else { @@ -79,7 +79,7 @@ rlc_am_init( rlc_pP->last_absolute_subframe_status_indication = 0xFFFFFFFF; // any value > 1 - rlc_pP->initialized = TRUE; + rlc_pP->initialized = true; } } //----------------------------------------------------------------------------- @@ -134,7 +134,7 @@ rlc_am_reestablish( rlc_pP->last_absolute_subframe_status_indication = 0xFFFFFFFF; // any value > 1 - rlc_pP->initialized = TRUE; + rlc_pP->initialized = true; } @@ -197,7 +197,7 @@ rlc_am_configure( const uint32_t t_reorderingP, const uint32_t t_status_prohibitP) { - if (rlc_pP->configured == TRUE) { + if (rlc_pP->configured == true) { LOG_I(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RECONFIGURE] max_retx_threshold %d poll_pdu %d poll_byte %d t_poll_retransmit %d t_reordering %d t_status_prohibit %d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), max_retx_thresholdP, @@ -235,7 +235,7 @@ rlc_am_configure( rlc_am_init_timer_reordering (ctxt_pP, rlc_pP, t_reorderingP); rlc_am_init_timer_status_prohibit(ctxt_pP, rlc_pP, t_status_prohibitP); - rlc_pP->configured = TRUE; + rlc_pP->configured = true; } } diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c index 0957c20bdfc..a5f0b4f9ef0 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c @@ -183,12 +183,10 @@ rlc_am_send_sdu ( } } //----------------------------------------------------------------------------- -void -rlc_am_reassemble_pdu( - const protocol_ctxt_t *const ctxt_pP, - rlc_am_entity_t *const rlc_pP, - mem_block_t *const tb_pP, - boolean_t free_rlc_pdu) { +void rlc_am_reassemble_pdu(const protocol_ctxt_t *const ctxt_pP, + rlc_am_entity_t *const rlc_pP, + mem_block_t *const tb_pP, + bool free_rlc_pdu) { int i,j; rlc_am_pdu_info_t *pdu_info = &((rlc_am_rx_pdu_management_t *)(tb_pP->data))->pdu_info; LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[REASSEMBLY PDU] TRY REASSEMBLY PDU SN=%03d\n", diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h index bf9bd58fb52..839e7d9304f 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h @@ -57,14 +57,14 @@ void rlc_am_reassembly (const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * */ void rlc_am_send_sdu (const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP); -/*! \fn void rlc_am_reassemble_pdu(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, const mem_block_t* const tb_pP,boolean_t free_rlc_pdu) +/*! \fn void rlc_am_reassemble_pdu(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, const mem_block_t* const tb_pP, bool free_rlc_pdu) * \brief Reassembly a RLC AM PDU, depending of the content of this PDU, data will be reassemblied to the current output SDU, the current will be sent to higher layers or not, after or before the reassembly, or no send of SDU will be triggered, depending on FI field in PDU header. * \param[in] ctxtP Running context. * \param[in] rlc_pP RLC AM protocol instance pointer. * \param[in] tb_pP RLC AM PDU embedded in a mem_block_t. * \param[in] free_rlc_pdu Flag for freeing RLC AM PDU after reassembly. */ -void rlc_am_reassemble_pdu(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, mem_block_t* const tb_pP,boolean_t free_rlc_pdu); +void rlc_am_reassemble_pdu(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, mem_block_t* const tb_pP, bool free_rlc_pdu); /** @} */ #endif diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c index 916d1513b0f..a749aa035e1 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c @@ -328,7 +328,7 @@ rlc_am_receive_process_data_pdu ( rlc_am_pdu_info_t* pdu_info_p = &((rlc_am_rx_pdu_management_t*)(tb_pP->data))->pdu_info; rlc_am_pdu_sn_10_t* rlc_am_pdu_sn_10_p = (rlc_am_pdu_sn_10_t*)first_byte_pP; rlc_am_rx_pdu_status_t pdu_status = RLC_AM_DATA_PDU_STATUS_OK; - boolean_t reassemble = false; + bool reassemble = false; if (rlc_am_get_data_pdu_infos(ctxt_pP,rlc_pP, rlc_am_pdu_sn_10_p, tb_size_in_bytesP, pdu_info_p) >= 0) { diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c index 56b37e1e395..7129307739a 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c @@ -29,13 +29,12 @@ #include "LAYER2/MAC/mac_extern.h" #include "common/utils/LOG/log.h" //----------------------------------------------------------------------------- -boolean_t rlc_am_nack_pdu ( - const protocol_ctxt_t* const ctxt_pP, - rlc_am_entity_t *const rlc_pP, - const rlc_sn_t snP, - const rlc_sn_t prev_nack_snP, - sdu_size_t so_startP, - sdu_size_t so_endP) +bool rlc_am_nack_pdu(const protocol_ctxt_t* const ctxt_pP, + rlc_am_entity_t *const rlc_pP, + const rlc_sn_t snP, + const rlc_sn_t prev_nack_snP, + sdu_size_t so_startP, + sdu_size_t so_endP) { // 5.2.1 Retransmission // ... @@ -54,8 +53,8 @@ boolean_t rlc_am_nack_pdu ( rlc_am_tx_data_pdu_management_t *tx_data_pdu_buffer_p = &rlc_pP->tx_data_pdu_buffer[snP % RLC_AM_WINDOW_SIZE]; //int pdu_sdu_index; //int sdu_index; - boolean_t status = TRUE; - boolean_t retx_count_increment = FALSE; + bool status = true; + bool retx_count_increment = false; sdu_size_t pdu_data_to_retx = 0; if (mb_p != NULL) { @@ -63,7 +62,7 @@ boolean_t rlc_am_nack_pdu ( if(so_startP > so_endP) { LOG_E(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[NACK-PDU] ERROR NACK MISSING PDU, so_startP %d, so_endP %d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),so_startP, so_endP); - status = FALSE; + status = false; } // Handle full PDU NACK first else if ((so_startP == 0) && (so_endP == 0x7FFF)) { @@ -71,9 +70,7 @@ boolean_t rlc_am_nack_pdu ( pdu_data_to_retx = tx_data_pdu_buffer_p->payload_size; /* Increment VtReTxNext if this is the first NACK or if some segments have already been transmitted */ if ((tx_data_pdu_buffer_p->flags.retransmit == 0) || (tx_data_pdu_buffer_p->nack_so_start)) - { - retx_count_increment = TRUE; - } + retx_count_increment = true; tx_data_pdu_buffer_p->nack_so_start = 0; tx_data_pdu_buffer_p->num_holes = 0; @@ -89,11 +86,11 @@ boolean_t rlc_am_nack_pdu ( if(tx_data_pdu_buffer_p->nack_so_start >= tx_data_pdu_buffer_p->payload_size){ LOG_E(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[NACK-PDU] ERROR NACK MISSING PDU, nack_so_start %d, payload_size %d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),tx_data_pdu_buffer_p->nack_so_start, tx_data_pdu_buffer_p->payload_size); - status = FALSE; + status = false; } } else { - status = FALSE; + status = false; } } else if (tx_data_pdu_buffer_p->flags.max_retransmit == 0) { @@ -107,9 +104,8 @@ boolean_t rlc_am_nack_pdu ( if (prev_nack_snP != snP) { /* New NACK_SN with SO */ /* check whether a new segment is to be placed in Retransmission Buffer, then increment vrReTx */ - if ((tx_data_pdu_buffer_p->flags.retransmit == 0) || (so_startP < tx_data_pdu_buffer_p->nack_so_start)) { - retx_count_increment = TRUE; - } + if ((tx_data_pdu_buffer_p->flags.retransmit == 0) || (so_startP < tx_data_pdu_buffer_p->nack_so_start)) + retx_count_increment = true; tx_data_pdu_buffer_p->num_holes = 1; tx_data_pdu_buffer_p->retx_hole_index = 0; @@ -129,21 +125,18 @@ boolean_t rlc_am_nack_pdu ( tx_data_pdu_buffer_p->nack_so_stop = so_endP; tx_data_pdu_buffer_p->num_holes ++; pdu_data_to_retx = so_endP - so_startP + 1; + } else { + status = false; } - else { - status = FALSE; - } - } - else { - status = FALSE; + } else { + status = false; } } else { - status = FALSE; + status = false; } - } - else { - status = FALSE; + } else { + status = false; } if (status) { @@ -175,17 +168,16 @@ boolean_t rlc_am_nack_pdu ( LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[NACK-PDU] ERROR NACK MISSING PDU SN %05d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), snP); - status = FALSE; + status = false; } return status; } //----------------------------------------------------------------------------- -void rlc_am_ack_pdu ( - const protocol_ctxt_t* const ctxt_pP, - rlc_am_entity_t *const rlc_pP, - const rlc_sn_t snP, - boolean_t free_pdu) +void rlc_am_ack_pdu(const protocol_ctxt_t* const ctxt_pP, + rlc_am_entity_t *const rlc_pP, + const rlc_sn_t snP, + bool free_pdu) { mem_block_t* mb_p = rlc_pP->tx_data_pdu_buffer[snP % RLC_AM_WINDOW_SIZE].mem_block; rlc_am_tx_data_pdu_management_t *tx_data_pdu_buffer = &rlc_pP->tx_data_pdu_buffer[snP % RLC_AM_WINDOW_SIZE]; @@ -283,7 +275,7 @@ mem_block_t* rlc_am_retransmit_get_am_segment( sdu_size_t retx_so_start,retx_so_stop; //starting and ending SO for retransmission in this PDU rlc_sn_t sn = pdu_mngt->sn; uint16_t header_so_part; - boolean_t fi_start, fi_end; + bool fi_start, fi_end; uint8_t sdu_index = 0; uint8_t sdu_segment_index = 0; uint8_t num_LIs_pdu_segment = pdu_mngt->nb_sdus - 1; @@ -377,11 +369,11 @@ mem_block_t* rlc_am_retransmit_get_am_segment( /* Set FI part to false if SO Start and SO End are different from PDU boundaries */ if (retx_so_start) { - fi_start = FALSE; + fi_start = false; } if (retx_so_stop < pdu_mngt->payload_size - 1) { - fi_end = FALSE; + fi_end = false; } /* Header content is filled at the end */ @@ -423,7 +415,7 @@ mem_block_t* rlc_am_retransmit_get_am_segment( else { /* if retx_so_start is still not included then set data_size with full original PDU data size */ - /* Set fi_start to FALSE in this case */ + /* Set fi_start to false in this case */ data_size = pdu_mngt->payload_size; } sdu_index ++; @@ -432,7 +424,7 @@ mem_block_t* rlc_am_retransmit_get_am_segment( if (retx_so_start == data_size) { /* Set FI Start if retx_so_start = cumulated data size */ - fi_start = TRUE; + fi_start = true; /* there must be at least one SDU more */ //Assertion(eNB)_PRAN_DesignDocument_annex No.778 if(sdu_index >= pdu_mngt->nb_sdus) @@ -464,8 +456,8 @@ mem_block_t* rlc_am_retransmit_get_am_segment( } else if (retx_so_start != 0) { - /* in all other cases set fi_start to FALSE if it SO Start is not 0 */ - fi_start = FALSE; + /* in all other cases set fi_start to false if it SO Start is not 0 */ + fi_start = false; } /* Set first SDU portion of the segment */ @@ -582,10 +574,10 @@ mem_block_t* rlc_am_retransmit_get_am_segment( "RLC AM Tx PDU Segment Data Error: retx_so_stop=%d OriginalPDUDataLength=%d SOStart=%d SegmentLength=%d numLISegment=%d numLIPDU=%d sn=%d LcId=%d !\n", retx_so_stop,pdu_mngt->payload_size,retx_so_start,*payload_sizeP,num_LIs_pdu_segment,pdu_mngt->nb_sdus - 1,sn,rlc_pP->channel_id); */ - /* init FI End to FALSE if retx_so_stop is not end of PDU */ + /* init FI End to false if retx_so_stop is not end of PDU */ if (retx_so_stop != pdu_mngt->payload_size - 1) { - fi_end = FALSE; + fi_end = false; } /* Check consistency between sdus_segment_size and payload_sizeP */ @@ -596,7 +588,7 @@ mem_block_t* rlc_am_retransmit_get_am_segment( data_size += sdus_segment_size[i]; if ((retx_so_stop == data_size - 1) && (i < num_LIs_pdu_segment)) { - fi_end = TRUE; + fi_end = true; } } //Assertion(eNB)_PRAN_DesignDocument_annex No.782 @@ -665,7 +657,7 @@ mem_block_t* rlc_am_retransmit_get_am_segment( pdu_mngt->nack_so_start = pdu_mngt->hole_so_start[pdu_mngt->retx_hole_index]; } - /* Content is supposed to be init with 0 so with FIStart=FIEnd=TRUE */ + /* Content is supposed to be init with 0 so with FIStart=FIEnd=true */ RLC_AM_PDU_SET_D_C(*pdu_segment_header_p); RLC_AM_PDU_SET_RF(*pdu_segment_header_p); /* Change FI */ diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h index fc526893142..c34d06337da 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h @@ -35,7 +35,7 @@ # ifndef __RLC_AM_RETRANSMIT_H__ # define __RLC_AM_RETRANSMIT_H__ //----------------------------------------------------------------------------- -/*! \fn boolean_t rlc_am_nack_pdu (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *rlcP, int16_t snP, int16_t prev_nack_snP,sdu_size_t so_startP, sdu_size_t so_endP) +/*! \fn bool rlc_am_nack_pdu (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *rlcP, int16_t snP, int16_t prev_nack_snP,sdu_size_t so_startP, sdu_size_t so_endP) * \brief The RLC AM PDU which have the sequence number snP is marked NACKed with segment offset fields. * \param[in] ctxtP Running context. * \param[in] rlcP RLC AM protocol instance pointer. @@ -46,13 +46,12 @@ * \return OK/KO * \note It may appear a new hole in the retransmission buffer depending on the segment offset informations. Depending on the state of the retransmission buffer, negative confirmation can be sent to higher layers about the drop by the RLC AM instance of a particular SDU. */ -boolean_t rlc_am_nack_pdu ( - const protocol_ctxt_t* const ctxt_pP, - rlc_am_entity_t *const rlcP, - const rlc_sn_t snP, - const rlc_sn_t prev_nack_snP, - sdu_size_t so_startP, - sdu_size_t so_endP); +bool rlc_am_nack_pdu(const protocol_ctxt_t* const ctxt_pP, + rlc_am_entity_t *const rlcP, + const rlc_sn_t snP, + const rlc_sn_t prev_nack_snP, + sdu_size_t so_startP, + sdu_size_t so_endP); /*! \fn void rlc_am_ack_pdu (const protocol_ctxt_t* const ctxt_pP,rlc_am_entity_t *rlcP, rlc_sn_t snP) * \brief The RLC AM PDU which have the sequence number snP is marked ACKed. @@ -62,11 +61,10 @@ boolean_t rlc_am_nack_pdu ( * \param[in] free_pdu Boolean indicating that the PDU can be freed because smaller than new vtA. * \note Depending on the state of the retransmission buffer, positive confirmation can be sent to higher layers about the receiving by the peer RLC AM instance of a particular SDU. */ -void rlc_am_ack_pdu ( - const protocol_ctxt_t* const ctxt_pP, - rlc_am_entity_t *const rlcP, - const rlc_sn_t snP, - boolean_t free_pdu); +void rlc_am_ack_pdu(const protocol_ctxt_t* const ctxt_pP, + rlc_am_entity_t *const rlcP, + const rlc_sn_t snP, + bool free_pdu); /*! \fn mem_block_t* rlc_am_retransmit_get_copy (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *rlcP, rlc_sn_t snP) * \brief The RLC AM PDU which have the sequence number snP is marked ACKed. diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c index 4a065539013..bd578abab2a 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c @@ -31,14 +31,13 @@ #include "common/utils/LOG/log.h" -boolean_t rlc_am_rx_check_vr_reassemble( - const protocol_ctxt_t* const ctxt_pP, - const rlc_am_entity_t* const rlc_pP) +bool rlc_am_rx_check_vr_reassemble(const protocol_ctxt_t* const ctxt_pP, + const rlc_am_entity_t* const rlc_pP) { mem_block_t* cursor_p = rlc_pP->receiver_buffer.head; rlc_am_rx_pdu_management_t * pdu_cursor_mgnt_p = NULL; sdu_size_t next_waited_so = 0; - boolean_t reassemble = FALSE; + bool reassemble = false; if (cursor_p != NULL) { @@ -48,7 +47,7 @@ boolean_t rlc_am_rx_check_vr_reassemble( if (sn_ref != rlc_pP->vr_r) { /* Case vrR has advanced from head : most likely case */ - reassemble = TRUE; + reassemble = true; /* Handle first SN if it is made of PDU segments : set them all to be reassembled */ if (pdu_info_p->rf) { pdu_cursor_mgnt_p = (rlc_am_rx_pdu_management_t *) (cursor_p->data); @@ -58,7 +57,7 @@ boolean_t rlc_am_rx_check_vr_reassemble( { LOG_E(RLC, "AM Rx Check Reassembly head SN=%d with PDU segments != vrR=%d should be fully received LCID=%d\n", sn_ref,rlc_pP->vr_r,rlc_pP->channel_id); - return FALSE; + return false; } /* AssertFatal(pdu_cursor_mgnt_p->all_segments_received > 0,"AM Rx Check Reassembly head SN=%d with PDU segments != vrR=%d should be fully received LCID=%d\n", @@ -94,7 +93,7 @@ boolean_t rlc_am_rx_check_vr_reassemble( { LOG_E(RLC, "AM Rx Check Reassembly vr=%d should be partly received SNHead=%d LCID=%d\n", rlc_pP->vr_r,sn_ref,rlc_pP->channel_id); - return FALSE; + return false; } /* AssertFatal(pdu_cursor_mgnt_p->all_segments_received == 0,"AM Rx Check Reassembly vr=%d should be partly received SNHead=%d LCID=%d\n", @@ -123,7 +122,7 @@ boolean_t rlc_am_rx_check_vr_reassemble( { LOG_E(RLC, "AM Rx Check Reassembly SNHead=vr=%d should be partly received LCID=%d\n", rlc_pP->vr_r,rlc_pP->channel_id); - return FALSE; + return false; } /* AssertFatal(pdu_cursor_mgnt_p->all_segments_received == 0,"AM Rx Check Reassembly SNHead=vr=%d should be partly received LCID=%d\n", @@ -132,7 +131,7 @@ boolean_t rlc_am_rx_check_vr_reassemble( while ((cursor_p != NULL) && (pdu_info_p->sn == rlc_pP->vr_r) && (pdu_info_p->so == next_waited_so)) { if (pdu_cursor_mgnt_p->segment_reassembled == RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_NO) { pdu_cursor_mgnt_p->segment_reassembled = RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_PENDING; - reassemble = TRUE; + reassemble = true; } next_waited_so += pdu_info_p->payload_size; cursor_p = cursor_p->next; @@ -157,7 +156,7 @@ mem_block_t * create_new_segment_from_pdu( int16_t new_li_list[RLC_AM_MAX_SDU_IN_PDU]; int16_t header_size = 0; uint8_t num_li = 0; - boolean_t fi_start, fi_end, lsf; + bool fi_start, fi_end, lsf; /* Init some PDU Segment header fixed parameters */ fi_start = !((pdu_rx_info_p->fi & 0x2) >> 1); @@ -170,11 +169,11 @@ mem_block_t * create_new_segment_from_pdu( header_size = RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE; if (so_offset) { - fi_start = FALSE; + fi_start = false; } if (so_offset + data_length_to_copy != pdu_rx_info_p->payload_size) { - fi_end = FALSE; - lsf = FALSE; + fi_end = false; + lsf = false; } } // end no LI in original segment else { @@ -185,7 +184,7 @@ mem_block_t * create_new_segment_from_pdu( /* set LSF to false if we know that end of the original segment will not be copied */ if (so_offset + data_length_to_copy != pdu_rx_info_p->payload_size) { - lsf = FALSE; + lsf = false; } /* catch the first LI containing so_offset */ @@ -223,7 +222,7 @@ mem_block_t * create_new_segment_from_pdu( num_li = j; /* set FI End if remaining size = 0 */ if (remaining_size == 0) { - fi_end = TRUE; + fi_end = true; } } } @@ -263,7 +262,7 @@ mem_block_t * create_new_segment_from_pdu( } /* Fill Header part in the buffer */ - /* Content is supposed to be init with 0 so with FIStart=FIEnd=TRUE */ + /* Content is supposed to be init with 0 so with FIStart=FIEnd=true */ /* copy first two bytes from original: D/C + RF + FI + E+ SN*/ memset(pdu_segment_header_p, 0, header_size); RLC_AM_PDU_SET_D_C(*pdu_segment_header_p); @@ -1106,7 +1105,7 @@ rlc_am_rx_list_reassemble_rlc_sdus( do { if (rlc_am_rx_pdu_management_p->all_segments_received > 0) { cursor_p = list2_remove_head(&rlc_pP->receiver_buffer); - rlc_am_reassemble_pdu(ctxt_pP, rlc_pP, cursor_p,TRUE); + rlc_am_reassemble_pdu(ctxt_pP, rlc_pP, cursor_p, true); rlc_am_rx_old_pdu_management = rlc_am_rx_pdu_management_p; cursor_p = list2_get_head(&rlc_pP->receiver_buffer); @@ -1123,7 +1122,7 @@ rlc_am_rx_list_reassemble_rlc_sdus( else if (rlc_am_rx_pdu_management_p->segment_reassembled == RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_PENDING) { rlc_am_rx_pdu_management_p->segment_reassembled = RLC_AM_RX_PDU_SEGMENT_REASSEMBLED; - rlc_am_reassemble_pdu(ctxt_pP, rlc_pP, cursor_p,FALSE); + rlc_am_reassemble_pdu(ctxt_pP, rlc_pP, cursor_p, false); rlc_am_rx_old_pdu_management = rlc_am_rx_pdu_management_p; cursor_p = cursor_p->next; diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h index fd8704964d1..18e423312cb 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h @@ -61,13 +61,13 @@ rlc_am_rx_pdu_status_t rlc_am_rx_list_check_duplicate_insert_pdu(const protocol_ */ signed int rlc_am_rx_list_insert_pdu(const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t* const rlcP, mem_block_t* const tbP); -/*! \fn boolean_t rlc_am_rx_check_vr_reassemble(const protocol_ctxt_t* const ctxt_pP,const rlc_am_entity_t* const rlc_pP) +/*! \fn bool rlc_am_rx_check_vr_reassemble(const protocol_ctxt_t* const ctxt_pP,const rlc_am_entity_t* const rlc_pP) * \brief Check if reassembly taking into account potential new vrR value * \param[in] ctxt_pP Running context. * \param[in] rlcP RLC AM protocol instance pointer. -* \return TRUE if reassembly must be done, FALSE else +* \return true if reassembly must be done, false else */ -boolean_t rlc_am_rx_check_vr_reassemble(const protocol_ctxt_t* const ctxt_pP,const rlc_am_entity_t* const rlc_pP); +bool rlc_am_rx_check_vr_reassemble(const protocol_ctxt_t* const ctxt_pP,const rlc_am_entity_t* const rlc_pP); /*! \fn void rlc_am_rx_check_all_byte_segments(const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t* const rlcP, mem_block_t* const tbP) * \brief Check if all sub-segments of a PDU are received, if yes then call rlc_am_rx_mark_all_segments_received() procedure. diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c index ed81e119acb..9e7c3338f81 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c @@ -32,12 +32,11 @@ #include "common/utils/LOG/log.h" //----------------------------------------------------------------------------- -void rlc_am_pdu_polling ( - const protocol_ctxt_t* const ctxt_pP, - rlc_am_entity_t *const rlc_pP, - rlc_am_pdu_sn_10_t *const pdu_pP, - const int16_t payload_sizeP, - boolean_t is_new_pdu) +void rlc_am_pdu_polling(const protocol_ctxt_t* const ctxt_pP, + rlc_am_entity_t *const rlc_pP, + rlc_am_pdu_sn_10_t *const pdu_pP, + const int16_t payload_sizeP, + bool is_new_pdu) { // 5.2.2 Polling // An AM RLC entity can poll its peer AM RLC entity in order to trigger STATUS reporting at the peer AM RLC entity. diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h index dc754d08e49..1e472302c82 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h @@ -36,14 +36,14 @@ # define __RLC_AM_SEGMENT_H__ //----------------------------------------------------------------------------- -/*! \fn void rlc_am_pdu_polling (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlcP, rlc_am_pdu_sn_10_t *pduP, int16_t payload_sizeP,boolean_t is_new_pdu) +/*! \fn void rlc_am_pdu_polling (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlcP, rlc_am_pdu_sn_10_t *pduP, int16_t payload_sizeP, bool is_new_pdu) * \brief Set or not the poll bit in the PDU header depending on RLC AM protocol variables. * \param[in] ctxt_pP Running context. * \param[in] rlcP RLC AM protocol instance pointer. * \param[in] pduP Pointer on the header of the PDU in order to be able to set the poll bit if necessary. * \param[in] payload_sizeP Size of the payload of the PDU. */ -void rlc_am_pdu_polling (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlcP, rlc_am_pdu_sn_10_t *pduP, int16_t payload_sizeP,boolean_t is_new_pdu); +void rlc_am_pdu_polling (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlcP, rlc_am_pdu_sn_10_t *pduP, int16_t payload_sizeP, bool is_new_pdu); /*! \fn void rlc_am_segment_10 (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t * const rlcP) * \brief Segment a PDU with 10 bits sequence number, based on segmentation information given by MAC (size to transmit). diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c index 02a0247a03d..f1e6c961e70 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c @@ -237,7 +237,7 @@ rlc_am_receive_process_control_pdu( rlc_sn_t nack_sn,prev_nack_sn; sdu_size_t data_cnf_so_stop = 0x7FFF; unsigned int nack_index; - boolean_t status = TRUE; + bool status = true; if (rlc_am_get_control_pdu_infos(rlc_am_pdu_sn_10_p, tb_size_in_bytes_pP, &rlc_pP->control_pdu_info) >= 0) { rlc_am_tx_buffer_display(ctxt_pP, rlc_pP, " TX BUFFER BEFORE PROCESS OF STATUS PDU"); @@ -282,7 +282,7 @@ rlc_am_receive_process_control_pdu( if (RLC_AM_DIFF_SN(rlc_pP->vt_s,rlc_pP->vt_a) >= RLC_AM_DIFF_SN(ack_sn,rlc_pP->vt_a)) { if (rlc_pP->control_pdu_info.num_nack == 0) { while (sn_cursor != ack_sn) { - rlc_am_ack_pdu(ctxt_pP, rlc_pP, sn_cursor,TRUE); + rlc_am_ack_pdu(ctxt_pP, rlc_pP, sn_cursor, true); sn_cursor = RLC_AM_NEXT_SN(sn_cursor); } @@ -294,7 +294,7 @@ rlc_am_receive_process_control_pdu( prev_nack_sn = 0x3FFF; while (sn_cursor != nack_sn) { - rlc_am_ack_pdu(ctxt_pP, rlc_pP, sn_cursor,TRUE); + rlc_am_ack_pdu(ctxt_pP, rlc_pP, sn_cursor, true); sn_cursor = RLC_AM_NEXT_SN(sn_cursor); } @@ -316,7 +316,7 @@ rlc_am_receive_process_control_pdu( rlc_am_ack_pdu(ctxt_pP, rlc_pP, sn_cursor, - FALSE); + false); } else { status = rlc_am_nack_pdu (ctxt_pP, rlc_pP, @@ -348,13 +348,13 @@ rlc_am_receive_process_control_pdu( LOG_E(RLC, PROTOCOL_RLC_AM_CTXT_FMT" WARNING CONTROL PDU ACK SN %d OUT OF WINDOW vtA=%d vtS=%d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),ack_sn,rlc_pP->vt_a,rlc_pP->vt_s); *tb_size_in_bytes_pP = 0; - status = FALSE; + status = false; } } else { LOG_E(RLC, PROTOCOL_RLC_AM_CTXT_FMT" ERROR IN DECODING CONTROL PDU\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); *tb_size_in_bytes_pP = 0; - status = FALSE; + status = false; } if (status) { @@ -480,8 +480,8 @@ rlc_am_send_status_pdu( int waited_so = 0; mem_block_t *tb_p = NULL; sdu_size_t pdu_size = 0; - boolean_t status_report_completed = false; - boolean_t segment_loop_end = false; + bool status_report_completed = false; + bool segment_loop_end = false; memset(&control_pdu_info, 0, sizeof(rlc_am_control_pdu_info_t)); LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEND-STATUS] nb_bits_to_transmit %d (15 already allocated for header)\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c index 7a95a62787a..e898a601c2c 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c @@ -1170,7 +1170,7 @@ void rlc_am_v9_3_0_test(void) { // initscr(); // cbreak(); - // keypad(stdscr, TRUE); + // keypad(stdscr, true); // under test pool_buffer_init(); set_comp_log(RLC, LOG_ERR, LOG_MED, 1); diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c index 969ed2d7a54..7aead2f30a4 100644 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c @@ -111,7 +111,7 @@ rlc_am_check_timer_poll_retransmit( } - rlc_pP->force_poll= TRUE; + rlc_pP->force_poll = true; //BugFix : new ms_time_out is computed when next poll is transmitter } } diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c index 4e3fffe176e..f079696aa91 100644 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c @@ -31,13 +31,11 @@ #include "list.h" #include "LAYER2/MAC/mac_extern.h" //----------------------------------------------------------------------------- -void -rlc_tm_send_sdu ( - const protocol_ctxt_t* const ctxt_pP, - rlc_tm_entity_t * const rlc_pP, - const boolean_t error_indicationP, - uint8_t * const srcP, - const sdu_size_t length_in_bitsP) +void rlc_tm_send_sdu(const protocol_ctxt_t* const ctxt_pP, + rlc_tm_entity_t * const rlc_pP, + const bool error_indicationP, + uint8_t * const srcP, + const sdu_size_t length_in_bitsP) { int length_in_bytes; #if DEBUG_RLC_TM_DISPLAY_ASCII_DATA diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h index d2bab33b1a4..de7b9b81706 100644 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h @@ -51,7 +51,7 @@ /*! \fn void rlc_tm_send_sdu ( * const protocol_ctxt_t* const ctxt_pP, * rlc_tm_entity_t * const rlc_pP, -* const boolean_t error_indicationP, +* const bool error_indicationP, * uint8_t * const srcP, * const sdu_size_t length_in_bitsP) * \brief Send SDU if any reassemblied to upper layer. @@ -60,12 +60,11 @@ * \param[in] srcP SDU data pointer. * \param[in] length_in_bitsP Length of SDU in bits. */ -void rlc_tm_send_sdu ( - const protocol_ctxt_t* const ctxt_pP, - rlc_tm_entity_t * const rlc_pP, - const boolean_t error_indicationP, - uint8_t * const srcP, - const sdu_size_t length_in_bitsP); +void rlc_tm_send_sdu(const protocol_ctxt_t* const ctxt_pP, + rlc_tm_entity_t * const rlc_pP, + const bool error_indicationP, + uint8_t * const srcP, + const sdu_size_t length_in_bitsP); /*! \fn void rlc_tm_no_segment (const protocol_ctxt_t* const ctxt_pP, rlc_tm_entity_t * const rlcP) * \brief Schedule a SDU to be transmited by lower layers. diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h index 1a13982df65..3c2f1804bec 100644 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h @@ -40,14 +40,13 @@ * \brief Structure containing a RLC TM instance protocol variables, allocation variables, buffers and other miscellaneous variables. */ typedef struct rlc_tm_entity { - boolean_t allocation; /*!< \brief Boolean for rlc_tm_entity_t struct allocation. */ + bool allocation; /*!< \brief Boolean for rlc_tm_entity_t struct allocation. */ rlc_protocol_state_t protocol_state; /*!< \brief Protocol state, can be RLC_NULL_STATE, RLC_DATA_TRANSFER_READY_STATE, RLC_LOCAL_SUSPEND_STATE. */ - boolean_t is_uplink_downlink; /*!< \brief Is this instance is a transmitter, a receiver or both? */ - boolean_t is_data_plane; /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */ + bool is_uplink_downlink; /*!< \brief Is this instance is a transmitter, a receiver or both? */ + bool is_data_plane; /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */ // for stats and trace purpose : logical_chan_id_t channel_id; /*!< \brief Transport channel identifier. */ rb_id_t rb_id; /*!< \brief Radio bearer identifier, for statistics and trace purpose. */ - //boolean_t is_enb; /*!< \brief To know if the RLC belongs to a eNB or UE. */ //----------------------------- // tranmission //----------------------------- diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c index 22e6f4d78d1..a838b2a0066 100644 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c @@ -133,10 +133,9 @@ rlc_tm_cleanup ( } //----------------------------------------------------------------------------- -void rlc_tm_configure( - const protocol_ctxt_t* const ctxt_pP, - rlc_tm_entity_t * const rlcP, - const boolean_t is_uplink_downlinkP) +void rlc_tm_configure(const protocol_ctxt_t* const ctxt_pP, + rlc_tm_entity_t * const rlcP, + const bool is_uplink_downlinkP) { rlcP->is_uplink_downlink = is_uplink_downlinkP; rlc_tm_reset_state_variables (ctxt_pP, rlcP); diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h index 57e2116a724..f315a0311ae 100644 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h @@ -78,27 +78,24 @@ void rlc_tm_init ( * \brief Reset protocol variables and state variables to initial values. * \param[in] rlcP RLC TM protocol instance pointer. */ -void rlc_tm_reset_state_variables ( - const protocol_ctxt_t* const ctxt_pP, - rlc_tm_entity_t * const rlcP); +void rlc_tm_reset_state_variables(const protocol_ctxt_t* const ctxt_pP, + rlc_tm_entity_t * const rlcP); /*! \fn void rlc_tm_cleanup(rlc_tm_entity_t * const rlcP) * \brief Free all allocated memory (lists and buffers) previously allocated by this RLC TM instance. * \param[in] rlcP RLC TM protocol instance pointer. */ -void rlc_tm_cleanup( - rlc_tm_entity_t * const rlcP); +void rlc_tm_cleanup(rlc_tm_entity_t * const rlcP); -/*! \fn void rlc_tm_configure(const protocol_ctxt_t* const ctxt_pP,rlc_tm_entity_t * const rlcP, const boolean_t is_uplink_downlinkP) +/*! \fn void rlc_tm_configure(const protocol_ctxt_t* const ctxt_pP,rlc_tm_entity_t * const rlcP, const bool is_uplink_downlinkP) * \brief Configure RLC TM protocol parameters. * \param[in] rlcP RLC TM protocol instance pointer. * \param[in] is_uplink_downlinkP Is this instance is TRANSMITTER_ONLY, RECEIVER_ONLY, or TRANSMITTER_AND_RECEIVER. */ -void rlc_tm_configure( - const protocol_ctxt_t* const ctxt_pP, - rlc_tm_entity_t * const rlcP, - const boolean_t is_uplink_downlinkP); +void rlc_tm_configure(const protocol_ctxt_t* const ctxt_pP, + rlc_tm_entity_t * const rlcP, + const bool is_uplink_downlinkP); /*! \fn void rlc_tm_set_debug_infos(const protocol_ctxt_t* const ctxt_pP, rlc_tm_entity_t * const rlcP, const rb_id_t rb_idP, const srb_flag_t srb_flagP) * \brief Set debug informations for a RLC TM protocol instance, these informations are only for trace purpose. diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c index bec815ac5da..f2cb4f09b1e 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c @@ -263,7 +263,7 @@ rlc_um_init ( } rlc_pP->first_pdu = 1; - rlc_pP->initialized = TRUE; + rlc_pP->initialized = true; } } //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h index 3250ac85b85..7bfa3d60ffe 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h @@ -53,12 +53,11 @@ typedef struct rlc_um_timer_s { */ typedef struct rlc_um_entity_s { - boolean_t initialized; /*!< \brief Boolean for rlc_am_entity_t struct initialization. */ - boolean_t is_uplink_downlink; /*!< \brief Is this instance is a transmitter, a receiver or both? */ + bool initialized; /*!< \brief Boolean for rlc_am_entity_t struct initialization. */ + bool is_uplink_downlink; /*!< \brief Is this instance is a transmitter, a receiver or both? */ rlc_protocol_state_t protocol_state; /*!< \brief Protocol state, can be RLC_NULL_STATE, RLC_DATA_TRANSFER_READY_STATE, RLC_LOCAL_SUSPEND_STATE. */ - boolean_t is_data_plane; /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */ - //boolean_t is_enb; /*!< \brief To know if the RLC belongs to a eNB or UE. */ - boolean_t is_mxch; /*!< \brief To know if the RLC belongs to a MBMS bearer. */ + bool is_data_plane; /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */ + bool is_mxch; /*!< \brief To know if the RLC belongs to a MBMS bearer. */ //----------------------------- // PROTOCOL VARIABLES //----------------------------- @@ -114,7 +113,7 @@ typedef struct rlc_um_entity_s { //----------------------------- // STATISTICS //----------------------------- - boolean_t first_pdu; /*!< \brief Act as a boolean, tells if the next PDU is the first PDU to be received. */ + bool first_pdu; /*!< \brief Act as a boolean, tells if the next PDU is the first PDU to be received. */ unsigned int stat_tx_pdcp_sdu; /*!< \brief Number of SDUs received from upper layers. */ unsigned int stat_tx_pdcp_bytes; /*!< \brief Number of SDU bytes received from upper layers. */ diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c index b9dcf0414b9..ec90817500d 100644 --- a/openair2/LAYER2/RLC/rlc.c +++ b/openair2/LAYER2/RLC/rlc.c @@ -41,13 +41,12 @@ #include "common/ran_context.h" extern RAN_CONTEXT_t RC; -extern boolean_t pdcp_data_ind( - const protocol_ctxt_t *const ctxt_pP, - const srb_flag_t srb_flagP, - const MBMS_flag_t MBMS_flagP, - const rb_id_t rb_idP, - const sdu_size_t sdu_buffer_sizeP, - mem_block_t *const sdu_buffer_pP); +extern bool pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP, + const srb_flag_t srb_flagP, + const MBMS_flag_t MBMS_flagP, + const rb_id_t rb_idP, + const sdu_size_t sdu_buffer_sizeP, + mem_block_t *const sdu_buffer_pP); #define DEBUG_RLC_PDCP_INTERFACE 1 //#define TRACE_RLC_PAYLOAD 1 @@ -397,7 +396,7 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t *const ctxt_pP, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_IN); - if (MBMS_flagP == TRUE) { + if (MBMS_flagP == true) { if (ctxt_pP->enb_flag) { log_ch_id = rlc_mbms_enb_get_lcid_by_rb_id(ctxt_pP->module_id,rb_idP); mbms_id_p = &rlc_mbms_lcid2service_session_id_eNB[ctxt_pP->module_id][log_ch_id]; diff --git a/openair2/LAYER2/RLC/rlc.h b/openair2/LAYER2/RLC/rlc.h index 1e5b7947d7a..1e17ff96bfc 100644 --- a/openair2/LAYER2/RLC/rlc.h +++ b/openair2/LAYER2/RLC/rlc.h @@ -107,7 +107,7 @@ typedef struct { rlc_buffer_occupancy_t pdus_in_buffer; /*!< \brief Number of PDUs buffered in RLC protocol instance (OBSOLETE). */ frame_t head_sdu_creation_time; /*!< \brief Head SDU creation time. */ sdu_size_t head_sdu_remaining_size_to_send; /*!< \brief remaining size of sdu: could be the total size or the remaining size of already segmented sdu */ - boolean_t head_sdu_is_segmented; /*!< \brief 0 if head SDU has not been segmented, 1 if already segmented */ + bool head_sdu_is_segmented; /*!< \brief 0 if head SDU has not been segmented, 1 if already segmented */ } mac_rlc_status_resp_t; diff --git a/openair2/LAYER2/RLC/rlc_mac.c b/openair2/LAYER2/RLC/rlc_mac.c index 89cbe4c406c..0e1cb89fd71 100644 --- a/openair2/LAYER2/RLC/rlc_mac.c +++ b/openair2/LAYER2/RLC/rlc_mac.c @@ -425,8 +425,8 @@ rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind( /* Assumptions : for UE only */ /* At each TTI, Buffer Occupancy is first computed in mac_rlc_status_ind called by MAC ue_scheduler() function */ /* Then this function is called during MAC multiplexing ue_get_sdu(), and it may be call several times for the same bearer if it is in AM mode and there are several PDU types to transmit */ - //AssertFatal(enb_flagP == FALSE,"RLC Tx mac_rlc_get_buffer_occupancy_ind function is not implemented for eNB LcId=%d\n", channel_idP); - if(enb_flagP != FALSE) { + //AssertFatal(enb_flagP == false,"RLC Tx mac_rlc_get_buffer_occupancy_ind function is not implemented for eNB LcId=%d\n", channel_idP); + if(enb_flagP != false) { LOG_E(RLC, "Tx mac_rlc_get_buffer_occupancy_ind function is not implemented for eNB LcId=%u\n", channel_idP); return 0; } diff --git a/openair2/LAYER2/RLC/rlc_rrc.c b/openair2/LAYER2/RLC/rlc_rrc.c index 4313f379fe0..ed9af5efb25 100644 --- a/openair2/LAYER2/RLC/rlc_rrc.c +++ b/openair2/LAYER2/RLC/rlc_rrc.c @@ -480,7 +480,7 @@ rlc_op_status_t rrc_rlc_remove_rlc ( /* for no gcc warnings */ (void)lcid; - if (MBMS_flagP == TRUE) { + if (MBMS_flagP == true) { if (ctxt_pP->enb_flag) { lcid = rlc_mbms_enb_get_lcid_by_rb_id(ctxt_pP->module_id,rb_idP); mbms_id_p = &rlc_mbms_lcid2service_session_id_eNB[ctxt_pP->module_id][lcid]; @@ -581,7 +581,7 @@ rlc_union_t *rrc_rlc_add_rlc ( rlc_mbms_id_t *mbms_id_p = NULL; logical_chan_id_t lcid = 0; - if (MBMS_flagP == FALSE) { + if (MBMS_flagP == false) { //AssertFatal (rb_idP < NB_RB_MAX, "RB id is too high (%u/%d)!\n", rb_idP, NB_RB_MAX); //AssertFatal (chan_idP < RLC_MAX_LC, "LC id is too high (%u/%d)!\n", chan_idP, RLC_MAX_LC); if(rb_idP >= NB_RB_MAX) { @@ -595,7 +595,7 @@ rlc_union_t *rrc_rlc_add_rlc ( } } - if (MBMS_flagP == TRUE) { + if (MBMS_flagP == true) { if (ctxt_pP->enb_flag) { lcid = rlc_mbms_enb_get_lcid_by_rb_id(ctxt_pP->module_id,rb_idP); mbms_id_p = &rlc_mbms_lcid2service_session_id_eNB[ctxt_pP->module_id][lcid]; @@ -640,11 +640,11 @@ rlc_union_t *rrc_rlc_add_rlc ( } else if (h_rc == HASH_TABLE_KEY_NOT_EXISTS) { rlc_union_p = calloc(1, sizeof(rlc_union_t)); h_rc = hashtable_insert(rlc_coll_p, key, rlc_union_p); - if(MBMS_flagP != TRUE) + if(MBMS_flagP != true) h_lcid_rc = hashtable_insert(rlc_coll_p, key_lcid, rlc_union_p); if ((h_rc == HASH_TABLE_OK) && (h_lcid_rc == HASH_TABLE_OK)) { - if (MBMS_flagP == TRUE) { + if (MBMS_flagP == true) { LOG_I(RLC, PROTOCOL_CTXT_FMT" RLC service id %u session id %u rrc_rlc_add_rlc\n", PROTOCOL_CTXT_ARGS(ctxt_pP), mbms_id_p->service_id, diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c index 7e1ddb62bd8..480b651593f 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c @@ -27,6 +27,7 @@ #include "nr_pdcp_security_nea2.h" #include "nr_pdcp_integrity_nia2.h" +#include "nr_pdcp_integrity_nia1.h" #include "nr_pdcp_sdu.h" #include "LOG/log.h" @@ -240,16 +241,21 @@ static void nr_pdcp_entity_set_security(nr_pdcp_entity_t *entity, } if (integrity_algorithm != 0 && integrity_algorithm != -1) { - if (integrity_algorithm != 2) { - LOG_E(PDCP, "FATAL: only nia2 supported for the moment\n"); - exit(1); - } entity->has_integrity = 1; if (entity->free_integrity != NULL) entity->free_integrity(entity->integrity_context); - entity->integrity_context = nr_pdcp_integrity_nia2_init(entity->integrity_key); - entity->integrity = nr_pdcp_integrity_nia2_integrity; - entity->free_integrity = nr_pdcp_integrity_nia2_free_integrity; + if (integrity_algorithm == 2) { + entity->integrity_context = nr_pdcp_integrity_nia2_init(entity->integrity_key); + entity->integrity = nr_pdcp_integrity_nia2_integrity; + entity->free_integrity = nr_pdcp_integrity_nia2_free_integrity; + } else if (integrity_algorithm == 1) { + entity->integrity_context = nr_pdcp_integrity_nia1_init(entity->integrity_key); + entity->integrity = nr_pdcp_integrity_nia1_integrity; + entity->free_integrity = nr_pdcp_integrity_nia1_free_integrity; + } else { + LOG_E(PDCP, "FATAL: only nia1 and nia2 supported for the moment\n"); + exit(1); + } } if (ciphering_algorithm == 0) { diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c new file mode 100644 index 00000000000..08ec9599370 --- /dev/null +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c @@ -0,0 +1,66 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "nr_pdcp_integrity_nia1.h" + +#include <stdlib.h> +#include <string.h> +#include <stdint.h> +#include <openssl/cmac.h> + +#include "UTIL/OSA/osa_defs.h" + +int stream_compute_integrity_eia1(stream_cipher_t *stream_cipher, uint8_t out[4]); + +void *nr_pdcp_integrity_nia1_init(unsigned char *integrity_key) +{ + stream_cipher_t *ret; + + ret = calloc(1, sizeof(*ret)); if (ret == NULL) abort(); + ret->key = malloc(16); if (ret->key == NULL) abort(); + memcpy(ret->key, integrity_key, 16); + ret->key_length = 16; /* unused */ + + return ret; +} + +void nr_pdcp_integrity_nia1_integrity(void *integrity_context, + unsigned char *out, + unsigned char *buffer, int length, + int bearer, int count, int direction) +{ + stream_cipher_t *ctx = integrity_context; + + ctx->message = buffer; + ctx->count = count; + ctx->bearer = bearer-1; + ctx->direction = direction; + ctx->blength = length * 8; + + stream_compute_integrity_eia1(ctx, out); +} + +void nr_pdcp_integrity_nia1_free_integrity(void *integrity_context) +{ + stream_cipher_t *ctx = integrity_context; + free(ctx->key); + free(ctx); +} diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.h b/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.h new file mode 100644 index 00000000000..5c44bad4a7d --- /dev/null +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.h @@ -0,0 +1,34 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#ifndef _NR_PDCP_INTEGRITY_NIA1_H_ +#define _NR_PDCP_INTEGRITY_NIA1_H_ + +void *nr_pdcp_integrity_nia1_init(unsigned char *integrity_key); + +void nr_pdcp_integrity_nia1_integrity(void *integrity_context, + unsigned char *out, + unsigned char *buffer, int length, + int bearer, int count, int direction); + +void nr_pdcp_integrity_nia1_free_integrity(void *integrity_context); + +#endif /* _NR_PDCP_INTEGRITY_NIA1_H_ */ diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c index b5cea6bdb99..9598bf1ad6a 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c @@ -274,9 +274,8 @@ static void do_pdcp_data_ind( if (rb != NULL) { rb->recv_pdu(rb, (char *)sdu_buffer->data, sdu_buffer_size); } else { - LOG_E(PDCP, "%s:%d:%s: fatal: no RB found (rb_id %ld, srb_flag %d)\n", + LOG_E(PDCP, "%s:%d:%s: no RB found (rb_id %ld, srb_flag %d)\n", __FILE__, __LINE__, __FUNCTION__, rb_id, srb_flagP); - exit(1); } nr_pdcp_manager_unlock(nr_pdcp_ue_manager); @@ -360,15 +359,14 @@ static void enqueue_pdcp_data_ind( if (pthread_mutex_unlock(&pq.m) != 0) abort(); } -boolean_t pdcp_data_ind( - const protocol_ctxt_t *const ctxt_pP, - const srb_flag_t srb_flagP, - const MBMS_flag_t MBMS_flagP, - const rb_id_t rb_id, - const sdu_size_t sdu_buffer_size, - mem_block_t *const sdu_buffer, - const uint32_t *const srcID, - const uint32_t *const dstID) +bool pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP, + const srb_flag_t srb_flagP, + const MBMS_flag_t MBMS_flagP, + const rb_id_t rb_id, + const sdu_size_t sdu_buffer_size, + mem_block_t *const sdu_buffer, + const uint32_t *const srcID, + const uint32_t *const dstID) { enqueue_pdcp_data_ind(ctxt_pP, srb_flagP, @@ -439,7 +437,7 @@ static void *enb_tun_read_thread(void *_) ctxt.rnti = rnti; uint8_t qfi = 7; - boolean_t rqi = 0; + bool rqi = 0; int pdusession_id = 10; sdap_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED, @@ -485,7 +483,7 @@ static void *ue_tun_read_thread(void *_) ctxt.rnti = rnti; - boolean_t dc = SDAP_HDR_UL_DATA_PDU; + bool dc = SDAP_HDR_UL_DATA_PDU; uint8_t qfi = 7; int pdusession_id = 10; @@ -859,7 +857,7 @@ void pdcp_run(const protocol_ctxt_t *const ctxt_pP) RRC_DCCH_DATA_REQ(msg_p).mode, NULL, NULL); - if (result != TRUE) + if (result != true) LOG_E(PDCP, "PDCP data request failed!\n"); result = itti_free(ITTI_MSG_ORIGIN_ID(msg_p), RRC_DCCH_DATA_REQ(msg_p).sdu_p); AssertFatal(result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); @@ -951,7 +949,7 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s, int has_sdap = 0; int has_sdapULheader=0; int has_sdapDLheader=0; - boolean_t is_sdap_DefaultDRB = false; + bool is_sdap_DefaultDRB = false; NR_QFI_t *mappedQFIs2Add = NULL; uint8_t mappedQFIs2AddCount=0; if (s->cnAssociation->present == NR_DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity) @@ -977,11 +975,6 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s, exit(1); } - if (drb_id != 1) { - LOG_E(PDCP, "%s:%d:%s: fatal, bad drb id %d\n", - __FILE__, __LINE__, __FUNCTION__, drb_id); - exit(1); - } nr_pdcp_manager_lock(nr_pdcp_ue_manager); ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rnti); @@ -1039,20 +1032,18 @@ static void add_drb(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s, LOG_I(PDCP, "%s:%s:%d: added DRB for UE RNTI %x\n", __FILE__, __FUNCTION__, __LINE__, rnti); } -boolean_t nr_rrc_pdcp_config_asn1_req( - const protocol_ctxt_t *const ctxt_pP, - NR_SRB_ToAddModList_t *const srb2add_list, - NR_DRB_ToAddModList_t *const drb2add_list, - NR_DRB_ToReleaseList_t *const drb2release_list, - const uint8_t security_modeP, - uint8_t *const kRRCenc, - uint8_t *const kRRCint, - uint8_t *const kUPenc, - uint8_t *const kUPint - ,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9 - ,rb_id_t *const defaultDRB, - struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list) - //struct NR_RLC_Config *rlc_Config) +bool nr_rrc_pdcp_config_asn1_req(const protocol_ctxt_t *const ctxt_pP, + NR_SRB_ToAddModList_t *const srb2add_list, + NR_DRB_ToAddModList_t *const drb2add_list, + NR_DRB_ToReleaseList_t *const drb2release_list, + const uint8_t security_modeP, + uint8_t *const kRRCenc, + uint8_t *const kRRCint, + uint8_t *const kUPenc, + uint8_t *const kUPint, + LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9, + rb_id_t *const defaultDRB, + struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list) { int rnti = ctxt_pP->rnti; int i; @@ -1110,17 +1101,16 @@ boolean_t nr_rrc_pdcp_config_asn1_req( } /* Dummy function due to dependency from LTE libraries */ -boolean_t rrc_pdcp_config_asn1_req( - const protocol_ctxt_t *const ctxt_pP, - LTE_SRB_ToAddModList_t *const srb2add_list, - LTE_DRB_ToAddModList_t *const drb2add_list, - LTE_DRB_ToReleaseList_t *const drb2release_list, - const uint8_t security_modeP, - uint8_t *const kRRCenc, - uint8_t *const kRRCint, - uint8_t *const kUPenc - ,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9 - ,rb_id_t *const defaultDRB) +bool rrc_pdcp_config_asn1_req(const protocol_ctxt_t *const ctxt_pP, + LTE_SRB_ToAddModList_t *const srb2add_list, + LTE_DRB_ToAddModList_t *const drb2add_list, + LTE_DRB_ToReleaseList_t *const drb2release_list, + const uint8_t security_modeP, + uint8_t *const kRRCenc, + uint8_t *const kRRCint, + uint8_t *const kUPenc, + LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9, + rb_id_t *const defaultDRB) { return 0; } @@ -1225,8 +1215,7 @@ uint64_t get_pdcp_optmask(void) return pdcp_optmask; } -boolean_t pdcp_remove_UE( - const protocol_ctxt_t *const ctxt_pP) +bool pdcp_remove_UE(const protocol_ctxt_t *const ctxt_pP) { int rnti = ctxt_pP->rnti; @@ -1281,13 +1270,12 @@ void pdcp_config_set_security( nr_pdcp_manager_unlock(nr_pdcp_ue_manager); } -static boolean_t pdcp_data_req_srb( - protocol_ctxt_t *ctxt_pP, - const rb_id_t rb_id, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer) +static bool pdcp_data_req_srb(protocol_ctxt_t *ctxt_pP, + const rb_id_t rb_id, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer) { LOG_D(PDCP, "%s() called, size %d\n", __func__, sdu_buffer_size); nr_pdcp_ue_t *ue; @@ -1328,13 +1316,12 @@ static boolean_t pdcp_data_req_srb( } -static boolean_t pdcp_data_req_drb( - protocol_ctxt_t *ctxt_pP, - const rb_id_t rb_id, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer) +static bool pdcp_data_req_drb(protocol_ctxt_t *ctxt_pP, + const rb_id_t rb_id, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer) { LOG_D(PDCP, "%s() called, size %d\n", __func__, sdu_buffer_size); nr_pdcp_ue_t *ue; @@ -1374,19 +1361,16 @@ static boolean_t pdcp_data_req_drb( return 1; } -boolean_t cu_f1u_data_req( - protocol_ctxt_t *ctxt_pP, - const srb_flag_t srb_flagP, - const rb_id_t rb_id, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer, - const pdcp_transmission_mode_t mode - ,const uint32_t *const sourceL2Id - ,const uint32_t *const destinationL2Id - ) { - +bool cu_f1u_data_req(protocol_ctxt_t *ctxt_pP, + const srb_flag_t srb_flagP, + const rb_id_t rb_id, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t mode, + const uint32_t *const sourceL2Id, + const uint32_t *const destinationL2Id) { //Force instance id to 0, OAI incoherent instance management ctxt_pP->instance=0; mem_block_t *memblock = get_free_mem_block(sdu_buffer_size, __func__); @@ -1403,18 +1387,16 @@ boolean_t cu_f1u_data_req( return ret; } -boolean_t pdcp_data_req( - protocol_ctxt_t *ctxt_pP, - const srb_flag_t srb_flagP, - const rb_id_t rb_id, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer, - const pdcp_transmission_mode_t mode - ,const uint32_t *const sourceL2Id - ,const uint32_t *const destinationL2Id - ) +bool pdcp_data_req(protocol_ctxt_t *ctxt_pP, + const srb_flag_t srb_flagP, + const rb_id_t rb_id, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t mode, + const uint32_t *const sourceL2Id, + const uint32_t *const destinationL2Id) { if (srb_flagP) { return pdcp_data_req_srb(ctxt_pP, rb_id, muiP, confirmP, sdu_buffer_size, sdu_buffer); diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity.c index fefe2fc77d4..1883bbdd6cc 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_entity.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity.c @@ -77,14 +77,15 @@ nr_rlc_entity_t *new_nr_rlc_entity_am( ret->sn_modulus = 1 << ret->sn_field_length; ret->window_size = ret->sn_modulus / 2; - ret->common.recv_pdu = nr_rlc_entity_am_recv_pdu; - ret->common.buffer_status = nr_rlc_entity_am_buffer_status; - ret->common.generate_pdu = nr_rlc_entity_am_generate_pdu; - ret->common.recv_sdu = nr_rlc_entity_am_recv_sdu; - ret->common.set_time = nr_rlc_entity_am_set_time; - ret->common.discard_sdu = nr_rlc_entity_am_discard_sdu; - ret->common.reestablishment = nr_rlc_entity_am_reestablishment; - ret->common.delete = nr_rlc_entity_am_delete; + ret->common.recv_pdu = nr_rlc_entity_am_recv_pdu; + ret->common.buffer_status = nr_rlc_entity_am_buffer_status; + ret->common.generate_pdu = nr_rlc_entity_am_generate_pdu; + ret->common.recv_sdu = nr_rlc_entity_am_recv_sdu; + ret->common.set_time = nr_rlc_entity_am_set_time; + ret->common.discard_sdu = nr_rlc_entity_am_discard_sdu; + ret->common.reestablishment = nr_rlc_entity_am_reestablishment; + ret->common.delete = nr_rlc_entity_am_delete; + ret->common.available_tx_space = nr_rlc_entity_am_available_tx_space; ret->common.deliver_sdu = deliver_sdu; ret->common.deliver_sdu_data = deliver_sdu_data; @@ -127,14 +128,15 @@ nr_rlc_entity_t *new_nr_rlc_entity_um( ret->sn_modulus = 1 << ret->sn_field_length; ret->window_size = ret->sn_modulus / 2; - ret->common.recv_pdu = nr_rlc_entity_um_recv_pdu; - ret->common.buffer_status = nr_rlc_entity_um_buffer_status; - ret->common.generate_pdu = nr_rlc_entity_um_generate_pdu; - ret->common.recv_sdu = nr_rlc_entity_um_recv_sdu; - ret->common.set_time = nr_rlc_entity_um_set_time; - ret->common.discard_sdu = nr_rlc_entity_um_discard_sdu; - ret->common.reestablishment = nr_rlc_entity_um_reestablishment; - ret->common.delete = nr_rlc_entity_um_delete; + ret->common.recv_pdu = nr_rlc_entity_um_recv_pdu; + ret->common.buffer_status = nr_rlc_entity_um_buffer_status; + ret->common.generate_pdu = nr_rlc_entity_um_generate_pdu; + ret->common.recv_sdu = nr_rlc_entity_um_recv_sdu; + ret->common.set_time = nr_rlc_entity_um_set_time; + ret->common.discard_sdu = nr_rlc_entity_um_discard_sdu; + ret->common.reestablishment = nr_rlc_entity_um_reestablishment; + ret->common.delete = nr_rlc_entity_um_delete; + ret->common.available_tx_space = nr_rlc_entity_um_available_tx_space; ret->common.deliver_sdu = deliver_sdu; ret->common.deliver_sdu_data = deliver_sdu_data; @@ -158,14 +160,15 @@ nr_rlc_entity_t *new_nr_rlc_entity_tm( ret->tx_maxsize = tx_maxsize; - ret->common.recv_pdu = nr_rlc_entity_tm_recv_pdu; - ret->common.buffer_status = nr_rlc_entity_tm_buffer_status; - ret->common.generate_pdu = nr_rlc_entity_tm_generate_pdu; - ret->common.recv_sdu = nr_rlc_entity_tm_recv_sdu; - ret->common.set_time = nr_rlc_entity_tm_set_time; - ret->common.discard_sdu = nr_rlc_entity_tm_discard_sdu; - ret->common.reestablishment = nr_rlc_entity_tm_reestablishment; - ret->common.delete = nr_rlc_entity_tm_delete; + ret->common.recv_pdu = nr_rlc_entity_tm_recv_pdu; + ret->common.buffer_status = nr_rlc_entity_tm_buffer_status; + ret->common.generate_pdu = nr_rlc_entity_tm_generate_pdu; + ret->common.recv_sdu = nr_rlc_entity_tm_recv_sdu; + ret->common.set_time = nr_rlc_entity_tm_set_time; + ret->common.discard_sdu = nr_rlc_entity_tm_discard_sdu; + ret->common.reestablishment = nr_rlc_entity_tm_reestablishment; + ret->common.delete = nr_rlc_entity_tm_delete; + ret->common.available_tx_space = nr_rlc_entity_tm_available_tx_space; ret->common.deliver_sdu = deliver_sdu; ret->common.deliver_sdu_data = deliver_sdu_data; diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity.h b/openair2/LAYER2/nr_rlc/nr_rlc_entity.h index b9b638fe078..5cd3bee6508 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_entity.h +++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity.h @@ -50,6 +50,8 @@ typedef struct nr_rlc_entity_t { void (*delete)(struct nr_rlc_entity_t *entity); + int (*available_tx_space)(struct nr_rlc_entity_t *entity); + /* callbacks provided to the RLC module */ void (*deliver_sdu)(void *deliver_sdu_data, struct nr_rlc_entity_t *entity, char *buf, int size); diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c index 2382db267fe..91e2bed11ae 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c @@ -1910,3 +1910,9 @@ void nr_rlc_entity_am_delete(nr_rlc_entity_t *_entity) clear_entity(entity); free(entity); } + +int nr_rlc_entity_am_available_tx_space(nr_rlc_entity_t *_entity) +{ + nr_rlc_entity_am_t *entity = (nr_rlc_entity_am_t *)_entity; + return entity->tx_maxsize - entity->tx_size; +} diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h index 57ae1a34856..4c626c4826b 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h +++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h @@ -99,5 +99,6 @@ void nr_rlc_entity_am_set_time(nr_rlc_entity_t *entity, uint64_t now); void nr_rlc_entity_am_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id); void nr_rlc_entity_am_reestablishment(nr_rlc_entity_t *_entity); void nr_rlc_entity_am_delete(nr_rlc_entity_t *entity); +int nr_rlc_entity_am_available_tx_space(nr_rlc_entity_t *entity); #endif /* _NR_RLC_ENTITY_AM_H_ */ diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c index 75408276d18..f85edbba0ff 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c @@ -174,3 +174,9 @@ void nr_rlc_entity_tm_delete(nr_rlc_entity_t *_entity) clear_entity(entity); free(entity); } + +int nr_rlc_entity_tm_available_tx_space(nr_rlc_entity_t *_entity) +{ + nr_rlc_entity_tm_t *entity = (nr_rlc_entity_tm_t *)_entity; + return entity->tx_maxsize - entity->tx_size; +} diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.h b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.h index 7c8c7e40a01..79187037999 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.h +++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.h @@ -51,5 +51,6 @@ void nr_rlc_entity_tm_set_time(nr_rlc_entity_t *entity, uint64_t now); void nr_rlc_entity_tm_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id); void nr_rlc_entity_tm_reestablishment(nr_rlc_entity_t *_entity); void nr_rlc_entity_tm_delete(nr_rlc_entity_t *entity); +int nr_rlc_entity_tm_available_tx_space(nr_rlc_entity_t *entity); #endif /* _NR_RLC_ENTITY_TM_H_ */ diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c index b34a7dc8941..5f2fd592a06 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c @@ -695,3 +695,9 @@ void nr_rlc_entity_um_delete(nr_rlc_entity_t *_entity) clear_entity(entity); free(entity); } + +int nr_rlc_entity_um_available_tx_space(nr_rlc_entity_t *_entity) +{ + nr_rlc_entity_um_t *entity = (nr_rlc_entity_um_t *)_entity; + return entity->tx_maxsize - entity->tx_size; +} diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.h b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.h index 21063a1ea18..c40e72ada1d 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.h +++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.h @@ -75,5 +75,6 @@ void nr_rlc_entity_um_set_time(nr_rlc_entity_t *entity, uint64_t now); void nr_rlc_entity_um_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id); void nr_rlc_entity_um_reestablishment(nr_rlc_entity_t *_entity); void nr_rlc_entity_um_delete(nr_rlc_entity_t *entity); +int nr_rlc_entity_um_available_tx_space(nr_rlc_entity_t *entity); #endif /* _NR_RLC_ENTITY_UM_H_ */ diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c index 0a8e03fc1e8..4bd4ea75fd7 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c @@ -101,6 +101,7 @@ void nr_drb_config(struct NR_RLC_Config *rlc_Config, NR_RLC_Config_PR rlc_config switch (rlc_config_pr){ case NR_RLC_Config_PR_um_Bi_Directional: // RLC UM Bi-directional Bearer configuration + LOG_I(RLC, "RLC UM Bi-directional Bearer configuration selected \n"); rlc_Config->choice.um_Bi_Directional = calloc(1, sizeof(*rlc_Config->choice.um_Bi_Directional)); rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = calloc(1, sizeof(*rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)); *rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NR_SN_FieldLengthUM_size12; @@ -123,7 +124,7 @@ void nr_drb_config(struct NR_RLC_Config *rlc_Config, NR_RLC_Config_PR rlc_config rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms15; break; default: - LOG_E (RLC, "Error in %s: RLC config type %d is not handled\n", __FUNCTION__, rlc_config_pr); + AssertFatal(0, "RLC config type %d not handled\n", rlc_config_pr); break; } @@ -213,10 +214,12 @@ tbs_size_t mac_rlc_data_req( } if (rb != NULL) { + LOG_D(RLC, "MAC PDU to get created for channel_idP:%d \n", channel_idP); rb->set_time(rb, nr_rlc_current_time); maxsize = tb_sizeP; ret = rb->generate_pdu(rb, buffer_pP, maxsize); } else { + LOG_D(RLC, "MAC PDU failed to get created for channel_idP:%d \n", channel_idP); ret = 0; } @@ -394,6 +397,35 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t *const ctxt_pP, return RLC_OP_STATUS_OK; } +int nr_rlc_get_available_tx_space( + const rnti_t rntiP, + const logical_chan_id_t channel_idP) +{ + nr_rlc_ue_t *ue; + nr_rlc_entity_t *rb; + int ret; + + nr_rlc_manager_lock(nr_rlc_ue_manager); + ue = nr_rlc_manager_get_ue(nr_rlc_ue_manager, rntiP); + + switch (channel_idP) { + case 1 ... 3: rb = ue->srb[channel_idP - 1]; break; + case 4 ... 8: rb = ue->drb[channel_idP - 4]; break; + default: rb = NULL; break; + } + + if (rb != NULL) { + ret = rb->available_tx_space(rb); + } else { + LOG_E(RLC, "[%s] Radio Bearer (channel ID %d) is NULL for UE with rntiP %x\n", __FUNCTION__, channel_idP, rntiP); + ret = -1; + } + + nr_rlc_manager_unlock(nr_rlc_ue_manager); + + return ret; +} + int rlc_module_init(int enb_flag) { static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h index 6b3c2281637..92fbba9bec8 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h +++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h @@ -46,4 +46,8 @@ void nr_rlc_bearer_init(NR_RLC_BearerConfig_t *RLC_BearerConfig, NR_RLC_BearerCo void nr_drb_config(struct NR_RLC_Config *rlc_Config, NR_RLC_Config_PR rlc_config_pr); -void nr_rlc_bearer_init_ul_spec(struct NR_LogicalChannelConfig *mac_LogicalChannelConfig); \ No newline at end of file +void nr_rlc_bearer_init_ul_spec(struct NR_LogicalChannelConfig *mac_LogicalChannelConfig); + +int nr_rlc_get_available_tx_space( + const rnti_t rntiP, + const logical_chan_id_t channel_idP); diff --git a/openair2/LAYER2/nr_rlc/tests/test14.txt.gz b/openair2/LAYER2/nr_rlc/tests/test14.txt.gz index 45e54651eb317c3b7695cfcab7428fe43172227b..53cea67c98d98e91baa4bfcd40518b523ef5a21f 100644 GIT binary patch delta 703 zcmV;w0zmzr29pMVABzYGiZ!%i0t0kqb96B@E_8Tw0Ns{5ZyZMugmeFjFSHY3X1eFa zP_W?4iKxghh<OSG2*bFC{P^|SJA#JqaN>z#awlMcouFr?x~jT%Z{NMYy<xp6tIZF$ z`}K!+H`p6iqkXzt_bor(cg#;q&HcXvZ*KSvV=xxuFoIEkjK>5_#3W3{6imf5%(8J{ zCe~mr)?o#!SdR_Zh)vjxE!c`}*p408i8DBhb2z~%&f@|u;u0?73a;WBuHy!7A_lR) zAL9Qw{uryW8Fzp7?Gt#}fp2Dy-&}qd?nniDsDd~|5Jfx^kccECBL%5QLpm~$i5k?R z4i!{Uj|Mb<q6y7tK`YwOjt+D#=i@EjEsWt6@9_a2@d=;t1z+(E-|-8WNiYOUa0EHR ze@+E^*<Jkd>)U-BeLUQM8Y|xa{NYJ~YY;$=4CD?C6qMizfe;CakO_rQ360PRgD{DP zXo-#}L?wD+AVy*$W?~^$Vk36qAWo7YS&}0ONlBhS6iAVjNSRbfmDEU`G)R+d$d>HL zLRPXrpnhqfZs#1UyCtDE+x0%FmiOJh3t{v3<H{_3{<l6l;DiO`Da3Zqlf40Ae_!iZ zeVJqRykq4$XglrL%ZKh?tGNGq#rO5$*$d6H7w#<cn*ERQl1?HH|3e&3$7}j7{>wBU zrIa3~R7<o>E3`^$v`!neNjG#$cXXjE-O~d-(i1(?3%$}Cy)UyspA5sW495_LGCU(N zA|o*}qcAF?F*;)~Cetu2(=mmqbxh9;%*ag4eB8h}9rUu>cubA_rP#Q9>^rMGGlt<S za>IP%7@oQMbOLxeI^oI(c~4>T-$>yXHeMwGrzhwNu!nOWPOAr+E%mz|4S$t2>uqae ly`I~Lhku?Z82!zOdi%n9_riL4VZA<E{~3X?UT)D5000p?OuGO8 delta 716 zcmV;-0yF)S2A>9hABzYGOnK#D0t0kqb96B@E_8Tw0Ns{LYhy<ch4=Xt-!j<@-Cfl$ zFGGgxvKh}R1k=x8Fd^tM$;_{xD;Xz9Xe>M4NCCm^MOEKZ=bSpax9>mP-mu=3)#kg~ z{rThj8|)3M(LUX+`<CzTJLZR_=KjmTn;U+`7>va@j9?Uh<1qmfF$t3~1yeB%vosFO z#2T!{I;>z7>#+eFu?d^81zWKV+pz;XaRz5`4ktLpd0fCnT*75s!Bt$tb=<&B#31&! zL;SywKgOzT#@(NN`vhKg;G5awH<v$!J5s?Osvr&#L=le!Bq9mPNI@#nkd6#wq6W37 zLj_gTqXCV7XhJhu(26#+qXV7G{dkLa3uAc2dwjr0e8OjZ!B>34cl-io5)8o-96^ro zpHsnJ_7p$=^5cGtJ|6BrjTIk$`uL>4H3%R_26Bf63QF*VK!}7y$b>?ughuFuL6}5C zv_wY~q7pqZ5F;@WGqDgWu@O6Q5GToyEXk3Cq$E#33ZzI%q)aNLN@}D|8l*`!WJ`8r zAuHJ*P`?aNw{wow-I7q7?RuY7%kyqOg|PYi@nn`c|2ZFBaKeJ}6k@yIlf40Af8Xj@ zeVt?Vykq4$XglrL%ZKjYs<?l-;`{pW><i7aFWgz?E&Y%2l1?HH{~}&Kl1|3!(zuh? z@>f~2-nKT@>$!b+`23{)=<iO{yI0oBE9(CT--()!Qd198vn5)l6<Vb=TBi-#q#L@W zJG#)7?&*OZ>4~1{g<k26-WT@hf0JPtmf;w}P=;p&Mr0&LW)wzcG)89(#$+0%WjdxX zmFby*8JUThj|VuXgI@L+k13YF6=Ro=eP@+tVj;XB$IRJS2q$A<*SMogU%0kspq@@J yFGn|A`Qq;>PyRnr{*A_~B;fSMT><uR?vLN<fo9=xP0X`v@)b>eEYZ;s0ssI@?OqfB diff --git a/openair2/LAYER2/nr_rlc/tests/test15.txt.gz b/openair2/LAYER2/nr_rlc/tests/test15.txt.gz index ddb895d56f0fe88f0ceffb9a100359413292f2b7..61fa01663479944ed13d1c30ee2c3adbe5a70cb1 100644 GIT binary patch literal 547 zcmV+;0^I!{iwFpnHMC*^19W9`bTKt9ba-?C&6Q1WQ!x-l_xy^pgbnhH$6r|@Dt2tz zt`MsHp8Zgz3ZbMaf?rRPCa8gss7RDbmgR-VI(K}peQ|bvF=KIC=eI8|HtToq-^`F1 z^FH2PE!vWo*A4e-wdwkMC%73Oa1JLp#d)0J0xsebF5?QW;s)G^TNQTPgg8VHMLc3i zKq8Wmj1;6I12Q5F>BxjSR8U1dYG^<sn$V0Ew4wt#q7Cingm-xPcuauo3-F5fc*6&L z#3y{l7ktGJ_z~am9Y0|X6HGCW85XdJB`jkFtJr{zSi?Ftt<EP1K?$B<gg}UdM973f zsDyzq5*lFzGZ7t8h)VQF1?awjXv9E_#6--*LafArI1(GN6DN`*2}wzwWTZffq(sW3 zLaL;JG?E&rlP0nw3t7pYY~(<W<V4QoLayY2Jdzu^lP8L!2t_HLVwCW!fKUB%pV!-d z^`$Mh^tPd2Rl1+!>5R0;rw92Yulec&zP0%t?>~Q9y*#lC_xS9zdfBS~3-gB4>h*~& zyvG-hsP8+zd-acV{^i-`@YZjx@A{ncx0k!nKKIOS$q%%}?_T`%c({FipNHBg4+`pb zu?pyYKiBgr=(_Jl`B!1waLS)<<oW+&rbnXG{_jJw>8<{$x6k^E-Jzeb`}o^ktTj5m l)&+~@IQGS2THf4z+qIy#*M|z^u?2dx;0IK+b^){r001`Y7gzuQ literal 554 zcmV+_0@eK=iwFo<dF5dO19W9`bTKt9ba-?C&6Q7Y6EP6Q?|h2i5iZCx9{<Y`QE}ta z_JmNiyY`|=6+%f<1fQPWG(iot2}Pn*vMe7wqxastXP=#%o-J5icgyP+XPfi8_iq-+ zf@K?SE>?BT%gc&;HC?*=-Ux2N2b{wRPH`S*xPXhegv+>s>u^18z)gh>HzE!ZL=le| z5|D@_BqIgskRBP3iZo<I9V)1z9yK(e5lv`D3)-PQI-nJ8=!kcC`FMzc>=W>c_jtnx ze8eYw#ut2t@9_h^;v0U%9444z9y2Up5ldLc3f5sgHeeNN*f{kk2tf&+V1z)3gha@M zLg)xRVIWk(1ZE^Uq7aqn4-(LQ0?~+p7>S9PiG|n^d*VQ>#6}!RjwB={d6JO=DUuQ? zlM1OL^`wDRNsTm;9a+dq_GBXmawI2mCKqx??#TnWk{fxXIEqk|;weT6zY_S=KDT9e z-7db=^%lKt&`*`_=XyFL?cvjV@kyTXb$9U1=6k&V{Bid3#4g;!XUEygmi=FtHymfL zPi)~meDMJLw!?SJ{&CJfKiM>|?dtNTEjfLAz6<Sh&+HcYJ+k=Si$AZs*XMcOC!^dc zXxqaS&|5v{eG0nnyK(9?Yo&bcR;<>;&{nH)eRcJ1CuOUz_X^}+rFTP29vb2E|M*M~ sWUv0;muI7`KBVol{*!mmkK|+cZ5A^}_s6#07RbSZA0L&&0<;ML09iH+!vFvP diff --git a/openair2/LAYER2/nr_rlc/tests/test8.txt.gz b/openair2/LAYER2/nr_rlc/tests/test8.txt.gz index c20d43c63b331c2de77e0484922c1b0c1957eb7c..461ae1aebad7294daa7445179da725cbe6e722d0 100644 GIT binary patch literal 319 zcmV-F0l@wriwFpCHMC*^19W9`bT}?_cys{Gl1od&P!NUp{T1I*H!?GMG|5sd?%cFp ziIhBUq)<eXrlP;z-rA^<TBLL#+{InY%sJngnN6m%jCP$j>(OlYzrDN8(2T~Fn?+l7 zTr4Z(a$B@~b3~GHj|ifOApsI15fUR~BtcRnM+&4wwv7&{Q9%_oG(bZ%LSuA{CTNQ0 zXn~e!g*vpx1XIkg01L4Qi?K15U@4Yk1y*7e=CGPT2=w6xz@vL|O}=)E=c?PgH}mdO z*#Vr+Fi^51N=2{ap-<r+C<O<VH1<laSMovqJ*)ZTx3NLLXa5G}>B0K+>n@Uyu5b_T zO$|XpIg(j@uFSkyuT;6!a^o7NH}n36|N9B|){pH)zwPBSRnI8A<SlJimac8<Znb*t RBXHH#=p9vUZtd{{0029ZoQ(hg literal 319 zcmV-F0l@wriwFp@Gp1nz19W9`bT}?_cys{GlDkgBKoCXye8nlDK{Mk=Y?p|LjwVTk zP~^uNMT!uz;~@BYvLObHLWH6eNLy@iXYW0Cb~c&LGTL?CtVgrm{r2uULo*szZWe9T zaj~qB%dKen=7=QY9uY(lLjoj3A|yt}NP?tDjuc3VYzG}uqk<}GXn=-jgvRI?P0$q0 z(E=^e3Uz3W38t7~0TyBr7Gq;9!BQ;83arE`%waWw5a`1XfJgV_ntbgR&sDciZ|2jd zvI97sVc=v(oQmGbL!ZJua0(7OY3!X`@8pa6dsp+xZ_ft(p8Xlf(}Vi-OP_p9g?n%x zY6ud_k<RLKb>_o*r^>CC8`m(snfHJAzklIA`mw#}x4nF}>KTQXyru2R(zR{ftyZsn R1+Kapy#sK9u$l1#007C*o1g#y diff --git a/openair2/LAYER2/nr_rlc/tests/test9.txt.gz b/openair2/LAYER2/nr_rlc/tests/test9.txt.gz index 27590b7d71c435e04cd19603d90cc0c9c0798597..938fcd6ddcb9a2bcf4bbd2206725a7c35e2a2b79 100644 GIT binary patch delta 298 zcmV+_0oDGz0=xnUABzYGfi<*Zkq8}sNt-Oi;?7Oml}O3YL<&VDX)5~kc8Y;UYo+2s zn8hsS&iT$aGoQ}p8SN%-Hlz7|e|vYGp&5-Yx68KbxL8%l<?hhx%@a$;JtBxAhBzcb zVkAMv$OK7|94U|z*$sN6Mg>*WP=`inj3($9ouDb2qXk-`73$F%6HGC~92Q}JF_vIs zY=Wg&julvmRhY+WoZ$4~lfa{Y@=d<+%jc^5NN*O>r?MB2Uuz6Vc7jwKkb?Tz_5+eT zO42lt`~fL6c5Z2l>38?L{=vf<98Ztuk%NJxm+vbG@rG8BoG7sVs{%vdK&t$Dwe=0N wn??Vj|NDRLqyO+W(U(?(qwta$x3pbZ`nIjR_4>81z*kqJcO1rN|Na9207W#H^#A|> delta 298 zcmV+_0oDGz0=xnUABzYG2sNf*kq8}sX`3v?;?7Oml}O3YL;^)5X)5~kc8Y;UYo+2s zn8hsS&iT$avzW~nDeWd}HlxLUe|vYGqA86pwyU=6xTs6ya(AeH^Td*Jj|ifOAr6U< z7#SlIWQrt6hU7?r>;^qjp@J%Es6!((M#ty`ouUbvp*dQhCF;=%6HGC~92Q}JF*e2~ z*c3~!49l?sD>08%IKk<|CxJ)*<eO~cSI=elk=`t%Ph>A3zt$L#>;x%4AO-ca?FS@x zl%z=@`2$jD?A+3pv+wSA{ey=!IG!BOBL@T4%l8$8ctfj5P83-ERe>RJAeDYyZ+*l3 wX4!w}|Nfu*=s&zo^rh9{D7<7DEp1m6zHO^+y?*U0@a5I$9m#xc_x=L_0Q8xU(f|Me diff --git a/openair2/LAYER2/rlc_v2/rlc_oai_api.c b/openair2/LAYER2/rlc_v2/rlc_oai_api.c index 2a6f00c13c4..11ae770e3ec 100644 --- a/openair2/LAYER2/rlc_v2/rlc_oai_api.c +++ b/openair2/LAYER2/rlc_v2/rlc_oai_api.c @@ -1065,3 +1065,15 @@ void du_rlc_data_req(const protocol_ctxt_t *const ctxt_pP, sdu_sizeP, sdu_pP, NULL, NULL); } + +/* HACK to be removed: nr_rlc_get_available_tx_space is needed by + * openair3/ocp-gtpu/gtp_itf.cpp which is compiled in lte-softmodem + * so let's put a dummy nr_rlc_get_available_tx_space here + */ +int nr_rlc_get_available_tx_space( + const rnti_t rntiP, + const logical_chan_id_t channel_idP) +{ + abort(); + return 0; +} diff --git a/openair2/M2AP/m2ap_common.h b/openair2/M2AP/m2ap_common.h index 95da064b4ab..0a6895fcb7f 100644 --- a/openair2/M2AP/m2ap_common.h +++ b/openair2/M2AP/m2ap_common.h @@ -55,11 +55,6 @@ # define M2AP_PORT 36423 #endif -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif - extern int asn1_xer_print; #if defined(ENB_MODE) diff --git a/openair2/NETWORK_DRIVER/MESH/device.c b/openair2/NETWORK_DRIVER/MESH/device.c index f63408259c8..d86e32e5618 100644 --- a/openair2/NETWORK_DRIVER/MESH/device.c +++ b/openair2/NETWORK_DRIVER/MESH/device.c @@ -198,7 +198,8 @@ int nas_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) // End debug information netif_stop_queue(dev); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE>=1796) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) \ + || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403) netif_trans_update(dev); #else dev->trans_start = jiffies; @@ -267,7 +268,8 @@ void nas_tx_timeout(struct net_device *dev) printk("TX_TIMEOUT: begin\n"); // (struct nas_priv *)(dev->priv)->stats.tx_errors++; (priv->stats).tx_errors++; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE>=1796) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) \ + || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403) netif_trans_update(dev); #else dev->trans_start = jiffies; @@ -285,7 +287,8 @@ static const struct net_device_ops nasmesh_netdev_ops = { .ndo_set_mac_address = NULL, .ndo_set_config = nas_set_config, .ndo_do_ioctl = nas_CTL_ioctl, -#if (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE>=1797 && LINUX_VERSION_CODE <= KERNEL_VERSION(3,11,0)) +#if LINUX_VERSION_CODE <= KERNEL_VERSION(3,11,0) \ + || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1797 && RHEL_RELEASE_CODE != 2403) .extended.ndo_change_mtu = nas_change_mtu, #else .ndo_change_mtu = nas_change_mtu, diff --git a/openair2/NETWORK_DRIVER/UE_IP/device.c b/openair2/NETWORK_DRIVER/UE_IP/device.c index 0ff9a739257..bf858a0005d 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/device.c +++ b/openair2/NETWORK_DRIVER/UE_IP/device.c @@ -239,7 +239,8 @@ int ue_ip_hard_start_xmit(struct sk_buff *skb_pP, struct net_device *dev_pP) { // End debug information netif_stop_queue(dev_pP); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) \ + || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403) netif_trans_update(dev_pP); #else dev_pP->trans_start = jiffies; @@ -315,7 +316,8 @@ void ue_ip_tx_timeout(struct net_device *dev_pP) printk("[UE_IP_DRV][%s] begin\n", __FUNCTION__); // (ue_ip_priv_t *)(dev_pP->priv_p)->stats.tx_errors++; (priv_p->stats).tx_errors++; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) \ + || (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1796 && RHEL_RELEASE_CODE != 2403) netif_trans_update(dev_pP); #else dev_pP->trans_start = jiffies; @@ -333,7 +335,7 @@ static const struct net_device_ops ue_ip_netdev_ops = { .ndo_set_mac_address = ue_ip_set_mac_address, .ndo_set_config = ue_ip_set_config, .ndo_do_ioctl = NULL, -#if (defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1797) +#if defined RHEL_RELEASE_CODE && RHEL_RELEASE_CODE >= 1797 && RHEL_RELEASE_CODE != 2403 .extended.ndo_change_mtu = ue_ip_change_mtu, #else .ndo_change_mtu = ue_ip_change_mtu, diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c index c860d847d95..47705082d1c 100644 --- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c @@ -77,7 +77,7 @@ void handle_nr_rach(NR_UL_IND_t *UL_info) bool in_timewindow = frame_diff == 0 || (frame_diff == 1 && UL_info->slot < 7); if (UL_info->rach_ind.number_of_pdus > 0 && in_timewindow) { - LOG_D(MAC,"UL_info[Frame %d, Slot %d] Calling initiate_ra_proc RACH:SFN/SLOT:%d/%d\n", + LOG_A(MAC,"UL_info[Frame %d, Slot %d] Calling initiate_ra_proc RACH:SFN/SLOT:%d/%d\n", UL_info->frame, UL_info->slot, UL_info->rach_ind.sfn, UL_info->rach_ind.slot); for (int i = 0; i < UL_info->rach_ind.number_of_pdus; i++) { UL_info->rach_ind.number_of_pdus--; @@ -215,6 +215,41 @@ void handle_nr_ulsch(NR_UL_IND_t *UL_info) UL_info->crc_ind.number_crcs = 0; } +void handle_nr_srs(NR_UL_IND_t *UL_info) { + + if(NFAPI_MODE == NFAPI_MODE_PNF) { + if (UL_info->srs_ind.number_of_pdus > 0) { + LOG_D(PHY,"PNF Sending UL_info->srs_ind.number_of_pdus: %d, SFN/SF:%d.%d \n", + UL_info->srs_ind.number_of_pdus, UL_info->frame, UL_info->slot); + oai_nfapi_nr_srs_indication(&UL_info->srs_ind); + UL_info->srs_ind.number_of_pdus = 0; + } + return; + } + + const module_id_t module_id = UL_info->module_id; + const frame_t frame = UL_info->srs_ind.sfn; + const sub_frame_t slot = UL_info->srs_ind.slot; + const int num_srs = UL_info->srs_ind.number_of_pdus; + const nfapi_nr_srs_indication_pdu_t *srs_list = UL_info->srs_ind.pdu_list; + + for (int i = 0; i < num_srs; i++) { + const nfapi_nr_srs_indication_pdu_t *srs_ind = &srs_list[i]; + LOG_D(NR_PHY, "(%d.%d) UL_info->srs_ind.pdu_list[%d].rnti: 0x%04x\n", frame, slot, i, srs_ind->rnti); + handle_nr_srs_measurements(module_id, + frame, + slot, + srs_ind->rnti, + srs_ind->timing_advance, + srs_ind->num_symbols, + srs_ind->wide_band_snr, + srs_ind->num_reported_symbols, + srs_ind->reported_symbol_list); + } + + UL_info->srs_ind.number_of_pdus = 0; +} + static void free_unqueued_nfapi_indications(nfapi_nr_rach_indication_t *rach_ind, nfapi_nr_uci_indication_t *uci_ind, nfapi_nr_rx_data_indication_t *rx_ind, @@ -372,9 +407,6 @@ static void match_crc_rx_pdu(nfapi_nr_rx_data_indication_t *rx_ind, nfapi_nr_crc void NR_UL_indication(NR_UL_IND_t *UL_info) { AssertFatal(UL_info!=NULL,"UL_info is null\n"); -#ifdef DUMP_FAPI - dump_ul(UL_info); -#endif module_id_t module_id = UL_info->module_id; int CC_id = UL_info->CC_id; NR_Sched_Rsp_t *sched_info = &NR_Sched_INFO[module_id][CC_id]; @@ -434,6 +466,7 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) { // clear UL DCI prior to handling ULSCH mac->UL_dci_req[CC_id].numPdus = 0; handle_nr_ulsch(UL_info); + handle_nr_srs(UL_info); if (get_softmodem_params()->emulate_l1) { free_unqueued_nfapi_indications(rach_ind, uci_ind, rx_ind, crc_ind); diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index 958786df8b5..5c51c4a1cd1 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -67,17 +67,6 @@ queue_t nr_tx_req_queue; queue_t nr_ul_dci_req_queue; queue_t nr_ul_tti_req_queue; -static slot_rnti_mcs_s slot_rnti_mcs[NUM_NFAPI_SLOT]; - -//static int get_mcs_from_sinr(float sinr); -//static int get_cqi_from_mcs(void); -static void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int sf, int index); -//static bool did_drop_transport_block(int slot, uint16_t rnti); -static float get_bler_val(uint8_t mcs, int sinr); -static bool should_drop_transport_block(int slot, uint16_t rnti); -static void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request); -static inline bool is_channel_modeling(void); - void nrue_init_standalone_socket(int tx_port, int rx_port) { { @@ -940,7 +929,7 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea return; } -static void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request) +void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request) { int count_sent = 0; NR_UE_MAC_INST_t *mac = get_mac_inst(0); @@ -1115,6 +1104,10 @@ int8_t handle_dlsch(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *u return 0; } +int8_t handle_csirs_measurements(module_id_t module_id, frame_t frame, int slot, fapi_nr_csirs_measurements_t *csirs_measurements) { + return nr_ue_process_csirs_measurements(module_id, frame, slot, csirs_measurements); +} + void update_harq_status(module_id_t module_id, uint8_t harq_pid, uint8_t ack_nack) { NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); @@ -1240,7 +1233,7 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_ (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_length, (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_start_subcarrier, (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.cell_id)) << FAPI_NR_RX_PDU_TYPE_SSB; - free((dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.pdu); + free((dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.pdu); break; case FAPI_NR_RX_PDU_TYPE_SIB: ret_mask |= (handle_bcch_dlsch(dl_info->module_id, @@ -1255,6 +1248,12 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_ case FAPI_NR_RX_PDU_TYPE_RAR: ret_mask |= (handle_dlsch(dl_info, ul_time_alignment, i)) << FAPI_NR_RX_PDU_TYPE_RAR; break; + case FAPI_NR_CSIRS_IND: + ret_mask |= (handle_csirs_measurements(dl_info->module_id, + dl_info->frame, + dl_info->slot, + &(dl_info->rx_ind->rx_indication_body+i)->csirs_measurements)) << FAPI_NR_CSIRS_IND; + break; default: break; } @@ -1444,243 +1443,3 @@ void RCconfig_nrUE_prs(void *cfg) } } } - -/* -static int get_mcs_from_sinr(float sinr) -{ - if (sinr < (nr_bler_data[0].bler_table[0][0])) - { - LOG_D(NR_MAC, "The SINR found is smaller than first MCS table\n"); - return 0; - } - - if (sinr > (nr_bler_data[NR_NUM_MCS-1].bler_table[nr_bler_data[NR_NUM_MCS-1].length - 1][0])) - { - LOG_D(NR_MAC, "The SINR found is larger than last MCS table\n"); - return NR_NUM_MCS-1; - } - - for (int n = NR_NUM_MCS-1; n >= 0; n--) - { - CHECK_INDEX(nr_bler_data, n); - float largest_sinr = (nr_bler_data[n].bler_table[nr_bler_data[n].length - 1][0]); - float smallest_sinr = (nr_bler_data[n].bler_table[0][0]); - if (sinr < largest_sinr && sinr > smallest_sinr) - { - LOG_D(NR_MAC, "The SINR found in MCS %d table\n", n); - return n; - } - } - LOG_E(NR_MAC, "Unable to get an MCS value.\n"); - abort(); -} - -static int get_cqi_from_mcs(void) -{ - static const int mcs_to_cqi[] = {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, - 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15}; - assert(NUM_ELEMENTS(mcs_to_cqi) == NR_NUM_MCS); - int slot = 0; - while (slot < NUM_NFAPI_SLOT) - { - if (slot_rnti_mcs[slot].latest) - { - int num_pdus = slot_rnti_mcs[slot].num_pdus; - if (num_pdus <= 0) - { - LOG_E(NR_MAC, "%s: slot_rnti_mcs[%d].num_pdus = 0\n", __FUNCTION__, slot); - abort(); - } - - CHECK_INDEX(slot_rnti_mcs[slot].mcs, num_pdus); - int mcs = get_mcs_from_sinr(slot_rnti_mcs[slot].sinr); - CHECK_INDEX(mcs_to_cqi, mcs); - int cqi = mcs_to_cqi[mcs]; - LOG_D(NR_MAC, "SINR: %f -> MCS: %d -> CQI: %d\n", slot_rnti_mcs[slot].sinr, mcs, cqi); - return cqi; - } - slot++; - } - LOG_E(NR_MAC, "Unable to get CQI value because no MCS found\n"); - abort(); -} -*/ - -static void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int slot, int index) -{ - if (pdu == NULL) - { - LOG_E(NR_MAC,"PDU NULL\n"); - abort(); - } - - /* This function is executed for every pdsch pdu type in a dl_tti_request. We save - the assocaited MCS and RNTI value for each. The 'index' passed in is a count of - how many times we have called this function for a particular dl_tti_request. It - allows us to save MCS/RNTI data in correct indicies when multiple pdsch pdu's are received.*/ - for (int i = 0; i < NUM_NFAPI_SLOT; i++) - { - slot_rnti_mcs[i].latest = false; - } - - CHECK_INDEX(slot_rnti_mcs[slot].rnti, index); - CHECK_INDEX(slot_rnti_mcs[slot].mcs, index); - CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, index); - slot_rnti_mcs[slot].rnti[index] = pdu->rnti; - slot_rnti_mcs[slot].mcs[index] = pdu->mcsIndex[0]; - slot_rnti_mcs[slot].rvIndex[index] = pdu->rvIndex[0]; - slot_rnti_mcs[slot].drop_flag[index] = false; - slot_rnti_mcs[slot].num_pdus = index+1; //index starts at 0 so we incrament to get num of pdus - slot_rnti_mcs[slot].latest = true; - LOG_D(NR_MAC, "Adding MCS %d and RNTI %x for slot_rnti_mcs[%d]\n", slot_rnti_mcs[slot].mcs[index], slot_rnti_mcs[slot].rnti[index], slot); - - return; -} - -/* -static bool did_drop_transport_block(int slot, uint16_t rnti) -{ - int num_pdus = slot_rnti_mcs[slot].num_pdus; - if (num_pdus <= 0) - { - LOG_E(MAC, "Problem, the PDU size is <= 0. We dropped this packet\n"); - return true; - } - CHECK_INDEX(slot_rnti_mcs[slot].rnti, num_pdus); - CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, num_pdus); - for (int n = 0; n < num_pdus; n++) - { - if (slot_rnti_mcs[slot].rnti[n] == rnti && slot_rnti_mcs[slot].drop_flag[n]) - { - return true; - } - } - return false; -} -*/ - -static float get_bler_val(uint8_t mcs, int sinr) -{ - // 4th col = dropped packets, 5th col = total packets - float bler_val = 0.0; - CHECK_INDEX(nr_bler_data, mcs); - LOG_D(NR_MAC, "sinr %d min %d max %d\n", sinr, - (int)(nr_bler_data[mcs].bler_table[0][0] * 10), - (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10) - ); - - if (sinr < (int)(nr_bler_data[mcs].bler_table[0][0] * 10)) - { - LOG_D(NR_MAC, "MCS %d table. SINR is smaller than lowest SINR, bler_val is set based on lowest SINR in table\n", mcs); - bler_val = nr_bler_data[mcs].bler_table[0][4] / nr_bler_data[mcs].bler_table[0][5]; - return bler_val; - } - if (sinr > (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10)) - { - LOG_D(NR_MAC, "MCS %d table. SINR is greater than largest SINR. bler_val is set based on largest SINR in table\n", mcs); - bler_val = nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][4] / nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][5]; - return bler_val; - } - // Loop through bler table to find sinr_index - for (int i = 0; i < nr_bler_data[mcs].length; i++) - { - int temp_sinr = (int)(nr_bler_data[mcs].bler_table[i][0] * 10); - if (temp_sinr == sinr) - { - bler_val = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5]; - return bler_val; - } - // Linear interpolation when SINR is between indices - if (temp_sinr > sinr) - { - float bler_val1 = nr_bler_data[mcs].bler_table[i - 1][4] / nr_bler_data[mcs].bler_table[i - 1][5]; - float bler_val2 = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5]; - LOG_D(NR_MAC, "sinr %d min %f max %f\n", sinr, bler_val1, bler_val2); - return ((bler_val1 + bler_val2) / 2); - } - } - LOG_E(NR_MAC, "NO SINR INDEX FOUND!\n"); - abort(); - -} - -static inline bool is_channel_modeling(void) -{ - /* TODO: For now we enable channel modeling based on the node_number. - Replace with a command line option to enable/disable channel modeling. - The LTE UE will crash when channel modeling is conducted for NSA - mode. It does not crash for LTE mode. We have not implemented channel - modeling for NSA mode yet. For now, we ensure only do do channel modeling - in LTE/NR mode. */ - return get_softmodem_params()->node_number == 0 && !get_softmodem_params()->nsa; -} - -static bool should_drop_transport_block(int slot, uint16_t rnti) -{ - if (!is_channel_modeling()) - { - return false; - } - - /* We want to avoid dropping setup messages because this would be pathological. */ - NR_UE_MAC_INST_t *mac = get_mac_inst(0); - if (mac->ra.ra_state < RA_SUCCEEDED) - { - LOG_D(NR_MAC, "Not dropping because MAC state: %d", mac->ra.ra_state); - return false; - } - - /* Get block error rate (bler_val) from table based on every saved - MCS and SINR to be used as the cutoff rate for dropping packets. - Generate random uniform vairable to compare against bler_val. */ - int num_pdus = slot_rnti_mcs[slot].num_pdus; - assert(slot < 20 && slot >= 0); - LOG_D(NR_MAC, "rnti: %x num_pdus %d state %d slot %u sinr %f\n", - rnti, num_pdus, mac->ra.ra_state, slot, slot_rnti_mcs[slot].sinr); - assert(num_pdus > 0); - CHECK_INDEX(slot_rnti_mcs[slot].rnti, num_pdus); - CHECK_INDEX(slot_rnti_mcs[slot].mcs, num_pdus); - CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, num_pdus); - int n = 0; - uint8_t mcs = 99; - for (n = 0; n < num_pdus; n++) - { - if (slot_rnti_mcs[slot].rnti[n] == rnti) - { - mcs = slot_rnti_mcs[slot].mcs[n]; - } - if (mcs != 99) - { - /* Use MCS to get the bler value. Since there can be multiple MCS - values for a particular slot, we verify that all PDUs are not - flagged for drop before returning. If even one is flagged for drop - we return immediately because we drop the entire packet. */ - - LOG_D(NR_MAC, "rnti: %x mcs %u slot %u sinr %f\n", - slot_rnti_mcs[slot].rnti[n], mcs, slot, slot_rnti_mcs[slot].sinr); - - float bler_val; - if (slot_rnti_mcs[slot].rvIndex[n] != 0) - bler_val = 0; - else - bler_val = get_bler_val(mcs, ((int)(slot_rnti_mcs[slot].sinr * 10))); - double drop_cutoff = ((double) rand() / (RAND_MAX)); - assert(drop_cutoff <= 1); - LOG_D(NR_MAC, "SINR = %f, Bler_val = %f, MCS = %"PRIu8"\n", slot_rnti_mcs[slot].sinr, bler_val, slot_rnti_mcs[slot].mcs[n]); - if (drop_cutoff <= bler_val) - { - slot_rnti_mcs[slot].drop_flag[n] = true; - LOG_T(NR_MAC, "We are dropping this packet. Bler_val = %f, MCS = %"PRIu8", slot = %d\n", bler_val, slot_rnti_mcs[slot].mcs[n], slot); - return slot_rnti_mcs[slot].drop_flag[n]; - } - } - - } - - if (mcs == 99) - { - LOG_E(NR_MAC, "NO MCS Found for rnti %x. slot_rnti_mcs[%d].mcs[%d] \n", rnti, slot, n); - abort(); - } - return false; -} diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h index 3eacf87e061..45ac8e2a7d4 100755 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h @@ -40,45 +40,12 @@ #include "openair2/PHY_INTERFACE/queue_t.h" #include "nfapi_nr_interface_scf.h" #include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h" +#include "NR_Packet_Drop.h" -#define NR_NUM_MCS 29 -#define NUM_SINR 100 -#define NUM_BLER_COL 13 -#define NUM_NFAPI_SLOT 20 -#define NR_NUM_LAYER 1 +extern slot_rnti_mcs_s slot_rnti_mcs[NUM_NFAPI_SLOT]; typedef struct NR_UL_TIME_ALIGNMENT NR_UL_TIME_ALIGNMENT_t; -typedef struct nr_phy_channel_params_t -{ - uint16_t sfn_slot; - uint16_t message_id; - uint16_t nb_of_sinrs; - float sinr[NR_NUM_LAYER]; - // Incomplete, need all channel parameters -} nr_phy_channel_params_t; - -typedef struct -{ - uint8_t slot; - uint16_t rnti[256]; - uint8_t mcs[256]; - uint8_t rvIndex[256]; - float sinr; - uint16_t num_pdus; - bool drop_flag[256]; - bool latest; - -} slot_rnti_mcs_s; - -typedef struct -{ - uint16_t length; - float bler_table[NUM_SINR][NUM_BLER_COL]; -} nr_bler_struct; - -extern nr_bler_struct nr_bler_data[NR_NUM_MCS]; - typedef enum { ONLY_PUSCH, NOT_PUSCH, diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c b/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c new file mode 100644 index 00000000000..97938c6b027 --- /dev/null +++ b/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c @@ -0,0 +1,183 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ +#include <stdio.h> +#include "openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h" +#include "executables/softmodem-common.h" +#include "NR_MAC_UE/mac_proto.h" + +slot_rnti_mcs_s slot_rnti_mcs[NUM_NFAPI_SLOT]; +void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int slot, int index) +{ + if (pdu == NULL) + { + LOG_E(NR_MAC,"PDU NULL\n"); + abort(); + } + + /* This function is executed for every pdsch pdu type in a dl_tti_request. We save + the assocaited MCS and RNTI value for each. The 'index' passed in is a count of + how many times we have called this function for a particular dl_tti_request. It + allows us to save MCS/RNTI data in correct indicies when multiple pdsch pdu's are received.*/ + for (int i = 0; i < NUM_NFAPI_SLOT; i++) + { + slot_rnti_mcs[i].latest = false; + } + + CHECK_INDEX(slot_rnti_mcs[slot].rnti, index); + CHECK_INDEX(slot_rnti_mcs[slot].mcs, index); + CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, index); + slot_rnti_mcs[slot].rnti[index] = pdu->rnti; + slot_rnti_mcs[slot].mcs[index] = pdu->mcsIndex[0]; + slot_rnti_mcs[slot].rvIndex[index] = pdu->rvIndex[0]; + slot_rnti_mcs[slot].drop_flag[index] = false; + slot_rnti_mcs[slot].num_pdus = index+1; //index starts at 0 so we incrament to get num of pdus + slot_rnti_mcs[slot].latest = true; + LOG_D(NR_MAC, "Adding MCS %d and RNTI %x for slot_rnti_mcs[%d]\n", slot_rnti_mcs[slot].mcs[index], slot_rnti_mcs[slot].rnti[index], slot); + + return; +} + +extern nr_bler_struct nr_bler_data[NR_NUM_MCS]; +float get_bler_val(uint8_t mcs, int sinr) +{ + // 4th col = dropped packets, 5th col = total packets + float bler_val = 0.0; + CHECK_INDEX(nr_bler_data, mcs); + LOG_D(NR_MAC, "sinr %d min %d max %d\n", sinr, + (int)(nr_bler_data[mcs].bler_table[0][0] * 10), + (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10) + ); + + if (sinr < (int)(nr_bler_data[mcs].bler_table[0][0] * 10)) + { + LOG_D(NR_MAC, "MCS %d table. SINR is smaller than lowest SINR, bler_val is set based on lowest SINR in table\n", mcs); + bler_val = nr_bler_data[mcs].bler_table[0][4] / nr_bler_data[mcs].bler_table[0][5]; + return bler_val; + } + if (sinr > (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10)) + { + LOG_D(NR_MAC, "MCS %d table. SINR is greater than largest SINR. bler_val is set based on largest SINR in table\n", mcs); + bler_val = nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][4] / nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][5]; + return bler_val; + } + // Loop through bler table to find sinr_index + for (int i = 0; i < nr_bler_data[mcs].length; i++) + { + int temp_sinr = (int)(nr_bler_data[mcs].bler_table[i][0] * 10); + if (temp_sinr == sinr) + { + bler_val = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5]; + return bler_val; + } + // Linear interpolation when SINR is between indices + if (temp_sinr > sinr) + { + float bler_val1 = nr_bler_data[mcs].bler_table[i - 1][4] / nr_bler_data[mcs].bler_table[i - 1][5]; + float bler_val2 = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5]; + LOG_D(NR_MAC, "sinr %d min %f max %f\n", sinr, bler_val1, bler_val2); + return ((bler_val1 + bler_val2) / 2); + } + } + LOG_E(NR_MAC, "NO SINR INDEX FOUND!\n"); + abort(); + +} + +bool is_channel_modeling(void) +{ + /* TODO: For now we enable channel modeling based on the node_number. + Replace with a command line option to enable/disable channel modeling. + The LTE UE will crash when channel modeling is conducted for NSA + mode. It does not crash for LTE mode. We have not implemented channel + modeling for NSA mode yet. For now, we ensure only do do channel modeling + in LTE/NR mode. */ + return get_softmodem_params()->node_number == 0 && !get_softmodem_params()->nsa; +} + +bool should_drop_transport_block(int slot, uint16_t rnti) +{ + if (!is_channel_modeling()) + { + return false; + } + + /* We want to avoid dropping setup messages because this would be pathological. */ + NR_UE_MAC_INST_t *mac = get_mac_inst(0); + if (mac->ra.ra_state < RA_SUCCEEDED) + { + LOG_D(NR_MAC, "Not dropping because MAC state: %d", mac->ra.ra_state); + return false; + } + + /* Get block error rate (bler_val) from table based on every saved + MCS and SINR to be used as the cutoff rate for dropping packets. + Generate random uniform vairable to compare against bler_val. */ + int num_pdus = slot_rnti_mcs[slot].num_pdus; + assert(slot < 20 && slot >= 0); + LOG_D(NR_MAC, "rnti: %x num_pdus %d state %d slot %u sinr %f\n", + rnti, num_pdus, mac->ra.ra_state, slot, slot_rnti_mcs[slot].sinr); + assert(num_pdus > 0); + CHECK_INDEX(slot_rnti_mcs[slot].rnti, num_pdus); + CHECK_INDEX(slot_rnti_mcs[slot].mcs, num_pdus); + CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, num_pdus); + int n = 0; + uint8_t mcs = 99; + for (n = 0; n < num_pdus; n++) + { + if (slot_rnti_mcs[slot].rnti[n] == rnti) + { + mcs = slot_rnti_mcs[slot].mcs[n]; + } + if (mcs != 99) + { + /* Use MCS to get the bler value. Since there can be multiple MCS + values for a particular slot, we verify that all PDUs are not + flagged for drop before returning. If even one is flagged for drop + we return immediately because we drop the entire packet. */ + + LOG_D(NR_MAC, "rnti: %x mcs %u slot %u sinr %f\n", + slot_rnti_mcs[slot].rnti[n], mcs, slot, slot_rnti_mcs[slot].sinr); + + float bler_val; + if (slot_rnti_mcs[slot].rvIndex[n] != 0) + bler_val = 0; + else + bler_val = get_bler_val(mcs, ((int)(slot_rnti_mcs[slot].sinr * 10))); + double drop_cutoff = ((double) rand() / (RAND_MAX)); + assert(drop_cutoff <= 1); + LOG_D(NR_MAC, "SINR = %f, Bler_val = %f, MCS = %"PRIu8"\n", slot_rnti_mcs[slot].sinr, bler_val, slot_rnti_mcs[slot].mcs[n]); + if (drop_cutoff <= bler_val) + { + slot_rnti_mcs[slot].drop_flag[n] = true; + LOG_T(NR_MAC, "We are dropping this packet. Bler_val = %f, MCS = %"PRIu8", slot = %d\n", bler_val, slot_rnti_mcs[slot].mcs[n], slot); + return slot_rnti_mcs[slot].drop_flag[n]; + } + } + + } + + if (mcs == 99) + { + LOG_E(NR_MAC, "NO MCS Found for rnti %x. slot_rnti_mcs[%d].mcs[%d] \n", rnti, slot, n); + abort(); + } + return false; +} diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h b/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h new file mode 100644 index 00000000000..549eb5c2e38 --- /dev/null +++ b/openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h @@ -0,0 +1,68 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ +#ifndef __NR_CHAN_MODEL_H__ +#define __NR_CHAN_MODEL_H__ + +#include <platform_types.h> +#include <nfapi_nr_interface_scf.h> +#include <openair1/PHY/thread_NR_UE.h> +#include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h" + +#define NR_NUM_MCS 29 +#define NUM_SINR 100 +#define NUM_BLER_COL 13 +#define NUM_NFAPI_SLOT 20 +#define NR_NUM_LAYER 1 +#define MAX_CHAN_PARAMS 256 + +typedef struct nr_phy_channel_params_t +{ + uint16_t sfn_slot; + uint16_t message_id; + uint16_t nb_of_sinrs; + float sinr[NR_NUM_LAYER]; +} nr_phy_channel_params_t; + +typedef struct +{ + uint8_t slot; + uint16_t rnti[MAX_CHAN_PARAMS]; + uint8_t mcs[MAX_CHAN_PARAMS]; + uint8_t rvIndex[MAX_CHAN_PARAMS]; + float sinr; + uint16_t num_pdus; + bool drop_flag[MAX_CHAN_PARAMS]; + bool latest; +} slot_rnti_mcs_s; + +typedef struct +{ + uint16_t length; + float bler_table[NUM_SINR][NUM_BLER_COL]; +} nr_bler_struct; + +void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int sf, int index); +void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request); +float get_bler_val(uint8_t mcs, int sinr); +bool should_drop_transport_block(int slot, uint16_t rnti); +bool is_channel_modeling(void); + +#endif diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.c b/openair2/PHY_INTERFACE/phy_stub_UE.c index c4650f18f3a..cd57ea9ff10 100644 --- a/openair2/PHY_INTERFACE/phy_stub_UE.c +++ b/openair2/PHY_INTERFACE/phy_stub_UE.c @@ -1956,7 +1956,7 @@ static int get_mcs_from_sinr(float sinr) static int get_cqi_from_mcs(void) { - static const int mcs_to_cqi[] = {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15}; + static const int mcs_to_cqi[] = {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15}; assert(NUM_ELEMENTS(mcs_to_cqi) == NUM_MCS); int sf = 0; while(sf < NUM_NFAPI_SUBFRAME) diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.h b/openair2/PHY_INTERFACE/phy_stub_UE.h index d68d1dffdd9..fe0e7be12e1 100644 --- a/openair2/PHY_INTERFACE/phy_stub_UE.h +++ b/openair2/PHY_INTERFACE/phy_stub_UE.h @@ -21,7 +21,7 @@ //#include "openair1/PHY/LTE_TRANSPORT/defs.h" #include "queue_t.h" -#define NUM_MCS 28 +#define NUM_MCS 29 #define NUM_SINR 100 #define NUM_BLER_COL 13 #define LTE_NUM_LAYER 1 diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c index a4239e857d9..f0c4e94c999 100644 --- a/openair2/RRC/LITE/rrc_common.c +++ b/openair2/RRC/LITE/rrc_common.c @@ -306,7 +306,7 @@ rrc_rx_tx( LOG_D(RRC,"SFN.SN %d.%d => release timer %d/%d\n",ctxt_pP->frame,ctxt_pP->subframe, ue_context_p->ue_context.ue_release_timer,ue_context_p->ue_context.ue_release_timer_thres); if ((ctxt_pP->frame == 0) && (ctxt_pP->subframe==0)) { - if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == TRUE) { + if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == true) { LOG_I(RRC,"UE rnti %x:S-TMSI %x failure timer %d/20000\n", ue_context_p->ue_context.rnti, ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi, diff --git a/openair2/RRC/LTE/L2_interface.c b/openair2/RRC/LTE/L2_interface.c index 0a63acc8fb8..c12d2aa873e 100644 --- a/openair2/RRC/LTE/L2_interface.c +++ b/openair2/RRC/LTE/L2_interface.c @@ -299,7 +299,7 @@ mac_rrc_data_ind( const uint8_t *sduP, const sdu_size_t sdu_lenP, const uint8_t mbsfn_sync_areaP, - const boolean_t brOption + const bool brOption ) //-------------------------------------------------------------------------- { diff --git a/openair2/RRC/LTE/L2_interface_common.c b/openair2/RRC/LTE/L2_interface_common.c index 1993fe7de09..660bd91dda8 100644 --- a/openair2/RRC/LTE/L2_interface_common.c +++ b/openair2/RRC/LTE/L2_interface_common.c @@ -58,7 +58,7 @@ rrc_data_req( { if(sdu_sizeP == 255) { LOG_I(RRC,"sdu_sizeP == 255"); - return FALSE; + return false; } MessageDef *message_p; @@ -94,7 +94,7 @@ rrc_data_req( if (ctxt_pP->enb_flag && NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) pdcp_run(ctxt_pP); - return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. + return true; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. } //------------------------------------------------------------------------------ diff --git a/openair2/RRC/LTE/L2_interface_ue.c b/openair2/RRC/LTE/L2_interface_ue.c index 534030864a2..850ecf1b588 100644 --- a/openair2/RRC/LTE/L2_interface_ue.c +++ b/openair2/RRC/LTE/L2_interface_ue.c @@ -298,7 +298,7 @@ rrc_data_req_ue( TASK_PDCP_UE, ctxt_pP->instance, message_p); - return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. + return true; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. } } diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg.c b/openair2/RRC/LTE/MESSAGES/asn1_msg.c index bd09540627a..e5024e35055 100644 --- a/openair2/RRC/LTE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LTE/MESSAGES/asn1_msg.c @@ -343,7 +343,7 @@ uint8_t do_MIB_SL(const protocol_ctxt_t *const ctxt_pP, const uint8_t eNB_index, if (in_coverage > 0 ) { //in coverage - mib_sl->inCoverage_r12 = TRUE; + mib_sl->inCoverage_r12 = true; mib_sl->sl_Bandwidth_r12 = *UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->freqInfo.ul_Bandwidth; if (UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index]->tdd_Config) { @@ -366,7 +366,7 @@ uint8_t do_MIB_SL(const protocol_ctxt_t *const ctxt_pP, const uint8_t eNB_index, } else { //Todo - out of coverage for V2X // Todo - UE has a selected SyncRef UE - mib_sl->inCoverage_r12 = FALSE; + mib_sl->inCoverage_r12 = false; //set sl-Bandwidth, subframeAssignmentSL and reserved from the pre-configured parameters } @@ -989,7 +989,7 @@ uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier, sib1_1250->nonCriticalExtension = NULL; ////Rel1310 if ((configuration->schedulingInfoSIB1_BR_r13[CC_id] != 0) && - (brOption==TRUE)) { + (brOption==true)) { sib1_1250->nonCriticalExtension = calloc(1, sizeof(LTE_SystemInformationBlockType1_v1310_IEs_t)); memset(sib1_1250->nonCriticalExtension, 0, sizeof(LTE_SystemInformationBlockType1_v1310_IEs_t)); LTE_SystemInformationBlockType1_v1310_IEs_t *sib1_1310 = sib1_1250->nonCriticalExtension; @@ -1279,7 +1279,7 @@ uint8_t do_SIB23(uint8_t Mod_id, *sib2 = &sib2_part->choice.sib2; *sib3 = &sib3_part->choice.sib3; - if ((configuration->eMBMS_configured > 0) && (brOption==FALSE)) { + if ((configuration->eMBMS_configured > 0) && (brOption==false)) { sib13_part = CALLOC(1,sizeof(struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member)); memset(sib13_part,0,sizeof(struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member)); sib13_part->present = LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920; @@ -1331,10 +1331,8 @@ uint8_t do_SIB23(uint8_t Mod_id, (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1 = calloc(1, sizeof(struct LTE_RACH_ConfigCommon__ext1)); memset((*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1, 0, sizeof(struct LTE_RACH_ConfigCommon__ext1)); - if (rrconfig->preambleTransMax_CE_r13) { - (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = calloc(1, sizeof(LTE_PreambleTransMax_t)); - *(*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = *rrconfig->preambleTransMax_CE_r13; // to be re-initialized when we find the enum - } else (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = NULL; + (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = calloc(1, sizeof(LTE_PreambleTransMax_t)); + *(*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = rrconfig->preambleTransMax_CE_r13; // to be re-initialized when we find the enum (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->rach_CE_LevelInfoList_r13 = calloc(1, sizeof(LTE_RACH_CE_LevelInfoList_r13_t)); memset((*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->rach_CE_LevelInfoList_r13, 0, sizeof(LTE_RACH_CE_LevelInfoList_r13_t)); @@ -2783,7 +2781,7 @@ do_RRCConnectionSetup( mac_MainConfig->ul_SCH_Config->maxHARQ_Tx = maxHARQ_Tx; // max number of UL HARQ transmission mac_MainConfig->ul_SCH_Config->periodicBSR_Timer = periodicBSR_Timer; mac_MainConfig->ul_SCH_Config->retxBSR_Timer = LTE_RetxBSR_Timer_r12_sf320; // LTE_RetxBSR_Timer_r12_sf5120 // regular BSR timer - mac_MainConfig->ul_SCH_Config->ttiBundling = 0; // FALSE + mac_MainConfig->ul_SCH_Config->ttiBundling = 0; // false //* timeAlignmentTimerDedicated *// mac_MainConfig->timeAlignmentTimerDedicated = LTE_TimeAlignmentTimer_infinity; //* DRX Config *// @@ -3137,7 +3135,7 @@ uint8_t do_RRCConnectionSetup_BR( //mac_MainConfig->ul_SCH_Config->maxHARQ_Tx = maxHARQ_Tx; mac_MainConfig->ul_SCH_Config->periodicBSR_Timer = periodicBSR_Timer; mac_MainConfig->ul_SCH_Config->retxBSR_Timer = LTE_RetxBSR_Timer_r12_sf320; - mac_MainConfig->ul_SCH_Config->ttiBundling = 0; // FALSE + mac_MainConfig->ul_SCH_Config->ttiBundling = 0; // false mac_MainConfig->timeAlignmentTimerDedicated = LTE_TimeAlignmentTimer_infinity; mac_MainConfig->drx_Config = NULL; mac_MainConfig->phr_Config = CALLOC(1, sizeof(*mac_MainConfig->phr_Config)); diff --git a/openair2/RRC/LTE/defs_NB_IoT.h b/openair2/RRC/LTE/defs_NB_IoT.h index 37a26086b55..b98dbe22ccd 100644 --- a/openair2/RRC/LTE/defs_NB_IoT.h +++ b/openair2/RRC/LTE/defs_NB_IoT.h @@ -148,7 +148,7 @@ typedef struct UE_RRC_INFO_NB_IoT_s { //Measurement Report not supported in NB-IoT #define PAYLOAD_SIZE_MAX 1024 -#define RRC_BUF_SIZE 512 +#define RRC_BUF_SIZE 1024 #define UNDEF_SECURITY_MODE 0xff #define NO_SECURITY_MODE 0x20 @@ -156,7 +156,7 @@ typedef struct UE_RRC_INFO_NB_IoT_s { #define RRC_TRANSACTION_IDENTIFIER_NUMBER 3 typedef struct UE_S_TMSI_NB_IoT_s { - boolean_t presence; + bool presence; mme_code_t mme_code; m_tmsi_t m_tmsi; } __attribute__ ((__packed__)) UE_S_TMSI_NB_IoT; diff --git a/openair2/RRC/LTE/rrc_UE.c b/openair2/RRC/LTE/rrc_UE.c index 9b37853ed2b..577ee3effdf 100644 --- a/openair2/RRC/LTE/rrc_UE.c +++ b/openair2/RRC/LTE/rrc_UE.c @@ -4351,8 +4351,8 @@ void rrc_ue_generate_nrMeasurementReport(protocol_ctxt_t *const ctxt_pP, uint8_t AssertFatal(size >= 0, "do_nrMeasurementReport failed \n"); LOG_I(RRC, "[UE %d] Frame %d : Generating Measurement Report for eNB %d\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index); - int result = pdcp_data_req(ctxt_pP, SRB_FLAG_YES, DCCH, rrc_mui++, 0, size, buffer, PDCP_TRANSMISSION_MODE_DATA,NULL, NULL); - AssertFatal (result == TRUE, "PDCP data request failed!\n"); + const bool result = pdcp_data_req(ctxt_pP, SRB_FLAG_YES, DCCH, rrc_mui++, 0, size, buffer, PDCP_TRANSMISSION_MODE_DATA,NULL, NULL); + AssertFatal (result == true, "PDCP data request failed!\n"); } } } @@ -4370,7 +4370,6 @@ void rrc_ue_generate_MeasurementReport(protocol_ctxt_t *const ctxt_pP, uint8_t e long nElem, nElem1; float rsrp_filtered, rsrq_filtered; static frame_t pframe=0; - int result; nElem = 98; nElem1 = 35; target_eNB_offset = UE_rrc_inst[ctxt_pP->module_id].Info[0].handoverTarget; // eNB_offset of target eNB: used to obtain the mod_id of target eNB @@ -4420,8 +4419,8 @@ void rrc_ue_generate_MeasurementReport(protocol_ctxt_t *const ctxt_pP, uint8_t e AssertFatal(size >= 0, "do_MeasurementReport failed \n"); LOG_I(RRC, "[UE %d] Frame %d : Generating Measurement Report for eNB %d. Size is %zu\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index, size); - result = pdcp_data_req(ctxt_pP, SRB_FLAG_YES, DCCH, rrc_mui++, 0, size, buffer, PDCP_TRANSMISSION_MODE_DATA,NULL, NULL); - AssertFatal (result == TRUE, "PDCP data request failed!\n"); + const bool result = pdcp_data_req(ctxt_pP, SRB_FLAG_YES, DCCH, rrc_mui++, 0, size, buffer, PDCP_TRANSMISSION_MODE_DATA,NULL, NULL); + AssertFatal (result == true, "PDCP data request failed!\n"); //LOG_D(RRC, "[UE %d] Frame %d Sending MeasReport (%d bytes) through DCCH%d to PDCP \n",ue_mod_idP,frameP, size, DCCH); } diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h index f537dcbbd2b..22c8a14863e 100644 --- a/openair2/RRC/LTE/rrc_defs.h +++ b/openair2/RRC/LTE/rrc_defs.h @@ -316,7 +316,7 @@ typedef enum SL_TRIGGER_e { #define MAX_MEAS_ID 7 #define PAYLOAD_SIZE_MAX 1024 -#define RRC_BUF_SIZE 512 +#define RRC_BUF_SIZE 1024 #define UNDEF_SECURITY_MODE 0xff #define NO_SECURITY_MODE 0x20 @@ -367,7 +367,7 @@ typedef struct UE_RRC_INFO_s { } __attribute__ ((__packed__)) UE_RRC_INFO; typedef struct UE_S_TMSI_s { - boolean_t presence; + bool presence; mme_code_t mme_code; m_tmsi_t m_tmsi; } __attribute__ ((__packed__)) UE_S_TMSI; @@ -484,7 +484,7 @@ typedef struct MEASUREMENT_INFO_s { typedef struct { char Payload[RRC_BUFFER_SIZE_MAX]; char Header[RRC_HEADER_SIZE_MAX]; - char payload_size; + uint16_t payload_size; } RRC_BUFFER; #define RRC_BUFFER_SIZE sizeof(RRC_BUFFER) @@ -931,7 +931,7 @@ typedef struct UE_RRC_INST_s { } UE_RRC_INST; typedef struct UE_PF_PO_s { - boolean_t enable_flag; /* flag indicate whether current object is used */ + bool enable_flag; /* flag indicate whether current object is used */ uint16_t ue_index_value; /* UE index value */ uint8_t PF_min; /* minimal value of Paging Frame (PF) */ uint8_t PO; /* Paging Occasion (PO) */ diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index ea98d3169d5..8be30175e11 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -150,7 +150,7 @@ init_SI( LTE_SystemInformationBlockType1_v1310_IEs_t *sib1_v13ext=(LTE_SystemInformationBlockType1_v1310_IEs_t *)NULL; LOG_D(RRC,"%s()\n\n\n\n",__FUNCTION__); - if(configuration->radioresourceconfig[CC_id].mbms_dedicated_serving_cell == TRUE) { + if(configuration->radioresourceconfig[CC_id].mbms_dedicated_serving_cell == true) { LOG_A(RRC, "Configuring MIB FeMBMS (N_RB_DL %d)\n", (int)configuration->N_RB_DL[CC_id]); RC.rrc[ctxt_pP->module_id]->carrier[CC_id].MIB_FeMBMS = (uint8_t *) malloc16(4); @@ -266,7 +266,7 @@ init_SI( carrier->sizeof_SIB1 = do_SIB1(&rrc->carrier[CC_id], ctxt_pP->module_id, CC_id, - FALSE, + false, configuration ); AssertFatal(carrier->sizeof_SIB1 != 255,"FATAL, RC.rrc[enb_mod_idP].carrier[CC_id].sizeof_SIB1 == 255"); @@ -276,7 +276,7 @@ init_SI( RC.rrc[ctxt_pP->module_id]->carrier[CC_id].SIB1_BR = (uint8_t *) malloc16(32); RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB1_BR = do_SIB1(&RC.rrc[ctxt_pP->module_id]->carrier[CC_id], ctxt_pP->module_id, - CC_id, TRUE, configuration); + CC_id, true, configuration); } } @@ -285,7 +285,7 @@ init_SI( AssertFatal(carrier->SIB23!=NULL,"cannot allocate memory for SIB"); carrier->sizeof_SIB23 = do_SIB23(ctxt_pP->module_id, CC_id, - FALSE, + false, configuration ); LOG_I(RRC,"do_SIB23, size %d \n ", carrier->sizeof_SIB23); @@ -295,7 +295,7 @@ init_SI( if (configuration->schedulingInfoSIB1_BR_r13[CC_id]>0) { carrier->SIB23_BR = (uint8_t *) malloc16(64); AssertFatal(carrier->SIB23_BR!=NULL,"cannot allocate memory for SIB"); - carrier->sizeof_SIB23_BR = do_SIB23(ctxt_pP->module_id, CC_id, TRUE, configuration); + carrier->sizeof_SIB23_BR = do_SIB23(ctxt_pP->module_id, CC_id, true, configuration); } LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" SIB2/3 Contents (partial)\n", @@ -661,7 +661,7 @@ rrc_eNB_get_next_transaction_identifier( ////----------------------------------------------------------------------------- //{ // -// boolean_t reg = FALSE; +// bool reg = false; // module_id_t i; // // AssertFatal(enb_mod_idP < NB_eNB_INST, "eNB index invalid (%d/%d)!", enb_mod_idP, NB_eNB_INST); @@ -669,12 +669,12 @@ rrc_eNB_get_next_transaction_identifier( // for (i = 0; i < MAX_MOBILES_PER_ENB; i++) { // if (RC.rrc[enb_mod_idP]->Info.UE_info[i] == UE_identity) { // // UE_identity already registered -// reg = TRUE; +// reg = true; // break; // } // } // -// if (reg == FALSE) { +// if (reg == false) { // return (UE_MODULE_INVALID); // } else // return (i); @@ -713,7 +713,7 @@ rrc_eNB_ue_context_stmsi_exist( m_tmsiP, mme_codeP, ue_context_p, ue_context_p->ue_context.rnti); - if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == TRUE) { + if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == true) { printf("=> S-TMSI %x, MME %x\n", ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi, ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code); @@ -976,28 +976,24 @@ rrc_eNB_free_UE( put_UE_in_freelist(enb_mod_idP, rnti, 1); } -void remove_UE_from_freelist(module_id_t mod_id, rnti_t rnti) { +void put_UE_in_freelist(module_id_t mod_id, rnti_t rnti, bool removeFlag) { eNB_MAC_INST *eNB_MAC = RC.mac[mod_id]; pthread_mutex_lock(&lock_ue_freelist); - UE_free_list_t *free_list = &eNB_MAC->UE_free_list; - free_list->UE_free_ctrl[free_list->head_freelist].rnti = 0; - free_list->head_freelist = (free_list->head_freelist + 1) % (NUMBER_OF_UE_MAX+1); - free_list->num_UEs--; - pthread_mutex_unlock(&lock_ue_freelist); -} - -void put_UE_in_freelist(module_id_t mod_id, rnti_t rnti, boolean_t removeFlag) { - UE_free_list_t *free_list = NULL; - eNB_MAC_INST *eNB_MAC = RC.mac[mod_id]; - pthread_mutex_lock(&lock_ue_freelist); - free_list = &eNB_MAC->UE_free_list; - free_list->UE_free_ctrl[free_list->tail_freelist].rnti = rnti; - free_list->UE_free_ctrl[free_list->tail_freelist].removeContextFlg = removeFlag; - free_list->UE_free_ctrl[free_list->tail_freelist].raFlag = 0; - free_list->num_UEs++; + LOG_I(PHY,"add ue %d in fre list, context flag: %d\n", rnti, removeFlag); + int i; + for (i=0; i < sizeofArray(eNB_MAC->UE_free_ctrl); i++) + if (eNB_MAC->UE_free_ctrl[i].rnti == 0) + break; + if (i==sizeofArray(eNB_MAC->UE_free_ctrl)) { + LOG_E(PHY,"List of UE to free is full\n"); + pthread_mutex_unlock(&lock_ue_freelist); + return; + } + eNB_MAC->UE_free_ctrl[i].rnti = rnti; + eNB_MAC->UE_free_ctrl[i].removeContextFlg = removeFlag; + eNB_MAC->UE_free_ctrl[i].raFlag = 0; eNB_MAC->UE_release_req.ue_release_request_body.ue_release_request_TLVs_list[eNB_MAC->UE_release_req.ue_release_request_body.number_of_TLVs].rnti = rnti; eNB_MAC->UE_release_req.ue_release_request_body.number_of_TLVs++; - free_list->tail_freelist = (free_list->tail_freelist + 1) % (NUMBER_OF_UE_MAX+1); pthread_mutex_unlock(&lock_ue_freelist); } @@ -1007,104 +1003,47 @@ extern void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch); extern void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch); void release_UE_in_freeList(module_id_t mod_id) { - int i, j, CC_id, pdu_number; - protocol_ctxt_t ctxt; - nfapi_ul_config_request_body_t *ul_req_tmp = NULL; PHY_VARS_eNB *eNB_PHY = NULL; - struct rrc_eNB_ue_context_s *ue_context_pP = NULL; eNB_MAC_INST *eNB_MAC = RC.mac[mod_id]; - boolean_t remove_UEContext; - rnti_t rnti; - int head, tail, ue_num; pthread_mutex_lock(&lock_ue_freelist); - head = eNB_MAC->UE_free_list.head_freelist; - tail = eNB_MAC->UE_free_list.tail_freelist; - if(head == tail) { - pthread_mutex_unlock(&lock_ue_freelist); - return; - } - - if(tail < head) { - tail = head + eNB_MAC->UE_free_list.num_UEs; - } - - pthread_mutex_unlock(&lock_ue_freelist); - - for(ue_num = head; ue_num < tail; ue_num++) { - ue_num = ue_num % (NUMBER_OF_UE_MAX+1); - rnti = eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].rnti; + for(int ue_num = 0; ue_num < sizeofArray(eNB_MAC->UE_free_ctrl) ; ue_num++) { + rnti_t rnti = eNB_MAC->UE_free_ctrl[ue_num].rnti; if(rnti != 0) { - remove_UEContext = eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].removeContextFlg; + protocol_ctxt_t ctxt; PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, mod_id, ENB_FLAG_YES, rnti, 0, 0,mod_id); - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { eNB_PHY = RC.eNB[mod_id][CC_id]; int id; // clean ULSCH entries for rnti - id = find_ulsch(rnti,eNB_PHY,eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].raFlag ? SEARCH_EXIST_RA : SEARCH_EXIST); + id = find_ulsch(rnti,eNB_PHY,eNB_MAC->UE_free_ctrl[ue_num].raFlag ? SEARCH_EXIST_RA : SEARCH_EXIST); if (id>=0) clean_eNb_ulsch(eNB_PHY->ulsch[id]); // clean DLSCH entries for rnti - id = find_dlsch(rnti,eNB_PHY,eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].raFlag ? SEARCH_EXIST_RA : SEARCH_EXIST); + id = find_dlsch(rnti,eNB_PHY,eNB_MAC->UE_free_ctrl[ue_num].raFlag ? SEARCH_EXIST_RA : SEARCH_EXIST); if (id>=0) clean_eNb_dlsch(eNB_PHY->dlsch[id][0]); // clean UCI entries for rnti - for (i=0; i<NUMBER_OF_UCI_MAX; i++) { + for (int i=0; i<NUMBER_OF_UCI_MAX; i++) { if(eNB_PHY->uci_vars[i].rnti == rnti) { LOG_I(MAC, "clean eNb uci_vars[%d] UE %x \n",i, rnti); memset(&eNB_PHY->uci_vars[i],0,sizeof(LTE_eNB_UCI)); } } - /* - for (i=0; i<MAX_MOBILES_PER_ENB; i++) { - ulsch = eNB_PHY->ulsch[i]; - - if((ulsch != NULL) && (ulsch->rnti == rnti)) { - void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch); - LOG_I(RRC, "clean_eNb_ulsch ulsch[%d] UE %x\n", i, rnti); - clean_eNb_ulsch(ulsch); - } - - dlsch = eNB_PHY->dlsch[i][0]; - - if((dlsch != NULL) && (dlsch->rnti == rnti)) { - void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch); - LOG_I(RRC, "clean_eNb_dlsch dlsch[%d] UE %x \n", i, rnti); - clean_eNb_dlsch(dlsch); - } - } - - ulsch = eNB_PHY->ulsch[i]; - - if((ulsch != NULL) && (ulsch->rnti == rnti)) { - void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch); - LOG_I(RRC, "clean_eNb_ulsch ulsch[%d] UE %x\n", i, rnti); - clean_eNb_ulsch(ulsch); - } - - for (i=0; i<NUMBER_OF_UCI_MAX; i++) { - if(eNB_PHY->uci_vars[i].rnti == rnti) { - LOG_I(MAC, "clean eNb uci_vars[%d] UE %x \n",i, rnti); - memset(&eNB_PHY->uci_vars[i],0,sizeof(LTE_eNB_UCI)); - } - } - */ - if (flexran_agent_get_rrc_xface(mod_id)) { - flexran_agent_get_rrc_xface(mod_id)->flexran_agent_notify_ue_state_change( - mod_id, rnti, PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_DEACTIVATED); + flexran_agent_get_rrc_xface(mod_id)->flexran_agent_notify_ue_state_change( mod_id, rnti, PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_DEACTIVATED); } - for(j = 0; j < 10; j++) { - ul_req_tmp = &eNB_MAC->UL_req_tmp[CC_id][j].ul_config_request_body; + for(int j = 0; j < 10; j++) { + nfapi_ul_config_request_body_t *ul_req_tmp = &eNB_MAC->UL_req_tmp[CC_id][j].ul_config_request_body; if(ul_req_tmp) { - pdu_number = ul_req_tmp->number_of_pdus; + int pdu_number = ul_req_tmp->number_of_pdus; for(int pdu_index = pdu_number-1; pdu_index >= 0; pdu_index--) { if((ul_req_tmp->ul_config_pdu_list[pdu_index].ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) || @@ -1126,7 +1065,8 @@ void release_UE_in_freeList(module_id_t mod_id) { } if (!NODE_IS_CU(RC.rrc[mod_id]->node_type)) { - rrc_mac_remove_ue(mod_id,rnti); + if (!eNB_MAC->UE_free_ctrl[ue_num].raFlag) + rrc_mac_remove_ue(mod_id,rnti); rrc_rlc_remove_ue(&ctxt); pdcp_remove_UE(&ctxt); } else { @@ -1139,19 +1079,20 @@ void release_UE_in_freeList(module_id_t mod_id) { itti_send_msg_to_task(TASK_CU_F1, mod_id, m); } - if(remove_UEContext) { - ue_context_pP = rrc_eNB_get_ue_context(RC.rrc[mod_id],rnti); - + if(eNB_MAC->UE_free_ctrl[ue_num].removeContextFlg) { + struct rrc_eNB_ue_context_s *ue_context_pP = rrc_eNB_get_ue_context(RC.rrc[mod_id],rnti); if(ue_context_pP) { + LOG_I(PHY, "remove RNTI %04x\n", rnti); rrc_eNB_remove_ue_context(&ctxt,RC.rrc[mod_id], (struct rrc_eNB_ue_context_s *) ue_context_pP); } } - LOG_I(RRC, "[release_UE_in_freeList] remove UE %x from freeList\n", rnti); - remove_UE_from_freelist(mod_id, rnti); + LOG_I(RRC, "[release_UE_in_freeList] remove UE %x from freeList ra context: %d\n", rnti, eNB_MAC->UE_free_ctrl[ue_num].raFlag); + eNB_MAC->UE_free_ctrl[ue_num].rnti = 0; } } + pthread_mutex_unlock(&lock_ue_freelist); } int rrc_eNB_previous_SRB2(rrc_eNB_ue_context_t *ue_context_pP) { @@ -1678,7 +1619,7 @@ rrc_eNB_process_RRCConnectionReestablishmentComplete( ue_context_pP->ue_context.rnti = ctxt_pP->rnti; if (EPC_MODE_ENABLED) { - uint8_t send_security_mode_command = FALSE; + uint8_t send_security_mode_command = false; rrc_pdcp_config_security( ctxt_pP, ue_context_pP, @@ -2332,7 +2273,7 @@ rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t *co // PDCP PDCP_rlc_AM = CALLOC(1, sizeof(*PDCP_rlc_AM)); DRB_pdcp_config->rlc_AM = PDCP_rlc_AM; - PDCP_rlc_AM->statusReportRequired = FALSE; + PDCP_rlc_AM->statusReportRequired = false; break; default : @@ -2590,7 +2531,7 @@ rrc_eNB_modify_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t *cons PDCP_rlc_AM = CALLOC(1, sizeof(*PDCP_rlc_AM)); DRB_pdcp_config->rlc_AM = PDCP_rlc_AM; - PDCP_rlc_AM->statusReportRequired = FALSE; + PDCP_rlc_AM->statusReportRequired = false; break; default : @@ -2951,7 +2892,7 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t #ifdef RRC_DEFAULT_RAB_IS_AM // EXMIMO_IOT PDCP_rlc_AM = CALLOC(1, sizeof(*PDCP_rlc_AM)); DRB_pdcp_config->rlc_AM = PDCP_rlc_AM; - PDCP_rlc_AM->statusReportRequired = FALSE; + PDCP_rlc_AM->statusReportRequired = false; #else PDCP_rlc_UM = CALLOC(1, sizeof(*PDCP_rlc_UM)); DRB_pdcp_config->rlc_UM = PDCP_rlc_UM; @@ -3347,7 +3288,7 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.triggerType.choice.event.eventId.present = LTE_ReportConfigInterRAT__triggerType__event__eventId_PR_eventB1_NR_r15; ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.triggerType.choice.event.eventId.choice.eventB1_NR_r15.b1_ThresholdNR_r15.present = LTE_ThresholdNR_r15_PR_nr_RSRP_r15; ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.triggerType.choice.event.eventId.choice.eventB1_NR_r15.b1_ThresholdNR_r15.choice.nr_RSRP_r15 = 0; - ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.triggerType.choice.event.eventId.choice.eventB1_NR_r15.reportOnLeave_r15 = FALSE; + ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.triggerType.choice.event.eventId.choice.eventB1_NR_r15.reportOnLeave_r15 = false; ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.triggerType.choice.event.hysteresis = 2; ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.triggerType.choice.event.timeToTrigger = LTE_TimeToTrigger_ms80; ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.maxReportCells = 4; @@ -3361,9 +3302,9 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t if (ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15 == NULL) exit(1); - ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_rsrp = TRUE; - ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_rsrq = TRUE; - ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_sinr = TRUE; + ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_rsrp = true; + ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_rsrq = true; + ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_sinr = true; ASN_SEQUENCE_ADD(&ReportConfig_list->list, ReportConfig_NR); LOG_A(RRC, "Generating RRCCConnectionReconfigurationRequest (NRUE Measurement Report Request).\n"); } @@ -3714,7 +3655,7 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt #ifdef RRC_DEFAULT_RAB_IS_AM // EXMIMO_IOT PDCP_rlc_AM = CALLOC(1, sizeof(*PDCP_rlc_AM)); DRB_pdcp_config->rlc_AM = PDCP_rlc_AM; - PDCP_rlc_AM->statusReportRequired = FALSE; + PDCP_rlc_AM->statusReportRequired = 0; // FALSE #else PDCP_rlc_UM = CALLOC(1, sizeof(*PDCP_rlc_UM)); DRB_pdcp_config->rlc_UM = PDCP_rlc_UM; @@ -5052,7 +4993,7 @@ check_handovers( && ue_context_p->ue_context.handover_info != NULL && ue_context_p->ue_context.handover_info->forwarding_state == FORWARDING_NO_EMPTY ) { MessageDef *msg_p; - int result; + bool result; protocol_ctxt_t ctxt; do { @@ -5090,7 +5031,7 @@ check_handovers( GTPV1U_ENB_DATA_FORWARDING_IND (msg_p).mode, NULL, NULL ); - if (result != TRUE) { + if (result != true) { LOG_E(RRC, "target enb send data forwarding buffer to PDCP request failed!\n"); } else { LOG_D(RRC, "target enb send data forwarding buffer to PDCP!\n"); @@ -5158,7 +5099,7 @@ check_handovers( GTPV1U_ENB_END_MARKER_IND (msg_p).mode, NULL, NULL ); - if (result != TRUE) { + if (result != true) { LOG_E(RRC, "target enb send spgw buffer to PDCP request failed!\n"); } else { LOG_D(RRC, "target enb send spgw buffer to PDCP!\n"); @@ -5390,7 +5331,7 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct #ifdef RRC_DEFAULT_RAB_IS_AM // EXMIMO_IOT PDCP_rlc_AM = CALLOC(1, sizeof(*PDCP_rlc_AM)); DRB_pdcp_config->rlc_AM = PDCP_rlc_AM; - PDCP_rlc_AM->statusReportRequired = FALSE; + PDCP_rlc_AM->statusReportRequired = 0; // FALSE #else PDCP_rlc_UM = CALLOC(1, sizeof(*PDCP_rlc_UM)); DRB_pdcp_config->rlc_UM = PDCP_rlc_UM; @@ -6280,10 +6221,7 @@ rrc_eNB_configure_rbs_handover(struct rrc_eNB_ue_context_s *ue_context_p, protoc ctxt_pP, ue_context_p, ue_context_p->ue_context.kenb); - rrc_pdcp_config_security( - ctxt_pP, - ue_context_p, - FALSE); + rrc_pdcp_config_security(ctxt_pP, ue_context_p, false); } // Add a new user (called during the HO procedure) @@ -6361,9 +6299,9 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( UE_sched_ctrl_t *UE_scheduling_control = &(RC.mac[module_id]->UE_info.UE_sched_ctrl[UE_id_mac]); - if (UE_scheduling_control->cdrx_waiting_ack == TRUE) { - UE_scheduling_control->cdrx_waiting_ack = FALSE; - UE_scheduling_control->cdrx_configured = TRUE; // Set to TRUE when RRC Connection Reconfiguration is received + if (UE_scheduling_control->cdrx_waiting_ack == true) { + UE_scheduling_control->cdrx_waiting_ack = false; + UE_scheduling_control->cdrx_configured = true; // Set to TRUE when RRC Connection Reconfiguration is received LOG_I(RRC, "CDRX configuration activated after RRC Connection Reconfiguration Complete reception\n"); } } @@ -6627,7 +6565,7 @@ rrc_eNB_generate_RRCConnectionSetup( ) //----------------------------------------------------------------------------- { - boolean_t is_mtc = ctxt_pP->brOption; + bool is_mtc = ctxt_pP->brOption; LTE_LogicalChannelConfig_t *SRB1_logicalChannelConfig; //,*SRB2_logicalChannelConfig; LTE_SRB_ToAddModList_t **SRB_configList; LTE_SRB_ToAddMod_t *SRB1_config; @@ -7249,6 +7187,7 @@ rrc_eNB_decode_ccch( LOG_I(RRC," S-TMSI exists, ue_context_p %p, old rnti %x => %x\n",ue_context_p,ue_context_p->ue_context.rnti,ctxt_pP->rnti); if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { + LOG_I(PHY, "remove RNTI %04x\n", ue_context_p->ue_context.rnti); rrc_mac_remove_ue(ctxt_pP->module_id, ue_context_p->ue_context.rnti); } else { MessageDef *m = itti_alloc_new_message(TASK_RRC_ENB, 0, F1AP_UE_CONTEXT_RELEASE_CMD); @@ -7284,7 +7223,7 @@ rrc_eNB_decode_ccch( LOG_E(RRC, "%s:%d:%s: rrc_eNB_get_next_free_ue_context returned NULL\n", __FILE__, __LINE__, __FUNCTION__); if (ue_context_p != NULL) { - ue_context_p->ue_context.Initialue_identity_s_TMSI.presence = TRUE; + ue_context_p->ue_context.Initialue_identity_s_TMSI.presence = true; ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code = mme_code; ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi = m_tmsi; } else { @@ -8766,7 +8705,7 @@ void rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) { if ((ctxt_pP->frame&127) == 0 && ctxt_pP->subframe ==0) { if (fd) { - if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == TRUE) { + if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == true) { fprintf(fd,"RRC UE rnti %x: S-TMSI %x failure timer %d/8\n", ue_context_p->ue_context.rnti, ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi, diff --git a/openair2/RRC/LTE/rrc_eNB_GTPV1U.c b/openair2/RRC/LTE/rrc_eNB_GTPV1U.c index 575a38ee3d9..64b5594dd9e 100644 --- a/openair2/RRC/LTE/rrc_eNB_GTPV1U.c +++ b/openair2/RRC/LTE/rrc_eNB_GTPV1U.c @@ -84,23 +84,20 @@ rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP( } //------------------------------------------------------------------------------ -boolean_t -gtpv_data_req( - const protocol_ctxt_t* const ctxt_pP, - const rb_id_t rb_idP, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_sizeP, - uint8_t* const buffer_pP, - const pdcp_transmission_mode_t modeP, - uint32_t task_id -) +bool gtpv_data_req(const protocol_ctxt_t* const ctxt_pP, + const rb_id_t rb_idP, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_sizeP, + uint8_t* const buffer_pP, + const pdcp_transmission_mode_t modeP, + uint32_t task_id) //------------------------------------------------------------------------------ { if(sdu_sizeP == 0) { LOG_I(GTPU,"gtpv_data_req sdu_sizeP == 0"); - return FALSE; + return false; } LOG_D(GTPU,"gtpv_data_req ue rnti %x sdu_sizeP %d rb id %ld", ctxt_pP->rnti, sdu_sizeP, rb_idP); MessageDef *message_p; @@ -129,7 +126,7 @@ gtpv_data_req( GTPV1U_ENB_DATA_FORWARDING_IND (message_p).eNB_index = ctxt_pP->eNB_index; itti_send_msg_to_task (TASK_DATA_FORWARDING, ctxt_pP->instance, message_p); - return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. + return true; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. } else if (task_id == TASK_END_MARKER){ LOG_I(GTPU,"gtpv_data_req task_id = TASK_END_MARKER\n"); @@ -152,23 +149,22 @@ gtpv_data_req( GTPV1U_ENB_END_MARKER_IND (message_p).eNB_index = ctxt_pP->eNB_index; itti_send_msg_to_task (TASK_END_MARKER, ctxt_pP->instance, message_p); - return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. + return true; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. } LOG_E(RRC, "Impossible state\n"); - return FALSE; + return false; } -boolean_t gtpv_data_req_new ( - protocol_ctxt_t *ctxt, - const srb_flag_t srb_flagP, - const rb_id_t rb_idP, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_buffer_sizeP, - unsigned char *const sdu_buffer_pP, - const pdcp_transmission_mode_t modeP, - const uint32_t *sourceL2Id, - const uint32_t *destinationL2Id) { +bool gtpv_data_req_new(protocol_ctxt_t *ctxt, + const srb_flag_t srb_flagP, + const rb_id_t rb_idP, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_buffer_sizeP, + unsigned char *const sdu_buffer_pP, + const pdcp_transmission_mode_t modeP, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id) { int task; if (sdu_buffer_sizeP==0) diff --git a/openair2/RRC/LTE/rrc_eNB_GTPV1U.h b/openair2/RRC/LTE/rrc_eNB_GTPV1U.h index ab789099cae..f991cbd5f62 100644 --- a/openair2/RRC/LTE/rrc_eNB_GTPV1U.h +++ b/openair2/RRC/LTE/rrc_eNB_GTPV1U.h @@ -60,16 +60,13 @@ void rrc_eNB_send_GTPV1U_ENB_DELETE_TUNNEL_REQ( rrc_eNB_ue_context_t* ue_context_pP ); -boolean_t -gtpv_data_req( - const protocol_ctxt_t* const ctxt_pP, - const rb_id_t rb_idP, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_sizeP, - uint8_t* const buffer_pP, - const pdcp_transmission_mode_t modeP, - uint32_t task_id -); +bool gtpv_data_req(const protocol_ctxt_t* const ctxt_pP, + const rb_id_t rb_idP, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_sizeP, + uint8_t* const buffer_pP, + const pdcp_transmission_mode_t modeP, + uint32_t task_id); #endif /* RRC_ENB_GTPV1U_H_ */ diff --git a/openair2/RRC/LTE/rrc_eNB_S1AP.c b/openair2/RRC/LTE/rrc_eNB_S1AP.c index f24c9ab1b61..aefbc018315 100644 --- a/openair2/RRC/LTE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LTE/rrc_eNB_S1AP.c @@ -402,15 +402,13 @@ static e_LTE_SecurityAlgorithmConfig__integrityProtAlgorithm rrc_eNB_select_inte *\param mod_id Instance ID of eNB. *\param ue_index Instance ID of UE in the eNB. *\param security_capabilities The security capabilities received from S1AP. - *\return TRUE if at least one algorithm has been changed else FALSE. + *\return true if at least one algorithm has been changed else false. */ int -rrc_eNB_process_security( - const protocol_ctxt_t *const ctxt_pP, - rrc_eNB_ue_context_t *const ue_context_pP, - security_capabilities_t *security_capabilities_pP -) { - boolean_t changed = FALSE; +rrc_eNB_process_security(const protocol_ctxt_t *const ctxt_pP, + rrc_eNB_ue_context_t *const ue_context_pP, + security_capabilities_t *security_capabilities_pP) { + bool changed = false; LTE_CipheringAlgorithm_r12_t cipheringAlgorithm; e_LTE_SecurityAlgorithmConfig__integrityProtAlgorithm integrityProtAlgorithm; /* Save security parameters */ @@ -428,14 +426,14 @@ rrc_eNB_process_security( if (ue_context_pP->ue_context.ciphering_algorithm != cipheringAlgorithm) { ue_context_pP->ue_context.ciphering_algorithm = cipheringAlgorithm; - changed = TRUE; + changed = true; } integrityProtAlgorithm = rrc_eNB_select_integrity (ue_context_pP->ue_context.security_capabilities.integrity_algorithms); if (ue_context_pP->ue_context.integrity_algorithm != integrityProtAlgorithm) { ue_context_pP->ue_context.integrity_algorithm = integrityProtAlgorithm; - changed = TRUE; + changed = true; } LOG_I (RRC, "[eNB %d][UE %x] Selected security algorithms (%p): %lx, %x, %s\n", @@ -532,7 +530,7 @@ rrc_pdcp_config_security( pdcp_p, DCCH, DCCH+2, - (send_security_mode_command == TRUE) ? + (send_security_mode_command == true) ? 0 | (ue_context_pP->ue_context.integrity_algorithm << 4) : (ue_context_pP->ue_context.ciphering_algorithm ) | (ue_context_pP->ue_context.integrity_algorithm << 4), @@ -960,12 +958,12 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char ue_context_p, S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p).security_key); { - uint8_t send_security_mode_command = TRUE; + uint8_t send_security_mode_command = true; #ifndef EXMIMO_IOT if ((ue_context_p->ue_context.ciphering_algorithm == SecurityAlgorithmConfig__cipheringAlgorithm_eea0) && (ue_context_p->ue_context.integrity_algorithm == INTEGRITY_ALGORITHM_NONE)) { - send_security_mode_command = FALSE; + send_security_mode_command = false; } #endif @@ -978,7 +976,7 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char rrc_eNB_generate_SecurityModeCommand ( &ctxt, ue_context_p); - send_security_mode_command = FALSE; + send_security_mode_command = false; // apply ciphering after RRC security command mode rrc_pdcp_config_security( &ctxt, @@ -1414,19 +1412,19 @@ int rrc_eNB_process_S1AP_E_RAB_MODIFY_REQ(MessageDef *msg_p, const char *msg_nam /* Save e RAB information for later */ { int j; - boolean_t is_treated[S1AP_MAX_E_RAB] = {FALSE}; + bool is_treated[S1AP_MAX_E_RAB] = {false}; uint8_t nb_of_failed_e_rabs = 0; // keep the previous bearer // the index for the rec for (i = 0; i < S1AP_E_RAB_MODIFY_REQ (msg_p).nb_e_rabs_tomodify; i++) { - if (is_treated[i] == TRUE) { + if (is_treated[i] == true) { // already treated continue; } for (j = i+1; j < S1AP_E_RAB_MODIFY_REQ (msg_p).nb_e_rabs_tomodify; j++) { - if (is_treated[j] == FALSE && + if (is_treated[j] == false && S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[j].e_rab_id == S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].e_rab_id) { // handle multiple E-RAB ID ue_context_p->ue_context.modify_e_rab[j].status = E_RAB_STATUS_NEW; @@ -1434,12 +1432,12 @@ int rrc_eNB_process_S1AP_E_RAB_MODIFY_REQ(MessageDef *msg_p, const char *msg_nam ue_context_p->ue_context.modify_e_rab[j].cause = S1AP_CAUSE_RADIO_NETWORK; ue_context_p->ue_context.modify_e_rab[j].cause_value = 31;//S1ap_CauseRadioNetwork_multiple_E_RAB_ID_instances; nb_of_failed_e_rabs++; - is_treated[i] = TRUE; - is_treated[j] = TRUE; + is_treated[i] = true; + is_treated[j] = true; } } - if (is_treated[i] == TRUE) { + if (is_treated[i] == true) { // handle multiple E-RAB ID ue_context_p->ue_context.modify_e_rab[i].status = E_RAB_STATUS_NEW; ue_context_p->ue_context.modify_e_rab[i].param.e_rab_id = S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].e_rab_id; @@ -1456,7 +1454,7 @@ int rrc_eNB_process_S1AP_E_RAB_MODIFY_REQ(MessageDef *msg_p, const char *msg_nam ue_context_p->ue_context.modify_e_rab[i].cause = S1AP_CAUSE_NAS; ue_context_p->ue_context.modify_e_rab[i].cause_value = 3;//S1ap_CauseNas_unspecified; nb_of_failed_e_rabs++; - is_treated[i] = TRUE; + is_treated[i] = true; continue; } @@ -1474,19 +1472,19 @@ int rrc_eNB_process_S1AP_E_RAB_MODIFY_REQ(MessageDef *msg_p, const char *msg_nam ue_context_p->ue_context.modify_e_rab[i].param.nas_pdu.buffer = S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].nas_pdu.buffer; ue_context_p->ue_context.modify_e_rab[i].param.sgw_addr = ue_context_p->ue_context.e_rab[j].param.sgw_addr; ue_context_p->ue_context.modify_e_rab[i].param.gtp_teid = ue_context_p->ue_context.e_rab[j].param.gtp_teid; - is_treated[i] = TRUE; + is_treated[i] = true; break; } } - if (is_treated[i] == FALSE) { + if (is_treated[i] == false) { // handle Unknown E-RAB ID ue_context_p->ue_context.modify_e_rab[i].status = E_RAB_STATUS_NEW; ue_context_p->ue_context.modify_e_rab[i].param.e_rab_id = S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].e_rab_id; ue_context_p->ue_context.modify_e_rab[i].cause = S1AP_CAUSE_RADIO_NETWORK; ue_context_p->ue_context.modify_e_rab[i].cause_value = 30;//S1ap_CauseRadioNetwork_unknown_E_RAB_ID; nb_of_failed_e_rabs++; - is_treated[i] = TRUE; + is_treated[i] = true; } } @@ -1824,8 +1822,8 @@ int rrc_eNB_process_PAGING_IND(MessageDef *msg_p, const char *msg_name, instance uint8_t i = 0; for (i = 0; i < MAX_MOBILES_PER_ENB; i++) { - if ((UE_PF_PO[CC_id][i].enable_flag == TRUE && UE_PF_PO[CC_id][i].ue_index_value == (uint16_t)(S1AP_PAGING_IND(msg_p).ue_index_value)) - || (UE_PF_PO[CC_id][i].enable_flag != TRUE)) { + if ((UE_PF_PO[CC_id][i].enable_flag == true && UE_PF_PO[CC_id][i].ue_index_value == (uint16_t)(S1AP_PAGING_IND(msg_p).ue_index_value)) + || (UE_PF_PO[CC_id][i].enable_flag != true)) { /* set T = min(Tc,Tue) */ UE_PF_PO[CC_id][i].T = T; /* set UE_ID */ @@ -1845,12 +1843,12 @@ int rrc_eNB_process_PAGING_IND(MessageDef *msg_p, const char *msg_name, instance UE_PF_PO[CC_id][i].PO = (frame_type==FDD) ? (4*(i_s&1)+(5*(i_s>>1))) : ((i_s&1)+(5*(i_s>>1))); } - if (UE_PF_PO[CC_id][i].enable_flag == TRUE) { + if (UE_PF_PO[CC_id][i].enable_flag == true) { //paging exist UE log LOG_D(RRC,"[eNB %ld] CC_id %d In S1AP_PAGING_IND: Update exist UE %d, T %d, PF %d, PO %d\n", instance, CC_id, UE_PF_PO[CC_id][i].ue_index_value, T, UE_PF_PO[CC_id][i].PF_min, UE_PF_PO[CC_id][i].PO); } else { /* set enable_flag */ - UE_PF_PO[CC_id][i].enable_flag = TRUE; + UE_PF_PO[CC_id][i].enable_flag = true; //paging new UE log LOG_D(RRC,"[eNB %ld] CC_id %d In S1AP_PAGING_IND: Insert a new UE %d, T %d, PF %d, PO %d\n", instance, CC_id, UE_PF_PO[CC_id][i].ue_index_value, T, UE_PF_PO[CC_id][i].PF_min, UE_PF_PO[CC_id][i].PO); } diff --git a/openair2/RRC/LTE/rrc_proto.h b/openair2/RRC/LTE/rrc_proto.h index f0456005f52..7bd3fbf758c 100644 --- a/openair2/RRC/LTE/rrc_proto.h +++ b/openair2/RRC/LTE/rrc_proto.h @@ -457,7 +457,7 @@ mac_rrc_data_ind( const uint8_t *sduP, const sdu_size_t sdu_lenP, const uint8_t mbsfn_sync_areaP, - const boolean_t brOption + const bool brOption ); int8_t @@ -685,7 +685,7 @@ extern RRC_release_list_t rrc_release_info; extern pthread_mutex_t lock_ue_freelist; void remove_UE_from_freelist(module_id_t mod_id, rnti_t rnti); -void put_UE_in_freelist(module_id_t mod_id, rnti_t rnti, boolean_t removeFlag); +void put_UE_in_freelist(module_id_t mod_id, rnti_t rnti, bool removeFlag); void release_UE_in_freeList(module_id_t mod_id); /** @}*/ diff --git a/openair2/RRC/NR/L2_nr_interface.c b/openair2/RRC/NR/L2_nr_interface.c index cd87dfd5548..ab9e3984d8a 100644 --- a/openair2/RRC/NR/L2_nr_interface.c +++ b/openair2/RRC/NR/L2_nr_interface.c @@ -49,102 +49,6 @@ extern RAN_CONTEXT_t RC; -int generate_pdcch_ConfigSIB1(NR_PDCCH_ConfigSIB1_t *pdcch_ConfigSIB1, - long ssbSubcarrierSpacing, - long subCarrierSpacingCommon, - channel_bandwidth_t min_channel_bw) { - - nr_ssb_and_cset_mux_pattern_type_t mux_pattern = 0; - - switch (ssbSubcarrierSpacing) { - - case NR_SubcarrierSpacing_kHz15: - if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz15) { - pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_1_NUM_INDEXES; - mux_pattern = table_38213_13_1_c1[pdcch_ConfigSIB1->controlResourceSetZero]; - } else if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz30) { - pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_2_NUM_INDEXES; - mux_pattern = table_38213_13_2_c1[pdcch_ConfigSIB1->controlResourceSetZero]; - } else { - AssertFatal(true,"Invalid subCarrierSpacingCommon\n"); - } - break; - - case NR_SubcarrierSpacing_kHz30: - if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz15) { - - if ( (min_channel_bw == bw_5MHz) || (min_channel_bw == bw_10MHz) ) { - pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_3_NUM_INDEXES; - mux_pattern = table_38213_13_3_c1[pdcch_ConfigSIB1->controlResourceSetZero]; - } else if (min_channel_bw == bw_40MHz) { - pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_5_NUM_INDEXES; - mux_pattern = table_38213_13_5_c1[pdcch_ConfigSIB1->controlResourceSetZero]; - } else { - AssertFatal(true,"Invalid min_bandwidth\n"); - } - - } else if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz30) { - - if ( (min_channel_bw == bw_5MHz) || (min_channel_bw == bw_10MHz) ) { - pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_4_NUM_INDEXES; - mux_pattern = table_38213_13_4_c1[pdcch_ConfigSIB1->controlResourceSetZero]; - } else if (min_channel_bw == bw_40MHz) { - pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_6_NUM_INDEXES; - mux_pattern = table_38213_13_6_c1[pdcch_ConfigSIB1->controlResourceSetZero]; - } else { - AssertFatal(true,"Invalid min_bandwidth\n"); - } - - } else { - AssertFatal(true,"Invalid subCarrierSpacingCommon\n"); - } - break; - - case NR_SubcarrierSpacing_kHz120: - if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz60) { - pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_7_NUM_INDEXES; - mux_pattern = table_38213_13_7_c1[pdcch_ConfigSIB1->controlResourceSetZero]; - } else if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz120) { - pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_8_NUM_INDEXES; - mux_pattern = table_38213_13_8_c1[pdcch_ConfigSIB1->controlResourceSetZero]; - } else { - AssertFatal(true,"Invalid subCarrierSpacingCommon\n"); - } - break; - - case NR_SubcarrierSpacing_kHz240: - if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz60) { - pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_9_NUM_INDEXES; - mux_pattern = table_38213_13_9_c1[pdcch_ConfigSIB1->controlResourceSetZero]; - } else if (subCarrierSpacingCommon == NR_SubcarrierSpacing_kHz120) { - pdcch_ConfigSIB1->controlResourceSetZero = rand() % TABLE_38213_13_10_NUM_INDEXES; - mux_pattern = table_38213_13_10_c1[pdcch_ConfigSIB1->controlResourceSetZero]; - } else { - AssertFatal(true,"Invalid subCarrierSpacingCommon\n"); - } - break; - - default: - AssertFatal(true,"Invalid ssbSubcarrierSpacing\n"); - break; - } - - - frequency_range_t frequency_range = FR1; - if(ssbSubcarrierSpacing>=60) { - frequency_range = FR2; - } - - pdcch_ConfigSIB1->searchSpaceZero = 0; - if(mux_pattern == NR_SSB_AND_CSET_MUX_PATTERN_TYPE1 && frequency_range == FR1){ - pdcch_ConfigSIB1->searchSpaceZero = rand() % TABLE_38213_13_11_NUM_INDEXES; - } - if(mux_pattern == NR_SSB_AND_CSET_MUX_PATTERN_TYPE1 && frequency_range == FR2){ - pdcch_ConfigSIB1->searchSpaceZero = rand() % TABLE_38213_13_12_NUM_INDEXES; - } - - return 0; -} int nr_rrc_mac_remove_ue(module_id_t mod_idP, @@ -168,7 +72,7 @@ nr_rrc_data_req( { if(sdu_sizeP == 255) { LOG_D(RRC,"sdu_sizeP == 255"); - return FALSE; + return false; } MessageDef *message_p; @@ -204,93 +108,98 @@ nr_rrc_data_req( if (ctxt_pP->enb_flag && NODE_IS_CU(RC.nrrrc[ctxt_pP->module_id]->node_type)) pdcp_run(ctxt_pP); - return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. + return true; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. } -int mac_rrc_nr_data_req(const module_id_t Mod_idP, - const int CC_id, - const frame_t frameP, - const rb_id_t Srb_id, - const rnti_t rnti, - const uint8_t Nb_tb, - uint8_t *const buffer_pP ){ +uint16_t mac_rrc_nr_data_req(const module_id_t Mod_idP, + const int CC_id, + const frame_t frameP, + const rb_id_t Srb_id, + const rnti_t rnti, + const uint8_t Nb_tb, + uint8_t *const buffer_pP ){ #ifdef DEBUG_RRC LOG_D(RRC,"[eNB %d] mac_rrc_data_req to SRB ID=%ld\n",Mod_idP,Srb_id); #endif - // MIBCH - if ((Srb_id & RAB_OFFSET) == MIBCH) { - - asn_enc_rval_t enc_rval; - uint8_t sfn_msb = (uint8_t)((frameP>>4)&0x3f); - rrc_gNB_carrier_data_t *carrier = &RC.nrrrc[Mod_idP]->carrier; - NR_BCCH_BCH_Message_t *mib = &carrier->mib; - - // Currently we are getting the pdcch_ConfigSIB1 from the configuration file. - // Uncomment this function for a dynamic pdcch_ConfigSIB1. - //channel_bandwidth_t min_channel_bw = bw_10MHz; // Must be obtained based on TS 38.101-1 Table 5.3.5-1 - //generate_pdcch_ConfigSIB1(carrier->pdcch_ConfigSIB1, - // *carrier->servingcellconfigcommon->ssbSubcarrierSpacing, - // carrier->mib.message.choice.mib->subCarrierSpacingCommon, - // min_channel_bw); - - mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = carrier->pdcch_ConfigSIB1->controlResourceSetZero; - mib->message.choice.mib->pdcch_ConfigSIB1.searchSpaceZero = carrier->pdcch_ConfigSIB1->searchSpaceZero; - - mib->message.choice.mib->systemFrameNumber.buf[0] = sfn_msb << 2; - enc_rval = uper_encode_to_buffer(&asn_DEF_NR_BCCH_BCH_Message, - NULL, - (void *) mib, - carrier->MIB, - 24); - LOG_D(NR_RRC, "Encoded MIB for frame %d sfn_msb %d (%p), bits %lu\n", frameP, sfn_msb, carrier->MIB, - enc_rval.encoded); - buffer_pP[0] = carrier->MIB[0]; - buffer_pP[1] = carrier->MIB[1]; - buffer_pP[2] = carrier->MIB[2]; - LOG_D(NR_RRC, "MIB PDU buffer_pP[0]=%x , buffer_pP[1]=%x, buffer_pP[2]=%x\n", buffer_pP[0], buffer_pP[1], - buffer_pP[2]); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", - enc_rval.failed_type->name, enc_rval.encoded); - return (3); - } + // MIBCH + if ((Srb_id & RAB_OFFSET) == MIBCH) { + + asn_enc_rval_t enc_rval; + uint8_t sfn_msb = (uint8_t)((frameP>>4)&0x3f); + rrc_gNB_carrier_data_t *carrier = &RC.nrrrc[Mod_idP]->carrier; + NR_BCCH_BCH_Message_t *mib = &carrier->mib; + + mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = carrier->pdcch_ConfigSIB1->controlResourceSetZero; + mib->message.choice.mib->pdcch_ConfigSIB1.searchSpaceZero = carrier->pdcch_ConfigSIB1->searchSpaceZero; + + mib->message.choice.mib->systemFrameNumber.buf[0] = sfn_msb << 2; + enc_rval = uper_encode_to_buffer(&asn_DEF_NR_BCCH_BCH_Message, + NULL, + (void *) mib, + carrier->MIB, + 24); + LOG_D(NR_RRC, "Encoded MIB for frame %d sfn_msb %d (%p), bits %lu\n", frameP, sfn_msb, carrier->MIB, + enc_rval.encoded); + buffer_pP[0] = carrier->MIB[0]; + buffer_pP[1] = carrier->MIB[1]; + buffer_pP[2] = carrier->MIB[2]; + LOG_D(NR_RRC, "MIB PDU buffer_pP[0]=%x , buffer_pP[1]=%x, buffer_pP[2]=%x\n", buffer_pP[0], buffer_pP[1], + buffer_pP[2]); + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", + enc_rval.failed_type->name, enc_rval.encoded); + return 3; + } // TODO BCCH SIB1 SIBs - if ((Srb_id & RAB_OFFSET ) == BCCH) { - memcpy(&buffer_pP[0], - RC.nrrrc[Mod_idP]->carrier.SIB1, - RC.nrrrc[Mod_idP]->carrier.sizeof_SIB1); - + if ((Srb_id & RAB_OFFSET) == BCCH) { + memcpy(&buffer_pP[0], RC.nrrrc[Mod_idP]->carrier.SIB1, RC.nrrrc[Mod_idP]->carrier.sizeof_SIB1); return RC.nrrrc[Mod_idP]->carrier.sizeof_SIB1; } // CCCH - if( (Srb_id & RAB_OFFSET ) == CCCH) { + if ((Srb_id & RAB_OFFSET) == CCCH) { + LOG_D(NR_RRC,"[gNB %d] Frame %d CCCH request (Srb_id %ld)\n", Mod_idP, frameP, Srb_id); char *payload_pP; - uint8_t Sdu_size = 0; struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[Mod_idP], rnti); LOG_D(NR_RRC,"[gNB %d] Frame %d CCCH request (Srb_id %ld)\n", Mod_idP, frameP, Srb_id); + if (ue_context_p == NULL) { + LOG_E(NR_RRC,"[gNB %d] Frame %d CCCH request but no ue_context\n", Mod_idP, frameP); + return 0; + } - AssertFatal(ue_context_p!=NULL,"failed to get ue_context, rnti %x\n",rnti); - int payload_size = ue_context_p->ue_context.Srb0.Tx_buffer.payload_size; - + uint16_t payload_size = ue_context_p->ue_context.Srb0.Tx_buffer.payload_size; // check if data is there for MAC if (payload_size > 0) { payload_pP = ue_context_p->ue_context.Srb0.Tx_buffer.Payload; LOG_D(NR_RRC,"[gNB %d] CCCH has %d bytes (dest: %p, src %p)\n", Mod_idP, payload_size, buffer_pP, payload_pP); // Fill buffer memcpy((void *)buffer_pP, (void*)payload_pP, payload_size); - Sdu_size = payload_size; ue_context_p->ue_context.Srb0.Tx_buffer.payload_size = 0; } - return Sdu_size; + return payload_size; } - return(0); + return 0; +} + +int8_t nr_mac_rrc_bwp_switch_req(const module_id_t module_idP, + const frame_t frameP, + const sub_frame_t sub_frameP, + const rnti_t rntiP, + const int dl_bwp_id, + const int ul_bwp_id) { + struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[module_idP], rntiP); + + protocol_ctxt_t ctxt; + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, GNB_FLAG_YES, rntiP, frameP, sub_frameP, 0); + nr_rrc_reconfiguration_req(ue_context_p, &ctxt, dl_bwp_id, ul_bwp_id); + + return 0; } int8_t nr_mac_rrc_data_ind(const module_id_t module_idP, @@ -302,7 +211,7 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP, const rb_id_t srb_idP, const uint8_t *sduP, const sdu_size_t sdu_lenP, - const boolean_t brOption) { + const bool brOption) { if (NODE_IS_DU(RC.nrrrc[module_idP]->node_type)) { LOG_W(RRC,"[DU %d][RAPROC] Received SDU for CCCH on SRB %ld length %d for UE id %d RNTI %x \n", @@ -312,6 +221,7 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP, // call do_RRCSetup like full procedure and extract masterCellGroup NR_CellGroupConfig_t cellGroupConfig; NR_ServingCellConfigCommon_t *scc=RC.nrrrc[module_idP]->carrier.servingcellconfigcommon; + NR_ServingCellConfig_t *servingcellconfigdedicated = RC.nrrrc[module_idP]->configuration.scd; memset(&cellGroupConfig,0,sizeof(cellGroupConfig)); struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_allocate_new_UE_context(RC.nrrrc[module_idP]); @@ -321,16 +231,16 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP, ue_context_p->ue_context.Srb0.Active = 1; RB_INSERT(rrc_nr_ue_tree_s, &RC.nrrrc[module_idP]->rrc_ue_head, ue_context_p); - fill_initial_cellGroupConfig(ue_context_p->local_uid,&cellGroupConfig,scc, &RC.nrrrc[module_idP]->configuration); + fill_initial_cellGroupConfig(ue_context_p->local_uid,&cellGroupConfig,scc,servingcellconfigdedicated,&RC.nrrrc[module_idP]->configuration); MessageDef* tmp=itti_alloc_new_message_sized(TASK_RRC_GNB, 0, F1AP_INITIAL_UL_RRC_MESSAGE, sizeof(f1ap_initial_ul_rrc_message_t) + sdu_lenP); f1ap_initial_ul_rrc_message_t *msg = &F1AP_INITIAL_UL_RRC_MESSAGE(tmp); asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, - NULL, - (void *)&cellGroupConfig, - msg->du2cu_rrc_container, - 1024); //sizeof(msg->du2cu_rrc_container)); + NULL, + (void *)&cellGroupConfig, + msg->du2cu_rrc_container, + F1AP_MAX_DU2CU_RRC_LENGTH); if (enc_rval.encoded == -1) { LOG_E(F1AP,"Could not encoded cellGroupConfig, failed element %s\n",enc_rval.failed_type->name); @@ -343,7 +253,8 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP, memcpy(msg->rrc_container, sduP, sdu_lenP); msg->rrc_container_length=sdu_lenP; itti_send_msg_to_task(TASK_DU_F1, 0, tmp); - return(0); + + return 0; } protocol_ctxt_t ctxt; @@ -356,7 +267,6 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP, nr_rrc_gNB_decode_ccch(&ctxt, sduP, sdu_lenP, NULL, CC_id); } } - return 0; } diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index 8e8959c5974..687784cafc8 100755 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -40,7 +40,9 @@ #include <asn_internal.h> /* for _ASN_DEFAULT_STACK_MAX */ #include <per_encoder.h> #include <nr/nr_common.h> +#include <softmodem-common.h> +#include "executables/softmodem-common.h" #include "LAYER2/nr_rlc/nr_rlc_oai_api.h" #include "asn1_msg.h" #include "../nr_rrc_proto.h" @@ -197,8 +199,7 @@ int xer_nr_sprint (char *string, size_t string_size, asn_TYPE_descriptor_t *td, uint8_t do_MIB_NR(gNB_RRC_INST *rrc,uint32_t frame) { asn_enc_rval_t enc_rval; - rrc_gNB_carrier_data_t *carrier = &rrc->carrier; - const gNB_RrcConfigurationReq *configuration = &rrc->configuration; + rrc_gNB_carrier_data_t *carrier = &rrc->carrier; NR_BCCH_BCH_Message_t *mib = &carrier->mib; NR_ServingCellConfigCommon_t *scc = carrier->servingcellconfigcommon; @@ -225,11 +226,14 @@ uint8_t do_MIB_NR(gNB_RRC_INST *rrc,uint32_t frame) { AssertFatal(scc->ssbSubcarrierSpacing != NULL, "scc->ssbSubcarrierSpacing is null\n"); int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; frequency_range_t frequency_range = band<100?FR1:FR2; - int ssb_subcarrier_offset; - if(frequency_range == FR1) - ssb_subcarrier_offset = (configuration->ssb_SubcarrierOffset<24) ? (configuration->ssb_SubcarrierOffset<<*scc->ssbSubcarrierSpacing) : configuration->ssb_SubcarrierOffset; - else - ssb_subcarrier_offset = configuration->ssb_SubcarrierOffset; + int ssb_subcarrier_offset = 31; // default value for NSA + if (get_softmodem_params()->sa) { + uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); + int scs_scaling = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000 ? 3 : 1; + ssb_subcarrier_offset = (absolute_diff/scs_scaling)%24; + if(frequency_range == FR2) + ssb_subcarrier_offset >>= 1; // this assumes 120kHz SCS for SSB and subCarrierSpacingCommon (only option supported by OAI for now) + } mib->message.choice.mib->ssb_SubcarrierOffset = ssb_subcarrier_offset&15; /* @@ -302,9 +306,8 @@ uint8_t do_MIB_NR(gNB_RRC_INST *rrc,uint32_t frame) { return((enc_rval.encoded+7)/8); } -uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, - gNB_RrcConfigurationReq *configuration - ) { +uint16_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, gNB_RrcConfigurationReq *configuration) { + asn_enc_rval_t enc_rval; NR_BCCH_DL_SCH_Message_t *sib1_message = CALLOC(1,sizeof(NR_BCCH_DL_SCH_Message_t)); @@ -403,7 +406,6 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, NR_BWP_DownlinkCommon_t *initialDownlinkBWP=&ServCellCom->downlinkConfigCommon.initialDownlinkBWP; initialDownlinkBWP->genericParameters= configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters; - for(int i = 0; i< configuration->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.count; i++) { asn1cSequenceAdd(ServCellCom->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list, @@ -411,7 +413,6 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, nrMultiBandInfo->freqBandIndicatorNR = configuration->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[i]; } - int scs_scaling0 = 1<<(configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing); int scs_scaling = scs_scaling0; int scs_scaling2 = scs_scaling0; @@ -520,7 +521,6 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, ss7->searchSpaceType->choice.common=calloc(1,sizeof(*ss7->searchSpaceType->choice.common)); ss7->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss7->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0)); - asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1, 0); asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation, 7); asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->pagingSearchSpace, 5); @@ -660,12 +660,9 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, (void *)sib1_message, carrier->SIB1, NR_MAX_SIB_LENGTH/8); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", + AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); - - if (enc_rval.encoded==-1) { - return(-1); - } + AssertFatal(enc_rval.encoded <= NR_MAX_SIB_LENGTH, "ASN1 encoded length %zd bits. 3GPP TS 38.331 section 5.2.1 - The physical layer imposes a limit to the maximum size a SIB can take. The maximum SIB1 or SI message size is 2976 bits.\n", enc_rval.encoded); return((enc_rval.encoded+7)/8); } @@ -988,139 +985,206 @@ uint8_t do_RRCReject(uint8_t Mod_id, return((enc_rval.encoded+7)/8); } -// TODO: Implement to b_SRS = 1 and b_SRS = 2 -long rrc_get_max_nr_csrs(uint8_t max_rbs, long b_SRS) { - - if(b_SRS>0) { - LOG_E(NR_RRC,"rrc_get_max_nr_csrs(): Not implemented yet for b_SRS>0\n"); - return 0; // This c_srs is always valid +void fill_default_downlinkBWP(NR_BWP_Downlink_t *bwp, + int bwp_loop, + NR_ServingCellConfig_t *servingcellconfigdedicated, + NR_ServingCellConfigCommon_t *scc, + const gNB_RrcConfigurationReq *configuration) { + + /// BWP common configuration + bwp->bwp_Common = calloc(1,sizeof(*bwp->bwp_Common)); + if(servingcellconfigdedicated->downlinkBWP_ToAddModList && + bwp_loop < servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count) { + bwp->bwp_Id = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Id; + bwp->bwp_Common->genericParameters.locationAndBandwidth = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.locationAndBandwidth; + bwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.subcarrierSpacing; + bwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.cyclicPrefix; + } else { + bwp->bwp_Id=bwp_loop+1; + bwp->bwp_Common->genericParameters.locationAndBandwidth = PRBalloc_to_locationandbandwidth(scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0); + bwp->bwp_Common->genericParameters.subcarrierSpacing = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing; + bwp->bwp_Common->genericParameters.cyclicPrefix = scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.cyclicPrefix; } - const uint16_t m_SRS[64] = { 4, 8, 12, 16, 16, 20, 24, 24, 28, 32, 36, 40, 48, 48, 52, 56, 60, 64, 72, 72, 76, 80, 88, - 96, 96, 104, 112, 120, 120, 120, 128, 128, 128, 132, 136, 144, 144, 144, 144, 152, 160, - 160, 160, 168, 176, 184, 192, 192, 192, 192, 208, 216, 224, 240, 240, 240, 240, 256, 256, - 256, 264, 272, 272, 272 }; - - long c_srs = 0; - uint16_t m = 4; - for(int c = 1; c<64; c++) { - if(m_SRS[c]>m && m_SRS[c]<max_rbs) { - c_srs = c; - m = m_SRS[c]; - } - } + bwp->bwp_Common->pdcch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon)); + bwp->bwp_Common->pdcch_ConfigCommon->present = NR_SetupRelease_PDCCH_ConfigCommon_PR_setup; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup)); + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->controlResourceSetZero=NULL; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet)); + + int curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); - return c_srs; + NR_ControlResourceSet_t *coreset = calloc(1,sizeof(*coreset)); + uint64_t bitmap = get_ssb_bitmap(scc); + rrc_coreset_config(coreset, bwp->bwp_Id, curr_bwp, bitmap); + + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = coreset; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceZero=NULL; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=NULL; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList)); + + NR_SearchSpace_t *ss=calloc(1,sizeof(*ss)); + ss->searchSpaceId = (bwp->bwp_Id<<1)-1 + 7; // To uniquely identify each SearchSpace lets derive it from the BWPId + ss->controlResourceSetId=calloc(1,sizeof(*ss->controlResourceSetId)); + *ss->controlResourceSetId=coreset->controlResourceSetId; + ss->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*ss->monitoringSlotPeriodicityAndOffset)); + ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1; + ss->duration=NULL; + ss->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss->monitoringSymbolsWithinSlot)); + ss->monitoringSymbolsWithinSlot->buf = calloc(1,2); + // should be '1100 0000 0000 00'B (LSB first!), first two symols in slot, adjust if needed + ss->monitoringSymbolsWithinSlot->buf[1] = 0; + ss->monitoringSymbolsWithinSlot->buf[0] = (1<<7); + ss->monitoringSymbolsWithinSlot->size = 2; + ss->monitoringSymbolsWithinSlot->bits_unused = 2; + ss->nrofCandidates = calloc(1,sizeof(*ss->nrofCandidates)); + ss->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0; + ss->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n2; + ss->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1; + ss->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0; + ss->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0; + ss->searchSpaceType = calloc(1,sizeof(*ss->searchSpaceType)); + ss->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common; + ss->searchSpaceType->choice.common=calloc(1,sizeof(*ss->searchSpaceType->choice.common)); + ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0)); + + ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list,ss); + + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=NULL; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation=NULL; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->pagingSearchSpace=NULL; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=NULL; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ext1=NULL; + bwp->bwp_Common->pdsch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon)); + bwp->bwp_Common->pdsch_ConfigCommon->present = NR_SetupRelease_PDSCH_ConfigCommon_PR_setup; + bwp->bwp_Common->pdsch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup)); + bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)); + + // Prepare PDSCH-TimeDomainResourceAllocation list + nr_rrc_config_dl_tda(scc, + bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList, + curr_bwp); + + /// BWP dedicated configuration + bwp->bwp_Dedicated=calloc(1,sizeof(*bwp->bwp_Dedicated)); + bwp->bwp_Dedicated->pdcch_Config=calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config)); + bwp->bwp_Dedicated->pdcch_Config->present = NR_SetupRelease_PDCCH_Config_PR_setup; + bwp->bwp_Dedicated->pdcch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup)); + bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList)); + bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList)); + + NR_ControlResourceSet_t *coreset2 = calloc(1,sizeof(*coreset2)); + rrc_coreset_config(coreset2, bwp->bwp_Id, curr_bwp, bitmap); + ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list, coreset2); + + bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList)); + NR_SearchSpace_t *ss2 = calloc(1,sizeof(*ss2)); + ss2->searchSpaceId=(bwp->bwp_Id<<1) + 7; // To uniquely identify each SearchSpace lets derive it from the BWPId + ss2->controlResourceSetId=calloc(1,sizeof(*ss2->controlResourceSetId)); + *ss2->controlResourceSetId=coreset2->controlResourceSetId; + ss2->monitoringSlotPeriodicityAndOffset=calloc(1,sizeof(*ss2->monitoringSlotPeriodicityAndOffset)); + ss2->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1; + ss2->monitoringSlotPeriodicityAndOffset->choice.sl1=(NULL_t)0; + ss2->duration=NULL; + ss2->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss2->monitoringSymbolsWithinSlot)); + ss2->monitoringSymbolsWithinSlot->buf = calloc(1,2); + ss2->monitoringSymbolsWithinSlot->size = 2; + ss2->monitoringSymbolsWithinSlot->buf[0]=0x80; + ss2->monitoringSymbolsWithinSlot->buf[1]=0x0; + ss2->monitoringSymbolsWithinSlot->bits_unused = 2; + ss2->nrofCandidates=calloc(1,sizeof(*ss2->nrofCandidates)); + ss2->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0; + ss2->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n2; + ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1; + ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0; + ss2->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0; + ss2->searchSpaceType=calloc(1,sizeof(*ss2->searchSpaceType)); + ss2->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_ue_Specific; + ss2->searchSpaceType->choice.ue_Specific = calloc(1,sizeof(*ss2->searchSpaceType->choice.ue_Specific)); + ss2->searchSpaceType->choice.ue_Specific->dci_Formats=NR_SearchSpace__searchSpaceType__ue_Specific__dci_Formats_formats0_1_And_1_1; + ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list, ss2); + + bwp->bwp_Dedicated->pdsch_Config=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config)); + bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup; + bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup)); + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA)); + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present= NR_SetupRelease_DMRS_DownlinkConfig_PR_setup; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup)); + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition)); + *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation = NR_PDSCH_Config__resourceAllocation_resourceAllocationType1; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling)); + bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = + calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize)); + *bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList)); + NR_TCI_State_t *tcic = calloc(1,sizeof(*tcic)); + tcic->tci_StateId=0; + tcic->qcl_Type1.cell=NULL; + tcic->qcl_Type1.bwp_Id=NULL; + tcic->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb; + tcic->qcl_Type1.referenceSignal.choice.ssb = 0; + tcic->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeD; + ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcic); } +void fill_default_uplinkBWP(NR_BWP_Uplink_t *ubwp, + int bwp_loop, + NR_ServingCellConfig_t *servingcellconfigdedicated, + NR_ServingCellConfigCommon_t *scc, + const gNB_RrcConfigurationReq *configuration, + int uid) { + + /// BWP common configuration + ubwp->bwp_Common = calloc(1,sizeof(*ubwp->bwp_Common)); + if(servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList && + bwp_loop < servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count) { + ubwp->bwp_Id = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Id; + ubwp->bwp_Common->genericParameters.locationAndBandwidth = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.locationAndBandwidth; + ubwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.subcarrierSpacing; + ubwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.cyclicPrefix; + } else { + ubwp->bwp_Id=bwp_loop+1; + ubwp->bwp_Common->genericParameters.locationAndBandwidth = PRBalloc_to_locationandbandwidth(scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0); + ubwp->bwp_Common->genericParameters.subcarrierSpacing = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing; + ubwp->bwp_Common->genericParameters.cyclicPrefix = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.cyclicPrefix; + } -void fill_initial_SpCellConfig(int uid, - NR_SpCellConfig_t *SpCellConfig, - NR_ServingCellConfigCommon_t *scc, - const gNB_RrcConfigurationReq *configuration) -{ - // This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4. - // However, if in the future NUMBER_OF_UE_MAX is increased, it will be necessary to improve the allocation of SRS resources, - // where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations. - AssertFatal(uid>=0 && uid<30, "gNB cannot allocate the SRS resources\n"); + int curr_bwp = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); - int curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); - SpCellConfig->servCellIndex = NULL; - SpCellConfig->reconfigurationWithSync = NULL; - SpCellConfig->rlmInSyncOutOfSyncThreshold = NULL; - SpCellConfig->rlf_TimersAndConstants = NULL; - SpCellConfig->spCellConfigDedicated = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated)); - SpCellConfig->spCellConfigDedicated->uplinkConfig = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig)); - NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP)); - SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP; - initialUplinkBWP->pucch_Config = calloc(1,sizeof(*initialUplinkBWP->pucch_Config)); - initialUplinkBWP->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup; + ubwp->bwp_Common->rach_ConfigCommon = NULL; + ubwp->bwp_Common->pusch_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon; + ubwp->bwp_Common->pucch_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon; + + /// BWP dedicated configuration + ubwp->bwp_Dedicated = calloc(1,sizeof(*ubwp->bwp_Dedicated)); + + // PUCCH config + ubwp->bwp_Dedicated->pucch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pucch_Config)); + ubwp->bwp_Dedicated->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup; NR_PUCCH_Config_t *pucch_Config = calloc(1,sizeof(*pucch_Config)); - initialUplinkBWP->pucch_Config->choice.setup=pucch_Config; + ubwp->bwp_Dedicated->pucch_Config->choice.setup=pucch_Config; + pucch_Config->resourceSetToAddModList = calloc(1,sizeof(*pucch_Config->resourceSetToAddModList)); pucch_Config->resourceSetToReleaseList = NULL; - NR_PUCCH_ResourceSet_t *pucchresset0=calloc(1,sizeof(*pucchresset0)); - NR_PUCCH_ResourceSet_t *pucchresset1=calloc(1,sizeof(*pucchresset1)); - pucchresset0->pucch_ResourceSetId = 0; - NR_PUCCH_ResourceId_t *pucchresset0id0=calloc(1,sizeof(*pucchresset0id0)); - *pucchresset0id0=0; - ASN_SEQUENCE_ADD(&pucchresset0->resourceList.list,pucchresset0id0); - pucchresset0->maxPayloadSize=NULL; - ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset0); - - pucchresset1->pucch_ResourceSetId = 1; - NR_PUCCH_ResourceId_t *pucchresset1id0=calloc(1,sizeof(*pucchresset1id0)); - *pucchresset1id0=1; - ASN_SEQUENCE_ADD(&pucchresset1->resourceList.list,pucchresset1id0); - pucchresset1->maxPayloadSize=NULL; - ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset1); - pucch_Config->resourceToAddModList = calloc(1,sizeof(*pucch_Config->resourceToAddModList)); pucch_Config->resourceToReleaseList = NULL; - // configure one single PUCCH0 opportunity for initial connection procedure - // one symbol (13) - NR_PUCCH_Resource_t *pucchres0=calloc(1,sizeof(*pucchres0)); - pucchres0->pucch_ResourceId=0; - //pucchres0->startingPRB=0; - pucchres0->startingPRB=(8+uid) % (curr_bwp/2); - LOG_D(NR_RRC, "pucchres0->startPRB %ld uid %d curr_bwp %d\n", pucchres0->startingPRB, uid, curr_bwp); - pucchres0->intraSlotFrequencyHopping=NULL; - pucchres0->secondHopPRB=NULL; - pucchres0->format.present= NR_PUCCH_Resource__format_PR_format0; - pucchres0->format.choice.format0=calloc(1,sizeof(*pucchres0->format.choice.format0)); - pucchres0->format.choice.format0->initialCyclicShift=0; - pucchres0->format.choice.format0->nrofSymbols=1; - pucchres0->format.choice.format0->startingSymbolIndex=13; - ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres0); - - NR_PUCCH_Resource_t *pucchres2=calloc(1,sizeof(*pucchres2)); - pucchres2->pucch_ResourceId=1; - pucchres2->startingPRB=0; - pucchres2->intraSlotFrequencyHopping=NULL; - pucchres2->secondHopPRB=NULL; - pucchres2->format.present= NR_PUCCH_Resource__format_PR_format2; - pucchres2->format.choice.format2=calloc(1,sizeof(*pucchres2->format.choice.format2)); - pucchres2->format.choice.format2->nrofPRBs=8; - pucchres2->format.choice.format2->nrofSymbols=1; - pucchres2->format.choice.format2->startingSymbolIndex=13; - ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres2); - - pucch_Config->format2=calloc(1,sizeof(*pucch_Config->format2)); - pucch_Config->format2->present=NR_SetupRelease_PUCCH_FormatConfig_PR_setup; - NR_PUCCH_FormatConfig_t *pucchfmt2 = calloc(1,sizeof(*pucchfmt2)); - pucch_Config->format2->choice.setup = pucchfmt2; - pucchfmt2->interslotFrequencyHopping=NULL; - pucchfmt2->additionalDMRS=NULL; - pucchfmt2->maxCodeRate=calloc(1,sizeof(*pucchfmt2->maxCodeRate)); - *pucchfmt2->maxCodeRate=NR_PUCCH_MaxCodeRate_zeroDot35; - pucchfmt2->nrofSlots=NULL; - pucchfmt2->pi2BPSK=NULL; - pucchfmt2->simultaneousHARQ_ACK_CSI=calloc(1,sizeof(*pucchfmt2->simultaneousHARQ_ACK_CSI)); - *pucchfmt2->simultaneousHARQ_ACK_CSI=NR_PUCCH_FormatConfig__simultaneousHARQ_ACK_CSI_true; - - pucch_Config->spatialRelationInfoToAddModList = calloc(1,sizeof(*pucch_Config->spatialRelationInfoToAddModList)); - NR_PUCCH_SpatialRelationInfo_t *pucchspatial = calloc(1,sizeof(*pucchspatial)); - pucchspatial->pucch_SpatialRelationInfoId = 1; - pucchspatial->servingCellId = NULL; - if(configuration->do_CSIRS) { - pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index; - pucchspatial->referenceSignal.choice.csi_RS_Index = 0; - } - else { - pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_ssb_Index; - pucchspatial->referenceSignal.choice.ssb_Index = 0; - } - pucchspatial->pucch_PathlossReferenceRS_Id = 0; - pucchspatial->p0_PUCCH_Id = 1; - pucchspatial->closedLoopIndex = NR_PUCCH_SpatialRelationInfo__closedLoopIndex_i0; - ASN_SEQUENCE_ADD(&pucch_Config->spatialRelationInfoToAddModList->list,pucchspatial); + config_pucch_resset0(pucch_Config, uid, curr_bwp, NULL); + config_pucch_resset1(pucch_Config, NULL); + set_pucch_power_config(pucch_Config, configuration->do_CSIRS); + scheduling_request_config(scc, pucch_Config); + set_dl_DataToUL_ACK(pucch_Config, configuration->minRXTXTIME); - initialUplinkBWP->pusch_Config = calloc(1,sizeof(*initialUplinkBWP->pusch_Config)); - initialUplinkBWP->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup; + // PUSCH config + ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config)); + ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup; NR_PUSCH_Config_t *pusch_Config = calloc(1,sizeof(*pusch_Config)); - initialUplinkBWP->pusch_Config->choice.setup = pusch_Config; - pusch_Config->dataScramblingIdentityPUSCH = NULL; + ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config; pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig)); *pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook; pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL; @@ -1129,8 +1193,8 @@ void fill_initial_SpCellConfig(int uid, pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup)); NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup; NR_DMRS_UplinkConfig->dmrs_Type = NULL; - NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NULL; /*calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition)); - *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0;*/ + NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition)); + *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0; NR_DMRS_UplinkConfig->phaseTrackingRS=NULL; NR_DMRS_UplinkConfig->maxLength=NULL; NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled)); @@ -1142,7 +1206,7 @@ void fill_initial_SpCellConfig(int uid, pusch_Config->pusch_PowerControl->msg3_Alpha = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->msg3_Alpha)); *pusch_Config->pusch_PowerControl->msg3_Alpha = NR_Alpha_alpha1; pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant)); - *pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = -76; + *pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = -98; pusch_Config->pusch_PowerControl->p0_AlphaSets = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_AlphaSets)); NR_P0_PUSCH_AlphaSet_t *aset = calloc(1,sizeof(*aset)); aset->p0_PUSCH_AlphaSetId=0; @@ -1187,11 +1251,30 @@ void fill_initial_SpCellConfig(int uid, pusch_Config->rbg_Size=NULL; pusch_Config->uci_OnPUSCH=NULL; pusch_Config->tp_pi2BPSK=NULL; + uint8_t transform_precoding = NR_PUSCH_Config__transformPrecoder_disabled; + if (pusch_Config->transformPrecoder == NULL) { + if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder != NULL) + transform_precoding = NR_PUSCH_Config__transformPrecoder_enabled; + } + else { + transform_precoding = *pusch_Config->transformPrecoder; + } + if (transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled) { + // Enable DMRS uplink config for transform precoding enabled + NR_DMRS_UplinkConfig->transformPrecodingEnabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingEnabled)); + NR_DMRS_UplinkConfig->transformPrecodingEnabled->nPUSCH_Identity = NULL; + NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceGroupHopping = NULL; + NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceHopping = NULL; + NR_DMRS_UplinkConfig->transformPrecodingEnabled->ext1 = NULL; + LOG_I(NR_RRC,"Transform precoding enabled\n"); + } - initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config)); - initialUplinkBWP->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup; + // SRS config + ubwp->bwp_Dedicated->configuredGrantConfig = NULL; + ubwp->bwp_Dedicated->srs_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->srs_Config)); + ubwp->bwp_Dedicated->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup; NR_SRS_Config_t *srs_Config = calloc(1,sizeof(*srs_Config)); - initialUplinkBWP->srs_Config->choice.setup=srs_Config; + ubwp->bwp_Dedicated->srs_Config->choice.setup = srs_Config; srs_Config->srs_ResourceSetToReleaseList=NULL; srs_Config->srs_ResourceSetToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceSetToAddModList)); NR_SRS_ResourceSet_t *srs_resset0=calloc(1,sizeof(*srs_resset0)); @@ -1201,21 +1284,13 @@ void fill_initial_SpCellConfig(int uid, *srs_resset0_id=0; ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list,srs_resset0_id); srs_Config->srs_ResourceToReleaseList=NULL; - - if (configuration->do_SRS) { - srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_periodic; - srs_resset0->resourceType.choice.periodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.periodic)); - srs_resset0->resourceType.choice.periodic->associatedCSI_RS = NULL; - } else { - srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_aperiodic; - srs_resset0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic)); - srs_resset0->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger=1; - srs_resset0->resourceType.choice.aperiodic->csi_RS=NULL; - srs_resset0->resourceType.choice.aperiodic->slotOffset= calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic->slotOffset)); - *srs_resset0->resourceType.choice.aperiodic->slotOffset=2; - srs_resset0->resourceType.choice.aperiodic->ext1=NULL; - } - + srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_aperiodic; + srs_resset0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic)); + srs_resset0->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger=1; + srs_resset0->resourceType.choice.aperiodic->csi_RS=NULL; + srs_resset0->resourceType.choice.aperiodic->slotOffset= calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic->slotOffset)); + *srs_resset0->resourceType.choice.aperiodic->slotOffset=2; + srs_resset0->resourceType.choice.aperiodic->ext1=NULL; srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook; srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha)); *srs_resset0->alpha = NR_Alpha_alpha1; @@ -1234,28 +1309,17 @@ void fill_initial_SpCellConfig(int uid, srs_res0->transmissionComb.choice.n2=calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2)); srs_res0->transmissionComb.choice.n2->combOffset_n2=0; srs_res0->transmissionComb.choice.n2->cyclicShift_n2=0; - srs_res0->resourceMapping.startPosition = 2 + uid%2; + srs_res0->resourceMapping.startPosition=2; srs_res0->resourceMapping.nrofSymbols=NR_SRS_Resource__resourceMapping__nrofSymbols_n1; srs_res0->resourceMapping.repetitionFactor=NR_SRS_Resource__resourceMapping__repetitionFactor_n1; srs_res0->freqDomainPosition=0; srs_res0->freqDomainShift=0; + srs_res0->freqHopping.c_SRS=0; srs_res0->freqHopping.b_SRS=0; srs_res0->freqHopping.b_hop=0; - srs_res0->freqHopping.c_SRS = rrc_get_max_nr_csrs( - NRRIV2BW(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275), - srs_res0->freqHopping.b_SRS); srs_res0->groupOrSequenceHopping=NR_SRS_Resource__groupOrSequenceHopping_neither; - - if (configuration->do_SRS) { - srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_periodic; - srs_res0->resourceType.choice.periodic=calloc(1,sizeof(*srs_res0->resourceType.choice.periodic)); - srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.present = NR_SRS_PeriodicityAndOffset_PR_sl160; - srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.choice.sl160 = 17 + (uid>1)*10; // 17/17/.../147/157 are mixed slots - } else { - srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_aperiodic; - srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic)); - } - + srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_aperiodic; + srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic)); srs_res0->sequenceId=40; srs_res0->spatialRelationInfo=calloc(1,sizeof(*srs_res0->spatialRelationInfo)); srs_res0->spatialRelationInfo->servingCellId=NULL; @@ -1263,31 +1327,124 @@ void fill_initial_SpCellConfig(int uid, srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index=0; ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0); - // configure Scheduling request - // 40 slot period - pucch_Config->schedulingRequestResourceToAddModList = calloc(1,sizeof(*pucch_Config->schedulingRequestResourceToAddModList)); - NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig = calloc(1,sizeof(*schedulingRequestResourceConfig)); - schedulingRequestResourceConfig->schedulingRequestResourceId = 1; - schedulingRequestResourceConfig->schedulingRequestID= 0; - schedulingRequestResourceConfig->periodicityAndOffset = calloc(1,sizeof(*schedulingRequestResourceConfig->periodicityAndOffset)); - schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40; - AssertFatal(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing==NR_SubcarrierSpacing_kHz30, - "SCS != 30kHz\n"); - - schedulingRequestResourceConfig->periodicityAndOffset->choice.sl40 = 8; - schedulingRequestResourceConfig->resource = calloc(1,sizeof(*schedulingRequestResourceConfig->resource)); - *schedulingRequestResourceConfig->resource = 0; - ASN_SEQUENCE_ADD(&pucch_Config->schedulingRequestResourceToAddModList->list,schedulingRequestResourceConfig); - - pucch_Config->dl_DataToUL_ACK = calloc(1,sizeof(*pucch_Config->dl_DataToUL_ACK)); - long *delay[8]; - for (int i=0;i<8;i++) { - delay[i] = calloc(1,sizeof(*delay[i])); - AssertFatal(configuration->minRXTXTIME >= 2 && configuration->minRXTXTIME < 7, - "minRXTXTIME is %d but should be within [2,7)\n", configuration->minRXTXTIME); - *delay[i] = i + configuration->minRXTXTIME; - ASN_SEQUENCE_ADD(&pucch_Config->dl_DataToUL_ACK->list,delay[i]); - } + ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL; +} + +void fill_initial_SpCellConfig(int uid, + NR_CellGroupConfig_t *cellGroupConfig, + NR_ServingCellConfigCommon_t *scc, + NR_ServingCellConfig_t *servingcellconfigdedicated, + const gNB_RrcConfigurationReq *configuration) { + + NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig; + + // This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4. + // However, if in the future NUMBER_OF_UE_MAX is increased, it will be necessary to improve the allocation of SRS resources, + // where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations. + AssertFatal(uid>=0 && uid<30, "gNB cannot allocate the SRS resources\n"); + + int curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); + SpCellConfig->servCellIndex = NULL; + SpCellConfig->reconfigurationWithSync = NULL; + SpCellConfig->rlmInSyncOutOfSyncThreshold = NULL; + SpCellConfig->rlf_TimersAndConstants = NULL; + + SpCellConfig->spCellConfigDedicated = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated)); + SpCellConfig->spCellConfigDedicated->uplinkConfig = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig)); + + NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP)); + SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP; + initialUplinkBWP->pucch_Config = calloc(1,sizeof(*initialUplinkBWP->pucch_Config)); + initialUplinkBWP->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup; + NR_PUCCH_Config_t *pucch_Config = calloc(1,sizeof(*pucch_Config)); + initialUplinkBWP->pucch_Config->choice.setup=pucch_Config; + pucch_Config->resourceSetToAddModList = calloc(1,sizeof(*pucch_Config->resourceSetToAddModList)); + pucch_Config->resourceSetToReleaseList = NULL; + pucch_Config->resourceToAddModList = calloc(1,sizeof(*pucch_Config->resourceToAddModList)); + pucch_Config->resourceToReleaseList = NULL; + config_pucch_resset0(pucch_Config, uid, curr_bwp, NULL); + config_pucch_resset1(pucch_Config, NULL); + set_pucch_power_config(pucch_Config, configuration->do_CSIRS); + + initialUplinkBWP->pusch_Config = calloc(1,sizeof(*initialUplinkBWP->pusch_Config)); + initialUplinkBWP->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup; + NR_PUSCH_Config_t *pusch_Config = calloc(1,sizeof(*pusch_Config)); + initialUplinkBWP->pusch_Config->choice.setup = pusch_Config; + pusch_Config->dataScramblingIdentityPUSCH = NULL; + pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig)); + *pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook; + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL; + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB)); + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup; + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup)); + NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup; + NR_DMRS_UplinkConfig->dmrs_Type = NULL; + NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NULL; /*calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition)); + *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0;*/ + NR_DMRS_UplinkConfig->phaseTrackingRS=NULL; + NR_DMRS_UplinkConfig->maxLength=NULL; + NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled)); + NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0 = NULL; + NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID1 = NULL; + NR_DMRS_UplinkConfig->transformPrecodingEnabled = NULL; + pusch_Config->pusch_PowerControl = calloc(1,sizeof(*pusch_Config->pusch_PowerControl)); + pusch_Config->pusch_PowerControl->tpc_Accumulation = NULL; + pusch_Config->pusch_PowerControl->msg3_Alpha = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->msg3_Alpha)); + *pusch_Config->pusch_PowerControl->msg3_Alpha = NR_Alpha_alpha1; + pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant)); + *pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = -76; + pusch_Config->pusch_PowerControl->p0_AlphaSets = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_AlphaSets)); + NR_P0_PUSCH_AlphaSet_t *aset = calloc(1,sizeof(*aset)); + aset->p0_PUSCH_AlphaSetId=0; + aset->p0=calloc(1,sizeof(*aset->p0)); + *aset->p0 = 0; + aset->alpha=calloc(1,sizeof(*aset->alpha)); + *aset->alpha=NR_Alpha_alpha1; + ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->p0_AlphaSets->list,aset); + pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList)); + NR_PUSCH_PathlossReferenceRS_t *plrefRS = calloc(1,sizeof(*plrefRS)); + plrefRS->pusch_PathlossReferenceRS_Id=0; + plrefRS->referenceSignal.present = NR_PUSCH_PathlossReferenceRS__referenceSignal_PR_ssb_Index; + plrefRS->referenceSignal.choice.ssb_Index = 0; + ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList->list,plrefRS); + pusch_Config->pusch_PowerControl->pathlossReferenceRSToReleaseList = NULL; + pusch_Config->pusch_PowerControl->twoPUSCH_PC_AdjustmentStates = NULL; + pusch_Config->pusch_PowerControl->deltaMCS = NULL; + pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList)); + NR_SRI_PUSCH_PowerControl_t *sriPUSCHPC=calloc(1,sizeof(*sriPUSCHPC)); + sriPUSCHPC->sri_PUSCH_PowerControlId=0; + sriPUSCHPC->sri_PUSCH_PathlossReferenceRS_Id=0; + sriPUSCHPC->sri_P0_PUSCH_AlphaSetId=0; + sriPUSCHPC->sri_PUSCH_ClosedLoopIndex=NR_SRI_PUSCH_PowerControl__sri_PUSCH_ClosedLoopIndex_i0; + ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList->list,sriPUSCHPC); + pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToReleaseList = NULL; + pusch_Config->frequencyHopping=NULL; + pusch_Config->frequencyHoppingOffsetLists=NULL; + pusch_Config->resourceAllocation = NR_PUSCH_Config__resourceAllocation_resourceAllocationType1; + pusch_Config->pusch_TimeDomainAllocationList = NULL; + pusch_Config->pusch_AggregationFactor=NULL; + pusch_Config->mcs_Table=NULL; + pusch_Config->mcs_TableTransformPrecoder=NULL; + pusch_Config->transformPrecoder= NULL; + if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) { + pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder)); + *pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled; + } + pusch_Config->codebookSubset=calloc(1,sizeof(*pusch_Config->codebookSubset)); + *pusch_Config->codebookSubset = NR_PUSCH_Config__codebookSubset_nonCoherent; + pusch_Config->maxRank=calloc(1,sizeof(*pusch_Config->maxRank)); + *pusch_Config->maxRank= 1; + pusch_Config->rbg_Size=NULL; + pusch_Config->uci_OnPUSCH=NULL; + pusch_Config->tp_pi2BPSK=NULL; + + // We are using do_srs = 0 here because the periodic SRS will only be enabled in update_cellGroupConfig() if do_srs == 1 + initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config)); + config_srs(initialUplinkBWP->srs_Config, scc, uid, 0); + + scheduling_request_config(scc, pucch_Config); + + set_dl_DataToUL_ACK(pucch_Config, configuration->minRXTXTIME); SpCellConfig->spCellConfigDedicated->initialDownlinkBWP = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->initialDownlinkBWP)); NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP; @@ -1300,37 +1457,9 @@ void fill_initial_SpCellConfig(int uid, bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList = calloc(1,sizeof(*bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList)); NR_ControlResourceSet_t *coreset = calloc(1,sizeof(*coreset)); - coreset->controlResourceSetId=1; - // frequency domain resources depends on BWP size - // options are 24, 48 or 96 - coreset->frequencyDomainResources.buf = calloc(1,6); - if (0) { - if (curr_bwp < 48) - coreset->frequencyDomainResources.buf[0] = 0xf0; - else - coreset->frequencyDomainResources.buf[0] = 0xff; - if (curr_bwp < 96) - coreset->frequencyDomainResources.buf[1] = 0; - else - coreset->frequencyDomainResources.buf[1] = 0xff; - } else { - coreset->frequencyDomainResources.buf[0] = 0xf0; - coreset->frequencyDomainResources.buf[1] = 0; - } - coreset->frequencyDomainResources.buf[2] = 0; - coreset->frequencyDomainResources.buf[3] = 0; - coreset->frequencyDomainResources.buf[4] = 0; - coreset->frequencyDomainResources.buf[5] = 0; - coreset->frequencyDomainResources.size = 6; - coreset->frequencyDomainResources.bits_unused = 3; - coreset->duration=1; - coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved; - coreset->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle; - - coreset->tci_StatesPDCCH_ToAddList=NULL; - coreset->tci_StatesPDCCH_ToReleaseList = NULL; - coreset->tci_PresentInDCI = NULL; - coreset->pdcch_DMRS_ScramblingID = NULL; + + uint64_t bitmap = get_ssb_bitmap(scc); + rrc_coreset_config(coreset, 0, curr_bwp, bitmap); ASN_SEQUENCE_ADD(&bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list, coreset); @@ -1341,7 +1470,7 @@ void fill_initial_SpCellConfig(int uid, ss2->searchSpaceId=2; ss2->controlResourceSetId=calloc(1,sizeof(*ss2->controlResourceSetId)); - *ss2->controlResourceSetId=1; + *ss2->controlResourceSetId=coreset->controlResourceSetId; ss2->monitoringSlotPeriodicityAndOffset=calloc(1,sizeof(*ss2->monitoringSlotPeriodicityAndOffset)); ss2->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1; ss2->monitoringSlotPeriodicityAndOffset->choice.sl1=(NULL_t)0; @@ -1349,13 +1478,13 @@ void fill_initial_SpCellConfig(int uid, ss2->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss2->monitoringSymbolsWithinSlot)); ss2->monitoringSymbolsWithinSlot->buf = calloc(1,2); ss2->monitoringSymbolsWithinSlot->size = 2; - ss2->monitoringSymbolsWithinSlot->bits_unused = 2; ss2->monitoringSymbolsWithinSlot->buf[0]=0x80; ss2->monitoringSymbolsWithinSlot->buf[1]=0x0; + ss2->monitoringSymbolsWithinSlot->bits_unused = 2; ss2->nrofCandidates=calloc(1,sizeof(*ss2->nrofCandidates)); ss2->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0; ss2->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n2; - ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n0; + ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1; ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0; ss2->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0; ss2->searchSpaceType=calloc(1,sizeof(*ss2->searchSpaceType)); @@ -1377,13 +1506,13 @@ void fill_initial_SpCellConfig(int uid, bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength=NULL; bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition)); - *bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1; - bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation = NR_PDSCH_Config__resourceAllocation_resourceAllocationType1; - bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling; - bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling)); - bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = - calloc(1,sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize)); - *bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband; + *bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1; + bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation = NR_PDSCH_Config__resourceAllocation_resourceAllocationType1; + bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling; + bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling)); + bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = + calloc(1,sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize)); + *bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband; bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList)); NR_TCI_State_t *tcic; @@ -1405,50 +1534,20 @@ void fill_initial_SpCellConfig(int uid, SpCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup = pdsch_servingcellconfig; if (configuration->do_CSIRS) { - + SpCellConfig->spCellConfigDedicated->csi_MeasConfig=calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->csi_MeasConfig)); SpCellConfig->spCellConfigDedicated->csi_MeasConfig->present = NR_SetupRelease_CSI_MeasConfig_PR_setup; NR_CSI_MeasConfig_t *csi_MeasConfig = calloc(1,sizeof(*csi_MeasConfig)); SpCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup = csi_MeasConfig; int pdsch_AntennaPorts = configuration->pdsch_AntennaPorts.N1 * configuration->pdsch_AntennaPorts.N2 * configuration->pdsch_AntennaPorts.XP; - if (pdsch_AntennaPorts > 1) { - csi_MeasConfig->csi_IM_ResourceToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceToAddModList)); - NR_CSI_IM_Resource_t *imres0 = calloc(1,sizeof(*imres0)); - imres0->csi_IM_ResourceId = 0; - imres0->csi_IM_ResourceElementPattern = calloc(1,sizeof(*imres0->csi_IM_ResourceElementPattern)); - imres0->csi_IM_ResourceElementPattern->present = NR_CSI_IM_Resource__csi_IM_ResourceElementPattern_PR_pattern1; - imres0->csi_IM_ResourceElementPattern->choice.pattern1 = calloc(1,sizeof(*imres0->csi_IM_ResourceElementPattern->choice.pattern1)); - imres0->csi_IM_ResourceElementPattern->choice.pattern1->subcarrierLocation_p1 = NR_CSI_IM_Resource__csi_IM_ResourceElementPattern__pattern1__subcarrierLocation_p1_s4; - imres0->csi_IM_ResourceElementPattern->choice.pattern1->symbolLocation_p1 = 6; - imres0->freqBand = calloc(1,sizeof(*imres0->freqBand)); - imres0->freqBand->startingRB = 0; - imres0->freqBand->nrofRBs = 108; - imres0->periodicityAndOffset = calloc(1,sizeof(*imres0->periodicityAndOffset)); - imres0->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots320; - imres0->periodicityAndOffset->choice.slots320 = 0; - ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceToAddModList->list,imres0); - csi_MeasConfig->csi_IM_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceSetToAddModList)); - NR_CSI_IM_ResourceSet_t *imset0 = calloc(1,sizeof(*imset0)); - imset0->csi_IM_ResourceSetId = 0; - NR_CSI_IM_ResourceId_t *res0 = calloc(1,sizeof(*res0)); - *res0 = 0; - ASN_SEQUENCE_ADD(&imset0->csi_IM_Resources,res0); - ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceSetToAddModList->list,imset0); - } - else { - csi_MeasConfig->csi_IM_ResourceToAddModList = NULL; - csi_MeasConfig->csi_IM_ResourceSetToAddModList = NULL; - } - - csi_MeasConfig->csi_IM_ResourceToReleaseList = NULL; - csi_MeasConfig->csi_IM_ResourceSetToReleaseList = NULL; - config_csirs(scc, csi_MeasConfig, uid, pdsch_AntennaPorts,curr_bwp,configuration->do_CSIRS); + config_csirs(scc, csi_MeasConfig, uid, pdsch_AntennaPorts, curr_bwp, configuration->do_CSIRS); + config_csiim(configuration->do_CSIRS, pdsch_AntennaPorts, curr_bwp, csi_MeasConfig); csi_MeasConfig->csi_SSB_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_SSB_ResourceSetToAddModList)); csi_MeasConfig->csi_SSB_ResourceSetToReleaseList = NULL; - + NR_CSI_SSB_ResourceSet_t *ssbresset0 = calloc(1,sizeof(*ssbresset0)); ssbresset0->csi_SSB_ResourceSetId=0; @@ -1493,7 +1592,6 @@ void fill_initial_SpCellConfig(int uid, csires0->bwp_Id = 0; csires0->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires0); - NR_CSI_ResourceConfig_t *csires1 = calloc(1,sizeof(*csires1)); csires1->csi_ResourceConfigId=1; @@ -1501,7 +1599,7 @@ void fill_initial_SpCellConfig(int uid, csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB)); csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = calloc(1,sizeof(*csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList)); NR_CSI_SSB_ResourceSetId_t *ssbres00 = calloc(1,sizeof(*ssbres00)); - *ssbres00 = 0; + *ssbres00 = 0; ASN_SEQUENCE_ADD(&csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list,ssbres00); csires1->bwp_Id = 0; csires1->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; @@ -1521,8 +1619,8 @@ void fill_initial_SpCellConfig(int uid, } NR_PUCCH_CSI_Resource_t *pucchcsires1 = calloc(1,sizeof(*pucchcsires1)); - pucchcsires1->uplinkBandwidthPartId=0; - pucchcsires1->pucch_Resource=1; + pucchcsires1->uplinkBandwidthPartId = 0; + pucchcsires1->pucch_Resource = *pucch_Config->resourceSetToAddModList->list.array[1]->resourceList.list.array[0]; csi_MeasConfig->csi_ReportConfigToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_ReportConfigToAddModList)); csi_MeasConfig->csi_ReportConfigToReleaseList = NULL; if (pdsch_AntennaPorts > 1) { @@ -1537,7 +1635,7 @@ void fill_initial_SpCellConfig(int uid, csirep1->reportConfigType.present = NR_CSI_ReportConfig__reportConfigType_PR_periodic; csirep1->reportConfigType.choice.periodic = calloc(1,sizeof(*csirep1->reportConfigType.choice.periodic)); csirep1->reportConfigType.choice.periodic->reportSlotConfig.present=NR_CSI_ReportPeriodicityAndOffset_PR_slots320; - csirep1->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = (7 + (20 * uid)) % 320; + csirep1->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = (7 + (30 * uid)) % 320; ASN_SEQUENCE_ADD(&csirep1->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list,pucchcsires1); csirep1->reportQuantity.present = NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI; csirep1->reportQuantity.choice.cri_RI_PMI_CQI=(NULL_t)0; @@ -1546,8 +1644,8 @@ void fill_initial_SpCellConfig(int uid, *csirep1->reportFreqConfiguration->cqi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI; csirep1->reportFreqConfiguration->pmi_FormatIndicator = calloc(1,sizeof(*csirep1->reportFreqConfiguration->pmi_FormatIndicator)); *csirep1->reportFreqConfiguration->pmi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__pmi_FormatIndicator_widebandPMI; - csirep1->reportFreqConfiguration->csi_ReportingBand = NULL; -/*calloc(1,sizeof(*csirep1->reportFreqConfiguration->csi_ReportingBand)); + csirep1->reportFreqConfiguration->csi_ReportingBand = NULL; + /*calloc(1,sizeof(*csirep1->reportFreqConfiguration->csi_ReportingBand)); csirep1->reportFreqConfiguration->csi_ReportingBand->present = NR_CSI_ReportConfig__reportFreqConfiguration__csi_ReportingBand_PR_subbands7; csirep1->reportFreqConfiguration->csi_ReportingBand->choice.subbands7.size=1; csirep1->reportFreqConfiguration->csi_ReportingBand->choice.subbands7.bits_unused=1; @@ -1596,7 +1694,7 @@ void fill_initial_SpCellConfig(int uid, csirep2->reportConfigType.present = NR_CSI_ReportConfig__reportConfigType_PR_periodic; csirep2->reportConfigType.choice.periodic = calloc(1,sizeof(*csirep2->reportConfigType.choice.periodic)); csirep2->reportConfigType.choice.periodic->reportSlotConfig.present=NR_CSI_ReportPeriodicityAndOffset_PR_slots320; - csirep2->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = (27 + (20 * uid)) % 320; + csirep2->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = (27 + (30 * uid)) % 320; ASN_SEQUENCE_ADD(&csirep2->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list,pucchcsires1); csirep2->reportQuantity.present = NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP; csirep2->reportQuantity.choice.cri_RSRP=(NULL_t)0; @@ -1618,6 +1716,7 @@ void fill_initial_SpCellConfig(int uid, csirep2->ext1 = NULL; ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ReportConfigToAddModList->list,csirep2); } + pdsch_servingcellconfig->codeBlockGroupTransmission = NULL; pdsch_servingcellconfig->xOverhead = NULL; pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH = calloc(1, sizeof(*pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH)); @@ -1627,27 +1726,63 @@ void fill_initial_SpCellConfig(int uid, pdsch_servingcellconfig->ext1->maxMIMO_Layers = calloc(1,sizeof(*pdsch_servingcellconfig->ext1->maxMIMO_Layers)); *pdsch_servingcellconfig->ext1->maxMIMO_Layers = 2; -} + // Downlink BWPs + int n_dl_bwp = 0; + if (servingcellconfigdedicated && + servingcellconfigdedicated->downlinkBWP_ToAddModList && + servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count > 0) { + n_dl_bwp = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count; + } + if(n_dl_bwp>0){ + SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList)); + for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) { + NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp)); + fill_default_downlinkBWP(bwp, bwp_loop, servingcellconfigdedicated, scc, configuration); + ASN_SEQUENCE_ADD(&SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp); + } + SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id)); + *SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = servingcellconfigdedicated->firstActiveDownlinkBWP_Id ? *servingcellconfigdedicated->firstActiveDownlinkBWP_Id : 1; + SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id)); + *SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = servingcellconfigdedicated->defaultDownlinkBWP_Id ? *servingcellconfigdedicated->defaultDownlinkBWP_Id : 1; + } -void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup,int use_rlc_um_for_drb) { + // Uplink BWPs + int n_ul_bwp = 0; + if (servingcellconfigdedicated && servingcellconfigdedicated->uplinkConfig && + servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList && + servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count > 0) { + n_ul_bwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count; + } + if(n_ul_bwp>0) { + SpCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList)); + for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) { + NR_BWP_Uplink_t *ubwp = calloc(1, sizeof(*ubwp)); + fill_default_uplinkBWP(ubwp, bwp_loop, servingcellconfigdedicated, scc, configuration, uid); + ASN_SEQUENCE_ADD(&SpCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list, ubwp); + } + SpCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id)); + *SpCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id ? *servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id : 1; + } - cellGroupConfig->cellGroupId = 0; - cellGroupConfig->rlc_BearerToReleaseList = NULL; - cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList)); + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_NR_SpCellConfig, (void *)SpCellConfig); + } - // RLC Bearer Config - // TS38.331 9.2.1 Default SRB configurations - NR_RLC_BearerConfig_t *rlc_BearerConfig = NULL; - NR_RLC_Config_t *rlc_Config = NULL; - NR_LogicalChannelConfig_t *logicalChannelConfig = NULL; - long *logicalChannelGroup = NULL; +} + +NR_RLC_BearerConfig_t *get_SRB_RLC_BearerConfig(long channelId, + long priority, + e_NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration bucketSizeDuration) +{ + NR_RLC_BearerConfig_t *rlc_BearerConfig = NULL; rlc_BearerConfig = calloc(1, sizeof(NR_RLC_BearerConfig_t)); - rlc_BearerConfig->logicalChannelIdentity = 2; + rlc_BearerConfig->logicalChannelIdentity = channelId; rlc_BearerConfig->servedRadioBearer = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer)); rlc_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity; - rlc_BearerConfig->servedRadioBearer->choice.srb_Identity = 2; + rlc_BearerConfig->servedRadioBearer->choice.srb_Identity = channelId; rlc_BearerConfig->reestablishRLC = NULL; - rlc_Config = calloc(1, sizeof(NR_RLC_Config_t)); + + NR_RLC_Config_t *rlc_Config = calloc(1, sizeof(NR_RLC_Config_t)); rlc_Config->present = NR_RLC_Config_PR_am; rlc_Config->choice.am = calloc(1, sizeof(*rlc_Config->choice.am)); rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t)); @@ -1661,12 +1796,14 @@ void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGr rlc_Config->choice.am->ul_AM_RLC.pollByte = NR_PollByte_infinity; rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t8; rlc_BearerConfig->rlc_Config = rlc_Config; - logicalChannelConfig = calloc(1, sizeof(NR_LogicalChannelConfig_t)); + + NR_LogicalChannelConfig_t *logicalChannelConfig = calloc(1, sizeof(NR_LogicalChannelConfig_t)); logicalChannelConfig->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters)); - logicalChannelConfig->ul_SpecificParameters->priority = 3; + logicalChannelConfig->ul_SpecificParameters->priority = priority; logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; - logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration = NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms5; - logicalChannelGroup = CALLOC(1, sizeof(long)); + logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration = bucketSizeDuration; + + long *logicalChannelGroup = CALLOC(1, sizeof(long)); *logicalChannelGroup = 0; logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup; logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID)); @@ -1674,153 +1811,156 @@ void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGr logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0; logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0; rlc_BearerConfig->mac_LogicalChannelConfig = logicalChannelConfig; - ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig); - ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig); - // DRB Configuration - NR_RLC_BearerConfig_t *rlc_BearerConfig_drb = NULL; - NR_RLC_Config_t *rlc_Config_drb = NULL; - NR_LogicalChannelConfig_t *logicalChannelConfig_drb = NULL; - long *logicalChannelGroup_drb = NULL; - rlc_BearerConfig_drb = calloc(1, sizeof(NR_RLC_BearerConfig_t)); - rlc_BearerConfig_drb->logicalChannelIdentity = 4; - rlc_BearerConfig_drb->servedRadioBearer = calloc(1, sizeof(*rlc_BearerConfig_drb->servedRadioBearer)); - rlc_BearerConfig_drb->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity; - rlc_BearerConfig_drb->servedRadioBearer->choice.drb_Identity = 1; - rlc_BearerConfig_drb->reestablishRLC = NULL; - rlc_Config_drb = calloc(1, sizeof(NR_RLC_Config_t)); - - if (use_rlc_um_for_drb) nr_drb_config(rlc_Config_drb, NR_RLC_Config_PR_um_Bi_Directional); - else nr_drb_config(rlc_Config_drb, NR_RLC_Config_PR_am); + return rlc_BearerConfig; +} - - rlc_BearerConfig_drb->rlc_Config = rlc_Config_drb; - logicalChannelConfig_drb = calloc(1, sizeof(NR_LogicalChannelConfig_t)); - logicalChannelConfig_drb->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig_drb->ul_SpecificParameters)); - logicalChannelConfig_drb->ul_SpecificParameters->priority = 13; - logicalChannelConfig_drb->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8; - logicalChannelConfig_drb->ul_SpecificParameters->bucketSizeDuration = NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms100; - logicalChannelGroup_drb = CALLOC(1, sizeof(long)); - *logicalChannelGroup_drb = 1; - logicalChannelConfig_drb->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup_drb; - logicalChannelConfig_drb->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig_drb->ul_SpecificParameters->schedulingRequestID)); - *logicalChannelConfig_drb->ul_SpecificParameters->schedulingRequestID = 0; - logicalChannelConfig_drb->ul_SpecificParameters->logicalChannelSR_Mask = 0; - logicalChannelConfig_drb->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0; - rlc_BearerConfig_drb->mac_LogicalChannelConfig = logicalChannelConfig_drb; - ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig_drb); - ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig_drb); +NR_RLC_BearerConfig_t *get_DRB_RLC_BearerConfig(long lcChannelId, long drbId, NR_RLC_Config_PR rlc_conf, long priority) +{ + NR_RLC_BearerConfig_t *rlc_BearerConfig = calloc(1, sizeof(NR_RLC_BearerConfig_t)); + rlc_BearerConfig->logicalChannelIdentity = lcChannelId; + rlc_BearerConfig->servedRadioBearer = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer)); + rlc_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity; + rlc_BearerConfig->servedRadioBearer->choice.drb_Identity = drbId; + rlc_BearerConfig->reestablishRLC = NULL; + + NR_RLC_Config_t *rlc_Config = calloc(1, sizeof(NR_RLC_Config_t)); + nr_drb_config(rlc_Config, rlc_conf); + rlc_BearerConfig->rlc_Config = rlc_Config; + + NR_LogicalChannelConfig_t *logicalChannelConfig = calloc(1, sizeof(NR_LogicalChannelConfig_t)); + logicalChannelConfig->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters)); + logicalChannelConfig->ul_SpecificParameters->priority = priority; + logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8; + logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration = NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms100; + + long *logicalChannelGroup = CALLOC(1, sizeof(long)); + *logicalChannelGroup = 1; + logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup; + logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID)); + *logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = 0; + logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0; + logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0; + rlc_BearerConfig->mac_LogicalChannelConfig = logicalChannelConfig; + + return rlc_BearerConfig; } +void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup, int use_rlc_um_for_drb, uint8_t configure_srb, uint8_t bearer_id_start, uint8_t nb_bearers_to_setup, long *priority) { + + cellGroupConfig->cellGroupId = 0; + cellGroupConfig->rlc_BearerToReleaseList = NULL; + cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList)); + + // RLC Bearer Config + // TS38.331 9.2.1 Default SRB configurations + if (configure_srb){ + NR_RLC_BearerConfig_t *rlc_BearerConfig = get_SRB_RLC_BearerConfig(2, 3, NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms5); + ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig); + ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig); + } + + // DRB Configuration + for (int i = bearer_id_start; i < bearer_id_start + nb_bearers_to_setup; i++ ){ + const NR_RLC_Config_PR rlc_conf = use_rlc_um_for_drb ? NR_RLC_Config_PR_um_Bi_Directional : NR_RLC_Config_PR_am; + NR_RLC_BearerConfig_t *rlc_BearerConfig = get_DRB_RLC_BearerConfig(3 + i, i, rlc_conf, priority[i-bearer_id_start]); + ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig); + ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig); + } +} void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, + const int uid, NR_UE_NR_Capability_t *uecap, const gNB_RrcConfigurationReq* configuration) { NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig; + if (SpCellConfig == NULL) return; - NR_ServingCellConfigCommon_t *scc = configuration->scc; + NR_ServingCellConfigCommon_t *scc = configuration ? configuration->scc : NULL; - NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP; - set_dl_mcs_table(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing, - configuration->force_256qam_off ? NULL : uecap, SpCellConfig,bwp_Dedicated, scc); - - struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList; - if (DL_BWP_list) { - for (int i=0; i<DL_BWP_list->list.count; i++){ - NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[i]; - int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing; - set_dl_mcs_table(scs, configuration->force_256qam_off ? NULL : uecap, SpCellConfig, bwp->bwp_Dedicated, scc); + if(scc) { + + // SRS configuration + if (configuration->do_SRS && + SpCellConfig && + SpCellConfig->spCellConfigDedicated && + SpCellConfig->spCellConfigDedicated->uplinkConfig && + SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) { + if (!SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config) { + SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config = + calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config)); + } + config_srs(SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config, + scc, + uid, + configuration->do_SRS); } + + // Set DL MCS table + NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP; + set_dl_mcs_table(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing, + configuration->force_256qam_off ? NULL : uecap, SpCellConfig, bwp_Dedicated, scc); + struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList; + if (DL_BWP_list) { + for (int i=0; i<DL_BWP_list->list.count; i++){ + NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[i]; + int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing; + set_dl_mcs_table(scs, configuration->force_256qam_off ? NULL : uecap, SpCellConfig, bwp->bwp_Dedicated, scc); + } + } + } } - void fill_initial_cellGroupConfig(int uid, NR_CellGroupConfig_t *cellGroupConfig, NR_ServingCellConfigCommon_t *scc, + NR_ServingCellConfig_t *servingcellconfigdedicated, const gNB_RrcConfigurationReq *configuration) { - NR_RLC_BearerConfig_t *rlc_BearerConfig = NULL; - NR_RLC_Config_t *rlc_Config = NULL; - NR_LogicalChannelConfig_t *logicalChannelConfig = NULL; NR_MAC_CellGroupConfig_t *mac_CellGroupConfig = NULL; NR_PhysicalCellGroupConfig_t *physicalCellGroupConfig = NULL; - long *logicalChannelGroup = NULL; cellGroupConfig->cellGroupId = 0; /* Rlc Bearer Config */ /* TS38.331 9.2.1 Default SRB configurations */ cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList)); - rlc_BearerConfig = calloc(1, sizeof(NR_RLC_BearerConfig_t)); - rlc_BearerConfig->logicalChannelIdentity = 1; - rlc_BearerConfig->servedRadioBearer = calloc(1, sizeof(*rlc_BearerConfig->servedRadioBearer)); - rlc_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity; - rlc_BearerConfig->servedRadioBearer->choice.srb_Identity = 1; - rlc_BearerConfig->reestablishRLC = NULL; - rlc_Config = calloc(1, sizeof(NR_RLC_Config_t)); - rlc_Config->present = NR_RLC_Config_PR_am; - rlc_Config->choice.am = calloc(1, sizeof(*rlc_Config->choice.am)); - rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t)); - *(rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12; - rlc_Config->choice.am->dl_AM_RLC.t_Reassembly = NR_T_Reassembly_ms35; - rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms0; - rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = calloc(1, sizeof(NR_SN_FieldLengthAM_t)); - *(rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength) = NR_SN_FieldLengthAM_size12; - rlc_Config->choice.am->ul_AM_RLC.t_PollRetransmit = NR_T_PollRetransmit_ms45; - rlc_Config->choice.am->ul_AM_RLC.pollPDU = NR_PollPDU_infinity; - rlc_Config->choice.am->ul_AM_RLC.pollByte = NR_PollByte_infinity; - rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t8; - rlc_BearerConfig->rlc_Config = rlc_Config; - logicalChannelConfig = calloc(1, sizeof(NR_LogicalChannelConfig_t)); - logicalChannelConfig->ul_SpecificParameters = calloc(1, sizeof(*logicalChannelConfig->ul_SpecificParameters)); - logicalChannelConfig->ul_SpecificParameters->priority = 1; - logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; - logicalChannelGroup = CALLOC(1, sizeof(long)); - *logicalChannelGroup = 0; - logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = logicalChannelGroup; - logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = CALLOC(1, sizeof(*logicalChannelConfig->ul_SpecificParameters->schedulingRequestID)); - *logicalChannelConfig->ul_SpecificParameters->schedulingRequestID = 0; - logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = 0; - logicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = 0; - rlc_BearerConfig->mac_LogicalChannelConfig = logicalChannelConfig; + NR_RLC_BearerConfig_t *rlc_BearerConfig = get_SRB_RLC_BearerConfig(1, 1, NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms1000); ASN_SEQUENCE_ADD(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig); cellGroupConfig->rlc_BearerToReleaseList = NULL; /* mac CellGroup Config */ - if (1) { - mac_CellGroupConfig = calloc(1, sizeof(*mac_CellGroupConfig)); - if (1) { - mac_CellGroupConfig->schedulingRequestConfig = calloc(1, sizeof(*mac_CellGroupConfig->schedulingRequestConfig)); - mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = CALLOC(1,sizeof(*mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList)); - struct NR_SchedulingRequestToAddMod *schedulingrequestlist; - schedulingrequestlist = CALLOC(1,sizeof(*schedulingrequestlist)); - schedulingrequestlist->schedulingRequestId = 0; - schedulingrequestlist->sr_ProhibitTimer = CALLOC(1,sizeof(*schedulingrequestlist->sr_ProhibitTimer)); - *(schedulingrequestlist->sr_ProhibitTimer) = 0; - schedulingrequestlist->sr_TransMax = NR_SchedulingRequestToAddMod__sr_TransMax_n64; - ASN_SEQUENCE_ADD(&(mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list),schedulingrequestlist); - } - mac_CellGroupConfig->bsr_Config = calloc(1, sizeof(*mac_CellGroupConfig->bsr_Config)); - mac_CellGroupConfig->bsr_Config->periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_sf10; - mac_CellGroupConfig->bsr_Config->retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf80; - mac_CellGroupConfig->tag_Config = calloc(1, sizeof(*mac_CellGroupConfig->tag_Config)); - mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL; - mac_CellGroupConfig->tag_Config->tag_ToAddModList = calloc(1,sizeof(*mac_CellGroupConfig->tag_Config->tag_ToAddModList)); - struct NR_TAG *tag=calloc(1,sizeof(*tag)); - tag->tag_Id = 0; - tag->timeAlignmentTimer = NR_TimeAlignmentTimer_infinity; - ASN_SEQUENCE_ADD(&mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag); - mac_CellGroupConfig->phr_Config = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config)); - mac_CellGroupConfig->phr_Config->present = NR_SetupRelease_PHR_Config_PR_setup; - mac_CellGroupConfig->phr_Config->choice.setup = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config->choice.setup)); - mac_CellGroupConfig->phr_Config->choice.setup->phr_PeriodicTimer = NR_PHR_Config__phr_PeriodicTimer_sf10; - mac_CellGroupConfig->phr_Config->choice.setup->phr_ProhibitTimer = NR_PHR_Config__phr_ProhibitTimer_sf10; - mac_CellGroupConfig->phr_Config->choice.setup->phr_Tx_PowerFactorChange = NR_PHR_Config__phr_Tx_PowerFactorChange_dB1; - } + mac_CellGroupConfig = calloc(1, sizeof(*mac_CellGroupConfig)); + + mac_CellGroupConfig->bsr_Config = calloc(1, sizeof(*mac_CellGroupConfig->bsr_Config)); + mac_CellGroupConfig->bsr_Config->periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_sf10; + mac_CellGroupConfig->bsr_Config->retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf80; + mac_CellGroupConfig->tag_Config = calloc(1, sizeof(*mac_CellGroupConfig->tag_Config)); + mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL; + mac_CellGroupConfig->tag_Config->tag_ToAddModList = calloc(1,sizeof(*mac_CellGroupConfig->tag_Config->tag_ToAddModList)); + struct NR_TAG *tag=calloc(1,sizeof(*tag)); + tag->tag_Id = 0; + tag->timeAlignmentTimer = NR_TimeAlignmentTimer_infinity; + ASN_SEQUENCE_ADD(&mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag); + mac_CellGroupConfig->phr_Config = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config)); + mac_CellGroupConfig->phr_Config->present = NR_SetupRelease_PHR_Config_PR_setup; + mac_CellGroupConfig->phr_Config->choice.setup = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config->choice.setup)); + mac_CellGroupConfig->phr_Config->choice.setup->phr_PeriodicTimer = NR_PHR_Config__phr_PeriodicTimer_sf10; + mac_CellGroupConfig->phr_Config->choice.setup->phr_ProhibitTimer = NR_PHR_Config__phr_ProhibitTimer_sf10; + mac_CellGroupConfig->phr_Config->choice.setup->phr_Tx_PowerFactorChange = NR_PHR_Config__phr_Tx_PowerFactorChange_dB1; + + mac_CellGroupConfig->schedulingRequestConfig = calloc(1, sizeof(*mac_CellGroupConfig->schedulingRequestConfig)); + mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = CALLOC(1,sizeof(*mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList)); + struct NR_SchedulingRequestToAddMod *schedulingrequestlist = CALLOC(1,sizeof(*schedulingrequestlist)); + schedulingrequestlist->schedulingRequestId = 0; + schedulingrequestlist->sr_ProhibitTimer = NULL; + schedulingrequestlist->sr_TransMax = NR_SchedulingRequestToAddMod__sr_TransMax_n64; + ASN_SEQUENCE_ADD(&(mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list),schedulingrequestlist); + cellGroupConfig->mac_CellGroupConfig = mac_CellGroupConfig; physicalCellGroupConfig = calloc(1,sizeof(*physicalCellGroupConfig)); @@ -1830,19 +1970,20 @@ void fill_initial_cellGroupConfig(int uid, cellGroupConfig->physicalCellGroupConfig = physicalCellGroupConfig; cellGroupConfig->spCellConfig = calloc(1,sizeof(*cellGroupConfig->spCellConfig)); - - fill_initial_SpCellConfig(uid,cellGroupConfig->spCellConfig,scc,configuration); + + fill_initial_SpCellConfig(uid,cellGroupConfig,scc,servingcellconfigdedicated,configuration); cellGroupConfig->sCellToAddModList = NULL; cellGroupConfig->sCellToReleaseList = NULL; } //------------------------------------------------------------------------------ -int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP, - uint8_t *const buffer, - const uint8_t transaction_id, - OCTET_STRING_t *masterCellGroup_from_DU, - NR_ServingCellConfigCommon_t *scc, +int16_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP, + uint8_t *const buffer, + const uint8_t transaction_id, + OCTET_STRING_t *masterCellGroup_from_DU, + NR_ServingCellConfigCommon_t *scc, + NR_ServingCellConfig_t *servingcellconfigdedicated, const gNB_RrcConfigurationReq *configuration) //------------------------------------------------------------------------------ { @@ -1904,13 +2045,11 @@ int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP, &asn_DEF_NR_CellGroupConfig, //might be added prefix later (void **)&cellGroupConfig, (uint8_t *)masterCellGroup_from_DU->buf, - masterCellGroup_from_DU->size, 0, 0); - - xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig); + masterCellGroup_from_DU->size, 0, 0); } else { cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t)); - fill_initial_cellGroupConfig(ue_context_pP->local_uid, cellGroupConfig, scc, configuration); + fill_initial_cellGroupConfig(ue_context_pP->local_uid,cellGroupConfig,scc,servingcellconfigdedicated,configuration); enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, NULL, @@ -1933,8 +2072,10 @@ int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP, ue_p->masterCellGroup = cellGroupConfig; if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig); xer_fprint(stdout, &asn_DEF_NR_DL_CCCH_Message, (void *)&dl_ccch_msg); } + enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_CCCH_Message, NULL, (void *)&dl_ccch_msg, @@ -1947,7 +2088,7 @@ int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP, return -1; } - LOG_I(NR_RRC,"RRCSetup Encoded %zd bits (%zd bytes)\n", + LOG_D(NR_RRC,"RRCSetup Encoded %zd bits (%zd bytes)\n", enc_rval.encoded,(enc_rval.encoded+7)/8); return((enc_rval.encoded+7)/8); } @@ -2211,7 +2352,8 @@ int16_t do_RRCReconfiguration( if(cellGroupConfig!=NULL){ update_cellGroupConfig(cellGroupConfig, - ue_context_pP->ue_context.UE_Capability_nr, + ue_context_pP->local_uid, + ue_context_pP ? ue_context_pP->ue_context.UE_Capability_nr : NULL, configuration); enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, @@ -2224,7 +2366,9 @@ int16_t do_RRCReconfiguration( enc_rval.failed_type->name, enc_rval.encoded); return -1; } - xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig); + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void *) cellGroupConfig); + } ie->nonCriticalExtension->masterCellGroup = calloc(1,sizeof(OCTET_STRING_t)); ie->nonCriticalExtension->masterCellGroup->buf = masterCellGroup_buf; @@ -2233,9 +2377,9 @@ int16_t do_RRCReconfiguration( dl_dcch_msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration = ie; - //if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { - xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg); - //} + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_NR_DL_DCCH_Message, (void *)&dl_dcch_msg); + } enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message, NULL, diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h index 81563eb7cdf..ea4b185f6b3 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.h +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h @@ -73,9 +73,7 @@ uint8_t do_MIB_NR(gNB_RRC_INST *rrc, @param carrier pointer to Carrier information @param configuration Pointer Configuration Request structure @return size of encoded bit stream in bytes*/ -uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, - gNB_RrcConfigurationReq *configuration - ); +uint16_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, gNB_RrcConfigurationReq *configuration); uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier, gNB_RrcConfigurationReq *configuration); @@ -102,26 +100,36 @@ uint8_t do_RRCReject(uint8_t Mod_id, uint8_t *const buffer); void fill_initial_SpCellConfig(int uid, - NR_SpCellConfig_t *SpCellConfig, + NR_CellGroupConfig_t *cellGroupConfig, NR_ServingCellConfigCommon_t *scc, + NR_ServingCellConfig_t *servingcellconfigdedicated, const gNB_RrcConfigurationReq *configuration); void fill_initial_cellGroupConfig(int uid, NR_CellGroupConfig_t *cellGroupConfig, NR_ServingCellConfigCommon_t *scc, + NR_ServingCellConfig_t *servingcellconfigdedicated, const gNB_RrcConfigurationReq *configuration); void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, + const int uid, NR_UE_NR_Capability_t *uecap, const gNB_RrcConfigurationReq *configuration); -void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup,int use_rlc_um_for_drb); +void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, + NR_CellGroupConfig_t *ue_context_mastercellGroup, + int use_rlc_um_for_drb, + uint8_t configure_srb, + uint8_t bearer_id_start, + uint8_t nb_bearers_to_setup, + long *priority); -int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP, +int16_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP, uint8_t *const buffer, const uint8_t transaction_id, OCTET_STRING_t *masterCellGroup_from_DU, NR_ServingCellConfigCommon_t *scc, + NR_ServingCellConfig_t *servingcellconfigdedicated, const gNB_RrcConfigurationReq *configuration); uint8_t do_NR_SecurityModeCommand( diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index af5e32336f9..f67fb93c234 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -34,6 +34,63 @@ const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160}; +void rrc_coreset_config(NR_ControlResourceSet_t *coreset, + int bwp_id, + int curr_bwp, + uint64_t ssb_bitmap) { + + + // frequency domain resources depending on BWP size + coreset->frequencyDomainResources.buf = calloc(1,6); + coreset->frequencyDomainResources.buf[0] = (curr_bwp < 48) ? 0xf0 : 0xff; + coreset->frequencyDomainResources.buf[1] = (curr_bwp < 96) ? 0x00 : 0xff; + coreset->frequencyDomainResources.buf[2] = (curr_bwp < 144) ? 0x00 : 0xff; + coreset->frequencyDomainResources.buf[3] = (curr_bwp < 192) ? 0x00 : 0xff; + coreset->frequencyDomainResources.buf[4] = (curr_bwp < 240) ? 0x00 : 0xff; + coreset->frequencyDomainResources.buf[5] = 0x00; + coreset->frequencyDomainResources.size = 6; + coreset->frequencyDomainResources.bits_unused = 3; + coreset->duration = (curr_bwp < 48) ? 2 : 1; + coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved; + coreset->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle; + + // The ID space is used across the BWPs of a Serving Cell as per 38.331 + coreset->controlResourceSetId = bwp_id + 1; + + coreset->tci_StatesPDCCH_ToAddList=calloc(1,sizeof(*coreset->tci_StatesPDCCH_ToAddList)); + NR_TCI_StateId_t *tci[64]; + for (int i=0;i<64;i++) { + if ((ssb_bitmap>>(63-i))&0x01){ + tci[i]=calloc(1,sizeof(*tci[i])); + *tci[i] = i; + ASN_SEQUENCE_ADD(&coreset->tci_StatesPDCCH_ToAddList->list,tci[i]); + } + } + coreset->tci_StatesPDCCH_ToReleaseList = NULL; + coreset->tci_PresentInDCI = NULL; + coreset->pdcch_DMRS_ScramblingID = NULL; +} + +uint64_t get_ssb_bitmap(NR_ServingCellConfigCommon_t *scc) { + uint64_t bitmap=0; + switch (scc->ssb_PositionsInBurst->present) { + case 1 : + bitmap = ((uint64_t) scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0])<<56; + break; + case 2 : + bitmap = ((uint64_t) scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0])<<56; + break; + case 3 : + for (int i=0; i<8; i++) { + bitmap |= (((uint64_t) scc->ssb_PositionsInBurst->choice.longBitmap.buf[i])<<((7-i)*8)); + } + break; + default: + AssertFatal(1==0,"SSB bitmap size value %d undefined (allowed values 1,2,3) \n", scc->ssb_PositionsInBurst->present); + } + return bitmap; +} + void set_csirs_periodicity(NR_NZP_CSI_RS_Resource_t *nzpcsi0, int uid, int nb_slots_per_period) { nzpcsi0->periodicityAndOffset = calloc(1,sizeof(*nzpcsi0->periodicityAndOffset)); @@ -81,7 +138,6 @@ void set_csirs_periodicity(NR_NZP_CSI_RS_Resource_t *nzpcsi0, int uid, int nb_sl } } - void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon, NR_CSI_MeasConfig_t *csi_MeasConfig, int uid, @@ -159,7 +215,8 @@ void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon, *nzpcsi0->powerControlOffsetSS = NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0; nzpcsi0->scramblingID = *servingcellconfigcommon->physCellId; set_csirs_periodicity(nzpcsi0, uid, nb_slots_per_period); - nzpcsi0->qcl_InfoPeriodicCSI_RS = NULL; + nzpcsi0->qcl_InfoPeriodicCSI_RS = calloc(1,sizeof(*nzpcsi0->qcl_InfoPeriodicCSI_RS)); + *nzpcsi0->qcl_InfoPeriodicCSI_RS = 0; ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpcsi0); } else { @@ -170,12 +227,234 @@ void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon, csi_MeasConfig->nzp_CSI_RS_ResourceToReleaseList = NULL; } +void set_csiim_offset(struct NR_CSI_ResourcePeriodicityAndOffset *periodicityAndOffset, + struct NR_CSI_ResourcePeriodicityAndOffset *target_periodicityAndOffset) { + + switch(periodicityAndOffset->present) { + case NR_CSI_ResourcePeriodicityAndOffset_PR_slots4: + periodicityAndOffset->choice.slots4 = target_periodicityAndOffset->choice.slots4; + break; + case NR_CSI_ResourcePeriodicityAndOffset_PR_slots5: + periodicityAndOffset->choice.slots5 = target_periodicityAndOffset->choice.slots5; + break; + case NR_CSI_ResourcePeriodicityAndOffset_PR_slots8: + periodicityAndOffset->choice.slots8 = target_periodicityAndOffset->choice.slots8; + break; + case NR_CSI_ResourcePeriodicityAndOffset_PR_slots10: + periodicityAndOffset->choice.slots10 = target_periodicityAndOffset->choice.slots10; + break; + case NR_CSI_ResourcePeriodicityAndOffset_PR_slots16: + periodicityAndOffset->choice.slots16 = target_periodicityAndOffset->choice.slots16; + break; + case NR_CSI_ResourcePeriodicityAndOffset_PR_slots20: + periodicityAndOffset->choice.slots20 = target_periodicityAndOffset->choice.slots20; + break; + case NR_CSI_ResourcePeriodicityAndOffset_PR_slots32: + periodicityAndOffset->choice.slots32 = target_periodicityAndOffset->choice.slots32; + break; + case NR_CSI_ResourcePeriodicityAndOffset_PR_slots40: + periodicityAndOffset->choice.slots40 = target_periodicityAndOffset->choice.slots40; + break; + case NR_CSI_ResourcePeriodicityAndOffset_PR_slots64: + periodicityAndOffset->choice.slots64 = target_periodicityAndOffset->choice.slots64; + break; + case NR_CSI_ResourcePeriodicityAndOffset_PR_slots80: + periodicityAndOffset->choice.slots80 = target_periodicityAndOffset->choice.slots80; + break; + case NR_CSI_ResourcePeriodicityAndOffset_PR_slots160: + periodicityAndOffset->choice.slots160 = target_periodicityAndOffset->choice.slots160; + break; + case NR_CSI_ResourcePeriodicityAndOffset_PR_slots320: + periodicityAndOffset->choice.slots320 = target_periodicityAndOffset->choice.slots320; + break; + case NR_CSI_ResourcePeriodicityAndOffset_PR_slots640: + periodicityAndOffset->choice.slots640 = target_periodicityAndOffset->choice.slots640; + break; + default: + AssertFatal(1==0,"CSI periodicity not among allowed values\n"); + } + +} + +void config_csiim(int do_csirs, int dl_antenna_ports, int curr_bwp, + NR_CSI_MeasConfig_t *csi_MeasConfig) { + + if (do_csirs && dl_antenna_ports > 1) { + csi_MeasConfig->csi_IM_ResourceToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceToAddModList)); + NR_CSI_IM_Resource_t *imres = calloc(1,sizeof(*imres)); + imres->csi_IM_ResourceId = 0; + NR_NZP_CSI_RS_Resource_t *nzpcsi = NULL; + for (int i=0; i<csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list.count; i++){ + nzpcsi = csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list.array[i]; + if (nzpcsi->nzp_CSI_RS_ResourceId == imres->csi_IM_ResourceId) + break; + } + AssertFatal(nzpcsi->nzp_CSI_RS_ResourceId == imres->csi_IM_ResourceId, "Couldn't find NZP CSI-RS corresponding to CSI-IM\n"); + imres->csi_IM_ResourceElementPattern = calloc(1,sizeof(*imres->csi_IM_ResourceElementPattern)); + imres->csi_IM_ResourceElementPattern->present = NR_CSI_IM_Resource__csi_IM_ResourceElementPattern_PR_pattern1; + imres->csi_IM_ResourceElementPattern->choice.pattern1 = calloc(1,sizeof(*imres->csi_IM_ResourceElementPattern->choice.pattern1)); + // starting subcarrier is 4 in the following configuration + // this is ok for current possible CSI-RS configurations (using only the first 4 symbols) + // TODO needs a more dynamic setting if CSI-RS is changed + imres->csi_IM_ResourceElementPattern->choice.pattern1->subcarrierLocation_p1 = NR_CSI_IM_Resource__csi_IM_ResourceElementPattern__pattern1__subcarrierLocation_p1_s4; + imres->csi_IM_ResourceElementPattern->choice.pattern1->symbolLocation_p1 = nzpcsi->resourceMapping.firstOFDMSymbolInTimeDomain; // same symbol as CSI-RS + imres->freqBand = calloc(1,sizeof(*imres->freqBand)); + imres->freqBand->startingRB = 0; + imres->freqBand->nrofRBs = ((curr_bwp>>2)+(curr_bwp%4>0))<<2; + imres->periodicityAndOffset = calloc(1,sizeof(*imres->periodicityAndOffset)); + // same period and offset of the associated CSI-RS + imres->periodicityAndOffset->present = nzpcsi->periodicityAndOffset->present; + set_csiim_offset(imres->periodicityAndOffset, nzpcsi->periodicityAndOffset); + ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceToAddModList->list,imres); + csi_MeasConfig->csi_IM_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceSetToAddModList)); + NR_CSI_IM_ResourceSet_t *imset = calloc(1,sizeof(*imset)); + imset->csi_IM_ResourceSetId = 0; + NR_CSI_IM_ResourceId_t *res = calloc(1,sizeof(*res)); + *res = imres->csi_IM_ResourceId; + ASN_SEQUENCE_ADD(&imset->csi_IM_Resources,res); + ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceSetToAddModList->list,imset); + } + else { + csi_MeasConfig->csi_IM_ResourceToAddModList = NULL; + csi_MeasConfig->csi_IM_ResourceSetToAddModList = NULL; + } + + csi_MeasConfig->csi_IM_ResourceToReleaseList = NULL; + csi_MeasConfig->csi_IM_ResourceSetToReleaseList = NULL; +} + +// TODO: Implement to b_SRS = 1 and b_SRS = 2 +long rrc_get_max_nr_csrs(const uint8_t max_rbs, const long b_SRS) { + + if(b_SRS>0) { + LOG_E(NR_RRC,"rrc_get_max_nr_csrs(): Not implemented yet for b_SRS>0\n"); + return 0; // This c_srs is always valid + } + + const uint16_t m_SRS[64] = { 4, 8, 12, 16, 16, 20, 24, 24, 28, 32, 36, 40, 48, 48, 52, 56, 60, 64, 72, 72, 76, 80, 88, + 96, 96, 104, 112, 120, 120, 120, 128, 128, 128, 132, 136, 144, 144, 144, 144, 152, 160, + 160, 160, 168, 176, 184, 192, 192, 192, 192, 208, 216, 224, 240, 240, 240, 240, 256, 256, + 256, 264, 272, 272, 272 }; + + long c_srs = 0; + uint16_t m = 4; + for(int c = 1; c<64; c++) { + if(m_SRS[c]>m && m_SRS[c]<max_rbs) { + c_srs = c; + m = m_SRS[c]; + } + } + + return c_srs; +} + +void config_srs(NR_SetupRelease_SRS_Config_t *setup_release_srs_Config, + const NR_ServingCellConfigCommon_t *servingcellconfigcommon, + const int uid, + const int do_srs) { + + setup_release_srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup; + + NR_SRS_Config_t *srs_Config; + if (setup_release_srs_Config->choice.setup) { + srs_Config = setup_release_srs_Config->choice.setup; + if (srs_Config->srs_ResourceSetToReleaseList) { + free(srs_Config->srs_ResourceSetToReleaseList); + } + if (srs_Config->srs_ResourceSetToAddModList) { + free(srs_Config->srs_ResourceSetToAddModList); + } + if (srs_Config->srs_ResourceToReleaseList) { + free(srs_Config->srs_ResourceToReleaseList); + } + if (srs_Config->srs_ResourceToAddModList) { + free(srs_Config->srs_ResourceToAddModList); + } + free(srs_Config); + } + + setup_release_srs_Config->choice.setup = calloc(1,sizeof(*setup_release_srs_Config->choice.setup)); + srs_Config = setup_release_srs_Config->choice.setup; + + srs_Config->srs_ResourceSetToReleaseList = NULL; + + srs_Config->srs_ResourceSetToAddModList = calloc(1,sizeof(*srs_Config->srs_ResourceSetToAddModList)); + NR_SRS_ResourceSet_t *srs_resset0 = calloc(1,sizeof(*srs_resset0)); + srs_resset0->srs_ResourceSetId = 0; + srs_resset0->srs_ResourceIdList = calloc(1,sizeof(*srs_resset0->srs_ResourceIdList)); + NR_SRS_ResourceId_t *srs_resset0_id = calloc(1,sizeof(*srs_resset0_id)); + *srs_resset0_id = 0; + ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list, srs_resset0_id); + srs_Config->srs_ResourceToReleaseList=NULL; + if (do_srs) { + srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_periodic; + srs_resset0->resourceType.choice.periodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.periodic)); + srs_resset0->resourceType.choice.periodic->associatedCSI_RS = NULL; + } else { + srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_aperiodic; + srs_resset0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic)); + srs_resset0->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger=1; + srs_resset0->resourceType.choice.aperiodic->csi_RS=NULL; + srs_resset0->resourceType.choice.aperiodic->slotOffset = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic->slotOffset)); + *srs_resset0->resourceType.choice.aperiodic->slotOffset = 2; + srs_resset0->resourceType.choice.aperiodic->ext1 = NULL; + } + srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook; + srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha)); + *srs_resset0->alpha = NR_Alpha_alpha1; + srs_resset0->p0 = calloc(1,sizeof(*srs_resset0->p0)); + *srs_resset0->p0 =-80; + srs_resset0->pathlossReferenceRS = NULL; + srs_resset0->srs_PowerControlAdjustmentStates = NULL; + ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceSetToAddModList->list,srs_resset0); + + srs_Config->srs_ResourceToReleaseList = NULL; + + srs_Config->srs_ResourceToAddModList = calloc(1,sizeof(*srs_Config->srs_ResourceToAddModList)); + NR_SRS_Resource_t *srs_res0=calloc(1,sizeof(*srs_res0)); + srs_res0->srs_ResourceId = 0; + srs_res0->nrofSRS_Ports = NR_SRS_Resource__nrofSRS_Ports_port1; + srs_res0->ptrs_PortIndex = NULL; + srs_res0->transmissionComb.present = NR_SRS_Resource__transmissionComb_PR_n2; + srs_res0->transmissionComb.choice.n2 = calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2)); + srs_res0->transmissionComb.choice.n2->combOffset_n2 = 0; + srs_res0->transmissionComb.choice.n2->cyclicShift_n2 = 0; + srs_res0->resourceMapping.startPosition = 2 + uid%2; + srs_res0->resourceMapping.nrofSymbols = NR_SRS_Resource__resourceMapping__nrofSymbols_n1; + srs_res0->resourceMapping.repetitionFactor = NR_SRS_Resource__resourceMapping__repetitionFactor_n1; + srs_res0->freqDomainPosition = 0; + srs_res0->freqDomainShift = 0; + srs_res0->freqHopping.b_SRS = 0; + srs_res0->freqHopping.b_hop = 0; + srs_res0->freqHopping.c_SRS = servingcellconfigcommon ? + rrc_get_max_nr_csrs( + NRRIV2BW(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275), + srs_res0->freqHopping.b_SRS) : 0; + srs_res0->groupOrSequenceHopping = NR_SRS_Resource__groupOrSequenceHopping_neither; + if (do_srs) { + srs_res0->resourceType.present = NR_SRS_Resource__resourceType_PR_periodic; + srs_res0->resourceType.choice.periodic = calloc(1,sizeof(*srs_res0->resourceType.choice.periodic)); + srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.present = NR_SRS_PeriodicityAndOffset_PR_sl160; + srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.choice.sl160 = 17 + (uid>1)*10; // 17/17/.../147/157 are mixed slots + } else { + srs_res0->resourceType.present = NR_SRS_Resource__resourceType_PR_aperiodic; + srs_res0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic)); + } + srs_res0->sequenceId = 40; + srs_res0->spatialRelationInfo = calloc(1,sizeof(*srs_res0->spatialRelationInfo)); + srs_res0->spatialRelationInfo->servingCellId = NULL; + srs_res0->spatialRelationInfo->referenceSignal.present = NR_SRS_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index; + srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index = 0; + ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0); +} + void prepare_sim_uecap(NR_UE_NR_Capability_t *cap, NR_ServingCellConfigCommon_t *scc, int numerology, int rbsize, int mcs_table) { + NR_Phy_Parameters_t *phy_Parameters = &cap->phy_Parameters; int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; NR_BandNR_t *nr_bandnr = CALLOC(1,sizeof(NR_BandNR_t)); nr_bandnr->bandNR = band; @@ -189,8 +468,8 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap, *bandNRinfo->pdsch_256QAM_FR2 = NR_BandNR__pdsch_256QAM_FR2_supported; } else{ - cap->phy_Parameters.phy_ParametersFR1 = CALLOC(1,sizeof(*cap->phy_Parameters.phy_ParametersFR1)); - NR_Phy_ParametersFR1_t *phy_fr1 = cap->phy_Parameters.phy_ParametersFR1; + phy_Parameters->phy_ParametersFR1 = CALLOC(1,sizeof(*phy_Parameters->phy_ParametersFR1)); + NR_Phy_ParametersFR1_t *phy_fr1 = phy_Parameters->phy_ParametersFR1; phy_fr1->pdsch_256QAM_FR1 = CALLOC(1,sizeof(*phy_fr1->pdsch_256QAM_FR1)); *phy_fr1->pdsch_256QAM_FR1 = NR_Phy_ParametersFR1__pdsch_256QAM_FR1_supported; } @@ -209,35 +488,45 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap, } fs_cc->supportedModulationOrderDL = CALLOC(1,sizeof(*fs_cc->supportedModulationOrderDL)); *fs_cc->supportedModulationOrderDL = NR_ModulationOrder_qam256; - ASN_SEQUENCE_ADD(&fs->featureSetsDownlinkPerCC->list, - fs_cc); + ASN_SEQUENCE_ADD(&fs->featureSetsDownlinkPerCC->list, fs_cc); } + + phy_Parameters->phy_ParametersFRX_Diff = CALLOC(1,sizeof(*phy_Parameters->phy_ParametersFRX_Diff)); + phy_Parameters->phy_ParametersFRX_Diff->pucch_F0_2WithoutFH = NULL; } -void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc){ +void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc, + NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList, + int curr_bwp) { frame_type_t frame_type = get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing); - int curr_bwp = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; + // coreset duration setting to be improved in the framework of RRC harmonization, potentially using a common function int len_coreset = 1; if (curr_bwp < 48) len_coreset = 2; - // setting default TDA for DL with + // setting default TDA for DL with TDA index 0 struct NR_PDSCH_TimeDomainResourceAllocation *timedomainresourceallocation = CALLOC(1,sizeof(NR_PDSCH_TimeDomainResourceAllocation_t)); + // k0: Slot offset between DCI and its scheduled PDSCH (see TS 38.214 clause 5.1.2.1) When the field is absent the UE applies the value 0. + //timedomainresourceallocation->k0 = calloc(1,sizeof(*timedomainresourceallocation->k0)); + //*timedomainresourceallocation->k0 = 0; timedomainresourceallocation->mappingType = NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA; timedomainresourceallocation->startSymbolAndLength = get_SLIV(len_coreset,14-len_coreset); // basic slot configuration starting in symbol 1 til the end of the slot - ASN_SEQUENCE_ADD(&scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list, - timedomainresourceallocation); + ASN_SEQUENCE_ADD(&pdsch_TimeDomainAllocationList->list, timedomainresourceallocation); + // setting TDA for CSI-RS symbol with index 1 + struct NR_PDSCH_TimeDomainResourceAllocation *timedomainresourceallocation1 = CALLOC(1,sizeof(NR_PDSCH_TimeDomainResourceAllocation_t)); + timedomainresourceallocation1->mappingType = NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA; + timedomainresourceallocation1->startSymbolAndLength = get_SLIV(len_coreset,14-len_coreset-1); // 1 symbol CSI-RS + ASN_SEQUENCE_ADD(&pdsch_TimeDomainAllocationList->list, timedomainresourceallocation1); if(frame_type==TDD) { - // TDD if(scc->tdd_UL_DL_ConfigurationCommon) { int dl_symb = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols; if(dl_symb > 1) { - timedomainresourceallocation = CALLOC(1,sizeof(NR_PDSCH_TimeDomainResourceAllocation_t)); - timedomainresourceallocation->mappingType = NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA; - timedomainresourceallocation->startSymbolAndLength = get_SLIV(len_coreset,dl_symb-len_coreset); // mixed slot configuration starting in symbol 1 til the end of the dl allocation - ASN_SEQUENCE_ADD(&scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list, - timedomainresourceallocation); + // mixed slot TDA with TDA index 2 + struct NR_PDSCH_TimeDomainResourceAllocation *timedomainresourceallocation2 = CALLOC(1,sizeof(NR_PDSCH_TimeDomainResourceAllocation_t)); + timedomainresourceallocation2->mappingType = NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA; + timedomainresourceallocation2->startSymbolAndLength = get_SLIV(len_coreset,dl_symb-len_coreset); // mixed slot configuration starting in symbol 1 til the end of the dl allocation + ASN_SEQUENCE_ADD(&pdsch_TimeDomainAllocationList->list, timedomainresourceallocation2); } } } @@ -249,64 +538,250 @@ void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay){ //TODO change to accomodate for SRS frame_type_t frame_type = get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing); - int temp_min_delay = 6; // k2 = 2 or 3 won'r work as well as higher values - if(frame_type==TDD && scc->tdd_UL_DL_ConfigurationCommon) { - - switch (scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity) { - case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms2p5: // 30kHz SCS - case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms2: // 60kHz SCS - case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms1p25: // 60kHz SCS - case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms1: // 120kHz SCS - case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms0p625: // 120kHz SCS - case NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms0p5: // 120kHz SCS - temp_min_delay = 2; - break; - } - } - - int k2 = (min_fb_delay<temp_min_delay)?temp_min_delay:min_fb_delay; + const int k2 = min_fb_delay; uint8_t DELTA[4]= {2,3,4,6}; // Delta parameter for Msg3 int mu = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing; + // UL TDA index 0 is basic slot configuration starting in symbol 0 til the last but one symbol struct NR_PUSCH_TimeDomainResourceAllocation *pusch_timedomainresourceallocation = CALLOC(1,sizeof(struct NR_PUSCH_TimeDomainResourceAllocation)); pusch_timedomainresourceallocation->k2 = CALLOC(1,sizeof(long)); *pusch_timedomainresourceallocation->k2 = k2; pusch_timedomainresourceallocation->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB; - pusch_timedomainresourceallocation->startSymbolAndLength = get_SLIV(0,13); // basic slot configuration starting in symbol 0 til the last but one symbol + pusch_timedomainresourceallocation->startSymbolAndLength = get_SLIV(0,13); ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation); if(frame_type==TDD) { - - // TDD if(scc->tdd_UL_DL_ConfigurationCommon) { int ul_symb = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols; - pusch_timedomainresourceallocation = CALLOC(1,sizeof(struct NR_PUSCH_TimeDomainResourceAllocation)); - pusch_timedomainresourceallocation->k2 = CALLOC(1,sizeof(long)); - *pusch_timedomainresourceallocation->k2 = k2; - pusch_timedomainresourceallocation->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB; - pusch_timedomainresourceallocation->startSymbolAndLength = get_SLIV(14-ul_symb,ul_symb-1); // starting in fist ul symbol til the last but one - ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation); - - // for msg3 in the mixed slot - int nb_periods_per_frame = get_nb_periods_per_frame(scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity); - int nb_slots_per_period = ((1<<mu) * 10)/nb_periods_per_frame; - struct NR_PUSCH_TimeDomainResourceAllocation *pusch_timedomainresourceallocation_msg3 = CALLOC(1,sizeof(struct NR_PUSCH_TimeDomainResourceAllocation)); - pusch_timedomainresourceallocation_msg3->k2 = CALLOC(1,sizeof(long)); - *pusch_timedomainresourceallocation_msg3->k2 = nb_slots_per_period - DELTA[mu]; - if(*pusch_timedomainresourceallocation_msg3->k2 < min_fb_delay) - *pusch_timedomainresourceallocation_msg3->k2 += nb_slots_per_period; - AssertFatal(*pusch_timedomainresourceallocation_msg3->k2<33,"Computed k2 for msg3 %ld is larger than the range allowed by RRC (0..32)\n", - *pusch_timedomainresourceallocation_msg3->k2); - pusch_timedomainresourceallocation_msg3->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB; - pusch_timedomainresourceallocation_msg3->startSymbolAndLength = get_SLIV(14-ul_symb,ul_symb-1); // starting in fist ul symbol til the last but one - ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation_msg3); + if (ul_symb>1) { + // UL TDA index 1 for mixed slot (TDD) + pusch_timedomainresourceallocation = CALLOC(1,sizeof(struct NR_PUSCH_TimeDomainResourceAllocation)); + pusch_timedomainresourceallocation->k2 = CALLOC(1,sizeof(long)); + *pusch_timedomainresourceallocation->k2 = k2; + pusch_timedomainresourceallocation->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB; + pusch_timedomainresourceallocation->startSymbolAndLength = get_SLIV(14-ul_symb,ul_symb-1); // starting in fist ul symbol til the last but one + ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation); + + // UL TDA index 2 for msg3 in the mixed slot (TDD) + int nb_periods_per_frame = get_nb_periods_per_frame(scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity); + int nb_slots_per_period = ((1<<mu) * 10)/nb_periods_per_frame; + struct NR_PUSCH_TimeDomainResourceAllocation *pusch_timedomainresourceallocation_msg3 = CALLOC(1,sizeof(struct NR_PUSCH_TimeDomainResourceAllocation)); + pusch_timedomainresourceallocation_msg3->k2 = CALLOC(1,sizeof(long)); + *pusch_timedomainresourceallocation_msg3->k2 = nb_slots_per_period - DELTA[mu]; + if(*pusch_timedomainresourceallocation_msg3->k2 < min_fb_delay) + *pusch_timedomainresourceallocation_msg3->k2 += nb_slots_per_period; + AssertFatal(*pusch_timedomainresourceallocation_msg3->k2<33,"Computed k2 for msg3 %ld is larger than the range allowed by RRC (0..32)\n", + *pusch_timedomainresourceallocation_msg3->k2); + pusch_timedomainresourceallocation_msg3->mappingType = NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB; + pusch_timedomainresourceallocation_msg3->startSymbolAndLength = get_SLIV(14-ul_symb,ul_symb-1); // starting in fist ul symbol til the last but one + ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation_msg3); + } } } } +void set_dl_DataToUL_ACK(NR_PUCCH_Config_t *pucch_Config, int min_feedback_time) { + + pucch_Config->dl_DataToUL_ACK = calloc(1,sizeof(*pucch_Config->dl_DataToUL_ACK)); + long *delay[8]; + for (int i=0;i<8;i++) { + delay[i] = calloc(1,sizeof(*delay[i])); + *delay[i] = i+min_feedback_time; + ASN_SEQUENCE_ADD(&pucch_Config->dl_DataToUL_ACK->list,delay[i]); + } +} + +// PUCCH resource set 0 for configuration with O_uci <= 2 bits and/or a positive or negative SR (section 9.2.1 of 38.213) +void config_pucch_resset0(NR_PUCCH_Config_t *pucch_Config, int uid, int curr_bwp, NR_UE_NR_Capability_t *uecap) { + + NR_PUCCH_ResourceSet_t *pucchresset = calloc(1,sizeof(*pucchresset)); + pucchresset->pucch_ResourceSetId = 0; + NR_PUCCH_ResourceId_t *pucchid=calloc(1,sizeof(*pucchid)); + *pucchid=0; + ASN_SEQUENCE_ADD(&pucchresset->resourceList.list,pucchid); + pucchresset->maxPayloadSize=NULL; + + if(uecap) { + long *pucch_F0_2WithoutFH = uecap->phy_Parameters.phy_ParametersFRX_Diff->pucch_F0_2WithoutFH; + AssertFatal(pucch_F0_2WithoutFH == NULL,"UE does not support PUCCH F0 without frequency hopping. Current configuration is without FH\n"); + } + + NR_PUCCH_Resource_t *pucchres0=calloc(1,sizeof(*pucchres0)); + pucchres0->pucch_ResourceId=*pucchid; + pucchres0->startingPRB= (8 + uid) % curr_bwp; + pucchres0->intraSlotFrequencyHopping=NULL; + pucchres0->secondHopPRB=NULL; + pucchres0->format.present= NR_PUCCH_Resource__format_PR_format0; + pucchres0->format.choice.format0=calloc(1,sizeof(*pucchres0->format.choice.format0)); + pucchres0->format.choice.format0->initialCyclicShift=0; + pucchres0->format.choice.format0->nrofSymbols=1; + pucchres0->format.choice.format0->startingSymbolIndex=13; + ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres0); + + ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset); +} + + +// PUCCH resource set 1 for configuration with O_uci > 2 bits (currently format2) +void config_pucch_resset1(NR_PUCCH_Config_t *pucch_Config, NR_UE_NR_Capability_t *uecap) { + + NR_PUCCH_ResourceSet_t *pucchresset=calloc(1,sizeof(*pucchresset)); + pucchresset->pucch_ResourceSetId = 1; + NR_PUCCH_ResourceId_t *pucchressetid=calloc(1,sizeof(*pucchressetid)); + *pucchressetid=2; + ASN_SEQUENCE_ADD(&pucchresset->resourceList.list,pucchressetid); + pucchresset->maxPayloadSize=NULL; + + if(uecap) { + long *pucch_F0_2WithoutFH = uecap->phy_Parameters.phy_ParametersFRX_Diff->pucch_F0_2WithoutFH; + AssertFatal(pucch_F0_2WithoutFH == NULL,"UE does not support PUCCH F2 without frequency hopping. Current configuration is without FH\n"); + } + + NR_PUCCH_Resource_t *pucchres2=calloc(1,sizeof(*pucchres2)); + pucchres2->pucch_ResourceId=*pucchressetid; + pucchres2->startingPRB=0; + pucchres2->intraSlotFrequencyHopping=NULL; + pucchres2->secondHopPRB=NULL; + pucchres2->format.present= NR_PUCCH_Resource__format_PR_format2; + pucchres2->format.choice.format2=calloc(1,sizeof(*pucchres2->format.choice.format2)); + pucchres2->format.choice.format2->nrofPRBs=8; + pucchres2->format.choice.format2->nrofSymbols=1; + pucchres2->format.choice.format2->startingSymbolIndex=13; + ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres2); + + ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset); + + pucch_Config->format2=calloc(1,sizeof(*pucch_Config->format2)); + pucch_Config->format2->present=NR_SetupRelease_PUCCH_FormatConfig_PR_setup; + NR_PUCCH_FormatConfig_t *pucchfmt2 = calloc(1,sizeof(*pucchfmt2)); + pucch_Config->format2->choice.setup = pucchfmt2; + pucchfmt2->interslotFrequencyHopping=NULL; + pucchfmt2->additionalDMRS=NULL; + pucchfmt2->maxCodeRate=calloc(1,sizeof(*pucchfmt2->maxCodeRate)); + *pucchfmt2->maxCodeRate=NR_PUCCH_MaxCodeRate_zeroDot35; + pucchfmt2->nrofSlots=NULL; + pucchfmt2->pi2BPSK=NULL; + + // to check UE capabilities for that in principle + pucchfmt2->simultaneousHARQ_ACK_CSI=calloc(1,sizeof(*pucchfmt2->simultaneousHARQ_ACK_CSI)); + *pucchfmt2->simultaneousHARQ_ACK_CSI=NR_PUCCH_FormatConfig__simultaneousHARQ_ACK_CSI_true; + +} + +void set_pucch_power_config(NR_PUCCH_Config_t *pucch_Config, int do_csirs) { + + pucch_Config->pucch_PowerControl = calloc(1,sizeof(*pucch_Config->pucch_PowerControl)); + NR_P0_PUCCH_t *p00 = calloc(1,sizeof(*p00)); + p00->p0_PUCCH_Id = 1; + p00->p0_PUCCH_Value = 0; + pucch_Config->pucch_PowerControl->p0_Set = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->p0_Set)); + ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->p0_Set->list,p00); + + pucch_Config->pucch_PowerControl->pathlossReferenceRSs = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->pathlossReferenceRSs)); + struct NR_PUCCH_PathlossReferenceRS *PL_ref_RS = calloc(1,sizeof(*PL_ref_RS)); + PL_ref_RS->pucch_PathlossReferenceRS_Id = 0; + if(do_csirs) { + PL_ref_RS->referenceSignal.present = NR_PUCCH_PathlossReferenceRS__referenceSignal_PR_csi_RS_Index; + PL_ref_RS->referenceSignal.choice.csi_RS_Index = 0; + } + else { + PL_ref_RS->referenceSignal.present = NR_PUCCH_PathlossReferenceRS__referenceSignal_PR_ssb_Index; + PL_ref_RS->referenceSignal.choice.ssb_Index = 0; + } + ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->pathlossReferenceRSs->list,PL_ref_RS); + + pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0)); + *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0 = 0; + pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2)); + *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = 0; + + pucch_Config->spatialRelationInfoToAddModList = calloc(1,sizeof(*pucch_Config->spatialRelationInfoToAddModList)); + pucch_Config->spatialRelationInfoToReleaseList=NULL; + NR_PUCCH_SpatialRelationInfo_t *pucchspatial = calloc(1,sizeof(*pucchspatial)); + pucchspatial->pucch_SpatialRelationInfoId = 1; + pucchspatial->servingCellId = NULL; + if(do_csirs) { + pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index; + pucchspatial->referenceSignal.choice.csi_RS_Index = 0; + } + else { + pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_ssb_Index; + pucchspatial->referenceSignal.choice.ssb_Index = 0; + } -void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap, + pucchspatial->pucch_PathlossReferenceRS_Id = PL_ref_RS->pucch_PathlossReferenceRS_Id; + pucchspatial->p0_PUCCH_Id = p00->p0_PUCCH_Id; + pucchspatial->closedLoopIndex = NR_PUCCH_SpatialRelationInfo__closedLoopIndex_i0; + ASN_SEQUENCE_ADD(&pucch_Config->spatialRelationInfoToAddModList->list,pucchspatial); +} + +void set_SR_periodandoffset(NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig, + NR_ServingCellConfigCommon_t *scc) { + + const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL; + int sr_slot = 1; // in FDD SR in slot 1 + if(tdd) + sr_slot = tdd->nrofDownlinkSlots; // SR in the first uplink slot + + schedulingRequestResourceConfig->periodicityAndOffset = calloc(1,sizeof(*schedulingRequestResourceConfig->periodicityAndOffset)); + + if(sr_slot<10){ + schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10; + schedulingRequestResourceConfig->periodicityAndOffset->choice.sl10 = sr_slot; + return; + } + if(sr_slot<20){ + schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl20; + schedulingRequestResourceConfig->periodicityAndOffset->choice.sl20 = sr_slot; + return; + } + if(sr_slot<40){ + schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40; + schedulingRequestResourceConfig->periodicityAndOffset->choice.sl40 = sr_slot; + return; + } + if(sr_slot<80){ + schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl80; + schedulingRequestResourceConfig->periodicityAndOffset->choice.sl80 = sr_slot; + return; + } + if(sr_slot<160){ + schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl160; + schedulingRequestResourceConfig->periodicityAndOffset->choice.sl160 = sr_slot; + return; + } + if(sr_slot<320){ + schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl320; + schedulingRequestResourceConfig->periodicityAndOffset->choice.sl320 = sr_slot; + return; + } + schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl640; + schedulingRequestResourceConfig->periodicityAndOffset->choice.sl640 = sr_slot; +} + +void scheduling_request_config(NR_ServingCellConfigCommon_t *scc, + NR_PUCCH_Config_t *pucch_Config) { + + // format with <=2 bits in pucch resource set 0 + NR_PUCCH_ResourceSet_t *pucchresset = pucch_Config->resourceSetToAddModList->list.array[0]; + // assigning the 1st pucch resource in the set to scheduling request + NR_PUCCH_ResourceId_t *pucchressetid = pucchresset->resourceList.list.array[0]; + + pucch_Config->schedulingRequestResourceToAddModList = calloc(1,sizeof(*pucch_Config->schedulingRequestResourceToAddModList)); + NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig = calloc(1,sizeof(*schedulingRequestResourceConfig)); + schedulingRequestResourceConfig->schedulingRequestResourceId = 1; + schedulingRequestResourceConfig->schedulingRequestID = 0; + + set_SR_periodandoffset(schedulingRequestResourceConfig, scc); + + schedulingRequestResourceConfig->resource = calloc(1,sizeof(*schedulingRequestResourceConfig->resource)); + *schedulingRequestResourceConfig->resource = *pucchressetid; + ASN_SEQUENCE_ADD(&pucch_Config->schedulingRequestResourceToAddModList->list,schedulingRequestResourceConfig); +} + +void set_dl_mcs_table(int scs, + NR_UE_NR_Capability_t *cap, NR_SpCellConfig_t *SpCellConfig, NR_BWP_DownlinkDedicated_t *bwp_Dedicated, NR_ServingCellConfigCommon_t *scc) { @@ -327,7 +802,7 @@ void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap, } AssertFatal(bw_rb>0,"Could not find scs-SpecificCarrierList element for scs %d",scs); int bw = get_supported_band_index(scs, band, bw_rb); - AssertFatal(bw>0,"Supported band corresponding to %d RBs not found\n", bw_rb); + AssertFatal(bw>=0,"Supported band corresponding to %d RBs not found\n", bw_rb); bool supported = false; if (band>256) { @@ -346,7 +821,7 @@ void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap, if(bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = calloc(1, sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table)); *bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NR_PDSCH_Config__mcs_Table_qam256; -// set table 2 in correct entry in SpCellConfig->spCellConfigDedicated->csi_MeasConfig->csi_ReportConfigToAddModList->list + // set table 2 in correct entry in SpCellConfig->spCellConfigDedicated->csi_MeasConfig->csi_ReportConfigToAddModList->list AssertFatal(SpCellConfig!=NULL,"SpCellConfig shouldn't be null\n"); AssertFatal(SpCellConfig->spCellConfigDedicated!=NULL,"SpCellConfigDedicated shouldn't be null\n"); if (SpCellConfig->spCellConfigDedicated->csi_MeasConfig && @@ -362,5 +837,3 @@ void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap, bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL; } - - diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h index 63df31d1a79..b1367a0c8a9 100644 --- a/openair2/RRC/NR/nr_rrc_config.h +++ b/openair2/RRC/NR/nr_rrc_config.h @@ -111,15 +111,35 @@ typedef struct physicalcellgroup_s{ long RNTI_Value[MAX_NUM_CCs]; }physicalcellgroup_t; -void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc); +uint64_t get_ssb_bitmap(NR_ServingCellConfigCommon_t *scc); +void rrc_coreset_config(NR_ControlResourceSet_t *coreset, + int bwp_id, + int curr_bwp, + uint64_t ssb_bitmap); +void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc, + NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList, + int curr_bwp); void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay); +void config_pucch_resset0(NR_PUCCH_Config_t *pucch_Config, int uid, int curr_bwp, NR_UE_NR_Capability_t *uecap); +void config_pucch_resset1(NR_PUCCH_Config_t *pucch_Config, NR_UE_NR_Capability_t *uecap); +void set_dl_DataToUL_ACK(NR_PUCCH_Config_t *pucch_Config, int min_feedback_time); +void set_pucch_power_config(NR_PUCCH_Config_t *pucch_Config, int do_csirs); +void scheduling_request_config(NR_ServingCellConfigCommon_t *scc, + NR_PUCCH_Config_t *pucch_Config); void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon, NR_CSI_MeasConfig_t *csi_MeasConfig, int uid, int num_dl_antenna_ports, int curr_bwp, int do_csirs); -void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap, +void config_csiim(int do_csirs, int dl_antenna_ports, int curr_bwp, + NR_CSI_MeasConfig_t *csi_MeasConfig); +void config_srs(NR_SetupRelease_SRS_Config_t *setup_release_srs_Config, + const NR_ServingCellConfigCommon_t *servingcellconfigcommon, + const int uid, + const int do_srs); +void set_dl_mcs_table(int scs, + NR_UE_NR_Capability_t *cap, NR_SpCellConfig_t *SpCellConfig, NR_BWP_DownlinkDedicated_t *bwp_Dedicated, NR_ServingCellConfigCommon_t *scc); @@ -129,5 +149,4 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap, int rbsize, int mcs_table); - #endif diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h index f59abb1bb48..b6a92db7a8d 100644 --- a/openair2/RRC/NR/nr_rrc_defs.h +++ b/openair2/RRC/NR/nr_rrc_defs.h @@ -132,7 +132,7 @@ typedef enum UE_STATE_NR_e { #define MAX_MEAS_ID 7 #define PAYLOAD_SIZE_MAX 1024 -#define RRC_BUF_SIZE 512 +#define RRC_BUF_SIZE 1024 #define UNDEF_SECURITY_MODE 0xff #define NO_SECURITY_MODE 0x20 @@ -173,7 +173,7 @@ typedef struct UE_RRC_INFO_NR_s { } __attribute__ ((__packed__)) NR_UE_RRC_INFO; typedef struct UE_S_TMSI_NR_s { - boolean_t presence; + bool presence; uint16_t amf_set_id; uint8_t amf_pointer; uint32_t fiveg_tmsi; @@ -217,7 +217,7 @@ typedef struct HANDOVER_INFO_NR_s { typedef struct { char Payload[NR_RRC_BUFFER_SIZE_MAX]; char Header[NR_RRC_HEADER_SIZE_MAX]; - int payload_size; + uint16_t payload_size; } NR_RRC_BUFFER; #define NR_RRC_BUFFER_SIZE sizeof(RRC_BUFFER_NR) @@ -290,10 +290,10 @@ typedef struct gNB_RRC_UE_s { NR_DRB_ToReleaseList_t *DRB_Release_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER]; uint8_t DRB_active[8]; - NR_SRB_INFO SI; - NR_SRB_INFO Srb0; - NR_SRB_INFO_TABLE_ENTRY Srb1; - NR_SRB_INFO_TABLE_ENTRY Srb2; + NR_SRB_INFO SI; + NR_SRB_INFO Srb0; + NR_SRB_INFO_TABLE_ENTRY Srb1; + NR_SRB_INFO_TABLE_ENTRY Srb2; NR_MeasConfig_t *measConfig; HANDOVER_INFO *handover_info; NR_MeasResults_t *measResults; @@ -435,7 +435,7 @@ typedef struct { uint8_t sizeof_MIB; uint8_t *SIB1; - uint8_t sizeof_SIB1; + uint16_t sizeof_SIB1; uint8_t *SIB23; uint8_t sizeof_SIB23; @@ -447,13 +447,15 @@ typedef struct { NR_BCCH_BCH_Message_t mib; NR_BCCH_BCH_Message_t *mib_DU; - NR_BCCH_DL_SCH_Message_t *siblock1_DU; + NR_SIB1_t *siblock1_DU; + //NR_BCCH_DL_SCH_Message_t *siblock1_DU; NR_SIB1_t *sib1; NR_SIB2_t *sib2; NR_SIB3_t *sib3; NR_BCCH_DL_SCH_Message_t systemInformation; // SIB23 NR_BCCH_DL_SCH_Message_t *siblock1; NR_ServingCellConfigCommon_t *servingcellconfigcommon; + NR_ServingCellConfig_t *servingcellconfig; NR_PDCCH_ConfigSIB1_t *pdcch_ConfigSIB1; NR_CellGroupConfig_t *secondaryCellGroup[MAX_NR_RRC_UE_CONTEXTS]; NR_SRB_INFO SI; diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h index c8fddbecfb9..dc6e14215ff 100644 --- a/openair2/RRC/NR/nr_rrc_proto.h +++ b/openair2/RRC/NR/nr_rrc_proto.h @@ -47,13 +47,13 @@ void rrc_config_nr_buffer(NR_SRB_INFO* Srb_info, uint8_t Lchan_type, uint8_t Role); -int mac_rrc_nr_data_req(const module_id_t Mod_idP, - const int CC_id, - const frame_t frameP, - const rb_id_t Srb_id, - const rnti_t rnti, - const uint8_t Nb_tb, - uint8_t *const buffer_pP ); +uint16_t mac_rrc_nr_data_req(const module_id_t Mod_idP, + const int CC_id, + const frame_t frameP, + const rb_id_t Srb_id, + const rnti_t rnti, + const uint8_t Nb_tb, + uint8_t *const buffer_pP); void rrc_gNB_process_SgNBAdditionRequest( const protocol_ctxt_t *const ctxt_pP, @@ -120,7 +120,7 @@ rrc_gNB_generate_SecurityModeCommand( rrc_gNB_ue_context_t *const ue_context_pP ); -uint8_t + uint8_t rrc_gNB_get_next_transaction_identifier( module_id_t gnb_mod_idP ); @@ -167,18 +167,28 @@ int nr_rrc_mac_remove_ue(module_id_t mod_idP, rnti_t rntiP); -int8_t nr_mac_rrc_data_ind( - const module_id_t module_idP, - const int CC_id, - const frame_t frameP, - const sub_frame_t sub_frameP, - const int UE_id, - const rnti_t rntiP, - const rb_id_t srb_idP, - const uint8_t *sduP, - const sdu_size_t sdu_lenP, - const boolean_t brOption -); +int8_t nr_mac_rrc_bwp_switch_req(const module_id_t module_idP, + const frame_t frameP, + const sub_frame_t sub_frameP, + const rnti_t rntiP, + const int dl_bwp_id, + const int ul_bwp_id); + +int8_t nr_mac_rrc_data_ind(const module_id_t module_idP, + const int CC_id, + const frame_t frameP, + const sub_frame_t sub_frameP, + const int UE_id, + const rnti_t rntiP, + const rb_id_t srb_idP, + const uint8_t *sduP, + const sdu_size_t sdu_lenP, + const bool brOption); + +int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP, + protocol_ctxt_t *const ctxt_pP, + const int dl_bwp_id, + const int ul_bwp_id); int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP, const uint8_t *buffer, @@ -197,7 +207,8 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release( void rrc_gNB_generate_dedicatedRRCReconfiguration( const protocol_ctxt_t *const ctxt_pP, - rrc_gNB_ue_context_t *ue_context_pP); + rrc_gNB_ue_context_t *ue_context_pP, + NR_CellGroupConfig_t *cell_groupConfig_from_DU); rlc_op_status_t nr_rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP, const NR_SRB_ToAddModList_t * const srb2add_listP, @@ -206,16 +217,15 @@ rlc_op_status_t nr_rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt const LTE_PMCH_InfoList_r9_t * const pmch_InfoList_r9_pP, struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list); -boolean_t nr_rrc_pdcp_config_asn1_req( - const protocol_ctxt_t *const ctxt_pP, - NR_SRB_ToAddModList_t *const srb2add_list, - NR_DRB_ToAddModList_t *const drb2add_list, - NR_DRB_ToReleaseList_t *const drb2release_list, - const uint8_t security_modeP, - uint8_t *const kRRCenc, - uint8_t *const kRRCint, - uint8_t *const kUPenc, - uint8_t *const kUPint - ,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9 - ,rb_id_t *const defaultDRB, - struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list); +bool nr_rrc_pdcp_config_asn1_req(const protocol_ctxt_t *const ctxt_pP, + NR_SRB_ToAddModList_t *const srb2add_list, + NR_DRB_ToAddModList_t *const drb2add_list, + NR_DRB_ToReleaseList_t *const drb2release_list, + const uint8_t security_modeP, + uint8_t *const kRRCenc, + uint8_t *const kRRCint, + uint8_t *const kUPenc, + uint8_t *const kUPint, + LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9, + rb_id_t *const defaultDRB, + struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list); diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index a0706509a79..8c6c583289a 100755 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -99,6 +99,7 @@ #include <openair2/X2AP/x2ap_eNB.h> #include <openair3/ocp-gtpu/gtp_itf.h> #include <openair2/RRC/NR/nr_rrc_proto.h> +#include "LAYER2/nr_rlc/nr_rlc_oai_api.h" #include "BIT_STRING.h" #include "assertions.h" @@ -115,16 +116,16 @@ uint8_t first_rrcreconfiguration = 0; ///---------------------------------------------------------------------------------------------------------------/// ///---------------------------------------------------------------------------------------------------------------/// -boolean_t DURecvCb( protocol_ctxt_t *ctxt_pP, - const srb_flag_t srb_flagP, - const rb_id_t rb_idP, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_buffer_sizeP, - unsigned char *const sdu_buffer_pP, - const pdcp_transmission_mode_t modeP, - const uint32_t *sourceL2Id, - const uint32_t *destinationL2Id) { +bool DURecvCb(protocol_ctxt_t *ctxt_pP, + const srb_flag_t srb_flagP, + const rb_id_t rb_idP, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_buffer_sizeP, + unsigned char *const sdu_buffer_pP, + const pdcp_transmission_mode_t modeP, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id) { // The buffer comes from the stack in gtp-u thread, we have a make a separate buffer to enqueue in a inter-thread message queue mem_block_t *sdu=get_free_mem_block(sdu_buffer_sizeP, __func__); memcpy(sdu->data, sdu_buffer_pP, sdu_buffer_sizeP); @@ -164,9 +165,8 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration LOG_I(NR_RRC,"Done init_NR_SI\n"); - if (NODE_IS_MONOLITHIC(rrc->node_type)){ + if (NODE_IS_MONOLITHIC(rrc->node_type) || NODE_IS_DU(rrc->node_type)){ rrc_mac_config_req_gNB(rrc->module_id, - rrc->configuration.ssb_SubcarrierOffset, rrc->configuration.pdsch_AntennaPorts, rrc->configuration.pusch_AntennaPorts, rrc->configuration.sib1_tda, @@ -197,7 +197,7 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration } char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigurationReq *configuration) { - protocol_ctxt_t ctxt; + protocol_ctxt_t ctxt = { 0 }; gNB_RRC_INST *rrc=RC.nrrrc[gnb_mod_idP]; PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, gnb_mod_idP, GNB_FLAG_YES, NOT_A_RNTI, 0, 0,gnb_mod_idP); LOG_I(NR_RRC, @@ -218,6 +218,7 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu rrc->ngap_id2_ngap_ids = hashtable_create (NUMBER_OF_UE_MAX * 2, NULL, NULL); rrc->configuration = *configuration; rrc->carrier.servingcellconfigcommon = configuration->scc; + rrc->carrier.servingcellconfig = configuration->scd; nr_rrc_config_ul_tda(configuration->scc,configuration->minRXTXTIME); /// System Information INIT pthread_mutex_init(&rrc->cell_info_mutex,NULL); @@ -275,7 +276,6 @@ void apply_macrlc_config(gNB_RRC_INST *rrc, NR_CellGroupConfig_t *cgc = get_softmodem_params()->sa ? ue_context_pP->ue_context.masterCellGroup : NULL; rrc_mac_config_req_gNB(rrc->module_id, - rrc->configuration.ssb_SubcarrierOffset, rrc->configuration.pdsch_AntennaPorts, rrc->configuration.pusch_AntennaPorts, rrc->configuration.sib1_tda, @@ -335,12 +335,16 @@ rrc_gNB_generate_RRCSetup( // T_INT(ctxt_pP->rnti)); gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context; gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id]; - ue_p->Srb0.Tx_buffer.payload_size = do_RRCSetup(ue_context_pP, - (uint8_t *) ue_p->Srb0.Tx_buffer.Payload, - rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id), - masterCellGroup_from_DU, - scc, - &rrc->configuration); + NR_ServingCellConfig_t *servingcellconfigdedicated = rrc->configuration.scd; + int16_t ret = do_RRCSetup(ue_context_pP, + (uint8_t *) ue_p->Srb0.Tx_buffer.Payload, + rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id), + masterCellGroup_from_DU, + scc,servingcellconfigdedicated,&rrc->configuration); + + AssertFatal(ret>0,"Error generating RRCSetup for RRCSetupRequest\n"); + + ue_p->Srb0.Tx_buffer.payload_size = ret; LOG_DUMPMSG(NR_RRC, DEBUG_RRC, (char *)(ue_p->Srb0.Tx_buffer.Payload), @@ -442,16 +446,20 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest( rrc_gNB_ue_context_t *ue_context_pP = NULL; gNB_RRC_INST *rrc_instance_p = RC.nrrrc[ctxt_pP->module_id]; NR_ServingCellConfigCommon_t *scc=rrc_instance_p->carrier.servingcellconfigcommon; + NR_ServingCellConfig_t *servingcellconfigdedicated = rrc_instance_p->configuration.scd; ue_context_pP = rrc_gNB_get_next_free_ue_context(ctxt_pP, rrc_instance_p, 0); gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context; - ue_p->Srb0.Tx_buffer.payload_size = do_RRCSetup(ue_context_pP, - (uint8_t *) ue_p->Srb0.Tx_buffer.Payload, - rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id), - NULL, - scc, - &rrc_instance_p->configuration); + int16_t ret = do_RRCSetup(ue_context_pP, + (uint8_t *) ue_p->Srb0.Tx_buffer.Payload, + rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id), + NULL, + scc,servingcellconfigdedicated,&rrc_instance_p->configuration); + + AssertFatal(ret>0,"Error generating RRCSetup for RRCReestablishmentRequest\n"); + + ue_p->Srb0.Tx_buffer.payload_size = ret; LOG_DUMPMSG(NR_RRC, DEBUG_RRC, (char *)(ue_p->Srb0.Tx_buffer.Payload), @@ -463,7 +471,6 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest( PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP)); rrc_mac_config_req_gNB(rrc_instance_p->module_id, - rrc_instance_p->configuration.ssb_SubcarrierOffset, rrc_instance_p->configuration.pdsch_AntennaPorts, rrc_instance_p->configuration.pusch_AntennaPorts, rrc_instance_p->configuration.sib1_tda, @@ -799,10 +806,29 @@ rrc_gNB_generate_defaultRRCReconfiguration( } if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) { + gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context; + rrc_mac_config_req_gNB(rrc->module_id, + rrc->configuration.pdsch_AntennaPorts, + rrc->configuration.pusch_AntennaPorts, + rrc->configuration.sib1_tda, + rrc->configuration.minRXTXTIME, + NULL, + NULL, + NULL, + 0, + ue_p->rnti, + ue_p->masterCellGroup); + + uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup && + ue_context_pP->ue_context.masterCellGroup->spCellConfig && + ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated && + ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ? + NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS; + nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id, ue_context_pP->ue_context.rnti, *rrc->carrier.servingcellconfigcommon->ssbSubcarrierSpacing, - NR_RRC_RECONFIGURATION_DELAY_MS); + delay_ms); } } @@ -810,7 +836,8 @@ rrc_gNB_generate_defaultRRCReconfiguration( void rrc_gNB_generate_dedicatedRRCReconfiguration( const protocol_ctxt_t *const ctxt_pP, - rrc_gNB_ue_context_t *ue_context_pP + rrc_gNB_ue_context_t *ue_context_pP, + NR_CellGroupConfig_t *cell_groupConfig_from_DU ) //----------------------------------------------------------------------------- { @@ -830,7 +857,10 @@ rrc_gNB_generate_dedicatedRRCReconfiguration( int qos_flow_index = 0; int pdu_sessions_done = 0; int i; - NR_CellGroupConfig_t *cellGroupConfig; + uint8_t drb_id_to_setup_start = 1; + uint8_t nb_drb_to_setup = 0; + long drb_priority[1] = {13}; // For now, we assume only one drb per pdu sessions with a default preiority (will be dynamique in future) + NR_CellGroupConfig_t *cellGroupConfig = NULL; uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id); @@ -872,6 +902,8 @@ rrc_gNB_generate_dedicatedRRCReconfiguration( DRB_config = CALLOC(1, sizeof(*DRB_config)); DRB_config->drb_Identity = i+1; + if (drb_id_to_setup_start == 1) drb_id_to_setup_start = DRB_config->drb_Identity; + nb_drb_to_setup++; DRB_config->cnAssociation = CALLOC(1, sizeof(*DRB_config->cnAssociation)); DRB_config->cnAssociation->present = NR_DRB_ToAddMod__cnAssociation_PR_sdap_Config; // sdap_Config @@ -885,7 +917,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration( sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_absent; sdap_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_absent; } - sdap_config->defaultDRB = TRUE; + sdap_config->defaultDRB = true; sdap_config->mappedQoS_FlowsToAdd = calloc(1, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd)); memset(sdap_config->mappedQoS_FlowsToAdd, 0, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd)); @@ -984,9 +1016,17 @@ rrc_gNB_generate_dedicatedRRCReconfiguration( } memset(buffer, 0, sizeof(buffer)); - cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t)); - fill_mastercellGroupConfig(cellGroupConfig, ue_context_pP->ue_context.masterCellGroup, - rrc->um_on_default_drb); + if(cell_groupConfig_from_DU == NULL){ + cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t)); + // FIXME: fill_mastercellGroupConfig() won't fill the right priorities or + // bearer IDs for the DRBs + fill_mastercellGroupConfig(cellGroupConfig, ue_context_pP->ue_context.masterCellGroup, rrc->um_on_default_drb, (drb_id_to_setup_start < 2) ? 1 : 0, drb_id_to_setup_start, nb_drb_to_setup, drb_priority); + } + else{ + LOG_I(NR_RRC, "Master cell group originating from the DU \n"); + cellGroupConfig = cell_groupConfig_from_DU; + } + size = do_RRCReconfiguration(ctxt_pP, buffer, sizeof(buffer), xid, *SRB_configList2, @@ -1041,10 +1081,28 @@ rrc_gNB_generate_dedicatedRRCReconfiguration( #endif if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) { + rrc_mac_config_req_gNB(rrc->module_id, + rrc->configuration.pdsch_AntennaPorts, + rrc->configuration.pusch_AntennaPorts, + rrc->configuration.sib1_tda, + rrc->configuration.minRXTXTIME, + NULL, + NULL, + NULL, + 0, + ue_context_pP->ue_context.rnti, + ue_context_pP->ue_context.masterCellGroup); + + uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup && + ue_context_pP->ue_context.masterCellGroup->spCellConfig && + ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated && + ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ? + NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS; + nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id, ue_context_pP->ue_context.rnti, *rrc->carrier.servingcellconfigcommon->ssbSubcarrierSpacing, - NR_RRC_RECONFIGURATION_DELAY_MS); + delay_ms); } } @@ -1221,10 +1279,16 @@ rrc_gNB_modify_dedicatedRRCReconfiguration( #endif if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) { + uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup && + ue_context_pP->ue_context.masterCellGroup->spCellConfig && + ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated && + ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ? + NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS; + nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id, ue_context_pP->ue_context.rnti, *RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing, - NR_RRC_RECONFIGURATION_DELAY_MS); + delay_ms); } } @@ -1291,8 +1355,8 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release( NULL); ue_context_pP->ue_context.pdu_session_release_command_flag = 1; - LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size, - "[MSG] RRC Reconfiguration\n"); + + LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size, "[MSG] RRC Reconfiguration\n"); /* Free all NAS PDUs */ if (nas_length > 0) { @@ -1328,10 +1392,16 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release( #endif if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) { + uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup && + ue_context_pP->ue_context.masterCellGroup->spCellConfig && + ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated && + ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ? + NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS; + nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id, ue_context_pP->ue_context.rnti, *RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing, - NR_RRC_RECONFIGURATION_DELAY_MS); + delay_ms); } } @@ -1356,7 +1426,6 @@ rrc_gNB_process_RRCReconfigurationComplete( NR_DRB_ToReleaseList_t *DRB_Release_configList2 = ue_context_pP->ue_context.DRB_Release_configList2[xid]; NR_DRB_Identity_t *drb_id_p = NULL; // uint8_t nr_DRB2LCHAN[8]; - gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id]; ue_context_pP->ue_context.ue_reestablishment_timer = 0; @@ -1395,20 +1464,7 @@ rrc_gNB_process_RRCReconfigurationComplete( NULL, get_softmodem_params()->sa ? ue_context_pP->ue_context.masterCellGroup->rlc_BearerToAddModList : NULL); /* Refresh SRBs/DRBs */ - if (!NODE_IS_CU(RC.nrrrc[ctxt_pP->module_id]->node_type)) { - rrc_mac_config_req_gNB(rrc->module_id, - rrc->configuration.ssb_SubcarrierOffset, - rrc->configuration.pdsch_AntennaPorts, - rrc->configuration.pusch_AntennaPorts, - rrc->configuration.sib1_tda, - rrc->configuration.minRXTXTIME, - NULL, - NULL, - NULL, - 0, - ue_context_pP->ue_context.rnti, - ue_context_pP->ue_context.masterCellGroup); LOG_D(NR_RRC,"Configuring RLC DRBs/SRBs for UE %x\n",ue_context_pP->ue_context.rnti); nr_rrc_rlc_config_asn1_req(ctxt_pP, SRB_configList, // NULL, @@ -1417,49 +1473,6 @@ rrc_gNB_process_RRCReconfigurationComplete( NULL, get_softmodem_params()->sa ? ue_context_pP->ue_context.masterCellGroup->rlc_BearerToAddModList : NULL); } - else if(SRB_configList!=NULL || DRB_configList!=NULL){ - MessageDef *message_p; - message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_SETUP_REQ); - f1ap_ue_context_setup_t *req=&F1AP_UE_CONTEXT_SETUP_REQ (message_p); - req->gNB_CU_ue_id = 0; - req->gNB_DU_ue_id = 0; - req->rnti = ue_context_pP->ue_context.rnti; - req->mcc = rrc->configuration.mcc[0]; - req->mnc = rrc->configuration.mnc[0]; - req->mnc_digit_length = rrc->configuration.mnc_digit_length[0]; - req->nr_cellid = rrc->nr_cellid; - if(SRB_configList!=NULL){ - req->srbs_to_be_setup = malloc(SRB_configList->list.count*sizeof(f1ap_srb_to_be_setup_t)); - req->srbs_to_be_setup_length = SRB_configList->list.count; - f1ap_srb_to_be_setup_t *SRBs=req->srbs_to_be_setup; - for (int i = 0; i < SRB_configList->list.count; i++){ - if(SRB_configList->list.array[i]->srb_Identity > 1){ - SRBs[i].srb_id = SRB_configList->list.array[i]->srb_Identity; - SRBs[i].lcid = SRB_configList->list.array[i]->srb_Identity; - } - } - } - if(DRB_configList!=NULL){ - gtpv1u_gnb_create_tunnel_req_t create_tunnel_req; - memset(&create_tunnel_req, 0, sizeof(gtpv1u_gnb_create_tunnel_req_t)); - req->drbs_to_be_setup = malloc(DRB_configList->list.count*sizeof(f1ap_drb_to_be_setup_t)); - req->drbs_to_be_setup_length = DRB_configList->list.count; - f1ap_drb_to_be_setup_t *DRBs=req->drbs_to_be_setup; - LOG_I(RRC, "Length of DRB list:%d, %d \n", DRB_configList->list.count, req->drbs_to_be_setup_length); - for (int i = 0; i < DRB_configList->list.count; i++){ - DRBs[i].drb_id = DRB_configList->list.array[i]->drb_Identity; - DRBs[i].rlc_mode = RLC_MODE_AM; - DRBs[i].up_ul_tnl[0].tl_address = inet_addr(rrc->eth_params_s.my_addr); - DRBs[i].up_ul_tnl[0].port=rrc->eth_params_s.my_portd; - DRBs[i].up_ul_tnl_length = 1; - DRBs[i].up_dl_tnl[0].tl_address = inet_addr(rrc->eth_params_s.remote_addr); - DRBs[i].up_dl_tnl[0].port=rrc->eth_params_s.remote_portd; - DRBs[i].up_dl_tnl_length = 1; - } - LOG_I(RRC, "Send F1AP_UE_CONTEXT_SETUP_REQ with ITTI\n"); - } - itti_send_msg_to_task (TASK_CU_F1, ctxt_pP->module_id, message_p); - } #endif /* Set the SRB active in UE context */ @@ -1610,7 +1623,7 @@ rrc_gNB_generate_RRCReestablishment( ue_context->Srb0.Tx_buffer.payload_size); #if(0) /* TODO : It may be needed if gNB goes into full stack working. */ - UE_id = find_nr_UE_id(module_id, rnti); + UE = find_nr_UE(module_id, rnti); if (UE_id != -1) { /* Activate reject timer, if RRCComplete not received after 10 frames, reject UE */ RC.nrmac[module_id]->UE_info.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer = 1; @@ -1754,15 +1767,16 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete( } } - gtpv1u_gnb_create_tunnel_req_t create_tunnel_req; + gtpv1u_gnb_create_tunnel_req_t create_tunnel_req={0}; /* Save e RAB information for later */ - memset(&create_tunnel_req, 0, sizeof(create_tunnel_req)); for ( j = 0, i = 0; i < NB_RB_MAX; i++) { if (ue_context_pP->ue_context.pduSession[i].status == PDU_SESSION_STATUS_ESTABLISHED || ue_context_pP->ue_context.pduSession[i].status == PDU_SESSION_STATUS_DONE) { create_tunnel_req.pdusession_id[j] = ue_context_pP->ue_context.pduSession[i].param.pdusession_id; create_tunnel_req.incoming_rb_id[j] = i+1; create_tunnel_req.outgoing_teid[j] = ue_context_pP->ue_context.pduSession[i].param.gtp_teid; + // to be developped, use the first QFI only + create_tunnel_req.outgoing_qfi[j] = ue_context_pP->ue_context.pduSession[i].param.qos[0].qfi; memcpy(create_tunnel_req.dst_addr[j].buffer, ue_context_pP->ue_context.pduSession[i].param.upf_addr.buffer, sizeof(uint8_t)*20); @@ -1813,7 +1827,7 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete( ue_context_pP->ue_context.rnti = ctxt_pP->rnti; if (AMF_MODE_ENABLED) { - uint8_t send_security_mode_command = FALSE; + uint8_t send_security_mode_command = false; nr_rrc_pdcp_config_security( ctxt_pP, ue_context_pP, @@ -1848,8 +1862,8 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete( NULL, NULL, NULL); - LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size, - "[MSG] RRC Reconfiguration\n"); + + LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size, "[MSG] RRC Reconfiguration\n"); /* Free all NAS PDUs */ for (i = 0; i < ue_context_pP->ue_context.nb_of_pdusessions; i++) { @@ -1893,14 +1907,92 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete( } if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) { + uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup && + ue_context_pP->ue_context.masterCellGroup->spCellConfig && + ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated && + ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ? + NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS; + nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id, ue_context_pP->ue_context.rnti, *RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing, - NR_RRC_RECONFIGURATION_DELAY_MS); + delay_ms); } } //----------------------------------------------------------------------------- +int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP, + protocol_ctxt_t *const ctxt_pP, + const int dl_bwp_id, + const int ul_bwp_id) { + + uint8_t buffer[RRC_BUF_SIZE]; + memset(buffer, 0, sizeof(buffer)); + uint8_t xid = rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id); + + NR_CellGroupConfig_t *masterCellGroup = ue_context_pP->ue_context.masterCellGroup; + if (dl_bwp_id >= 0) { + *masterCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = dl_bwp_id; + *masterCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = dl_bwp_id; + } + if (ul_bwp_id >= 0) { + *masterCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = ul_bwp_id; + } + + uint16_t size = do_RRCReconfiguration(ctxt_pP, + buffer, + sizeof(buffer), + xid, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + ue_context_pP, + NULL, + NULL, + NULL, + masterCellGroup); + + gNB_RrcConfigurationReq *configuration = &RC.nrrrc[ctxt_pP->module_id]->configuration; + rrc_mac_config_req_gNB(ctxt_pP->module_id, + configuration->pdsch_AntennaPorts, + configuration->pusch_AntennaPorts, + configuration->sib1_tda, + configuration->minRXTXTIME, + NULL, + NULL, + NULL, + 0, + ue_context_pP->ue_context.rnti, + masterCellGroup); + + nr_rrc_data_req(ctxt_pP, + DCCH, + rrc_gNB_mui++, + SDU_CONFIRM_NO, + size, + buffer, + PDCP_TRANSMISSION_MODE_CONTROL); + + if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) { + uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup && + ue_context_pP->ue_context.masterCellGroup->spCellConfig && + ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated && + ue_context_pP->ue_context.masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList ? + NR_RRC_RECONFIGURATION_DELAY_MS + NR_RRC_BWP_SWITCHING_DELAY_MS : NR_RRC_RECONFIGURATION_DELAY_MS; + + nr_mac_enable_ue_rrc_processing_timer(ctxt_pP->module_id, + ue_context_pP->ue_context.rnti, + *RC.nrrrc[ctxt_pP->module_id]->carrier.servingcellconfigcommon->ssbSubcarrierSpacing, + delay_ms); + } + + return 0; +} + /*------------------------------------------------------------------------------*/ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP, const uint8_t *buffer, @@ -2022,7 +2114,7 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP, } if (ue_context_p != NULL) { - ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence = TRUE; + ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence = true; ue_context_p->ue_context.ng_5G_S_TMSI_Part1 = s_tmsi_part1; } } @@ -2499,7 +2591,7 @@ rrc_gNB_decode_dcch( fiveg_s_TMSI, fiveg_s_TMSI >> 38, fiveg_s_TMSI >> 38, (fiveg_s_TMSI >> 32) & 0x3F, (fiveg_s_TMSI >> 32) & 0x3F, (uint32_t)fiveg_s_TMSI); - if (ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence == TRUE) { + if (ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence == true) { ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.amf_set_id = fiveg_s_TMSI >> 38; ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.amf_pointer = (fiveg_s_TMSI >> 32) & 0x3F; ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.fiveg_tmsi = (uint32_t)fiveg_s_TMSI; @@ -2683,11 +2775,74 @@ rrc_gNB_decode_dcch( ul_dcch_msg); } - if (ue_context_p->ue_context.established_pdu_sessions_flag == 1) { - rrc_gNB_generate_dedicatedRRCReconfiguration(ctxt_pP, ue_context_p); - } else { - rrc_gNB_generate_defaultRRCReconfiguration(ctxt_pP, ue_context_p); + if(!NODE_IS_CU(RC.nrrrc[ctxt_pP->module_id]->node_type)){ + if (ue_context_p->ue_context.established_pdu_sessions_flag == 1) { + rrc_gNB_generate_dedicatedRRCReconfiguration(ctxt_pP, ue_context_p, NULL); + } else { + rrc_gNB_generate_defaultRRCReconfiguration(ctxt_pP, ue_context_p); + } } + else{ + /*Generate a UE context setup request message towards the DU to provide the UE + *capability info and get the updates on master cell group config from the DU*/ + MessageDef *message_p; + message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_SETUP_REQ); + f1ap_ue_context_setup_t *req=&F1AP_UE_CONTEXT_SETUP_REQ (message_p); + //UE_IDs will be extracted from F1AP layer + req->gNB_CU_ue_id = 0; + req->gNB_DU_ue_id = 0; + req->rnti = ue_context_p->ue_context.rnti; + req->mcc = RC.nrrrc[ctxt_pP->module_id]->configuration.mcc[0]; + req->mnc = RC.nrrrc[ctxt_pP->module_id]->configuration.mnc[0]; + req->mnc_digit_length = RC.nrrrc[ctxt_pP->module_id]->configuration.mnc_digit_length[0]; + req->nr_cellid = RC.nrrrc[ctxt_pP->module_id]->nr_cellid; + + if (ue_context_p->ue_context.established_pdu_sessions_flag == 1) { + /*Instruction towards the DU for SRB2 configuration*/ + req->srbs_to_be_setup = malloc(1*sizeof(f1ap_srb_to_be_setup_t)); + req->srbs_to_be_setup_length = 1; + f1ap_srb_to_be_setup_t *SRBs=req->srbs_to_be_setup; + SRBs[0].srb_id = 2; + SRBs[0].lcid = 2; + + /*Instruction towards the DU for DRB configuration and tunnel creation*/ + req->drbs_to_be_setup = malloc(1*sizeof(f1ap_drb_to_be_setup_t)); + req->drbs_to_be_setup_length = 1; + f1ap_drb_to_be_setup_t *DRBs=req->drbs_to_be_setup; + LOG_I(RRC, "Length of DRB list:%d \n", req->drbs_to_be_setup_length); + DRBs[0].drb_id = 1; + DRBs[0].rlc_mode = RLC_MODE_AM; + DRBs[0].up_ul_tnl[0].tl_address = inet_addr(RC.nrrrc[ctxt_pP->module_id]->eth_params_s.my_addr); + DRBs[0].up_ul_tnl[0].port=RC.nrrrc[ctxt_pP->module_id]->eth_params_s.my_portd; + DRBs[0].up_ul_tnl_length = 1; + DRBs[0].up_dl_tnl[0].tl_address = inet_addr(RC.nrrrc[ctxt_pP->module_id]->eth_params_s.remote_addr); + DRBs[0].up_dl_tnl[0].port=RC.nrrrc[ctxt_pP->module_id]->eth_params_s.remote_portd; + DRBs[0].up_dl_tnl_length = 1; + } + if( ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.present == + NR_UECapabilityInformation__criticalExtensions_PR_ueCapabilityInformation ) { + struct NR_UE_CapabilityRAT_ContainerList *ue_CapabilityRAT_ContainerList = + ul_dcch_msg->message.choice.c1->choice.ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation->ue_CapabilityRAT_ContainerList; + if(ue_CapabilityRAT_ContainerList!=NULL){ + LOG_I(NR_RRC, "ue_CapabilityRAT_ContainerList is present \n"); + req->cu_to_du_rrc_information = calloc(1,sizeof(cu_to_du_rrc_information_t)); + req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList = calloc(1,4096); + asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UE_CapabilityRAT_ContainerList, + NULL, + ue_CapabilityRAT_ContainerList, + req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList, + 4096); + AssertFatal (enc_rval.encoded > 0, "ASN1 ue_CapabilityRAT_ContainerList encoding failed (%s, %jd)!\n", + enc_rval.failed_type->name, enc_rval.encoded); + req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length = (enc_rval.encoded+7)>>3; + } + else{ + LOG_I(NR_RRC, "ue_CapabilityRAT_ContainerList is not present \n"); + } + } + itti_send_msg_to_task (TASK_CU_F1, ctxt_pP->module_id, message_p); + } + break; @@ -2800,11 +2955,8 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) { memset(mib->message.choice.mib,0,sizeof(struct NR_MIB)); memcpy(mib->message.choice.mib, mib_DU->message.choice.mib, sizeof(struct NR_MIB)); - rrc->carrier.SIB1 = malloc(f1_setup_req->sib1_length[i]); - rrc->carrier.sizeof_SIB1 = f1_setup_req->sib1_length[i]; - memcpy((void *)rrc->carrier.SIB1,f1_setup_req->sib1[i],f1_setup_req->sib1_length[i]); dec_rval = uper_decode_complete(NULL, - &asn_DEF_NR_BCCH_DL_SCH_Message, + &asn_DEF_NR_SIB1, //&asn_DEF_NR_BCCH_DL_SCH_Message, (void **)&rrc->carrier.siblock1_DU, f1_setup_req->sib1[i], f1_setup_req->sib1_length[i]); @@ -2814,12 +2966,12 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) { dec_rval.consumed ); // Parse message and extract SystemInformationBlockType1 field - NR_BCCH_DL_SCH_Message_t *bcch_message = rrc->carrier.siblock1_DU; - AssertFatal(bcch_message->message.present == NR_BCCH_DL_SCH_MessageType_PR_c1, - "bcch_message->message.present != NR_BCCH_DL_SCH_MessageType_PR_c1\n"); - AssertFatal(bcch_message->message.choice.c1->present == NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1, - "bcch_message->message.choice.c1->present != NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1\n"); - rrc->carrier.sib1 = bcch_message->message.choice.c1->choice.systemInformationBlockType1; + rrc->carrier.sib1 = rrc->carrier.siblock1_DU; + if ( LOG_DEBUGFLAG(DEBUG_ASN1)){ + LOG_I(NR_RRC, "Printing received SIB1 container inside F1 setup request message:\n"); + xer_fprint(stdout, &asn_DEF_NR_SIB1,(void *)rrc->carrier.sib1); + } + rrc->carrier.physCellId = f1_setup_req->cell[i].nr_pci; F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p2).gNB_CU_name = rrc->node_name; @@ -2877,11 +3029,13 @@ void rrc_gNB_process_dc_overall_timeout(const module_id_t gnb_mod_idP, x2ap_ENDC static int rrc_process_DU_DL(MessageDef *msg_p, const char *msg_name, instance_t instance) { NRDuDlReq_t * req=&NRDuDlReq(msg_p); - protocol_ctxt_t ctxt; - ctxt.rnti = req->rnti; - ctxt.module_id = instance; - ctxt.instance = instance; - ctxt.enb_flag = 1; + protocol_ctxt_t ctxt = { + .rnti = req->rnti, + .module_id = instance, + .instance = instance, + .enb_flag = 1, + .eNB_index = instance + }; gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id]; struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rnti); @@ -3082,7 +3236,6 @@ static int rrc_process_DU_DL(MessageDef *msg_p, const char *msg_name, instance_ LOG_I(F1AP, "Received DL RRC Transfer on srb_id %ld\n", req->srb_id); // rlc_op_status_t rlc_status; - // boolean_t ret = TRUE; //LOG_I(F1AP, "PRRCContainer size %lu:", ie->value.choice.RRCContainer.size); //for (int i = 0; i < ie->value.choice.RRCContainer.size; i++) @@ -3107,23 +3260,23 @@ static int rrc_process_DU_DL(MessageDef *msg_p, const char *msg_name, instance_ // switch (rlc_status) { // case RLC_OP_STATUS_OK: // //LOG_I(F1AP, "Data sending request over RLC succeeded!\n"); - // ret=TRUE; + // ret=true; // break; // case RLC_OP_STATUS_BAD_PARAMETER: // LOG_W(F1AP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n"); - // ret= FALSE; + // ret= false; // break; // case RLC_OP_STATUS_INTERNAL_ERROR: // LOG_W(F1AP, "Data sending request over RLC failed with 'Internal Error' reason!\n"); - // ret= FALSE; + // ret= false; // break; // case RLC_OP_STATUS_OUT_OF_RESSOURCES: // LOG_W(F1AP, "Data sending request over RLC failed with 'Out of Resources' reason!\n"); - // ret= FALSE; + // ret= false; // break; // default: // LOG_W(F1AP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status); - // ret= FALSE; + // ret= false; // break; // } // switch case // return ret; @@ -3133,11 +3286,13 @@ return 0; static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const char *msg_name, instance_t instance){ f1ap_ue_context_setup_t * req=&F1AP_UE_CONTEXT_SETUP_REQ(msg_p); - protocol_ctxt_t ctxt; - ctxt.rnti = req->rnti; - ctxt.module_id = instance; - ctxt.instance = instance; - ctxt.enb_flag = 1; + protocol_ctxt_t ctxt = { + .rnti = req->rnti, + .module_id = instance, + .instance = instance, + .enb_flag = 1, + .eNB_index = instance + }; gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id]; gNB_MAC_INST *mac = RC.nrmac[ctxt.module_id]; struct rrc_gNB_ue_context_s *ue_context_p = @@ -3147,10 +3302,97 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(message_p); uint32_t incoming_teid = 0; + if(req->cu_to_du_rrc_information!=NULL){ + if(req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList!=NULL){ + LOG_I(NR_RRC, "Length of ue_CapabilityRAT_ContainerList is: %d \n", (int) req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length); + struct NR_UE_CapabilityRAT_ContainerList *ue_CapabilityRAT_ContainerList = NULL; + asn_dec_rval_t dec_rval = uper_decode_complete( NULL, + &asn_DEF_NR_UE_CapabilityRAT_ContainerList, + (void **)&ue_CapabilityRAT_ContainerList, + (uint8_t *)req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList, + (int) req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length); + + if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) { + AssertFatal(1==0,"UE Capability RAT ContainerList decode error\n"); + // free the memory + SEQUENCE_free( &asn_DEF_NR_UE_CapabilityRAT_ContainerList, ue_CapabilityRAT_ContainerList, 1 ); + return; + } + //To fill ue_context.UE_Capability_MRDC, ue_context.UE_Capability_nr ... + int NR_index = -1; + for(int i = 0;i < ue_CapabilityRAT_ContainerList->list.count; i++){ + if(ue_CapabilityRAT_ContainerList->list.array[i]->rat_Type == + NR_RAT_Type_nr){ + LOG_I(NR_RRC, "DU received NR_RAT_Type_nr UE capabilities Info through the UE Context Setup Request from the CU \n"); + if(ue_context_p->ue_context.UE_Capability_nr){ + ASN_STRUCT_FREE(asn_DEF_NR_UE_NR_Capability,ue_context_p->ue_context.UE_Capability_nr); + ue_context_p->ue_context.UE_Capability_nr = 0; + } + + dec_rval = uper_decode(NULL, + &asn_DEF_NR_UE_NR_Capability, + (void**)&ue_context_p->ue_context.UE_Capability_nr, + ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.buf, + ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size, + 0,0); + if(LOG_DEBUGFLAG(DEBUG_ASN1)){ + xer_fprint(stdout,&asn_DEF_NR_UE_NR_Capability,ue_context_p->ue_context.UE_Capability_nr); + } + + if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)){ + LOG_E(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" Failed to decode nr UE capabilities (%zu bytes)\n", + PROTOCOL_NR_RRC_CTXT_UE_ARGS(&ctxt),dec_rval.consumed); + ASN_STRUCT_FREE(asn_DEF_NR_UE_NR_Capability,ue_context_p->ue_context.UE_Capability_nr); + ue_context_p->ue_context.UE_Capability_nr = 0; + } + + ue_context_p->ue_context.UE_Capability_size = + ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size; + if(NR_index != -1){ + LOG_E(NR_RRC,"fatal: more than 1 eutra capability\n"); + exit(1); + } + NR_index = i; + } + + if(ue_CapabilityRAT_ContainerList->list.array[i]->rat_Type == + NR_RAT_Type_eutra_nr){ + LOG_I(NR_RRC, "DU received NR_RAT_Type_eutra_nr UE capabilities Info through the UE Context Setup Request from the CU \n"); + if(ue_context_p->ue_context.UE_Capability_MRDC){ + ASN_STRUCT_FREE(asn_DEF_NR_UE_MRDC_Capability,ue_context_p->ue_context.UE_Capability_MRDC); + ue_context_p->ue_context.UE_Capability_MRDC = 0; + } + dec_rval = uper_decode(NULL, + &asn_DEF_NR_UE_MRDC_Capability, + (void**)&ue_context_p->ue_context.UE_Capability_MRDC, + ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.buf, + ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size, + 0,0); + if(LOG_DEBUGFLAG(DEBUG_ASN1)){ + xer_fprint(stdout,&asn_DEF_NR_UE_MRDC_Capability,ue_context_p->ue_context.UE_Capability_MRDC); + } + + if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)){ + LOG_E(NR_RRC,PROTOCOL_NR_RRC_CTXT_FMT" Failed to decode nr UE capabilities (%zu bytes)\n", + PROTOCOL_NR_RRC_CTXT_UE_ARGS(&ctxt),dec_rval.consumed); + ASN_STRUCT_FREE(asn_DEF_NR_UE_MRDC_Capability,ue_context_p->ue_context.UE_Capability_MRDC); + ue_context_p->ue_context.UE_Capability_MRDC = 0; + } + ue_context_p->ue_context.UE_MRDC_Capability_size = + ue_CapabilityRAT_ContainerList->list.array[i]->ue_CapabilityRAT_Container.size; + } + + if(ue_CapabilityRAT_ContainerList->list.array[i]->rat_Type == + NR_RAT_Type_eutra){ + //TODO + } + } + } + } - NR_CellGroupConfig_t *cellGroupConfig; - cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t)); - fill_mastercellGroupConfig(cellGroupConfig, ue_context_p->ue_context.masterCellGroup,rrc->um_on_default_drb); + uint8_t drb_id_to_setup_start = 0; + uint8_t nb_drb_to_setup = 0; + long drb_priority[1] = {13}; // For now, we assume only one drb per pdu sessions with a default preiority (will be dynamique in future) /* Configure SRB2 */ NR_SRB_ToAddMod_t *SRB2_config = NULL; @@ -3179,6 +3421,7 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha ue_context_p->ue_context.DRB_configList = CALLOC(1, sizeof(*ue_context_p->ue_context.DRB_configList)); } DRB_configList = ue_context_p->ue_context.DRB_configList; + nb_drb_to_setup = req->drbs_to_be_setup_length; for (int i=0; i<req->drbs_to_be_setup_length; i++){ DRB_config = CALLOC(1, sizeof(*DRB_config)); DRB_config->drb_Identity = req->drbs_to_be_setup[i].drb_id; @@ -3188,18 +3431,39 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha memcpy(addr.buffer, &drb_p.up_ul_tnl[0].tl_address, sizeof(drb_p.up_ul_tnl[0].tl_address)); addr.length=sizeof(drb_p.up_ul_tnl[0].tl_address)*8; extern instance_t DUuniqInstance; - incoming_teid=newGtpuCreateTunnel(DUuniqInstance, - req->rnti, - drb_p.drb_id, - drb_p.drb_id, - drb_p.up_ul_tnl[0].teid, - addr, - drb_p.up_ul_tnl[0].port, - DURecvCb); + if (!drb_id_to_setup_start) drb_id_to_setup_start = drb_p.drb_id; + incoming_teid = newGtpuCreateTunnel(DUuniqInstance, + req->rnti, + drb_p.drb_id, + drb_p.drb_id, + drb_p.up_ul_tnl[0].teid, + -1, // no qfi + addr, + drb_p.up_ul_tnl[0].port, + DURecvCb, + NULL); } } + NR_CellGroupConfig_t *cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t)); + if (req->srbs_to_be_setup_length > 0 || req->drbs_to_be_setup_length>0) + // FIXME: fill_mastercellGroupConfig() won't fill the right priorities or + // bearer IDs for the DRBs + fill_mastercellGroupConfig(cellGroupConfig, ue_context_p->ue_context.masterCellGroup, rrc->um_on_default_drb, SRB2_config ? 1 : 0, drb_id_to_setup_start, nb_drb_to_setup, drb_priority); + apply_macrlc_config(rrc, ue_context_p, &ctxt); + + if(req->rrc_container_length > 0){ + mem_block_t *pdcp_pdu_p = get_free_mem_block(req->rrc_container_length, __func__); + memcpy(&pdcp_pdu_p->data[0], req->rrc_container, req->rrc_container_length); + du_rlc_data_req(&ctxt, 1, 0x00, 1, 1, 0, req->rrc_container_length, pdcp_pdu_p); + LOG_I(F1AP, "Printing RRC Container of UE context setup request: \n"); + for (int j=0; j<req->rrc_container_length; j++){ + printf("%02x ", pdcp_pdu_p->data[j]); + } + printf("\n"); + } + /* Fill the UE context setup response ITTI message to send to F1AP */ resp->gNB_CU_ue_id = req->gNB_CU_ue_id; resp->rnti = ctxt.rnti; @@ -3234,25 +3498,188 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha else{ LOG_W(NR_RRC, "No SRB added upon reception of F1 UE Context setup request at the DU\n"); } - resp->du_to_cu_rrc_information = calloc(1,1024*sizeof(uint8_t)); + /* fixme: + * Here we should be encoding the updates on cellgroupconfig based on the content of UE capabilities + */ + resp->du_to_cu_rrc_information = calloc(1, sizeof(du_to_cu_rrc_information_t)); + resp->du_to_cu_rrc_information->cellGroupConfig = calloc(1,1024); asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, NULL, - (void *)cellGroupConfig, - resp->du_to_cu_rrc_information, + ue_context_p->ue_context.masterCellGroup, //(void *)cellGroupConfig, + resp->du_to_cu_rrc_information->cellGroupConfig, 1024); - resp->du_to_cu_rrc_information_length = (enc_rval.encoded+7)>>3; + if (enc_rval.encoded == -1) { + LOG_E(F1AP,"Could not encode ue_context.masterCellGroup, failed element %s\n",enc_rval.failed_type->name); + exit(-1); + } + resp->du_to_cu_rrc_information->cellGroupConfig_length = (enc_rval.encoded+7)>>3; free(cellGroupConfig); itti_send_msg_to_task (TASK_DU_F1, ctxt.module_id, message_p); } +static void rrc_DU_process_ue_context_modification_request(MessageDef *msg_p, const char *msg_name, instance_t instance){ + + f1ap_ue_context_setup_t * req=&F1AP_UE_CONTEXT_MODIFICATION_REQ(msg_p); + protocol_ctxt_t ctxt = { + .rnti = req->rnti, + .module_id = instance, + .instance = instance, + .enb_flag = 1, + .eNB_index = instance + }; + gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id]; + gNB_MAC_INST *mac = RC.nrmac[ctxt.module_id]; + struct rrc_gNB_ue_context_s *ue_context_p = + rrc_gNB_get_ue_context(rrc, ctxt.rnti); + MessageDef *message_p; + message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_MODIFICATION_RESP); + f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_MODIFICATION_RESP(message_p); + uint32_t incoming_teid = 0; + NR_CellGroupConfig_t *cellGroupConfig = NULL; + + /* Configure SRB2 */ + NR_SRB_ToAddMod_t *SRB2_config = NULL; + NR_SRB_ToAddModList_t *SRB_configList = NULL; + uint8_t SRBs_before_new_addition = 0; + + if(req->srbs_to_be_setup_length>0){ + if(ue_context_p->ue_context.SRB_configList == NULL){ + LOG_W(NR_RRC, "The SRB list of the UE context is empty before the addition of new SRB at the DU \n"); + ue_context_p->ue_context.SRB_configList = CALLOC(1, sizeof(*ue_context_p->ue_context.SRB_configList)); + } + SRB_configList = ue_context_p->ue_context.SRB_configList; + SRBs_before_new_addition = SRB_configList->list.count; + for (int i=0; i<req->srbs_to_be_setup_length; i++){ + SRB2_config = CALLOC(1, sizeof(*SRB2_config)); + SRB2_config->srb_Identity = req->srbs_to_be_setup[i].srb_id; + ASN_SEQUENCE_ADD(&SRB_configList->list, SRB2_config); + } + } + + /* Configure DRB */ + NR_DRB_ToAddMod_t *DRB_config = NULL; + NR_DRB_ToAddModList_t *DRB_configList = NULL; + if(req->drbs_to_be_setup_length>0){ + if(ue_context_p->ue_context.DRB_configList == NULL){ + ue_context_p->ue_context.DRB_configList = CALLOC(1, sizeof(*ue_context_p->ue_context.DRB_configList)); + } + DRB_configList = ue_context_p->ue_context.DRB_configList; + for (int i=0; i<req->drbs_to_be_setup_length; i++){ + DRB_config = CALLOC(1, sizeof(*DRB_config)); + DRB_config->drb_Identity = req->drbs_to_be_setup[i].drb_id; + ASN_SEQUENCE_ADD(&DRB_configList->list, DRB_config); + f1ap_drb_to_be_setup_t drb_p = req->drbs_to_be_setup[i]; + transport_layer_addr_t addr; + memcpy(addr.buffer, &drb_p.up_ul_tnl[0].tl_address, sizeof(drb_p.up_ul_tnl[0].tl_address)); + addr.length=sizeof(drb_p.up_ul_tnl[0].tl_address)*8; + extern instance_t DUuniqInstance; + incoming_teid = newGtpuCreateTunnel(DUuniqInstance, + req->rnti, + drb_p.drb_id, + drb_p.drb_id, + drb_p.up_ul_tnl[0].teid, + -1, // no qfi + addr, + drb_p.up_ul_tnl[0].port, + DURecvCb, + NULL); + } + } + + if(req->srbs_to_be_setup_length>0 || req->drbs_to_be_setup_length>0){ + cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t)); + uint8_t drb_id_to_setup_start = 1; + long drb_priority[1] = {13}; // For now, we assume only one drb per pdu sessions with a default preiority (will be dynamique in future) + fill_mastercellGroupConfig(cellGroupConfig, + ue_context_p->ue_context.masterCellGroup, + rrc->um_on_default_drb, + drb_id_to_setup_start < 2 ? 1 : 0, + drb_id_to_setup_start, + req->drbs_to_be_setup_length, + drb_priority); + apply_macrlc_config(rrc, ue_context_p, &ctxt); + } + if(req->ReconfigComplOutcome == RRCreconf_failure){ + LOG_W(NR_RRC, "CU reporting RRC Reconfiguration failure \n"); + } + else if(req->ReconfigComplOutcome == RRCreconf_success){ + LOG_I(NR_RRC, "CU reporting RRC Reconfiguration success \n"); + if(ue_context_p->ue_context.DRB_configList!=NULL){ + LOG_I(NR_RRC, "Send first DDD buffer status reporting towards the CU through an ITTI message to gtp-u \n"); + uint8_t drb_id = ue_context_p->ue_context.DRB_configList->list.array[0]->drb_Identity; + rnti_t rnti = ue_context_p->ue_context.rnti; + int rlc_tx_buffer_space = nr_rlc_get_available_tx_space(rnti, drb_id); + LOG_I(NR_RRC, "Reported in DDD drb_id:%d, rnti:%d\n", drb_id, rnti); + MessageDef *msg = itti_alloc_new_message_sized(TASK_RRC_GNB, 0, GTPV1U_DU_BUFFER_REPORT_REQ, + sizeof(gtpv1u_gnb_tunnel_data_req_t)); + gtpv1u_DU_buffer_report_req_t *req=>PV1U_DU_BUFFER_REPORT_REQ(msg); + req->pdusession_id = drb_id; + req->rnti = rnti; + req->buffer_availability = rlc_tx_buffer_space; //10000000; //Hardcoding to be removed and read the actual RLC buffer availability instead + extern instance_t DUuniqInstance; + itti_send_msg_to_task(TASK_GTPV1_U, DUuniqInstance, msg); + + } + } + + /* Fill the UE context setup response ITTI message to send to F1AP */ + resp->gNB_CU_ue_id = req->gNB_CU_ue_id; + resp->rnti = ctxt.rnti; + if(DRB_configList){ + if(DRB_configList->list.count > 0){ + resp->drbs_to_be_setup = calloc(1,DRB_configList->list.count*sizeof(f1ap_drb_to_be_setup_t)); + resp->drbs_to_be_setup_length = DRB_configList->list.count; + for (int i=0; i<DRB_configList->list.count; i++){ + resp->drbs_to_be_setup[i].drb_id = DRB_configList->list.array[i]->drb_Identity; + resp->drbs_to_be_setup[i].rlc_mode = RLC_MODE_AM; + resp->drbs_to_be_setup[i].up_dl_tnl[0].teid = incoming_teid; + resp->drbs_to_be_setup[i].up_dl_tnl[0].tl_address = inet_addr(mac->eth_params_n.my_addr); + resp->drbs_to_be_setup[i].up_dl_tnl_length = 1; + } + } + else{ + LOG_W(NR_RRC, "No DRB added upon reception of F1 UE context modification request with a DRB to setup list\n"); + } + } + if(SRB_configList){ + if(SRB_configList->list.count >0 && SRBs_before_new_addition < SRB_configList->list.count){ + resp->srbs_to_be_setup = calloc(1,req->srbs_to_be_setup_length*sizeof(f1ap_srb_to_be_setup_t)); + resp->srbs_to_be_setup_length = req->srbs_to_be_setup_length; + for (int i=SRBs_before_new_addition; i<SRB_configList->list.count; i++){ + resp->srbs_to_be_setup[i-SRBs_before_new_addition].srb_id = SRB_configList->list.array[i]->srb_Identity; + } + } + else{ + LOG_W(NR_RRC, "No SRB added upon reception of F1 UE Context modification request at the DU\n"); + } + } + else{ + LOG_W(NR_RRC, "No SRB added upon reception of F1 UE Context modification request at the DU\n"); + } + + //if(cellGroupConfig != NULL) { + resp->du_to_cu_rrc_information = calloc(1,sizeof(du_to_cu_rrc_information_t)); + resp->du_to_cu_rrc_information->cellGroupConfig = calloc(1,1024); + asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, + NULL, + ue_context_p->ue_context.masterCellGroup, //(void *)cellGroupConfig, + resp->du_to_cu_rrc_information->cellGroupConfig, + 1024); + resp->du_to_cu_rrc_information->cellGroupConfig_length = (enc_rval.encoded+7)>>3; + //} + itti_send_msg_to_task (TASK_DU_F1, ctxt.module_id, message_p); +} + static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, const char *msg_name, instance_t instance){ f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p); - protocol_ctxt_t ctxt; - ctxt.rnti = resp->rnti; - ctxt.module_id = instance; - ctxt.instance = instance; - ctxt.enb_flag = 1; + protocol_ctxt_t ctxt = { + .rnti = resp->rnti, + .module_id = instance, + .instance = instance, + .enb_flag = 1, + .eNB_index = instance + }; gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id]; struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rnti); NR_CellGroupConfig_t *cellGroupConfig = NULL; @@ -3260,8 +3687,8 @@ static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, const ch asn_dec_rval_t dec_rval = uper_decode_complete( NULL, &asn_DEF_NR_CellGroupConfig, (void **)&cellGroupConfig, - (uint8_t *)resp->du_to_cu_rrc_information, - (int) resp->du_to_cu_rrc_information_length); + (uint8_t *)resp->du_to_cu_rrc_information->cellGroupConfig, + (int) resp->du_to_cu_rrc_information->cellGroupConfig_length); if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) { AssertFatal(1==0,"Cell group config decode error\n"); @@ -3276,20 +3703,90 @@ static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, const ch } if(cellGroupConfig->rlc_BearerToAddModList!=NULL){ if(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList != NULL){ - LOG_I(NR_RRC, "rlc_BearerToAddModList not empty before filling it \n"); - free(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList); + int ue_ctxt_rlc_Bearers = ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList->list.count; + for(int i=ue_ctxt_rlc_Bearers; i<ue_ctxt_rlc_Bearers + cellGroupConfig->rlc_BearerToAddModList->list.count; i++){ + ASN_SEQUENCE_ADD(&ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList->list, + cellGroupConfig->rlc_BearerToAddModList->list.array[i-ue_ctxt_rlc_Bearers]); + } } - ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList)); - memcpy(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList, cellGroupConfig->rlc_BearerToAddModList, + else{ + LOG_W(NR_RRC, "Empty rlc_BearerToAddModList at ue_context of the CU before filling the updates from UE context setup response \n"); + ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList)); + memcpy(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList, cellGroupConfig->rlc_BearerToAddModList, sizeof(*cellGroupConfig->rlc_BearerToAddModList)); + } } xer_fprint(stdout,&asn_DEF_NR_CellGroupConfig, ue_context_p->ue_context.masterCellGroup); + if (ue_context_p->ue_context.established_pdu_sessions_flag == 1) { + rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p, cellGroupConfig); + } else { + rrc_gNB_generate_defaultRRCReconfiguration(&ctxt, ue_context_p); + } + free(cellGroupConfig->rlc_BearerToAddModList); free(cellGroupConfig); } +static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, const char *msg_name, instance_t instance){ + + f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p); + protocol_ctxt_t ctxt = { + .rnti = resp->rnti, + .module_id = instance, + .instance = instance, + .enb_flag = 1, + .eNB_index = instance + }; + gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id]; + struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rnti); + NR_CellGroupConfig_t *cellGroupConfig = NULL; + + if(resp->du_to_cu_rrc_information->cellGroupConfig!=NULL){ + asn_dec_rval_t dec_rval = uper_decode_complete( NULL, + &asn_DEF_NR_CellGroupConfig, + (void **)&cellGroupConfig, + (uint8_t *)resp->du_to_cu_rrc_information->cellGroupConfig, + (int) resp->du_to_cu_rrc_information->cellGroupConfig_length); + + if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) { + AssertFatal(1==0,"Cell group config decode error\n"); + // free the memory + SEQUENCE_free( &asn_DEF_NR_CellGroupConfig, cellGroupConfig, 1 ); + return; + } + //xer_fprint(stdout,&asn_DEF_NR_CellGroupConfig, cellGroupConfig); + + if(ue_context_p->ue_context.masterCellGroup == NULL){ + ue_context_p->ue_context.masterCellGroup = calloc(1, sizeof(NR_CellGroupConfig_t)); + } + + if(cellGroupConfig->rlc_BearerToAddModList!=NULL){ + if(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList != NULL){ + int ue_ctxt_rlc_Bearers = ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList->list.count; + for(int i=ue_ctxt_rlc_Bearers; i<ue_ctxt_rlc_Bearers + cellGroupConfig->rlc_BearerToAddModList->list.count; i++){ + ASN_SEQUENCE_ADD(&ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList->list, + cellGroupConfig->rlc_BearerToAddModList->list.array[i-ue_ctxt_rlc_Bearers]); + } + } + else{ + LOG_W(NR_RRC, "Empty rlc_BearerToAddModList at ue_context of the CU before filling the updates from UE context setup response \n"); + ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList)); + memcpy(ue_context_p->ue_context.masterCellGroup->rlc_BearerToAddModList, cellGroupConfig->rlc_BearerToAddModList, + sizeof(*cellGroupConfig->rlc_BearerToAddModList)); + } + } + LOG_I(NR_RRC, "Updated master cell group configuration stored at the UE context of the CU:\n"); + xer_fprint(stdout,&asn_DEF_NR_CellGroupConfig, ue_context_p->ue_context.masterCellGroup); + + rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p, cellGroupConfig); + + free(cellGroupConfig->rlc_BearerToAddModList); + free(cellGroupConfig); + } +} + unsigned int mask_flip(unsigned int x) { return((((x>>8) + (x<<8))&0xffff)>>6); } @@ -3451,9 +3948,10 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) { FILE *fd=NULL;//fopen("nrRRCstats.log","w"); RB_FOREACH(ue_context_p, rrc_nr_ue_tree_s, &(RC.nrrrc[ctxt_pP->module_id]->rrc_ue_head)) { ctxt_pP->rnti = ue_context_p->ue_id_rnti; + gNB_MAC_INST *nrmac=RC.nrmac[ctxt_pP->module_id]; //WHAT A BEAUTIFULL RACE CONDITION !!! if (fd) { - if (ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence == TRUE) { + if (ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.presence == true) { fprintf(fd,"NR RRC UE rnti %x: S-TMSI %x failure timer %d/8\n", ue_context_p->ue_id_rnti, ue_context_p->ue_context.Initialue_identity_5g_s_TMSI.fiveg_tmsi, @@ -3490,15 +3988,27 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) { // Remove here the MAC and RRC context when RRC is not connected or gNB is not connected to CN5G if(ue_context_p->ue_context.StatusRrc < NR_RRC_CONNECTED || ue_context_p->ue_context.gNB_ue_ngap_id == 0) { - mac_remove_nr_ue(ctxt_pP->module_id, ctxt_pP->rnti); - rrc_rlc_remove_ue(ctxt_pP); - pdcp_remove_UE(ctxt_pP); - - /* remove RRC UE Context */ - ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rnti); - if (ue_context_p) { - rrc_gNB_remove_ue_context(ctxt_pP, RC.nrrrc[ctxt_pP->module_id], ue_context_p); - LOG_I(NR_RRC, "remove UE %x \n", ctxt_pP->rnti); + if(!NODE_IS_CU(RC.nrrrc[ctxt_pP->instance]->node_type)){ + mac_remove_nr_ue(nrmac, ctxt_pP->rnti); + rrc_rlc_remove_ue(ctxt_pP); + pdcp_remove_UE(ctxt_pP); + + /* remove RRC UE Context */ + ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rnti); + if (ue_context_p) { + rrc_gNB_remove_ue_context(ctxt_pP, RC.nrrrc[ctxt_pP->module_id], ue_context_p); + LOG_I(NR_RRC, "remove UE %x \n", ctxt_pP->rnti); + } + } + // In case of CU trigger UE context release command towards the DU + else{ + MessageDef *message_p; + message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_RELEASE_CMD); + f1ap_ue_context_release_cmd_t *rel_cmd=&F1AP_UE_CONTEXT_RELEASE_CMD (message_p); + rel_cmd->rnti = ctxt_pP->rnti; + rel_cmd->cause = F1AP_CAUSE_RADIO_NETWORK; + rel_cmd->cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release + itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, message_p); } } @@ -3514,7 +4024,7 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) { ue_context_p->ue_context.rnti); ue_context_p->ue_context.ue_release_timer_rrc = 0; - mac_remove_nr_ue(ctxt_pP->module_id, ctxt_pP->rnti); + mac_remove_nr_ue(nrmac, ctxt_pP->rnti); rrc_rlc_remove_ue(ctxt_pP); pdcp_remove_UE(ctxt_pP); newGtpuDeleteAllTunnels(ctxt_pP->instance, ctxt_pP->rnti); @@ -3533,7 +4043,6 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) { if (fd) fclose(fd); - /* send a tick to x2ap */ if (is_x2ap_enabled()){ msg = itti_alloc_new_message(TASK_RRC_ENB, 0, X2AP_SUBFRAME_PROCESS); @@ -3685,17 +4194,30 @@ void *rrc_gnb_task(void *args_p) { rrc_gNB_process_f1_setup_req(&F1AP_SETUP_REQ(msg_p)); break; - case NR_DU_RRC_DL_INDICATION: - rrc_process_DU_DL(msg_p, msg_name_p, instance); - break; + case NR_DU_RRC_DL_INDICATION: + rrc_process_DU_DL(msg_p, msg_name_p, instance); + break; - case F1AP_UE_CONTEXT_SETUP_REQ: - rrc_DU_process_ue_context_setup_request(msg_p, msg_name_p, instance); - break; + case F1AP_UE_CONTEXT_SETUP_REQ: + rrc_DU_process_ue_context_setup_request(msg_p, msg_name_p, instance); + break; - case F1AP_UE_CONTEXT_SETUP_RESP: - rrc_CU_process_ue_context_setup_response(msg_p, msg_name_p, instance); - break; + case F1AP_UE_CONTEXT_SETUP_RESP: + rrc_CU_process_ue_context_setup_response(msg_p, msg_name_p, instance); + break; + + case F1AP_UE_CONTEXT_MODIFICATION_RESP: + rrc_CU_process_ue_context_modification_response(msg_p, msg_name_p, instance); + break; + + case F1AP_UE_CONTEXT_MODIFICATION_REQ: + rrc_DU_process_ue_context_modification_request(msg_p, msg_name_p, instance); + break; + + case F1AP_UE_CONTEXT_RELEASE_CMD: + LOG_W(NR_RRC, "Received F1AP_UE_CONTEXT_RELEASE_CMD for processing at the RRC layer of the DU. Processing function " + "implementation is pending\n"); + break; /* Messages from X2AP */ case X2AP_ENDC_SGNB_ADDITION_REQ: @@ -3966,5 +4488,6 @@ void nr_rrc_trigger(protocol_ctxt_t *ctxt, int CC_id, int frame, int subframe) message_p = itti_alloc_new_message(TASK_RRC_GNB, 0, RRC_SUBFRAME_PROCESS); RRC_SUBFRAME_PROCESS(message_p).ctxt = *ctxt; RRC_SUBFRAME_PROCESS(message_p).CC_id = CC_id; + LOG_D(NR_RRC, "Time in RRC: %u/ %u \n", frame, subframe); itti_send_msg_to_task(TASK_RRC_GNB, ctxt->module_id, message_p); } diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c index c73c3d9649d..8e1975ea119 100644 --- a/openair2/RRC/NR/rrc_gNB_NGAP.c +++ b/openair2/RRC/NR/rrc_gNB_NGAP.c @@ -307,7 +307,6 @@ nr_rrc_pdcp_config_security( //uint8_t *k_kdf = NULL; static int print_keys= 1; - /* Derive the keys from kgnb */ if (SRB_configList != NULL) { nr_derive_key_up_enc(ue_context_pP->ue_context.ciphering_algorithm, @@ -475,7 +474,6 @@ rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ( rrc_gNB_ue_context_t *ue_context_p = NULL; protocol_ctxt_t ctxt={0}; uint8_t pdu_sessions_done = 0; - gtpv1u_gnb_create_tunnel_req_t create_tunnel_req; gtpv1u_gnb_create_tunnel_resp_t create_tunnel_resp; uint8_t inde_list[NR_NB_RB_MAX - 3]= {0}; int ret = 0; @@ -504,7 +502,7 @@ rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ( uint8_t nb_pdusessions_tosetup = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).nb_of_pdusessions; if (nb_pdusessions_tosetup != 0) { - memset(&create_tunnel_req, 0, sizeof(gtpv1u_gnb_create_tunnel_req_t)); + gtpv1u_gnb_create_tunnel_req_t create_tunnel_req={0}; for (int i = 0; i < NR_NB_RB_MAX - 3; i++) { if(ue_context_p->ue_context.pduSession[i].status >= PDU_SESSION_STATUS_DONE) continue; @@ -513,6 +511,8 @@ rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ( create_tunnel_req.pdusession_id[pdu_sessions_done] = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].pdusession_id; create_tunnel_req.incoming_rb_id[pdu_sessions_done] = i+1; create_tunnel_req.outgoing_teid[pdu_sessions_done] = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].gtp_teid; + // To be developped: hardcoded first flow + create_tunnel_req.outgoing_qfi[pdu_sessions_done] = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].qos[0].qfi; create_tunnel_req.dst_addr[pdu_sessions_done].length = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].upf_addr.length; memcpy(create_tunnel_req.dst_addr[pdu_sessions_done].buffer, NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].upf_addr.buffer, @@ -709,7 +709,7 @@ rrc_gNB_process_security( rrc_gNB_ue_context_t *const ue_context_pP, ngap_security_capabilities_t *security_capabilities_pP ) { - boolean_t changed = FALSE; + bool changed = false; NR_CipheringAlgorithm_t cipheringAlgorithm; e_NR_IntegrityProtAlgorithm integrityProtAlgorithm; /* Save security parameters */ @@ -727,14 +727,14 @@ rrc_gNB_process_security( if (ue_context_pP->ue_context.ciphering_algorithm != cipheringAlgorithm) { ue_context_pP->ue_context.ciphering_algorithm = cipheringAlgorithm; - changed = TRUE; + changed = true; } integrityProtAlgorithm = rrc_gNB_select_integrity(ctxt_pP, ue_context_pP->ue_context.security_capabilities.nRintegrity_algorithms); if (ue_context_pP->ue_context.integrity_algorithm != integrityProtAlgorithm) { ue_context_pP->ue_context.integrity_algorithm = integrityProtAlgorithm; - changed = TRUE; + changed = true; } LOG_I (NR_RRC, "[gNB %d][UE %x] Selected security algorithms (%p): %lx, %x, %s\n", @@ -905,7 +905,7 @@ rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP( for (pdusession = 0; pdusession < ue_context_pP->ue_context.setup_pdu_sessions; pdusession++) { // if (xid == ue_context_pP->ue_context.pdusession[pdusession].xid) { if (ue_context_pP->ue_context.pduSession[pdusession].status == PDU_SESSION_STATUS_DONE) { - pdusession_setup_t * tmp=&NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdusession]; + pdusession_setup_t * tmp=&NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdu_sessions_done]; tmp->pdusession_id = ue_context_pP->ue_context.pduSession[pdusession].param.pdusession_id; // tmp->pdusession_id = 1; tmp->nb_of_qos_flow = ue_context_pP->ue_context.pduSession[pdusession].param.nb_qos; @@ -1004,6 +1004,7 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ( create_tunnel_req.pdusession_id[pdu_sessions_done] = NGAP_PDUSESSION_SETUP_REQ(msg_p).pdusession_setup_params[pdu_sessions_done].pdusession_id; create_tunnel_req.incoming_rb_id[pdu_sessions_done]= i+1; create_tunnel_req.outgoing_teid[pdu_sessions_done] = NGAP_PDUSESSION_SETUP_REQ(msg_p).pdusession_setup_params[pdu_sessions_done].gtp_teid; + create_tunnel_req.outgoing_qfi[pdu_sessions_done] = NGAP_PDUSESSION_SETUP_REQ(msg_p).pdusession_setup_params[pdu_sessions_done].qos[0].qfi; memcpy(create_tunnel_req.dst_addr[pdu_sessions_done].buffer, NGAP_PDUSESSION_SETUP_REQ(msg_p).pdusession_setup_params[pdu_sessions_done].upf_addr.buffer, sizeof(uint8_t)*20); @@ -1050,7 +1051,46 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ( // TEST // ue_context_p->ue_context.pdusession[0].status = PDU_SESSION_STATUS_DONE; // rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(&ctxt, ue_context_p, 0); - rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p); + if(!NODE_IS_CU(RC.nrrrc[ctxt.module_id]->node_type)){ + rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p, NULL); + } + else{ + /*Generate a UE context modification request message towards the DU to instruct the DU + *for SRB2 and DRB configuration and get the updates on master cell group config from the DU*/ + MessageDef *message_p; + message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_MODIFICATION_REQ); + f1ap_ue_context_setup_t *req=&F1AP_UE_CONTEXT_MODIFICATION_REQ (message_p); + req->rnti = ue_context_p->ue_context.rnti; + req->mcc = RC.nrrrc[ctxt.module_id]->configuration.mcc[0]; + req->mnc = RC.nrrrc[ctxt.module_id]->configuration.mnc[0]; + req->mnc_digit_length = RC.nrrrc[ctxt.module_id]->configuration.mnc_digit_length[0]; + req->nr_cellid = RC.nrrrc[ctxt.module_id]->nr_cellid; + + /*Instruction towards the DU for SRB2 configuration*/ + req->srbs_to_be_setup = malloc(1*sizeof(f1ap_srb_to_be_setup_t)); + req->srbs_to_be_setup_length = 1; + f1ap_srb_to_be_setup_t *SRBs=req->srbs_to_be_setup; + SRBs[0].srb_id = 2; + SRBs[0].lcid = 2; + + /*Instruction towards the DU for DRB configuration and tunnel creation*/ + gtpv1u_gnb_create_tunnel_req_t create_tunnel_req; + memset(&create_tunnel_req, 0, sizeof(gtpv1u_gnb_create_tunnel_req_t)); + req->drbs_to_be_setup = malloc(1*sizeof(f1ap_drb_to_be_setup_t)); + req->drbs_to_be_setup_length = 1; + f1ap_drb_to_be_setup_t *DRBs=req->drbs_to_be_setup; + LOG_D(RRC, "Length of DRB list:%d \n", req->drbs_to_be_setup_length); + DRBs[0].drb_id = 1; + DRBs[0].rlc_mode = RLC_MODE_AM; + DRBs[0].up_ul_tnl[0].tl_address = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.my_addr); + DRBs[0].up_ul_tnl[0].port=RC.nrrrc[ctxt.module_id]->eth_params_s.my_portd; + DRBs[0].up_ul_tnl_length = 1; + DRBs[0].up_dl_tnl[0].tl_address = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.remote_addr); + DRBs[0].up_dl_tnl[0].port=RC.nrrrc[ctxt.module_id]->eth_params_s.remote_portd; + DRBs[0].up_dl_tnl_length = 1; + + itti_send_msg_to_task (TASK_CU_F1, ctxt.module_id, message_p); + } return(0); } } @@ -1088,17 +1128,17 @@ rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ( ue_context_p->ue_context.gNB_ue_ngap_id = gNB_ue_ngap_id; { int j; - boolean_t is_treated[NGAP_MAX_PDUSESSION] = {FALSE}; + bool is_treated[NGAP_MAX_PDUSESSION] = {false}; uint8_t nb_of_failed_pdusessions = 0; for (i = 0; i < nb_pdusessions_tomodify; i++) { - if (is_treated[i] == TRUE) { + if (is_treated[i] == true) { continue; } //Check if same PDU session ID to handle multiple pdu sessions for (j = i+1; j < nb_pdusessions_tomodify; j++) { - if (is_treated[j] == FALSE && + if (is_treated[j] == false && NGAP_PDUSESSION_MODIFY_REQ(msg_p).pdusession_modify_params[j].pdusession_id == NGAP_PDUSESSION_MODIFY_REQ(msg_p).pdusession_modify_params[i].pdusession_id) { // handle multiple pdu session id @@ -1109,12 +1149,12 @@ rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ( ue_context_p->ue_context.modify_pdusession[j].cause = NGAP_CAUSE_RADIO_NETWORK; ue_context_p->ue_context.modify_pdusession[j].cause_value = NGAP_CauseRadioNetwork_multiple_PDU_session_ID_instances; nb_of_failed_pdusessions++; - is_treated[i] = TRUE; - is_treated[j] = TRUE; + is_treated[i] = true; + is_treated[j] = true; } } // handle multiple pdu session id case - if (is_treated[i] == TRUE) { + if (is_treated[i] == true) { LOG_D(NR_RRC, "handle multiple pdu session id \n"); ue_context_p->ue_context.modify_pdusession[i].status = PDU_SESSION_STATUS_NEW; ue_context_p->ue_context.modify_pdusession[i].param.pdusession_id = @@ -1157,13 +1197,13 @@ rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ( ue_context_p->ue_context.modify_pdusession[i].param.gtp_teid = ue_context_p->ue_context.pduSession[j].param.gtp_teid; - is_treated[i] = TRUE; + is_treated[i] = true; break; } } // handle Unknown pdu session ID - if (is_treated[i] == FALSE) { + if (is_treated[i] == false) { LOG_D(NR_RRC, "handle Unknown pdu session ID \n"); ue_context_p->ue_context.modify_pdusession[i].status = PDU_SESSION_STATUS_NEW; ue_context_p->ue_context.modify_pdusession[i].param.pdusession_id = @@ -1171,7 +1211,7 @@ rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ( ue_context_p->ue_context.modify_pdusession[i].cause = NGAP_CAUSE_RADIO_NETWORK; ue_context_p->ue_context.modify_pdusession[i].cause_value = NGAP_CauseRadioNetwork_unknown_PDU_session_ID; nb_of_failed_pdusessions++; - is_treated[i] = TRUE; + is_treated[i] = true; } } diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c index b482637dfd4..b3eada8136a 100644 --- a/openair2/RRC/NR/rrc_gNB_nsa.c +++ b/openair2/RRC/NR/rrc_gNB_nsa.c @@ -106,6 +106,9 @@ void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc, NR_UE_CapabilityRAT_ContainerL } LOG_A(NR_RRC, "Successfully decoded UE NR capabilities (NR and MRDC)\n"); + ue_context_p->ue_context.spCellConfig = calloc(1, sizeof(struct NR_SpCellConfig)); + ue_context_p->ue_context.spCellConfig->spCellConfigDedicated = rrc->carrier.servingcellconfig; + LOG_I(NR_RRC,"Adding new NSA user (%p)\n",ue_context_p); rrc_add_nsa_user(rrc,ue_context_p, m); } @@ -241,6 +244,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_ cipher_algo, NR_SecurityConfig__keyToUse_secondary); } + NR_ServingCellConfig_t *scc = ue_context_p->ue_context.spCellConfig ? ue_context_p->ue_context.spCellConfig->spCellConfigDedicated : NULL; fill_default_reconfig(carrier->servingcellconfigcommon, @@ -250,6 +254,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_ ue_context_p->ue_context.UE_Capability_nr, configuration, ue_context_p->local_uid); + ue_context_p->ue_id_rnti = ue_context_p->ue_context.secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity; NR_CG_Config_t *CG_Config = calloc(1,sizeof(*CG_Config)); memset((void *)CG_Config,0,sizeof(*CG_Config)); @@ -344,7 +349,6 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_ // configure MAC and RLC if (NODE_IS_DU(rrc->node_type)) { rrc_mac_config_req_gNB(rrc->module_id, - rrc->configuration.ssb_SubcarrierOffset, rrc->configuration.pdsch_AntennaPorts, rrc->configuration.pusch_AntennaPorts, rrc->configuration.sib1_tda, @@ -357,7 +361,6 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_ ue_context_p->ue_context.secondaryCellGroup); } else { rrc_mac_config_req_gNB(rrc->module_id, - rrc->configuration.ssb_SubcarrierOffset, rrc->configuration.pdsch_AntennaPorts, rrc->configuration.pusch_AntennaPorts, rrc->configuration.sib1_tda, @@ -421,7 +424,8 @@ void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) { rrc_rlc_remove_ue(&ctxt); - mac_remove_nr_ue(rrc->module_id, rnti); + // WHAT A RACE CONDITION + mac_remove_nr_ue(RC.nrmac[rrc->module_id], rnti); gtpv1u_enb_delete_tunnel_req_t tmp={0}; tmp.rnti=rnti; tmp.from_gnb=1; diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index b56d622acdc..2ee3a26c4b0 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -47,8 +47,463 @@ #include "LAYER2/nr_rlc/nr_rlc_oai_api.h" #include "nr_rrc_config.h" -#define false 0 -#define true 1 +void fix_servingcellconfigdedicated(NR_ServingCellConfig_t *scd) { + + int b = 0; + while (b < scd->downlinkBWP_ToAddModList->list.count) { + if (scd->downlinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == 0) { + asn_sequence_del(&scd->downlinkBWP_ToAddModList->list, b, 1); + } else { + b++; + } + } + + if(scd->downlinkBWP_ToAddModList->list.count == 0) { + free(scd->downlinkBWP_ToAddModList); + scd->downlinkBWP_ToAddModList = NULL; + } + + b = 0; + while (b < scd->uplinkConfig->uplinkBWP_ToAddModList->list.count) { + if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == + 0) { + asn_sequence_del(&scd->uplinkConfig->uplinkBWP_ToAddModList->list, b, 1); + } else { + b++; + } + } + + if(scd->uplinkConfig->uplinkBWP_ToAddModList->list.count == 0) { + free(scd->uplinkConfig->uplinkBWP_ToAddModList); + scd->uplinkConfig->uplinkBWP_ToAddModList = NULL; + } + +} + +void fill_default_nsa_downlinkBWP(NR_BWP_Downlink_t *bwp, + long bwp_loop, + NR_CellGroupConfig_t *secondaryCellGroup, + NR_ServingCellConfig_t *servingcellconfigdedicated, + NR_ServingCellConfigCommon_t *servingcellconfigcommon, + const gNB_RrcConfigurationReq *configuration, + NR_UE_NR_Capability_t *uecap, + int dl_antenna_ports, + uint64_t bitmap) { + + /// BWP common configuration + + bwp->bwp_Common = calloc(1,sizeof(*bwp->bwp_Common)); + + if(servingcellconfigdedicated->downlinkBWP_ToAddModList && + bwp_loop < servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count) { + bwp->bwp_Id = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Id; + bwp->bwp_Common->genericParameters.locationAndBandwidth = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.locationAndBandwidth; + bwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.subcarrierSpacing; + bwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.cyclicPrefix; + } else { + bwp->bwp_Id=bwp_loop+1; + bwp->bwp_Common->genericParameters.locationAndBandwidth = PRBalloc_to_locationandbandwidth(servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0); + bwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing; + bwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters.cyclicPrefix; + } + + bwp->bwp_Common->pdcch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon)); + bwp->bwp_Common->pdcch_ConfigCommon->present = NR_SetupRelease_PDCCH_ConfigCommon_PR_setup; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup)); + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->controlResourceSetZero=NULL; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet)); + + int curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,275); + + NR_ControlResourceSet_t *coreset = calloc(1,sizeof(*coreset)); + rrc_coreset_config(coreset, bwp->bwp_Id, curr_bwp, bitmap); + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = coreset; + + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceZero=NULL; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=NULL; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList)); + + NR_SearchSpace_t *ss=calloc(1,sizeof(*ss)); + ss->searchSpaceId = (bwp->bwp_Id<<1)-1; // To uniquely identify each SearchSpace lets derive it from the BWPId + ss->controlResourceSetId=calloc(1,sizeof(*ss->controlResourceSetId)); + *ss->controlResourceSetId=coreset->controlResourceSetId; + ss->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*ss->monitoringSlotPeriodicityAndOffset)); + ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1; + ss->duration=NULL; + ss->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss->monitoringSymbolsWithinSlot)); + ss->monitoringSymbolsWithinSlot->buf = calloc(1,2); + // should be '1100 0000 0000 00'B (LSB first!), first two symols in slot, adjust if needed + ss->monitoringSymbolsWithinSlot->buf[1] = 0; + ss->monitoringSymbolsWithinSlot->buf[0] = (1<<7) | (1<<6); + ss->monitoringSymbolsWithinSlot->size = 2; + ss->monitoringSymbolsWithinSlot->bits_unused = 2; + ss->nrofCandidates = calloc(1,sizeof(*ss->nrofCandidates)); + ss->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0; + ss->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0; + ss->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1; + ss->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0; + ss->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0; + ss->searchSpaceType = calloc(1,sizeof(*ss->searchSpaceType)); + ss->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common; + ss->searchSpaceType->choice.common=calloc(1,sizeof(*ss->searchSpaceType->choice.common)); + ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0)); + ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list,ss); + + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=NULL; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation=NULL; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->pagingSearchSpace=NULL; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace)); + *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=ss->searchSpaceId; + bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ext1=NULL; + + bwp->bwp_Common->pdsch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon)); + bwp->bwp_Common->pdsch_ConfigCommon->present = NR_SetupRelease_PDSCH_ConfigCommon_PR_setup; + bwp->bwp_Common->pdsch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup)); + bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)); + + // Prepare PDSCH-TimeDomainResourceAllocation list + nr_rrc_config_dl_tda(servingcellconfigcommon, + bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList, + curr_bwp); + + /// BWP dedicated configuration + + if (!bwp->bwp_Dedicated) { + bwp->bwp_Dedicated=calloc(1,sizeof(*bwp->bwp_Dedicated)); + } + bwp->bwp_Dedicated->pdcch_Config=calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config)); + bwp->bwp_Dedicated->pdcch_Config->present = NR_SetupRelease_PDCCH_Config_PR_setup; + bwp->bwp_Dedicated->pdcch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup)); + bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList)); + + ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list, coreset); + + bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList)); + + NR_SearchSpace_t *ss2 = calloc(1,sizeof(*ss2)); + ss2->searchSpaceId=(bwp->bwp_Id<<1); // To uniquely identify each SearchSpace lets derive it from the BWPId + ss2->controlResourceSetId=calloc(1,sizeof(*ss2->controlResourceSetId)); + *ss2->controlResourceSetId=coreset->controlResourceSetId; + ss2->monitoringSlotPeriodicityAndOffset=calloc(1,sizeof(*ss2->monitoringSlotPeriodicityAndOffset)); + ss2->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1; + ss2->monitoringSlotPeriodicityAndOffset->choice.sl1=(NULL_t)0; + ss2->duration=NULL; + ss2->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss2->monitoringSymbolsWithinSlot)); + ss2->monitoringSymbolsWithinSlot->buf = calloc(1,2); + ss2->monitoringSymbolsWithinSlot->size = 2; + ss2->monitoringSymbolsWithinSlot->bits_unused = 2; + ss2->monitoringSymbolsWithinSlot->buf[0]=0xc0; + ss2->monitoringSymbolsWithinSlot->buf[1]=0x0; + ss2->nrofCandidates=calloc(1,sizeof(*ss2->nrofCandidates)); + ss2->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0; + ss2->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0; + if (curr_bwp < 48) { + ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1; + ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0; + } else if (curr_bwp < 96) { + ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n2; + ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n1; + } else { + ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n4; + ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n2; + } + ss2->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0; + ss2->searchSpaceType=calloc(1,sizeof(*ss2->searchSpaceType)); + ss2->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_ue_Specific; + ss2->searchSpaceType->choice.ue_Specific = calloc(1,sizeof(*ss2->searchSpaceType->choice.ue_Specific)); + ss2->searchSpaceType->choice.ue_Specific->dci_Formats=NR_SearchSpace__searchSpaceType__ue_Specific__dci_Formats_formats0_1_And_1_1; + ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list, ss2); + + bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToReleaseList = NULL; + + if (!bwp->bwp_Dedicated->pdsch_Config) { + bwp->bwp_Dedicated->pdsch_Config = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config)); + bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup; + bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup)); + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA)); + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present= NR_SetupRelease_DMRS_DownlinkConfig_PR_setup; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup)); + } + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL; + + if ((get_softmodem_params()->do_ra || get_softmodem_params()->phy_test) && dl_antenna_ports > 1) // for MIMO, we use DMRS Config Type 2 but only with OAI UE + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type)); + else + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID0=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID1=NULL; + if (!bwp->bwp_Dedicated->pdsch_Config) { + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS=NULL; + } + bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition)); + *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1; + + bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList)); + + int n_ssb = 0; + NR_TCI_State_t *tcid[64]; + for (int i=0;i<64;i++) { + if ((bitmap>>(63-i))&0x01){ + tcid[i]=calloc(1,sizeof(*tcid[i])); + tcid[i]->tci_StateId=n_ssb; + tcid[i]->qcl_Type1.cell=NULL; + tcid[i]->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid[i]->qcl_Type1.bwp_Id)); + *tcid[i]->qcl_Type1.bwp_Id=1; + tcid[i]->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb; + tcid[i]->qcl_Type1.referenceSignal.choice.ssb = i; + tcid[i]->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC; + ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid[i]); + n_ssb++; + } + } + + bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToReleaseList=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->vrb_ToPRB_Interleaver=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation=NR_PDSCH_Config__resourceAllocation_resourceAllocationType1; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_AggregationFactor=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToAddModList=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToReleaseList=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1; + set_dl_mcs_table(bwp->bwp_Common->genericParameters.subcarrierSpacing, + configuration->force_256qam_off ? NULL : uecap, + secondaryCellGroup->spCellConfig, + bwp->bwp_Dedicated, + servingcellconfigcommon); + bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI)); + *bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling)); + bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = + calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize)); + *bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToAddModList=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToReleaseList=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToAddModList=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToReleaseList=NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->p_ZP_CSI_RS_ResourceSet=NULL; + bwp->bwp_Dedicated->sps_Config = NULL; + bwp->bwp_Dedicated->radioLinkMonitoringConfig = NULL; + +#if 0 + bwp->bwp_Dedicated->radioLinkMonitoringConfig = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig)); + bwp->bwp_Dedicated->radioLinkMonitoringConfig->present = NR_SetupRelease_RadioLinkMonitoringConfig_PR_setup; + bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup)); + bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->failureDetectionResourcesToAddModList=NULL; + bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->failureDetectionResourcesToReleaseList=NULL; + bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount)); + *bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount = NR_RadioLinkMonitoringConfig__beamFailureInstanceMaxCount_n3; + bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer)); + *bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = NR_RadioLinkMonitoringConfig__beamFailureDetectionTimer_pbfd2; +#endif + +} + +void fill_default_nsa_uplinkBWP(NR_BWP_Uplink_t *ubwp, + long bwp_loop, + NR_ServingCellConfig_t *servingcellconfigdedicated, + NR_ServingCellConfigCommon_t *servingcellconfigcommon, + const gNB_RrcConfigurationReq *configuration, + int uid) { + + /// BWP common configuration + + ubwp->bwp_Common = calloc(1,sizeof(*ubwp->bwp_Common)); + + if(servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList && + bwp_loop < servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count) { + ubwp->bwp_Id = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Id; + ubwp->bwp_Common->genericParameters.locationAndBandwidth = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.locationAndBandwidth; + ubwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.subcarrierSpacing; + ubwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Common->genericParameters.cyclicPrefix; + } else { + ubwp->bwp_Id=bwp_loop+1; + ubwp->bwp_Common->genericParameters.locationAndBandwidth = PRBalloc_to_locationandbandwidth(servingcellconfigcommon->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0); + ubwp->bwp_Common->genericParameters.subcarrierSpacing = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing; + ubwp->bwp_Common->genericParameters.cyclicPrefix = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.cyclicPrefix; + } + + ubwp->bwp_Common->rach_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon; + ubwp->bwp_Common->pusch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon; + ubwp->bwp_Common->pucch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon; + + /// BWP dedicated configuration + + if (!ubwp->bwp_Dedicated) + ubwp->bwp_Dedicated = calloc(1,sizeof(*ubwp->bwp_Dedicated)); + + int curr_bwp = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth,275); + + ubwp->bwp_Dedicated->pucch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pucch_Config)); + ubwp->bwp_Dedicated->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup; + NR_PUCCH_Config_t *pucch_Config = calloc(1,sizeof(*pucch_Config)); + ubwp->bwp_Dedicated->pucch_Config->choice.setup=pucch_Config; + + pucch_Config->resourceSetToAddModList = calloc(1,sizeof(*pucch_Config->resourceSetToAddModList)); + pucch_Config->resourceSetToReleaseList = NULL; + pucch_Config->resourceToAddModList = calloc(1,sizeof(*pucch_Config->resourceToAddModList)); + pucch_Config->resourceToReleaseList = NULL; + config_pucch_resset0(pucch_Config, uid, curr_bwp, NULL); + config_pucch_resset1(pucch_Config, NULL); + set_pucch_power_config(pucch_Config, configuration->do_CSIRS); + + scheduling_request_config(servingcellconfigcommon, pucch_Config); + set_dl_DataToUL_ACK(pucch_Config, configuration->minRXTXTIME); + + ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config)); + ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup; + NR_PUSCH_Config_t *pusch_Config = NULL; + if(servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList && + bwp_loop < servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count) { + pusch_Config = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_loop]->bwp_Dedicated->pusch_Config->choice.setup; + } else { + pusch_Config = calloc(1,sizeof(*pusch_Config)); + } + ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config; + pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig)); + *pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook; + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL; + if (!pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB) { + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB)); + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup; + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup)); + } + NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup; + NR_DMRS_UplinkConfig->dmrs_Type = NULL; + NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition)); + *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0; + if (!servingcellconfigdedicated) { + NR_DMRS_UplinkConfig->phaseTrackingRS=NULL; + } + NR_DMRS_UplinkConfig->maxLength=NULL; + NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled)); + NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0 = NULL; + NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID1 = NULL; + NR_DMRS_UplinkConfig->transformPrecodingEnabled = NULL; + pusch_Config->pusch_PowerControl = calloc(1,sizeof(*pusch_Config->pusch_PowerControl)); + pusch_Config->pusch_PowerControl->tpc_Accumulation = NULL; + pusch_Config->pusch_PowerControl->msg3_Alpha = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->msg3_Alpha)); + *pusch_Config->pusch_PowerControl->msg3_Alpha = NR_Alpha_alpha1; + pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = NULL; + pusch_Config->pusch_PowerControl->p0_AlphaSets = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_AlphaSets)); + NR_P0_PUSCH_AlphaSet_t *aset = calloc(1,sizeof(*aset)); + aset->p0_PUSCH_AlphaSetId=0; + aset->p0=calloc(1,sizeof(*aset->p0)); + *aset->p0 = 0; + aset->alpha=calloc(1,sizeof(*aset->alpha)); + *aset->alpha=NR_Alpha_alpha1; + ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->p0_AlphaSets->list,aset); + pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = NULL; + pusch_Config->pusch_PowerControl->pathlossReferenceRSToReleaseList = NULL; + pusch_Config->pusch_PowerControl->twoPUSCH_PC_AdjustmentStates = NULL; + pusch_Config->pusch_PowerControl->deltaMCS = NULL; + pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList = NULL; + pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToReleaseList = NULL; + pusch_Config->frequencyHopping=NULL; + pusch_Config->frequencyHoppingOffsetLists=NULL; + pusch_Config->resourceAllocation = NR_PUSCH_Config__resourceAllocation_resourceAllocationType1; + pusch_Config->pusch_TimeDomainAllocationList = NULL; + pusch_Config->pusch_AggregationFactor=NULL; + pusch_Config->mcs_Table=NULL; + pusch_Config->transformPrecoder= NULL; + pusch_Config->mcs_TableTransformPrecoder=NULL; + /* if msg3_transformprecoding is set in conf file - pusch config should not disable it */ + if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) { + pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder)); + *pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled; + } + pusch_Config->codebookSubset=calloc(1,sizeof(*pusch_Config->codebookSubset)); + *pusch_Config->codebookSubset = NR_PUSCH_Config__codebookSubset_nonCoherent; + pusch_Config->maxRank=calloc(1,sizeof(*pusch_Config->maxRank)); + *pusch_Config->maxRank= 1; + pusch_Config->rbg_Size=NULL; + pusch_Config->uci_OnPUSCH=NULL; + pusch_Config->tp_pi2BPSK=NULL; + + ubwp->bwp_Dedicated->srs_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->srs_Config)); + ubwp->bwp_Dedicated->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup; + NR_SRS_Config_t *srs_Config = calloc(1,sizeof(*srs_Config)); + ubwp->bwp_Dedicated->srs_Config->choice.setup = srs_Config; + srs_Config->srs_ResourceSetToReleaseList=NULL; + srs_Config->srs_ResourceSetToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceSetToAddModList)); + NR_SRS_ResourceSet_t *srs_resset0=calloc(1,sizeof(*srs_resset0)); + srs_resset0->srs_ResourceSetId = 0; + srs_resset0->srs_ResourceIdList=calloc(1,sizeof(*srs_resset0->srs_ResourceIdList)); + NR_SRS_ResourceId_t *srs_resset0_id=calloc(1,sizeof(*srs_resset0_id)); + *srs_resset0_id=0; + ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list,srs_resset0_id); + srs_Config->srs_ResourceToReleaseList=NULL; + + if(configuration->do_SRS) { + srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_periodic; + srs_resset0->resourceType.choice.periodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.periodic)); + srs_resset0->resourceType.choice.periodic->associatedCSI_RS = NULL; + } else { + srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_aperiodic; + srs_resset0->resourceType.choice.aperiodic = calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic)); + srs_resset0->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger=1; + srs_resset0->resourceType.choice.aperiodic->csi_RS=NULL; + srs_resset0->resourceType.choice.aperiodic->slotOffset= calloc(1,sizeof(*srs_resset0->resourceType.choice.aperiodic->slotOffset)); + *srs_resset0->resourceType.choice.aperiodic->slotOffset=2; + srs_resset0->resourceType.choice.aperiodic->ext1=NULL; + } + + srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook; + srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha)); + *srs_resset0->alpha = NR_Alpha_alpha1; + srs_resset0->p0=calloc(1,sizeof(*srs_resset0->p0)); + *srs_resset0->p0=-80; + srs_resset0->pathlossReferenceRS=NULL; + srs_resset0->srs_PowerControlAdjustmentStates=NULL; + ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceSetToAddModList->list,srs_resset0); + srs_Config->srs_ResourceToReleaseList=NULL; + srs_Config->srs_ResourceToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceToAddModList)); + NR_SRS_Resource_t *srs_res0=calloc(1,sizeof(*srs_res0)); + srs_res0->srs_ResourceId=0; + srs_res0->nrofSRS_Ports=NR_SRS_Resource__nrofSRS_Ports_port1; + srs_res0->ptrs_PortIndex=NULL; + srs_res0->transmissionComb.present=NR_SRS_Resource__transmissionComb_PR_n2; + srs_res0->transmissionComb.choice.n2=calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2)); + srs_res0->transmissionComb.choice.n2->combOffset_n2=0; + srs_res0->transmissionComb.choice.n2->cyclicShift_n2=0; + srs_res0->resourceMapping.startPosition = 2 + uid%2; + srs_res0->resourceMapping.nrofSymbols=NR_SRS_Resource__resourceMapping__nrofSymbols_n1; + srs_res0->resourceMapping.repetitionFactor=NR_SRS_Resource__resourceMapping__repetitionFactor_n1; + srs_res0->freqDomainPosition=0; + srs_res0->freqDomainShift=0; + srs_res0->freqHopping.b_SRS=0; + srs_res0->freqHopping.b_hop=0; + srs_res0->freqHopping.c_SRS = rrc_get_max_nr_csrs( + NRRIV2BW(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275), + srs_res0->freqHopping.b_SRS); + srs_res0->groupOrSequenceHopping=NR_SRS_Resource__groupOrSequenceHopping_neither; + + if(configuration->do_SRS) { + srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_periodic; + srs_res0->resourceType.choice.periodic=calloc(1,sizeof(*srs_res0->resourceType.choice.periodic)); + srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.present = NR_SRS_PeriodicityAndOffset_PR_sl160; + srs_res0->resourceType.choice.periodic->periodicityAndOffset_p.choice.sl160 = 17 + (uid>1)*10; // 17/17/.../147/157 are mixed slots + } else { + srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_aperiodic; + srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic)); + } + + srs_res0->sequenceId=40; + srs_res0->spatialRelationInfo=calloc(1,sizeof(*srs_res0->spatialRelationInfo)); + srs_res0->spatialRelationInfo->servingCellId=NULL; + srs_res0->spatialRelationInfo->referenceSignal.present=NR_SRS_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index; + srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index=0; + ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0); + + ubwp->bwp_Dedicated->configuredGrantConfig = NULL; + ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL; + +} void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon, NR_ServingCellConfig_t *servingcellconfigdedicated, @@ -57,8 +512,8 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco int scg_id, int servCellIndex, const gNB_RrcConfigurationReq *configuration, - int uid) -{ + int uid) { + const rrc_pdsch_AntennaPorts_t* pdschap = &configuration->pdsch_AntennaPorts; const int dl_antenna_ports = pdschap->N1 * pdschap->N2 * pdschap->XP; const int do_csirs = configuration->do_CSIRS; @@ -74,22 +529,8 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco // where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations. AssertFatal(uid>=0 && uid<30, "gNB cannot allocate the SRS resources\n"); - uint64_t bitmap=0; - switch (servingcellconfigcommon->ssb_PositionsInBurst->present) { - case 1 : - bitmap = ((uint64_t) servingcellconfigcommon->ssb_PositionsInBurst->choice.shortBitmap.buf[0])<<56; - break; - case 2 : - bitmap = ((uint64_t) servingcellconfigcommon->ssb_PositionsInBurst->choice.mediumBitmap.buf[0])<<56; - break; - case 3 : - for (int i=0; i<8; i++) { - bitmap |= (((uint64_t) servingcellconfigcommon->ssb_PositionsInBurst->choice.longBitmap.buf[i])<<((7-i)*8)); - } - break; - default: - AssertFatal(1==0,"SSB bitmap size value %d undefined (allowed values 1,2,3) \n", servingcellconfigcommon->ssb_PositionsInBurst->present); - } + uint64_t bitmap = get_ssb_bitmap(servingcellconfigcommon); + fix_servingcellconfigdedicated(servingcellconfigdedicated); memset(secondaryCellGroup,0,sizeof(NR_CellGroupConfig_t)); secondaryCellGroup->cellGroupId = scg_id; @@ -102,40 +543,33 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco secondaryCellGroup->rlc_BearerToAddModList = calloc(1,sizeof(*secondaryCellGroup->rlc_BearerToAddModList)); ASN_SEQUENCE_ADD(&secondaryCellGroup->rlc_BearerToAddModList->list, RLC_BearerConfig); - secondaryCellGroup->mac_CellGroupConfig=calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig)); - secondaryCellGroup->mac_CellGroupConfig->drx_Config = NULL; - secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig)); - secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList)); - NR_SchedulingRequestToAddMod_t *SchedulingRequestConf = calloc(1,sizeof(*SchedulingRequestConf)); - SchedulingRequestConf->schedulingRequestId = 0; //Could be changed - SchedulingRequestConf->sr_ProhibitTimer = calloc(1,sizeof(*SchedulingRequestConf->sr_ProhibitTimer)); - *SchedulingRequestConf->sr_ProhibitTimer = NR_SchedulingRequestToAddMod__sr_ProhibitTimer_ms16; - SchedulingRequestConf->sr_TransMax = NR_SchedulingRequestToAddMod__sr_TransMax_n32; - ASN_SEQUENCE_ADD(&secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list,SchedulingRequestConf); - secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToReleaseList = NULL; - - secondaryCellGroup->mac_CellGroupConfig->bsr_Config=calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->bsr_Config)); - secondaryCellGroup->mac_CellGroupConfig->bsr_Config->periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_sf10; - secondaryCellGroup->mac_CellGroupConfig->bsr_Config->retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf160; - secondaryCellGroup->mac_CellGroupConfig->tag_Config=calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->tag_Config)); - secondaryCellGroup->mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL; - secondaryCellGroup->mac_CellGroupConfig->tag_Config->tag_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->tag_Config->tag_ToAddModList)); + NR_MAC_CellGroupConfig_t *mac_CellGroupConfig = secondaryCellGroup->mac_CellGroupConfig; + + mac_CellGroupConfig=calloc(1,sizeof(*mac_CellGroupConfig)); + mac_CellGroupConfig->drx_Config = NULL; + + mac_CellGroupConfig->bsr_Config=calloc(1,sizeof(*mac_CellGroupConfig->bsr_Config)); + mac_CellGroupConfig->bsr_Config->periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_sf10; + mac_CellGroupConfig->bsr_Config->retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf160; + mac_CellGroupConfig->tag_Config=calloc(1,sizeof(*mac_CellGroupConfig->tag_Config)); + mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL; + mac_CellGroupConfig->tag_Config->tag_ToAddModList = calloc(1,sizeof(*mac_CellGroupConfig->tag_Config->tag_ToAddModList)); struct NR_TAG *tag=calloc(1,sizeof(*tag)); tag->tag_Id = 0; tag->timeAlignmentTimer = NR_TimeAlignmentTimer_infinity; - ASN_SEQUENCE_ADD(&secondaryCellGroup->mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag); - secondaryCellGroup->mac_CellGroupConfig->phr_Config = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->phr_Config)); - secondaryCellGroup->mac_CellGroupConfig->phr_Config->present = NR_SetupRelease_PHR_Config_PR_setup; - secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup = calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup)); - secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_PeriodicTimer = NR_PHR_Config__phr_PeriodicTimer_sf20; - secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_ProhibitTimer = NR_PHR_Config__phr_ProhibitTimer_sf0; - secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_Tx_PowerFactorChange = NR_PHR_Config__phr_Tx_PowerFactorChange_dB3; - secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->multiplePHR=false; - secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->dummy=false; - secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_Type2OtherCell = false; - secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_ModeOtherCG = NR_PHR_Config__phr_ModeOtherCG_real; - secondaryCellGroup->mac_CellGroupConfig->skipUplinkTxDynamic=false; - secondaryCellGroup->mac_CellGroupConfig->ext1 = NULL; + ASN_SEQUENCE_ADD(&mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag); + mac_CellGroupConfig->phr_Config = calloc(1,sizeof(*mac_CellGroupConfig->phr_Config)); + mac_CellGroupConfig->phr_Config->present = NR_SetupRelease_PHR_Config_PR_setup; + mac_CellGroupConfig->phr_Config->choice.setup = calloc(1,sizeof(*mac_CellGroupConfig->phr_Config->choice.setup)); + mac_CellGroupConfig->phr_Config->choice.setup->phr_PeriodicTimer = NR_PHR_Config__phr_PeriodicTimer_sf20; + mac_CellGroupConfig->phr_Config->choice.setup->phr_ProhibitTimer = NR_PHR_Config__phr_ProhibitTimer_sf0; + mac_CellGroupConfig->phr_Config->choice.setup->phr_Tx_PowerFactorChange = NR_PHR_Config__phr_Tx_PowerFactorChange_dB3; + mac_CellGroupConfig->phr_Config->choice.setup->multiplePHR=false; + mac_CellGroupConfig->phr_Config->choice.setup->dummy=false; + mac_CellGroupConfig->phr_Config->choice.setup->phr_Type2OtherCell = false; + mac_CellGroupConfig->phr_Config->choice.setup->phr_ModeOtherCG = NR_PHR_Config__phr_ModeOtherCG_real; + mac_CellGroupConfig->skipUplinkTxDynamic=false; + mac_CellGroupConfig->ext1 = NULL; secondaryCellGroup->physicalCellGroupConfig = calloc(1,sizeof(*secondaryCellGroup->physicalCellGroupConfig)); secondaryCellGroup->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH=NULL; secondaryCellGroup->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUSCH=NULL; @@ -198,12 +632,12 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1 = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1)); secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1->t311 = NR_RLF_TimersAndConstants__ext1__t311_ms30000; secondaryCellGroup->spCellConfig->rlmInSyncOutOfSyncThreshold = NULL; - if (servingcellconfigdedicated) { - secondaryCellGroup->spCellConfig->spCellConfigDedicated = servingcellconfigdedicated; - } else { - secondaryCellGroup->spCellConfig->spCellConfigDedicated = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated)); - } + + secondaryCellGroup->spCellConfig->spCellConfigDedicated = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated)); secondaryCellGroup->spCellConfig->spCellConfigDedicated->tdd_UL_DL_ConfigurationDedicated = NULL; + + /// initialDownlinkBWP + secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)); secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdcch_Config=NULL; secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config)); @@ -225,7 +659,6 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition)); *secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList)); int n_ssb = 0; @@ -245,7 +678,6 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco } } - #if 0 NR_TCI_State_t*tci0=calloc(1,sizeof(*tci0)); @@ -371,406 +803,129 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco *secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = NR_RadioLinkMonitoringConfig__beamFailureDetectionTimer_pbfd2; #endif - secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToReleaseList= NULL; - - NR_BWP_Downlink_t *bwp = NULL; - if (servingcellconfigdedicated) { - bwp=servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[0]; - } else { - secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList)); - - bwp=calloc(1,sizeof(*bwp)); - } - bwp->bwp_Id=1; - bwp->bwp_Common=calloc(1,sizeof(*bwp->bwp_Common)); - // copy common BWP size from initial BWP except for bandwdith - memcpy((void*)&bwp->bwp_Common->genericParameters, - &servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters, - sizeof(bwp->bwp_Common->genericParameters)); - bwp->bwp_Common->genericParameters.locationAndBandwidth=PRBalloc_to_locationandbandwidth(servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0); - - - bwp->bwp_Common->pdcch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon)); - bwp->bwp_Common->pdcch_ConfigCommon->present = NR_SetupRelease_PDCCH_ConfigCommon_PR_setup; - bwp->bwp_Common->pdcch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup)); - bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->controlResourceSetZero=NULL; - bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet)); - - int curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,275); - - NR_ControlResourceSet_t *coreset = calloc(1,sizeof(*coreset)); - coreset->controlResourceSetId=1; - // frequency domain resources depends on BWP size - // options are 24, 48 or 96 - coreset->frequencyDomainResources.buf = calloc(1,6); - if (curr_bwp < 48) - coreset->frequencyDomainResources.buf[0] = 0xf0; - else - coreset->frequencyDomainResources.buf[0] = 0xff; - if (curr_bwp < 96) - coreset->frequencyDomainResources.buf[1] = 0; - else - coreset->frequencyDomainResources.buf[1] = 0xff; - coreset->frequencyDomainResources.buf[2] = 0; - coreset->frequencyDomainResources.buf[3] = 0; - coreset->frequencyDomainResources.buf[4] = 0; - coreset->frequencyDomainResources.buf[5] = 0; - coreset->frequencyDomainResources.size = 6; - coreset->frequencyDomainResources.bits_unused = 3; - coreset->duration=1; - coreset->cce_REG_MappingType.present = NR_ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved; - coreset->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle; - - coreset->tci_StatesPDCCH_ToAddList=calloc(1,sizeof(*coreset->tci_StatesPDCCH_ToAddList)); - NR_TCI_StateId_t *tci[64]; - for (int i=0;i<64;i++) { - if ((bitmap>>(63-i))&0x01){ - tci[i]=calloc(1,sizeof(*tci[i])); - *tci[i] = i; - ASN_SEQUENCE_ADD(&coreset->tci_StatesPDCCH_ToAddList->list,tci[i]); - } - } - coreset->tci_StatesPDCCH_ToReleaseList = NULL; - coreset->tci_PresentInDCI = NULL; - coreset->pdcch_DMRS_ScramblingID = NULL; - - bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = coreset; - - bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceZero=NULL; - bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=NULL; - bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList)); - - NR_SearchSpace_t *ss=calloc(1,sizeof(*ss)); - ss->searchSpaceId = 1; - ss->controlResourceSetId=calloc(1,sizeof(*ss->controlResourceSetId)); - *ss->controlResourceSetId=1; - ss->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*ss->monitoringSlotPeriodicityAndOffset)); - ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1; - ss->duration=NULL; - ss->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss->monitoringSymbolsWithinSlot)); - ss->monitoringSymbolsWithinSlot->buf = calloc(1,2); - // should be '1100 0000 0000 00'B (LSB first!), first two symols in slot, adjust if needed - ss->monitoringSymbolsWithinSlot->buf[1] = 0; - ss->monitoringSymbolsWithinSlot->buf[0] = (1<<7) | (1<<6); - ss->monitoringSymbolsWithinSlot->size = 2; - ss->monitoringSymbolsWithinSlot->bits_unused = 2; - ss->nrofCandidates = calloc(1,sizeof(*ss->nrofCandidates)); - ss->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0; - ss->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0; - ss->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1; - ss->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0; - ss->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0; - ss->searchSpaceType = calloc(1,sizeof(*ss->searchSpaceType)); - ss->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common; - ss->searchSpaceType->choice.common=calloc(1,sizeof(*ss->searchSpaceType->choice.common)); - ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0)); - - ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list,ss); - - bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=NULL; - if(get_softmodem_params()->sa) { - bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1)); - *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=0; - } - bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation=NULL; - bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->pagingSearchSpace=NULL; - bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace)); - *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=1; - bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ext1=NULL; - - bwp->bwp_Common->pdsch_ConfigCommon=calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon)); - bwp->bwp_Common->pdsch_ConfigCommon->present = NR_SetupRelease_PDSCH_ConfigCommon_PR_setup; - bwp->bwp_Common->pdsch_ConfigCommon->choice.setup = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup)); - bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList = calloc(1,sizeof(*bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)); - - // copy PDSCH TimeDomainResourceAllocation from InitialBWP - - NR_PDSCH_TimeDomainResourceAllocation_t *pdschi; - for (int i=0;i<servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count;i++) { - pdschi= calloc(1,sizeof(*pdschi)); - if(servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->k0){ - pdschi->k0 = calloc(1,sizeof(*pdschi->k0)); - *pdschi->k0 = *servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->k0; - } - pdschi->mappingType = servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->mappingType; - pdschi->startSymbolAndLength = servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength; - ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list,pdschi); - } - - if (!servingcellconfigdedicated) { - bwp->bwp_Dedicated=calloc(1,sizeof(*bwp->bwp_Dedicated)); - } - bwp->bwp_Dedicated->pdcch_Config=calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config)); - bwp->bwp_Dedicated->pdcch_Config->present = NR_SetupRelease_PDCCH_Config_PR_setup; - bwp->bwp_Dedicated->pdcch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup)); - bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList)); - - ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list, - coreset); - - bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList)); - - NR_SearchSpace_t *ss2 = calloc(1,sizeof(*ss2)); - - ss2->searchSpaceId=2; - ss2->controlResourceSetId=calloc(1,sizeof(*ss2->controlResourceSetId)); - *ss2->controlResourceSetId=1; - ss2->monitoringSlotPeriodicityAndOffset=calloc(1,sizeof(*ss2->monitoringSlotPeriodicityAndOffset)); - ss2->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1; - ss2->monitoringSlotPeriodicityAndOffset->choice.sl1=(NULL_t)0; - ss2->duration=NULL; - ss2->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss2->monitoringSymbolsWithinSlot)); - ss2->monitoringSymbolsWithinSlot->buf = calloc(1,2); - ss2->monitoringSymbolsWithinSlot->size = 2; - ss2->monitoringSymbolsWithinSlot->bits_unused = 2; - ss2->monitoringSymbolsWithinSlot->buf[0]=0xc0; - ss2->monitoringSymbolsWithinSlot->buf[1]=0x0; - ss2->nrofCandidates=calloc(1,sizeof(*ss2->nrofCandidates)); - ss2->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0; - ss2->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0; - if (curr_bwp < 48) - ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1; - else if (curr_bwp < 96) - ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n2; - else - ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n4; - ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0; - ss2->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0; - ss2->searchSpaceType=calloc(1,sizeof(*ss2->searchSpaceType)); - ss2->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_ue_Specific; - ss2->searchSpaceType->choice.ue_Specific = calloc(1,sizeof(*ss2->searchSpaceType->choice.ue_Specific)); - ss2->searchSpaceType->choice.ue_Specific->dci_Formats=NR_SearchSpace__searchSpaceType__ue_Specific__dci_Formats_formats0_1_And_1_1; - - ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list, - ss2); - - - bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToReleaseList = NULL; - - if (!servingcellconfigdedicated) { - bwp->bwp_Dedicated->pdsch_Config = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config)); - - bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup; - bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup)); - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA)); - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present= NR_SetupRelease_DMRS_DownlinkConfig_PR_setup; - - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup)); - } - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL; - - if ((get_softmodem_params()->do_ra || - get_softmodem_params()->phy_test) && - dl_antenna_ports > 1) // for MIMO, we use DMRS Config Type 2 but only with OAI UE - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type)); - else - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID0=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID1=NULL; - if (!servingcellconfigdedicated) { - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS=NULL; - } - bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition)); - *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos1; + /// initialUplinkBWP - bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList)); - - n_ssb = 0; - NR_TCI_State_t *tcid[64]; - for (int i=0;i<64;i++) { - if ((bitmap>>(63-i))&0x01){ - tcid[i]=calloc(1,sizeof(*tcid[i])); - tcid[i]->tci_StateId=n_ssb; - tcid[i]->qcl_Type1.cell=NULL; - tcid[i]->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid[i]->qcl_Type1.bwp_Id)); - *tcid[i]->qcl_Type1.bwp_Id=1; - tcid[i]->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb; - tcid[i]->qcl_Type1.referenceSignal.choice.ssb = i; - tcid[i]->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC; - ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid[i]); - n_ssb++; - } - } - - - bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToReleaseList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->vrb_ToPRB_Interleaver=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation=NR_PDSCH_Config__resourceAllocation_resourceAllocationType1; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_AggregationFactor=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToAddModList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToReleaseList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1; - set_dl_mcs_table(bwp->bwp_Common->genericParameters.subcarrierSpacing, - configuration->force_256qam_off ? NULL : uecap, - secondaryCellGroup->spCellConfig,bwp->bwp_Dedicated, - servingcellconfigcommon); - bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI)); - *bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling)); - bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = - calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize)); - *bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToAddModList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToReleaseList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToAddModList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToReleaseList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->p_ZP_CSI_RS_ResourceSet=NULL; - bwp->bwp_Dedicated->sps_Config = NULL; //calloc(1,sizeof(struct NR_SetupRelease_SPS_Config)); - - bwp->bwp_Dedicated->radioLinkMonitoringConfig = NULL; -#if 0 - bwp->bwp_Dedicated->radioLinkMonitoringConfig = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig)); - bwp->bwp_Dedicated->radioLinkMonitoringConfig->present = NR_SetupRelease_RadioLinkMonitoringConfig_PR_setup; + if (!secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig) { + secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig)); + } - bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup)); - bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->failureDetectionResourcesToAddModList=NULL; - bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->failureDetectionResourcesToReleaseList=NULL; - bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount)); - *bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount = NR_RadioLinkMonitoringConfig__beamFailureInstanceMaxCount_n3; - bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = calloc(1,sizeof(*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer)); - *bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = NR_RadioLinkMonitoringConfig__beamFailureDetectionTimer_pbfd2; -#endif - - if (!servingcellconfigdedicated) { - ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp); - } - secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id)); - - *secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id=1; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->bwp_InactivityTimer = NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id)); - *secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = 1; - - if (!servingcellconfigdedicated) { - secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig)); - } + NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP)); + secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP; + initialUplinkBWP->pucch_Config = NULL; + initialUplinkBWP->pusch_Config = calloc(1,sizeof(*initialUplinkBWP->pusch_Config)); + initialUplinkBWP->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup; - NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP)); - secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP; - initialUplinkBWP->pucch_Config = NULL; - initialUplinkBWP->pusch_Config = calloc(1,sizeof(*initialUplinkBWP->pusch_Config)); - initialUplinkBWP->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup; - NR_PUSCH_Config_t *pusch_Config = NULL; - if (servingcellconfigdedicated) { - pusch_Config = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup; - } else { - pusch_Config = calloc(1,sizeof(*pusch_Config)); - } - initialUplinkBWP->pusch_Config->choice.setup = pusch_Config; - pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig)); - *pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook; - pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL; - if (!servingcellconfigdedicated) { - pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB)); - pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup; - pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup)); - } - NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup; - NR_DMRS_UplinkConfig->dmrs_Type = NULL; - NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition)); - *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0; - if (!servingcellconfigdedicated) { - NR_DMRS_UplinkConfig->phaseTrackingRS=NULL; - } - NR_DMRS_UplinkConfig->maxLength=NULL; - NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled)); - NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0 = NULL; - NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID1 = NULL; - NR_DMRS_UplinkConfig->transformPrecodingEnabled = NULL; - pusch_Config->pusch_PowerControl = calloc(1,sizeof(*pusch_Config->pusch_PowerControl)); - pusch_Config->pusch_PowerControl->tpc_Accumulation = NULL; - pusch_Config->pusch_PowerControl->msg3_Alpha = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->msg3_Alpha)); - *pusch_Config->pusch_PowerControl->msg3_Alpha = NR_Alpha_alpha1; - pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = NULL; - pusch_Config->pusch_PowerControl->p0_AlphaSets = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_AlphaSets)); - NR_P0_PUSCH_AlphaSet_t *aset = calloc(1,sizeof(*aset)); - aset->p0_PUSCH_AlphaSetId=0; - aset->p0=calloc(1,sizeof(*aset->p0)); - *aset->p0 = 0; - aset->alpha=calloc(1,sizeof(*aset->alpha)); - *aset->alpha=NR_Alpha_alpha1; - ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->p0_AlphaSets->list,aset); - pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = NULL; - pusch_Config->pusch_PowerControl->pathlossReferenceRSToReleaseList = NULL; - pusch_Config->pusch_PowerControl->twoPUSCH_PC_AdjustmentStates = NULL; - pusch_Config->pusch_PowerControl->deltaMCS = NULL; - pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList = NULL; - pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToReleaseList = NULL; - pusch_Config->frequencyHopping=NULL; - pusch_Config->frequencyHoppingOffsetLists=NULL; - pusch_Config->resourceAllocation = NR_PUSCH_Config__resourceAllocation_resourceAllocationType1; - pusch_Config->pusch_TimeDomainAllocationList = NULL; - pusch_Config->pusch_AggregationFactor=NULL; - pusch_Config->mcs_Table=NULL; - pusch_Config->transformPrecoder= NULL; - pusch_Config->mcs_TableTransformPrecoder=NULL; - /* if msg3_transformprecoding is set in conf file - pusch config should not disable it */ - if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) { + NR_PUSCH_Config_t *pusch_Config = NULL; + if (servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList) { + pusch_Config = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup; + } else { + pusch_Config = calloc(1,sizeof(*pusch_Config)); + } + initialUplinkBWP->pusch_Config->choice.setup = pusch_Config; + pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig)); + *pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook; + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL; + if (!pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB) { + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB)); + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup; + pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup)); + } + NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup; + NR_DMRS_UplinkConfig->dmrs_Type = NULL; + NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition)); + *NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0; + if (!servingcellconfigdedicated) { + NR_DMRS_UplinkConfig->phaseTrackingRS=NULL; + } + NR_DMRS_UplinkConfig->maxLength=NULL; + NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled)); + NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0 = NULL; + NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID1 = NULL; + NR_DMRS_UplinkConfig->transformPrecodingEnabled = NULL; + pusch_Config->pusch_PowerControl = calloc(1,sizeof(*pusch_Config->pusch_PowerControl)); + pusch_Config->pusch_PowerControl->tpc_Accumulation = NULL; + pusch_Config->pusch_PowerControl->msg3_Alpha = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->msg3_Alpha)); + *pusch_Config->pusch_PowerControl->msg3_Alpha = NR_Alpha_alpha1; + pusch_Config->pusch_PowerControl->p0_NominalWithoutGrant = NULL; + pusch_Config->pusch_PowerControl->p0_AlphaSets = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->p0_AlphaSets)); + NR_P0_PUSCH_AlphaSet_t *aset = calloc(1,sizeof(*aset)); + aset->p0_PUSCH_AlphaSetId=0; + aset->p0=calloc(1,sizeof(*aset->p0)); + *aset->p0 = 0; + aset->alpha=calloc(1,sizeof(*aset->alpha)); + *aset->alpha=NR_Alpha_alpha1; + ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->p0_AlphaSets->list,aset); + pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = NULL; + pusch_Config->pusch_PowerControl->pathlossReferenceRSToReleaseList = NULL; + pusch_Config->pusch_PowerControl->twoPUSCH_PC_AdjustmentStates = NULL; + pusch_Config->pusch_PowerControl->deltaMCS = NULL; + pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToAddModList = NULL; + pusch_Config->pusch_PowerControl->sri_PUSCH_MappingToReleaseList = NULL; + pusch_Config->frequencyHopping=NULL; + pusch_Config->frequencyHoppingOffsetLists=NULL; + pusch_Config->resourceAllocation = NR_PUSCH_Config__resourceAllocation_resourceAllocationType1; + pusch_Config->pusch_TimeDomainAllocationList = NULL; + pusch_Config->pusch_AggregationFactor=NULL; + pusch_Config->mcs_Table=NULL; + pusch_Config->transformPrecoder= NULL; + pusch_Config->mcs_TableTransformPrecoder=NULL; + /* if msg3_transformprecoding is set in conf file - pusch config should not disable it */ + if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) { pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder)); *pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled; - } - pusch_Config->codebookSubset=calloc(1,sizeof(*pusch_Config->codebookSubset)); - *pusch_Config->codebookSubset = NR_PUSCH_Config__codebookSubset_nonCoherent; - pusch_Config->maxRank=calloc(1,sizeof(*pusch_Config->maxRank)); - *pusch_Config->maxRank= 1; - pusch_Config->rbg_Size=NULL; - pusch_Config->uci_OnPUSCH=NULL; - pusch_Config->tp_pi2BPSK=NULL; + } + pusch_Config->codebookSubset=calloc(1,sizeof(*pusch_Config->codebookSubset)); + *pusch_Config->codebookSubset = NR_PUSCH_Config__codebookSubset_nonCoherent; + pusch_Config->maxRank=calloc(1,sizeof(*pusch_Config->maxRank)); + *pusch_Config->maxRank= configuration->pusch_AntennaPorts; + pusch_Config->rbg_Size=NULL; + pusch_Config->uci_OnPUSCH=NULL; + pusch_Config->tp_pi2BPSK=NULL; - /*------------------------------TRANSFORM PRECODING- -----------------------------------------------------------------------*/ + /*------------------------------TRANSFORM PRECODING- -----------------------------------------------------------------------*/ - uint8_t transform_precoding = NR_PUSCH_Config__transformPrecoder_disabled; + uint8_t transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled; - // TBD: configure this from .conf file, Dedicated params cannot yet be configured in .conf file. - // Enable this to test transform precoding enabled from dedicated config. - /*if (pusch_Config->transformPrecoder == NULL) - pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder)); + // TBD: configure this from .conf file, Dedicated params cannot yet be configured in .conf file. + // Enable this to test transform precoding enabled from dedicated config. + /*if (pusch_Config->transformPrecoder == NULL) + pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder)); - *pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_enabled; */ + *pusch_Config->transformPrecoder = NR_PUSCH_Config__transformPrecoder_enabled; */ // END ------- - if (pusch_Config->transformPrecoder == NULL) { - if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder != NULL) - transform_precoding = NR_PUSCH_Config__transformPrecoder_enabled; - } - else - transform_precoding = *pusch_Config->transformPrecoder; + if (pusch_Config->transformPrecoder == NULL) { + if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder != NULL) + transformPrecoder = NR_PUSCH_Config__transformPrecoder_enabled; + } + else + transformPrecoder = *pusch_Config->transformPrecoder; - if (transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled ) { + if (transformPrecoder == NR_PUSCH_Config__transformPrecoder_enabled ) { /* Enable DMRS uplink config for transform precoding enabled */ NR_DMRS_UplinkConfig->transformPrecodingEnabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingEnabled)); NR_DMRS_UplinkConfig->transformPrecodingEnabled->nPUSCH_Identity = NULL; NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceGroupHopping = NULL; NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceHopping = NULL; NR_DMRS_UplinkConfig->transformPrecodingEnabled->ext1 = NULL; - LOG_I(RRC,"TRANSFORM PRECODING ENABLED......\n"); - } - /*----------------------------------------------------------------------------------------------------------------------------*/ - - initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config)); - initialUplinkBWP->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup; - NR_SRS_Config_t *srs_Config = calloc(1,sizeof(*srs_Config)); - initialUplinkBWP->srs_Config->choice.setup=srs_Config; - srs_Config->srs_ResourceSetToReleaseList=NULL; - srs_Config->srs_ResourceSetToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceSetToAddModList)); - NR_SRS_ResourceSet_t *srs_resset0=calloc(1,sizeof(*srs_resset0)); - srs_resset0->srs_ResourceSetId = 0; - srs_resset0->srs_ResourceIdList=calloc(1,sizeof(*srs_resset0->srs_ResourceIdList)); - NR_SRS_ResourceId_t *srs_resset0_id=calloc(1,sizeof(*srs_resset0_id)); - *srs_resset0_id=0; - ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list,srs_resset0_id); - srs_Config->srs_ResourceToReleaseList=NULL; + + initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config)); + initialUplinkBWP->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup; + + NR_SRS_Config_t *srs_Config = calloc(1,sizeof(*srs_Config)); + initialUplinkBWP->srs_Config->choice.setup=srs_Config; + srs_Config->srs_ResourceSetToReleaseList=NULL; + srs_Config->srs_ResourceSetToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceSetToAddModList)); + NR_SRS_ResourceSet_t *srs_resset0=calloc(1,sizeof(*srs_resset0)); + srs_resset0->srs_ResourceSetId = 0; + srs_resset0->srs_ResourceIdList=calloc(1,sizeof(*srs_resset0->srs_ResourceIdList)); + NR_SRS_ResourceId_t *srs_resset0_id=calloc(1,sizeof(*srs_resset0_id)); + *srs_resset0_id=0; + ASN_SEQUENCE_ADD(&srs_resset0->srs_ResourceIdList->list,srs_resset0_id); + srs_Config->srs_ResourceToReleaseList=NULL; if (configuration->do_SRS) { srs_resset0->resourceType.present = NR_SRS_ResourceSet__resourceType_PR_periodic; @@ -786,35 +941,35 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco srs_resset0->resourceType.choice.aperiodic->ext1=NULL; } - srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook; - srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha)); - *srs_resset0->alpha = NR_Alpha_alpha1; - srs_resset0->p0=calloc(1,sizeof(*srs_resset0->p0)); - *srs_resset0->p0=-80; - srs_resset0->pathlossReferenceRS=NULL; - srs_resset0->srs_PowerControlAdjustmentStates=NULL; - ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceSetToAddModList->list,srs_resset0); - srs_Config->srs_ResourceToReleaseList=NULL; - srs_Config->srs_ResourceToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceToAddModList)); - NR_SRS_Resource_t *srs_res0=calloc(1,sizeof(*srs_res0)); - srs_res0->srs_ResourceId=0; - srs_res0->nrofSRS_Ports=NR_SRS_Resource__nrofSRS_Ports_port1; - srs_res0->ptrs_PortIndex=NULL; - srs_res0->transmissionComb.present=NR_SRS_Resource__transmissionComb_PR_n2; - srs_res0->transmissionComb.choice.n2=calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2)); - srs_res0->transmissionComb.choice.n2->combOffset_n2=0; - srs_res0->transmissionComb.choice.n2->cyclicShift_n2=0; - srs_res0->resourceMapping.startPosition = 2 + uid%2; - srs_res0->resourceMapping.nrofSymbols=NR_SRS_Resource__resourceMapping__nrofSymbols_n1; - srs_res0->resourceMapping.repetitionFactor=NR_SRS_Resource__resourceMapping__repetitionFactor_n1; - srs_res0->freqDomainPosition=0; - srs_res0->freqDomainShift=0; - srs_res0->freqHopping.b_SRS=0; - srs_res0->freqHopping.b_hop=0; - srs_res0->freqHopping.c_SRS = rrc_get_max_nr_csrs( - NRRIV2BW(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275), - srs_res0->freqHopping.b_SRS); - srs_res0->groupOrSequenceHopping=NR_SRS_Resource__groupOrSequenceHopping_neither; + srs_resset0->usage=NR_SRS_ResourceSet__usage_codebook; + srs_resset0->alpha = calloc(1,sizeof(*srs_resset0->alpha)); + *srs_resset0->alpha = NR_Alpha_alpha1; + srs_resset0->p0=calloc(1,sizeof(*srs_resset0->p0)); + *srs_resset0->p0=-80; + srs_resset0->pathlossReferenceRS=NULL; + srs_resset0->srs_PowerControlAdjustmentStates=NULL; + ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceSetToAddModList->list,srs_resset0); + srs_Config->srs_ResourceToReleaseList=NULL; + srs_Config->srs_ResourceToAddModList=calloc(1,sizeof(*srs_Config->srs_ResourceToAddModList)); + NR_SRS_Resource_t *srs_res0=calloc(1,sizeof(*srs_res0)); + srs_res0->srs_ResourceId=0; + srs_res0->nrofSRS_Ports=NR_SRS_Resource__nrofSRS_Ports_port1; + srs_res0->ptrs_PortIndex=NULL; + srs_res0->transmissionComb.present=NR_SRS_Resource__transmissionComb_PR_n2; + srs_res0->transmissionComb.choice.n2=calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2)); + srs_res0->transmissionComb.choice.n2->combOffset_n2=0; + srs_res0->transmissionComb.choice.n2->cyclicShift_n2=0; + srs_res0->resourceMapping.startPosition = 2 + uid%2; + srs_res0->resourceMapping.nrofSymbols=NR_SRS_Resource__resourceMapping__nrofSymbols_n1; + srs_res0->resourceMapping.repetitionFactor=NR_SRS_Resource__resourceMapping__repetitionFactor_n1; + srs_res0->freqDomainPosition=0; + srs_res0->freqDomainShift=0; + srs_res0->freqHopping.b_SRS=0; + srs_res0->freqHopping.b_hop=0; + srs_res0->freqHopping.c_SRS = rrc_get_max_nr_csrs( + NRRIV2BW(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, 275), + srs_res0->freqHopping.b_SRS); + srs_res0->groupOrSequenceHopping=NR_SRS_Resource__groupOrSequenceHopping_neither; if (configuration->do_SRS) { srs_res0->resourceType.present= NR_SRS_Resource__resourceType_PR_periodic; @@ -826,174 +981,60 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco srs_res0->resourceType.choice.aperiodic=calloc(1,sizeof(*srs_res0->resourceType.choice.aperiodic)); } - srs_res0->sequenceId=40; - srs_res0->spatialRelationInfo=calloc(1,sizeof(*srs_res0->spatialRelationInfo)); - srs_res0->spatialRelationInfo->servingCellId=NULL; - srs_res0->spatialRelationInfo->referenceSignal.present=NR_SRS_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index; - srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index=0; - ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0); - - secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToReleaseList = NULL; - NR_BWP_Uplink_t *ubwp = NULL; - if (servingcellconfigdedicated) { - ubwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]; - } else { - secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList)); - ubwp = calloc(1,sizeof(*ubwp)); - } - ubwp->bwp_Id=1; - ubwp->bwp_Common = calloc(1,sizeof(*ubwp->bwp_Common)); - // copy bwp_Common from Initial UL BWP except for bandwidth - memcpy((void*)&ubwp->bwp_Common->genericParameters, - (void*)&servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters, - sizeof(servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->genericParameters)); - ubwp->bwp_Common->genericParameters.locationAndBandwidth=PRBalloc_to_locationandbandwidth(servingcellconfigcommon->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0); - - ubwp->bwp_Common->rach_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon; - ubwp->bwp_Common->pusch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon; - ubwp->bwp_Common->pucch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon; - - if (!servingcellconfigdedicated) { - ubwp->bwp_Dedicated = calloc(1,sizeof(*ubwp->bwp_Dedicated)); - } - ubwp->bwp_Dedicated->pucch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pucch_Config)); - ubwp->bwp_Dedicated->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup; - NR_PUCCH_Config_t *pucch_Config = calloc(1,sizeof(*pucch_Config)); - ubwp->bwp_Dedicated->pucch_Config->choice.setup=pucch_Config; - pucch_Config->resourceSetToAddModList = calloc(1,sizeof(*pucch_Config->resourceSetToAddModList)); - pucch_Config->resourceSetToReleaseList = NULL; - NR_PUCCH_ResourceSet_t *pucchresset0=calloc(1,sizeof(*pucchresset0)); - NR_PUCCH_ResourceSet_t *pucchresset1=calloc(1,sizeof(*pucchresset1)); - pucchresset0->pucch_ResourceSetId = 0; - NR_PUCCH_ResourceId_t *pucchresset0id0=calloc(1,sizeof(*pucchresset0id0)); - *pucchresset0id0=1; - ASN_SEQUENCE_ADD(&pucchresset0->resourceList.list,pucchresset0id0); - pucchresset0->maxPayloadSize=NULL; - - ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset0); - - pucchresset1->pucch_ResourceSetId = 1; - NR_PUCCH_ResourceId_t *pucchresset1id0=calloc(1,sizeof(*pucchresset1id0)); - *pucchresset1id0=2; - ASN_SEQUENCE_ADD(&pucchresset1->resourceList.list,pucchresset1id0); - pucchresset1->maxPayloadSize=NULL; - ASN_SEQUENCE_ADD(&pucch_Config->resourceSetToAddModList->list,pucchresset1); - - pucch_Config->resourceToAddModList = calloc(1,sizeof(*pucch_Config->resourceToAddModList)); - pucch_Config->resourceToReleaseList = NULL; - NR_PUCCH_Resource_t *pucchres0=calloc(1,sizeof(*pucchres0)); - NR_PUCCH_Resource_t *pucchres2=calloc(1,sizeof(*pucchres2)); - - pucchres0->pucch_ResourceId=1; - pucchres0->startingPRB= (8 + uid) % curr_bwp; - pucchres0->intraSlotFrequencyHopping=NULL; - pucchres0->secondHopPRB=NULL; - pucchres0->format.present= NR_PUCCH_Resource__format_PR_format0; - pucchres0->format.choice.format0=calloc(1,sizeof(*pucchres0->format.choice.format0)); - pucchres0->format.choice.format0->initialCyclicShift=0; - pucchres0->format.choice.format0->nrofSymbols=1; - pucchres0->format.choice.format0->startingSymbolIndex=13; - ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres0); - - pucchres2->pucch_ResourceId=2; - pucchres2->startingPRB=0; - pucchres2->intraSlotFrequencyHopping=NULL; - pucchres2->secondHopPRB=NULL; - pucchres2->format.present= NR_PUCCH_Resource__format_PR_format2; - pucchres2->format.choice.format2=calloc(1,sizeof(*pucchres2->format.choice.format2)); - pucchres2->format.choice.format2->nrofPRBs=8; - pucchres2->format.choice.format2->nrofSymbols=1; - pucchres2->format.choice.format2->startingSymbolIndex=13; - ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres2); - - pucch_Config->format2=calloc(1,sizeof(*pucch_Config->format2)); - pucch_Config->format2->present=NR_SetupRelease_PUCCH_FormatConfig_PR_setup; - NR_PUCCH_FormatConfig_t *pucchfmt2 = calloc(1,sizeof(*pucchfmt2)); - pucch_Config->format2->choice.setup = pucchfmt2; - pucchfmt2->interslotFrequencyHopping=NULL; - pucchfmt2->additionalDMRS=NULL; - pucchfmt2->maxCodeRate=calloc(1,sizeof(*pucchfmt2->maxCodeRate)); - *pucchfmt2->maxCodeRate=NR_PUCCH_MaxCodeRate_zeroDot35; - pucchfmt2->nrofSlots=NULL; - pucchfmt2->pi2BPSK=NULL; - pucchfmt2->simultaneousHARQ_ACK_CSI=calloc(1,sizeof(*pucchfmt2->simultaneousHARQ_ACK_CSI)); - *pucchfmt2->simultaneousHARQ_ACK_CSI=NR_PUCCH_FormatConfig__simultaneousHARQ_ACK_CSI_true; - - // for scheduling requestresource - pucch_Config->schedulingRequestResourceToAddModList = calloc(1,sizeof(*pucch_Config->schedulingRequestResourceToAddModList)); - NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig = calloc(1,sizeof(*schedulingRequestResourceConfig)); - schedulingRequestResourceConfig->schedulingRequestResourceId = 1; - schedulingRequestResourceConfig->schedulingRequestID = 0; - schedulingRequestResourceConfig->periodicityAndOffset = calloc(1,sizeof(*schedulingRequestResourceConfig->periodicityAndOffset)); - schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10; - schedulingRequestResourceConfig->periodicityAndOffset->choice.sl10 = 7; - schedulingRequestResourceConfig->resource = calloc(1,sizeof(*schedulingRequestResourceConfig->resource)); - *schedulingRequestResourceConfig->resource = 1; - ASN_SEQUENCE_ADD(&pucch_Config->schedulingRequestResourceToAddModList->list,schedulingRequestResourceConfig); - - pucch_Config->schedulingRequestResourceToReleaseList=NULL; - pucch_Config->multi_CSI_PUCCH_ResourceList=NULL; - pucch_Config->dl_DataToUL_ACK = calloc(1,sizeof(*pucch_Config->dl_DataToUL_ACK)); - long *delay[8]; - for (int i=0;i<8;i++) { - delay[i] = calloc(1,sizeof(*delay[i])); - *delay[i] = i + configuration->minRXTXTIME; - ASN_SEQUENCE_ADD(&pucch_Config->dl_DataToUL_ACK->list,delay[i]); - } - pucch_Config->spatialRelationInfoToAddModList = calloc(1,sizeof(*pucch_Config->spatialRelationInfoToAddModList)); - NR_PUCCH_SpatialRelationInfo_t *pucchspatial = calloc(1,sizeof(*pucchspatial)); - pucchspatial->pucch_SpatialRelationInfoId = 1; - pucchspatial->servingCellId = NULL; - if(do_csirs) { - pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index; - pucchspatial->referenceSignal.choice.csi_RS_Index = 0; - } - else { - pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_ssb_Index; - pucchspatial->referenceSignal.choice.ssb_Index = 0; - } - pucchspatial->pucch_PathlossReferenceRS_Id = 0; - pucchspatial->p0_PUCCH_Id = 1; - pucchspatial->closedLoopIndex = NR_PUCCH_SpatialRelationInfo__closedLoopIndex_i0; - ASN_SEQUENCE_ADD(&pucch_Config->spatialRelationInfoToAddModList->list,pucchspatial); - pucch_Config->spatialRelationInfoToReleaseList=NULL; - pucch_Config->pucch_PowerControl=calloc(1,sizeof(*pucch_Config->pucch_PowerControl)); - pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0)); - *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f0 = 0; - pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1)); - *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f1 = 0; - pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2)); - *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f2 = 0; - pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3)); - *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f3 = 0; - pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4 = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4)); - *pucch_Config->pucch_PowerControl->deltaF_PUCCH_f4 = 0; - pucch_Config->pucch_PowerControl->p0_Set = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->p0_Set)); - NR_P0_PUCCH_t *p00 = calloc(1,sizeof(*p00)); - p00->p0_PUCCH_Id=1; - p00->p0_PUCCH_Value = 0; - ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->p0_Set->list,p00); - pucch_Config->pucch_PowerControl->pathlossReferenceRSs = NULL; - - if (!servingcellconfigdedicated) { - // copy pusch_Config from dedicated initialBWP - ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config)); - ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup; - ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config; - } - ubwp->bwp_Dedicated->configuredGrantConfig = NULL; - ubwp->bwp_Dedicated->srs_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->srs_Config)); - ubwp->bwp_Dedicated->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup; - ubwp->bwp_Dedicated->srs_Config->choice.setup = srs_Config; + srs_res0->sequenceId=40; + srs_res0->spatialRelationInfo=calloc(1,sizeof(*srs_res0->spatialRelationInfo)); + srs_res0->spatialRelationInfo->servingCellId=NULL; + srs_res0->spatialRelationInfo->referenceSignal.present=NR_SRS_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index; + srs_res0->spatialRelationInfo->referenceSignal.choice.csi_RS_Index=0; + ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0); - ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL; + /// Dedicated BWPs - if (!servingcellconfigdedicated) { - ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp); - } + // Downlink BWPs + int n_dl_bwp = 1; + if (servingcellconfigdedicated && servingcellconfigdedicated->downlinkBWP_ToAddModList) { + n_dl_bwp = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count; + } + if(n_dl_bwp>0) { + secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList)); + for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) { + NR_BWP_Downlink_t *bwp = calloc(1,sizeof(*bwp)); + fill_default_nsa_downlinkBWP(bwp, bwp_loop, secondaryCellGroup, servingcellconfigdedicated, servingcellconfigcommon, configuration, uecap, dl_antenna_ports, bitmap); + ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp); + } + secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id)); + *secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = servingcellconfigdedicated->firstActiveDownlinkBWP_Id ? *servingcellconfigdedicated->firstActiveDownlinkBWP_Id : 1; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id)); + *secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = servingcellconfigdedicated->defaultDownlinkBWP_Id ? *servingcellconfigdedicated->defaultDownlinkBWP_Id : 1; + } - secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id)); - *secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = 1; + // Uplink BWPs + int n_ul_bwp = 1; + if (servingcellconfigdedicated && servingcellconfigdedicated->uplinkConfig && servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList) { + n_ul_bwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count; + } + if(n_ul_bwp>0) { + secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList)); + for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) { + NR_BWP_Uplink_t *ubwp = calloc(1,sizeof(*ubwp)); + fill_default_nsa_uplinkBWP(ubwp, bwp_loop, servingcellconfigdedicated, servingcellconfigcommon, configuration, uid); + ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp); + } + secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id)); + *secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id ? *servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id : 1; + } + + secondaryCellGroup->spCellConfig->spCellConfigDedicated->bwp_InactivityTimer = NULL; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToReleaseList= NULL; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToReleaseList = NULL; + + mac_CellGroupConfig->schedulingRequestConfig = calloc(1, sizeof(*mac_CellGroupConfig->schedulingRequestConfig)); + mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = CALLOC(1,sizeof(*mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList)); + struct NR_SchedulingRequestToAddMod *schedulingrequestlist = CALLOC(1,sizeof(*schedulingrequestlist)); + schedulingrequestlist->schedulingRequestId = 0; + schedulingrequestlist->sr_ProhibitTimer = NULL; + schedulingrequestlist->sr_TransMax = NR_SchedulingRequestToAddMod__sr_TransMax_n64; + ASN_SEQUENCE_ADD(&(mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list),schedulingrequestlist); secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig)); NR_PUSCH_ServingCellConfig_t *pusch_scc = calloc(1,sizeof(*pusch_scc)); @@ -1008,9 +1049,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco pusch_scc->ext1->processingType2Enabled = NULL; secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->carrierSwitching = NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->supplementaryUplink=NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdcch_ServingCellConfig=NULL; secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig)); @@ -1034,39 +1073,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco NR_CSI_MeasConfig_t *csi_MeasConfig = calloc(1,sizeof(*csi_MeasConfig)); secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup = csi_MeasConfig; - if (do_csirs && dl_antenna_ports > 1) { - csi_MeasConfig->csi_IM_ResourceToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceToAddModList)); - NR_CSI_IM_Resource_t *imres0 = calloc(1,sizeof(*imres0)); - imres0->csi_IM_ResourceId = 0; - imres0->csi_IM_ResourceElementPattern = calloc(1,sizeof(*imres0->csi_IM_ResourceElementPattern)); - imres0->csi_IM_ResourceElementPattern->present = NR_CSI_IM_Resource__csi_IM_ResourceElementPattern_PR_pattern1; - imres0->csi_IM_ResourceElementPattern->choice.pattern1 = calloc(1,sizeof(*imres0->csi_IM_ResourceElementPattern->choice.pattern1)); - imres0->csi_IM_ResourceElementPattern->choice.pattern1->subcarrierLocation_p1 = NR_CSI_IM_Resource__csi_IM_ResourceElementPattern__pattern1__subcarrierLocation_p1_s4; - imres0->csi_IM_ResourceElementPattern->choice.pattern1->symbolLocation_p1 = 6; - imres0->freqBand = calloc(1,sizeof(*imres0->freqBand)); - imres0->freqBand->startingRB = 0; - imres0->freqBand->nrofRBs = ((curr_bwp>>2)+(curr_bwp%4>0))<<2; - imres0->periodicityAndOffset = calloc(1,sizeof(*imres0->periodicityAndOffset)); - imres0->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots320; - imres0->periodicityAndOffset->choice.slots320 = 0; - ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceToAddModList->list,imres0); - csi_MeasConfig->csi_IM_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceSetToAddModList)); - NR_CSI_IM_ResourceSet_t *imset0 = calloc(1,sizeof(*imset0)); - imset0->csi_IM_ResourceSetId = 0; - NR_CSI_IM_ResourceId_t *res0 = calloc(1,sizeof(*res0)); - *res0 = 0; - ASN_SEQUENCE_ADD(&imset0->csi_IM_Resources,res0); - ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceSetToAddModList->list,imset0); - } - else { - csi_MeasConfig->csi_IM_ResourceToAddModList = NULL; - csi_MeasConfig->csi_IM_ResourceSetToAddModList = NULL; - } - - csi_MeasConfig->csi_IM_ResourceToReleaseList = NULL; - csi_MeasConfig->csi_IM_ResourceSetToReleaseList = NULL; - + int curr_bwp = NRRIV2BW(PRBalloc_to_locationandbandwidth(servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth,0),275); config_csirs(servingcellconfigcommon, csi_MeasConfig, uid, dl_antenna_ports, curr_bwp, do_csirs); + config_csiim(do_csirs, dl_antenna_ports, curr_bwp, csi_MeasConfig); csi_MeasConfig->csi_SSB_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_SSB_ResourceSetToAddModList)); csi_MeasConfig->csi_SSB_ResourceSetToReleaseList = NULL; @@ -1268,10 +1277,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco ASN_SEQUENCE_ADD(&csirep2->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list,pucchcsires1); csirep2->reportQuantity.present = NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP; csirep2->reportQuantity.choice.ssb_Index_RSRP=(NULL_t)0; - csirep2->reportFreqConfiguration = calloc(1,sizeof(*csirep2->reportFreqConfiguration)); - csirep2->reportFreqConfiguration->cqi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI; - csirep2->reportFreqConfiguration->pmi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__pmi_FormatIndicator_widebandPMI; - csirep2->reportFreqConfiguration->csi_ReportingBand=NULL; + csirep2->reportFreqConfiguration = NULL; csirep2->timeRestrictionForChannelMeasurements= NR_CSI_ReportConfig__timeRestrictionForChannelMeasurements_configured; csirep2->timeRestrictionForInterferenceMeasurements=NR_CSI_ReportConfig__timeRestrictionForInterferenceMeasurements_configured; csirep2->codebookConfig= NULL; @@ -1295,8 +1301,12 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco secondaryCellGroup->spCellConfig->spCellConfigDedicated->pathlossReferenceLinking=NULL; secondaryCellGroup->spCellConfig->spCellConfigDedicated->servingCellMO=NULL; -} + *servingcellconfigdedicated = *secondaryCellGroup->spCellConfig->spCellConfigDedicated; + if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { + xer_fprint(stdout, &asn_DEF_NR_SpCellConfig, (void *)secondaryCellGroup->spCellConfig); + } +} void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon, NR_ServingCellConfig_t *servingcellconfigdedicated, diff --git a/openair2/RRC/NR_UE/L2_interface_ue.c b/openair2/RRC/NR_UE/L2_interface_ue.c index 6f0c7fc27fa..b4508e2627d 100644 --- a/openair2/RRC/NR_UE/L2_interface_ue.c +++ b/openair2/RRC/NR_UE/L2_interface_ue.c @@ -181,6 +181,6 @@ rrc_data_req_nr_ue( TASK_PDCP_UE, ctxt_pP->instance, message_p); - return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. + return true; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. } diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 7dca9b27740..53817af48e2 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -1320,11 +1320,11 @@ nr_rrc_ue_process_masterCellGroup( //TODO (perform SCell addition/modification as specified in 5.3.5.5.9) } - if( cellGroupConfig->ext2->bh_RLC_ChannelToReleaseList_r16 != NULL){ + if(cellGroupConfig->ext2 != NULL && cellGroupConfig->ext2->bh_RLC_ChannelToReleaseList_r16 != NULL){ //TODO (perform the BH RLC channel addition/modification as specified in 5.3.5.5.11) } - if( cellGroupConfig->ext2->bh_RLC_ChannelToAddModList_r16 != NULL){ + if(cellGroupConfig->ext2 != NULL && cellGroupConfig->ext2->bh_RLC_ChannelToAddModList_r16 != NULL){ //TODO (perform the BH RLC channel addition/modification as specified in 5.3.5.5.11) } } @@ -1340,13 +1340,6 @@ static void rrc_ue_generate_RRCSetupComplete( uint8_t size; const char *nas_msg; int nas_msg_length; - NR_UE_MAC_INST_t *mac = get_mac_inst(0); - - if (mac->cg && - mac->cg->spCellConfig && - mac->cg->spCellConfig->spCellConfigDedicated && - mac->cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig) - AssertFatal(1==0,"2 > csi_MeasConfig is not null\n"); if (AMF_MODE_ENABLED) { #if defined(ITTI_SIM) @@ -1462,8 +1455,8 @@ int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB nr_rrc_ue_process_RadioBearerConfig(ctxt_pP, gNB_index, &dl_ccch_msg->message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup->radioBearerConfig); - nr_rrc_set_state (ctxt_pP->module_id, RRC_STATE_CONNECTED); - nr_rrc_set_sub_state (ctxt_pP->module_id, RRC_SUB_STATE_CONNECTED); + nr_rrc_set_state (ctxt_pP->module_id, RRC_STATE_CONNECTED_NR); + nr_rrc_set_sub_state (ctxt_pP->module_id, RRC_SUB_STATE_CONNECTED_NR); NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].rnti = ctxt_pP->rnti; rrc_ue_generate_RRCSetupComplete( ctxt_pP, @@ -2021,7 +2014,7 @@ nr_rrc_ue_establish_srb2( int i, cnt; if( radioBearerConfig->srb3_ToRelease != NULL){ - if( *radioBearerConfig->srb3_ToRelease == TRUE){ + if( *radioBearerConfig->srb3_ToRelease == true){ //TODO (release the PDCP entity and the srb-Identity of the SRB3.) } } diff --git a/openair2/SDAP/nr_sdap/nr_sdap.c b/openair2/SDAP/nr_sdap/nr_sdap.c index 74ef93aff74..dd7a76920d3 100644 --- a/openair2/SDAP/nr_sdap/nr_sdap.c +++ b/openair2/SDAP/nr_sdap/nr_sdap.c @@ -21,19 +21,19 @@ #include "nr_sdap.h" -boolean_t sdap_data_req(protocol_ctxt_t *ctxt_p, - const srb_flag_t srb_flag, - const rb_id_t rb_id, - const mui_t mui, - const confirm_t confirm, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer, - const pdcp_transmission_mode_t pt_mode, - const uint32_t *sourceL2Id, - const uint32_t *destinationL2Id, - const uint8_t qfi, - const boolean_t rqi, - const int pdusession_id) { +bool sdap_data_req(protocol_ctxt_t *ctxt_p, + const srb_flag_t srb_flag, + const rb_id_t rb_id, + const mui_t mui, + const confirm_t confirm, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t pt_mode, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id, + const uint8_t qfi, + const bool rqi, + const int pdusession_id) { nr_sdap_entity_t *sdap_entity; sdap_entity = nr_sdap_get_entity(ctxt_p->rnti, pdusession_id); @@ -42,19 +42,19 @@ boolean_t sdap_data_req(protocol_ctxt_t *ctxt_p, return 0; } - boolean_t ret = sdap_entity->tx_entity(sdap_entity, - ctxt_p, - srb_flag, - rb_id, - mui, - confirm, - sdu_buffer_size, - sdu_buffer, - pt_mode, - sourceL2Id, - destinationL2Id, - qfi, - rqi); + bool ret = sdap_entity->tx_entity(sdap_entity, + ctxt_p, + srb_flag, + rb_id, + mui, + confirm, + sdu_buffer_size, + sdu_buffer, + pt_mode, + sourceL2Id, + destinationL2Id, + qfi, + rqi); return ret; } diff --git a/openair2/SDAP/nr_sdap/nr_sdap.h b/openair2/SDAP/nr_sdap/nr_sdap.h index cd702cfd7f3..5959ca15589 100644 --- a/openair2/SDAP/nr_sdap/nr_sdap.h +++ b/openair2/SDAP/nr_sdap/nr_sdap.h @@ -32,20 +32,19 @@ * Downlink - gNB * Uplink - nrUE */ -boolean_t sdap_data_req(protocol_ctxt_t *ctxt_p, - const srb_flag_t srb_flag, - const rb_id_t rb_id, - const mui_t mui, - const confirm_t confirm, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer, - const pdcp_transmission_mode_t pt_mode, - const uint32_t *sourceL2Id, - const uint32_t *destinationL2Id, - const uint8_t qfi, - const boolean_t rqi, - const int pdusession_id - ); +bool sdap_data_req(protocol_ctxt_t *ctxt_p, + const srb_flag_t srb_flag, + const rb_id_t rb_id, + const mui_t mui, + const confirm_t confirm, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t pt_mode, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id, + const uint8_t qfi, + const bool rqi, + const int pdusession_id); /* * TS 37.324 4.4 Functions diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.c b/openair2/SDAP/nr_sdap/nr_sdap_entity.c index c5d1c1d6fe1..5e3627296c5 100644 --- a/openair2/SDAP/nr_sdap/nr_sdap_entity.c +++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.c @@ -46,23 +46,22 @@ void nr_pdcp_submit_sdap_ctrl_pdu(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_u return; } -static boolean_t nr_sdap_tx_entity(nr_sdap_entity_t *entity, - protocol_ctxt_t *ctxt_p, - const srb_flag_t srb_flag, - const rb_id_t rb_id, - const mui_t mui, - const confirm_t confirm, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer, - const pdcp_transmission_mode_t pt_mode, - const uint32_t *sourceL2Id, - const uint32_t *destinationL2Id, - const uint8_t qfi, - const boolean_t rqi - ) { +static bool nr_sdap_tx_entity(nr_sdap_entity_t *entity, + protocol_ctxt_t *ctxt_p, + const srb_flag_t srb_flag, + const rb_id_t rb_id, + const mui_t mui, + const confirm_t confirm, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t pt_mode, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id, + const uint8_t qfi, + const bool rqi) { /* The offset of the SDAP header, it might be 0 if the has_sdap is not true in the pdcp entity. */ int offset=0; - boolean_t ret=false; + bool ret = false; /*Hardcode DRB ID given from upper layer (ue/enb_tun_read_thread rb_id), it will change if we have SDAP*/ rb_id_t sdap_drb_id = rb_id; int pdcp_ent_has_sdap = 0; @@ -297,7 +296,7 @@ static void nr_sdap_rx_entity(nr_sdap_entity_t *entity, } } -void nr_sdap_qfi2drb_map_update(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t drb, boolean_t hasSdap){ +void nr_sdap_qfi2drb_map_update(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t drb, bool hasSdap) { if(qfi < SDAP_MAX_QFI && qfi > SDAP_MAP_RULE_EMPTY && drb > 0 && @@ -390,7 +389,7 @@ void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity, nr_sdap_entity_t *new_nr_sdap_entity(int has_sdap, uint16_t rnti, int pdusession_id, - boolean_t is_defaultDRB, + bool is_defaultDRB, uint8_t drb_identity, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount) @@ -450,7 +449,7 @@ nr_sdap_entity_t *nr_sdap_get_entity(uint16_t rnti, int pdusession_id) { if(sdap_entity == NULL) return NULL; - while(sdap_entity->rnti != rnti && sdap_entity->next_entity != NULL) { + while(( sdap_entity->rnti != rnti || sdap_entity->pdusession_id != pdusession_id ) && sdap_entity->next_entity != NULL) { sdap_entity = sdap_entity->next_entity; } @@ -460,6 +459,7 @@ nr_sdap_entity_t *nr_sdap_get_entity(uint16_t rnti, int pdusession_id) { return NULL; } + void delete_nr_sdap_entity(uint16_t rnti) { nr_sdap_entity_t *entityPtr, *entityPrev = NULL; entityPtr = sdap_info.sdap_entity_llist; diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.h b/openair2/SDAP/nr_sdap/nr_sdap_entity.h index b46e5bf4e34..635289d4d48 100644 --- a/openair2/SDAP/nr_sdap/nr_sdap_entity.h +++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.h @@ -64,7 +64,7 @@ typedef struct nr_sdap_ul_hdr_s { typedef struct qfi2drb_s { rb_id_t drb_id; - boolean_t hasSdap; + bool hasSdap; } qfi2drb_t; void nr_pdcp_submit_sdap_ctrl_pdu(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu); @@ -75,7 +75,7 @@ typedef struct nr_sdap_entity_s { int pdusession_id; qfi2drb_t qfi2drb_table[SDAP_MAX_QFI]; - void (*qfi2drb_map_update)(struct nr_sdap_entity_s *entity, uint8_t qfi, rb_id_t drb, boolean_t hasSdap); + void (*qfi2drb_map_update)(struct nr_sdap_entity_s *entity, uint8_t qfi, rb_id_t drb, bool hasSdap); void (*qfi2drb_map_delete)(struct nr_sdap_entity_s *entity, uint8_t qfi); rb_id_t (*qfi2drb_map)(struct nr_sdap_entity_s *entity, uint8_t qfi, rb_id_t upper_layer_rb_id); @@ -84,20 +84,19 @@ typedef struct nr_sdap_entity_s { void (*sdap_submit_ctrl_pdu)(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu); - boolean_t (*tx_entity)(struct nr_sdap_entity_s *entity, - protocol_ctxt_t *ctxt_p, - const srb_flag_t srb_flag, - const rb_id_t rb_id, - const mui_t mui, - const confirm_t confirm, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer, - const pdcp_transmission_mode_t pt_mode, - const uint32_t *sourceL2Id, - const uint32_t *destinationL2Id, - const uint8_t qfi, - const boolean_t rqi - ); + bool (*tx_entity)(struct nr_sdap_entity_s *entity, + protocol_ctxt_t *ctxt_p, + const srb_flag_t srb_flag, + const rb_id_t rb_id, + const mui_t mui, + const confirm_t confirm, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t pt_mode, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id, + const uint8_t qfi, + const bool rqi); void (*rx_entity)(struct nr_sdap_entity_s *entity, rb_id_t pdcp_entity, @@ -114,7 +113,7 @@ typedef struct nr_sdap_entity_s { } nr_sdap_entity_t; /* QFI to DRB Mapping Related Function */ -void nr_sdap_qfi2drb_map_update(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t drb, boolean_t hasSdap); +void nr_sdap_qfi2drb_map_update(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t drb, bool hasSdap); /* QFI to DRB Mapping Related Function */ void nr_sdap_qfi2drb_map_del(nr_sdap_entity_t *entity, uint8_t qfi); @@ -168,7 +167,7 @@ void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity, nr_sdap_entity_t *new_nr_sdap_entity(int has_sdap, uint16_t rnti, int pdusession_id, - boolean_t is_defaultDRB, + bool is_defaultDRB, uint8_t default_DRB, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount); diff --git a/openair2/UTIL/OMG/defs.h b/openair2/UTIL/OMG/defs.h index 06c9bf6e73f..1102a69cc56 100644 --- a/openair2/UTIL/OMG/defs.h +++ b/openair2/UTIL/OMG/defs.h @@ -29,12 +29,6 @@ #include <stdlib.h> -// TYPEDEFS - -#define true 1 -#define false 0 - -//typedef char bool; #include <stdbool.h> #include "omg_constants.h" diff --git a/openair2/UTIL/OPT/opt.h b/openair2/UTIL/OPT/opt.h index ae6a3eb2a65..d08790a0584 100644 --- a/openair2/UTIL/OPT/opt.h +++ b/openair2/UTIL/OPT/opt.h @@ -109,11 +109,14 @@ typedef enum radio_type_e { extern int opt_enabled; #define trace_pdu(x...) if (opt_enabled) trace_pdu_implementation(0, x) -#define trace_NRpdu(x...) if (opt_enabled) trace_pdu_implementation(1, x) +#define trace_NRpdu(x...) if (opt_enabled) nr_trace_pdu_implementation(1, x) void trace_pdu_implementation(int nr, int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size, int ueid, int rntiType, int rnti, uint16_t sysFrame, uint8_t subframe, int oob_event, int oob_event_value); +void nr_trace_pdu_implementation(int nr, int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size, + int rntiType, int rnti, uint16_t sysFrame, uint8_t subframe, + int oob_event, int oob_event_value); int init_opt(void); diff --git a/openair2/UTIL/OPT/probe.c b/openair2/UTIL/OPT/probe.c index 8731eb294a5..9359c48e95a 100644 --- a/openair2/UTIL/OPT/probe.c +++ b/openair2/UTIL/OPT/probe.c @@ -476,6 +476,14 @@ static void SendFrameNR(guint8 radioType, guint8 direction, guint8 rntiType, extern RAN_CONTEXT_t RC; #include <openair1/PHY/phy_extern_ue.h> /* Remote serveraddress (where Wireshark is running) */ +void nr_trace_pdu_implementation(int nr, int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size, + int rntiType, int rnti, uint16_t sysFrameNumber, uint8_t subFrameNumber, int oob_event, + int oob_event_value) { + trace_pdu_implementation(nr, direction, pdu_buffer, pdu_buffer_size, + rnti, rntiType, rnti, sysFrameNumber, subFrameNumber, oob_event, + oob_event_value); +} + void trace_pdu_implementation(int nr, int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size, int ueid, int rntiType, int rnti, uint16_t sysFrameNumber, uint8_t subFrameNumber, int oob_event, int oob_event_value) { diff --git a/openair2/X2AP/x2ap_common.h b/openair2/X2AP/x2ap_common.h index a2f903a7372..7dd88ffa21a 100644 --- a/openair2/X2AP/x2ap_common.h +++ b/openair2/X2AP/x2ap_common.h @@ -52,11 +52,6 @@ # define X2AP_PORT 36422 #endif -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif - extern int asn1_xer_print; #if defined(ENB_MODE) diff --git a/openair3/M3AP/m3ap_common.h b/openair3/M3AP/m3ap_common.h index 7f68510314f..c5f55bc70a2 100644 --- a/openair3/M3AP/m3ap_common.h +++ b/openair3/M3AP/m3ap_common.h @@ -52,11 +52,6 @@ # define M3AP_PORT 36444 #endif -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif - extern int asn1_xer_print; #if defined(ENB_MODE) diff --git a/openair3/NAS/COMMON/UTIL/nas_timer.c b/openair3/NAS/COMMON/UTIL/nas_timer.c index 8448d9a78cc..b67a3bc232f 100644 --- a/openair3/NAS/COMMON/UTIL/nas_timer.c +++ b/openair3/NAS/COMMON/UTIL/nas_timer.c @@ -121,7 +121,7 @@ static nas_timer_database_t _nas_timer_db = { static void _nas_timer_db_init(void); static int _nas_timer_db_get_id(void); -static int _nas_timer_db_is_active(int id); +static bool _nas_timer_db_is_active(int id); static nas_timer_entry_t *_nas_timer_db_create_entry(long sec, nas_timer_callback_t cb, void *args); static void _nas_timer_db_delete_entry(int id); @@ -130,7 +130,7 @@ static void _nas_timer_db_insert_entry(int id, nas_timer_entry_t *te); static int _nas_timer_db_insert(timer_queue_t *entry); static nas_timer_entry_t *_nas_timer_db_remove_entry(int id); -static int _nas_timer_db_remove(timer_queue_t *entry); +static bool _nas_timer_db_remove(timer_queue_t *entry); /* * ----------------------------------------------------------------------------- @@ -408,12 +408,12 @@ static int _nas_timer_db_get_id(void) ** Others: _nas_timer_db ** ** ** ** Outputs: None ** - ** Return: TRUE if the timer entry is active; FALSE ** + ** Return: true if the timer entry is active; false ** ** if it is not an active timer entry. ** ** Others: None ** ** ** ***************************************************************************/ -static int _nas_timer_db_is_active(int id) +static bool _nas_timer_db_is_active(int id) { return ( (id != NAS_TIMER_INACTIVE_ID) && (_nas_timer_db.tq[id].id != NAS_TIMER_INACTIVE_ID) ); @@ -562,11 +562,11 @@ static int _nas_timer_db_insert(timer_queue_t *entry) } else { /* The new entry is the first entry of the list */ _nas_timer_db.head = entry; - return TRUE; + return true; } /* The new entry is NOT the first entry of the list */ - return FALSE; + return false; } /**************************************************************************** @@ -588,7 +588,7 @@ static int _nas_timer_db_insert(timer_queue_t *entry) ***************************************************************************/ static nas_timer_entry_t *_nas_timer_db_remove_entry(int id) { - int restart; + bool restart; /* The identifier of the timer is valid within the timer queue */ assert(_nas_timer_db.tq[id].id == id); @@ -622,7 +622,7 @@ static nas_timer_entry_t *_nas_timer_db_remove_entry(int id) return (_nas_timer_db.tq[id].entry); } -static int _nas_timer_db_remove(timer_queue_t *entry) +static bool _nas_timer_db_remove(timer_queue_t *entry) { /* Update the pointer from the previous entry */ /* prev ---> entry ---> next */ @@ -644,12 +644,12 @@ static int _nas_timer_db_remove(timer_queue_t *entry) if (_nas_timer_db.head != NULL) { /* Other timers are scheduled to expire */ - return TRUE; + return true; } } /* The entry was NOT the first entry of the list */ - return FALSE; + return false; } /* diff --git a/openair3/NAS/COMMON/UTIL/socket.c b/openair3/NAS/COMMON/UTIL/socket.c index 53a6ec8823d..20c071203df 100644 --- a/openair3/NAS/COMMON/UTIL/socket.c +++ b/openair3/NAS/COMMON/UTIL/socket.c @@ -397,7 +397,7 @@ static int _socket_set_option(int sfd) * and it will simply open another socket on the same port and * continue listening. */ - optval = TRUE; + optval = true; if (setsockopt (sfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) { return RETURNerror; @@ -405,12 +405,12 @@ static int _socket_set_option(int sfd) /* IPV6_V6ONLY socket option * ------------------------- - * When option is set to TRUE, the socket is restricted to sending and + * When option is set to true, the socket is restricted to sending and * receiving IPv6 packets only. - * When option is set to FALSE, the socket can be used to send and receive + * When option is set to false, the socket can be used to send and receive * packets to and from an IPv6 address or an IPv4-mapped IPv6 address. */ - optval = FALSE; + optval = false; if (setsockopt (sfd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)) < 0) { return RETURNerror; diff --git a/openair3/NAS/COMMON/UTIL/stty.c b/openair3/NAS/COMMON/UTIL/stty.c index eceb0b06b13..fe87a63e440 100644 --- a/openair3/NAS/COMMON/UTIL/stty.c +++ b/openair3/NAS/COMMON/UTIL/stty.c @@ -192,7 +192,7 @@ static sttyset_t stty_params[] = { { NULL, 0, 0, 0 } }; -static int _stty_set_this(struct termios *term, const sttyset_t *p, int turnon); +static int _stty_set_this(struct termios *term, const sttyset_t *p, bool turnon); /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ @@ -207,7 +207,7 @@ static int _stty_set_this(struct termios *term, const sttyset_t *p, int turnon); ** ** ** Inputs: p: The TTY parameters ** ** turnon: Indicate whether the parameter should be ** - ** turned on (TRUE) or turned off (FALSE) ** + ** turned on (true) or turned off (false) ** ** Others: None ** ** ** ** Outputs: term: The termios structure to fill ** @@ -223,7 +223,7 @@ int stty_set(int fd, const char *params) register char *s; struct termios term; register int i; - int mode; + bool mode; /* Get current tty attributes */ if ( tcgetattr(fd, &term) < 0 ) { @@ -234,10 +234,10 @@ int stty_set(int fd, const char *params) p = strtok(s," \t\n"); while (p && (rc != RETURNerror)) { - mode = 1; + mode = true; if ( *p == '-' ) { - mode = 0; + mode = false; p++; } @@ -275,7 +275,7 @@ int stty_set(int fd, const char *params) ** ** ** Inputs: p: The TTY parameters ** ** turnon: Indicate whether the parameter should be ** - ** turned on (TRUE) or turned off (FALSE) ** + ** turned on (true) or turned off (false) ** ** Others: None ** ** ** ** Outputs: term: The termios structure to fill ** @@ -283,7 +283,7 @@ int stty_set(int fd, const char *params) ** Others: None ** ** ** ***************************************************************************/ -static int _stty_set_this(struct termios *term, const sttyset_t *p, int turnon) +static int _stty_set_this(struct termios *term, const sttyset_t *p, bool turnon) { int rc = RETURNok; diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.h b/openair3/NAS/NR_UE/nr_nas_msg_sim.h index 9655f87130f..abdc5b2e757 100644 --- a/openair3/NAS/NR_UE/nr_nas_msg_sim.h +++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.h @@ -80,7 +80,6 @@ typedef struct { uint8_t kgnb[32]; } ue_sa_security_key_t; - typedef enum fgs_protocol_discriminator_e { /* Protocol discriminator identifier for 5GS Mobility Management */ FGS_MOBILITY_MANAGEMENT_MESSAGE = 0x7E, diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c index bbc37d18a3c..387c3de3a8c 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c @@ -120,12 +120,12 @@ static socket_id_t * _as_simulator_mme_sid = NULL; /* * UE NAS process connection manager's running indicator */ -static int _as_simulator_ue_is_running = FALSE; +static bool _as_simulator_ue_is_running = false; /* * MME NAS process connection manager's running indicator */ -static int _as_simulator_mme_is_running = FALSE; +static bool _as_simulator_mme_is_running = false; static int _set_signal_handler(int signal, void (handler)(int)); static void _signal_handler(int signal_number); @@ -307,8 +307,8 @@ static void _signal_handler(int signal_number) { printf("\nWARNING\t: %s - Signal %d received\n", __FUNCTION__, signal_number); - _as_simulator_ue_is_running = FALSE; - _as_simulator_mme_is_running = FALSE; + _as_simulator_ue_is_running = false; + _as_simulator_mme_is_running = false; } /* @@ -321,7 +321,7 @@ static void* _as_simulator_ue_mngr(void* args) int msg_id; as_message_t msg; - _as_simulator_ue_is_running = TRUE; + _as_simulator_ue_is_running = true; printf("INFO\t: %s - UE connection manager started\n", __FUNCTION__); @@ -388,7 +388,7 @@ static void* _as_simulator_ue_mngr(void* args) } /* Close the connection to the network sublayer */ - _as_simulator_ue_is_running = FALSE; + _as_simulator_ue_is_running = false; printf("ERROR\t: The UE connection manager exited\n"); return (NULL); } @@ -403,7 +403,7 @@ static void* _as_simulator_mme_mngr(void* args) int msg_id; as_message_t msg; - _as_simulator_mme_is_running = TRUE; + _as_simulator_mme_is_running = true; printf("INFO\t: %s - MME connection manager started\n", __FUNCTION__); @@ -469,7 +469,7 @@ static void* _as_simulator_mme_mngr(void* args) } /* Close the connection to the network sublayer */ - _as_simulator_mme_is_running = FALSE; + _as_simulator_mme_is_running = false; printf("ERROR\t: %s - The MME connection manager exited\n", __FUNCTION__); return (NULL); } diff --git a/openair3/NAS/TEST/NETWORK/network_simulator.c b/openair3/NAS/TEST/NETWORK/network_simulator.c index 461f701f951..492a709463f 100644 --- a/openair3/NAS/TEST/NETWORK/network_simulator.c +++ b/openair3/NAS/TEST/NETWORK/network_simulator.c @@ -208,7 +208,7 @@ static const OctetString* _network_simulator_pdn[NETWORK_IP_MAX][2] = { static int _set_signal_handler(int signal, void (handler)(int)); static void _signal_handler(int signal_number); static int _process_message(int msgID, const as_message_t* req); -static int _assign_pdn_address(int ue_pdn_type, int is_initial, int* pdn_type, OctetString* pdn); +static int _assign_pdn_address(int ue_pdn_type, bool is_initial, int* pdn_type, OctetString* pdn); /* Functions used to process messages received from the Access Stratum */ static int _process_cell_info_req(const cell_info_req_t* req, cell_info_cnf_t* rsp); @@ -283,7 +283,7 @@ int main (int argc, const char* argv[]) /* * Network simulator main loop */ - while (TRUE) { + while (true) { as_message_t msg; /* Receive message from the NAS */ @@ -1072,11 +1072,11 @@ static int _process_pdn_connectivity_request(const pdn_connectivity_request_msg* /* Assign PDN address */ if (apn.length > 0) { request->accesspointname.accesspointnamevalue = apn; - esm_cause = _assign_pdn_address(requested_pdn_type, FALSE, &pdn_type, + esm_cause = _assign_pdn_address(requested_pdn_type, false, &pdn_type, &request->pdnaddress.pdnaddressinformation); } else { request->accesspointname.accesspointnamevalue = EURECOM_APN; - esm_cause = _assign_pdn_address(requested_pdn_type, TRUE, &pdn_type, + esm_cause = _assign_pdn_address(requested_pdn_type, true, &pdn_type, &request->pdnaddress.pdnaddressinformation); } diff --git a/openair3/NAS/TEST/USER/user_simulator.c b/openair3/NAS/TEST/USER/user_simulator.c index 1c429c3b850..3050c166927 100644 --- a/openair3/NAS/TEST/USER/user_simulator.c +++ b/openair3/NAS/TEST/USER/user_simulator.c @@ -192,7 +192,7 @@ int main (int argc, const char* argv[]) /* * User simulator main loop */ - while (TRUE) { + while (true) { char c; int len; @@ -293,7 +293,7 @@ static void _signal_handler(int signal_number) */ static void* _receive_thread(void* arg) { - while (TRUE) { + while (true) { /* Receive AT response from the NAS sublayer */ int rbytes = USER_RECV(_user_simulator_recv_buffer, USER_SIMULATOR_BUFFER_SIZE); diff --git a/openair3/NAS/UE/API/USER/at_command.c b/openair3/NAS/UE/API/USER/at_command.c index ab85b2d2fa6..a6591c67482 100644 --- a/openair3/NAS/UE/API/USER/at_command.c +++ b/openair3/NAS/UE/API/USER/at_command.c @@ -354,7 +354,7 @@ static int ParseString(char * at_str, at_command_t* at_command) char* terminal_character_index = NULL; int num_of_chars_to_compare = -1; int handler_index; - int handler_found = FALSE; + bool handler_found = false; int check_for_carriage_return_index = 0; /* @@ -415,7 +415,7 @@ static int ParseString(char * at_str, at_command_t* at_command) if (strncasecmp(at_str, _at_command_handler[handler_index].command, num_of_chars_to_compare) != 0) continue; - handler_found = TRUE; + handler_found = true; break; } @@ -681,7 +681,7 @@ static unsigned int NumberOfParameters(const unsigned char* str) ** Others: None ** ** ** ** Outputs: None ** - ** Return: TRUE, FALSE ** + ** Return: true, false ** ** Others: None ** ** ** ***************************************************************************/ @@ -689,11 +689,11 @@ static unsigned int IsNumeric(const char* str, size_t len) { while (len-- > 0) { if (!isdigit(str[len])) { - return FALSE; + return false; } } - return TRUE; + return true; } /****************************************************************************/ @@ -719,7 +719,7 @@ static int parse_e1(const char* string, int position, at_command_t* at_command) static int parse_q0(const char* string, int position, at_command_t* at_command) { /* Result code suppression Q0 */ - at_error_code_suppression_q1 = FALSE; + at_error_code_suppression_q1 = false; at_command->id = 0; at_command->mask = AT_COMMAND_NO_PARAM; return at_command->id; @@ -728,7 +728,7 @@ static int parse_q0(const char* string, int position, at_command_t* at_command) static int parse_q1(const char* string, int position, at_command_t* at_command) { /* Result code suppression Q1 */ - at_error_code_suppression_q1 = TRUE; + at_error_code_suppression_q1 = true; at_command->id = 0; at_command->mask = AT_COMMAND_NO_PARAM; return at_command->id; @@ -738,7 +738,7 @@ static int parse_v0(const char* string, int position, at_command_t* at_command) { /* Response format V0 (numeric result code + limited header) */ at_error_format = AT_ERROR_NUMERIC; - at_response_format_v1 = FALSE; + at_response_format_v1 = false; at_command->id = 0; at_command->mask = AT_COMMAND_NO_PARAM; return at_command->id; @@ -748,7 +748,7 @@ static int parse_v1(const char* string, int position, at_command_t* at_command) { /* Response format V1 (verbose result code + full header) */ at_error_format = AT_ERROR_VERBOSE; - at_response_format_v1 = TRUE; + at_response_format_v1 = true; at_command->id = 0; at_command->mask = AT_COMMAND_NO_PARAM; return at_command->id; diff --git a/openair3/NAS/UE/API/USER/at_error.c b/openair3/NAS/UE/API/USER/at_error.c index d004c897368..bad7127adc4 100644 --- a/openair3/NAS/UE/API/USER/at_error.c +++ b/openair3/NAS/UE/API/USER/at_error.c @@ -55,10 +55,10 @@ extern int at_response_format_v1; /* * Result code suppression indicator (set by ATQ0 and ATQ1) * ------------------------------------------------------- - * FALSE - Result codes are transmitted to the user application - * TRUE - Result codes are suppressed and not transmitted + * false - Result codes are transmitted to the user application + * true - Result codes are suppressed and not transmitted */ -int at_error_code_suppression_q1 = FALSE; +bool at_error_code_suppression_q1 = false; /* * Verbose mode indicator (set by ATV0, ATV1 and AT+CMEE) diff --git a/openair3/NAS/UE/API/USER/at_response.c b/openair3/NAS/UE/API/USER/at_response.c index 859db90d7e0..eef0385750c 100644 --- a/openair3/NAS/UE/API/USER/at_response.c +++ b/openair3/NAS/UE/API/USER/at_response.c @@ -52,10 +52,10 @@ Description Defines structure of the AT command response returned after /* * Response format indicator (set by ATV0 and ATV1) * ----------------------------------------------- - * TRUE - <CR><LF><text><CR><LF>, <CR><LF><verbose code><CR><LF> - * FALSE - <text><CR><LF>, <numeric code><CR><LF> + * true - <CR><LF><text><CR><LF>, <CR><LF><verbose code><CR><LF> + * false - <text><CR><LF>, <numeric code><CR><LF> */ -int at_response_format_v1 = TRUE; +bool at_response_format_v1 = true; /****************************************************************************/ /******************* L O C A L D E F I N I T I O N S *******************/ diff --git a/openair3/NAS/UE/EMM/Attach.c b/openair3/NAS/UE/EMM/Attach.c index 5e7a1f578b7..52f7ebce448 100644 --- a/openair3/NAS/UE/EMM/Attach.c +++ b/openair3/NAS/UE/EMM/Attach.c @@ -146,7 +146,7 @@ int emm_proc_attach(nas_user_t *user, emm_proc_attach_type_t type) /* Update the emergency bearer service indicator */ if (type == EMM_ATTACH_TYPE_EMERGENCY) { - user->emm_data->is_emergency = TRUE; + user->emm_data->is_emergency = true; } /* Setup initial NAS information message to transfer */ @@ -211,7 +211,7 @@ int emm_proc_attach(nas_user_t *user, emm_proc_attach_type_t type) } /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_as->sctx, user->emm_data->security, FALSE, FALSE); + emm_as_set_security_data(&emm_as->sctx, user->emm_data->security, false, false); emm_as->ksi = EMM_AS_NO_KEY_AVAILABLE; if (user->emm_data->security) { @@ -230,8 +230,8 @@ int emm_proc_attach(nas_user_t *user, emm_proc_attach_type_t type) * is requested to setup a default EPS bearer */ esm_sap.primitive = ESM_PDN_CONNECTIVITY_REQ; - esm_sap.is_standalone = FALSE; - esm_sap.data.pdn_connect.is_defined = TRUE; + esm_sap.is_standalone = false; + esm_sap.data.pdn_connect.is_defined = true; esm_sap.data.pdn_connect.cid = 1; /* TODO: PDN type should be set according to the IP capability of the UE */ esm_sap.data.pdn_connect.pdn_type = NET_PDN_TYPE_IPV4; @@ -387,7 +387,7 @@ int emm_proc_attach_accept(nas_user_t *user, long t3412, long t3402, long t3423, if (n_eplmns > 0) { for (i = 0; (i < n_eplmns) && (i < EMM_DATA_EPLMN_MAX); i++) { - int is_forbidden = FALSE; + bool is_forbidden = false; if (!user->emm_data->is_emergency) { /* If the attach procedure is not for emergency bearer @@ -395,7 +395,7 @@ int emm_proc_attach_accept(nas_user_t *user, long t3412, long t3402, long t3423, * code that is already in the list of forbidden PLMNs */ for (j = 0; j < user->emm_data->fplmn.n_plmns; j++) { if (PLMNS_ARE_EQUAL(eplmn[i], user->emm_data->fplmn.plmn[j])) { - is_forbidden = TRUE; + is_forbidden = true; break; } } @@ -418,7 +418,7 @@ int emm_proc_attach_accept(nas_user_t *user, long t3412, long t3402, long t3423, * Notify ESM that a default EPS bearer has to be activated */ esm_sap.primitive = ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_REQ; - esm_sap.is_standalone = FALSE; + esm_sap.is_standalone = false; esm_sap.recv = esm_msg_pP; rc = esm_sap_send(user, &esm_sap); @@ -445,7 +445,7 @@ int emm_proc_attach_accept(nas_user_t *user, long t3412, long t3402, long t3423, emm_sap.u.emm_as.u.data.ueid = user->ueid; /* Setup EPS NAS security data */ emm_as_set_security_data(&emm_sap.u.emm_as.u.data.sctx, - user->emm_data->security, FALSE, TRUE); + user->emm_data->security, false, true); /* Get the activate default EPS bearer context accept message * to be transfered within the ESM container of the attach * complete message */ @@ -546,7 +546,7 @@ int emm_proc_attach_reject(nas_user_t *user, int emm_cause, const OctetString *e case EMM_CAUSE_EPS_NOT_ALLOWED: case EMM_CAUSE_BOTH_NOT_ALLOWED: /* Consider the USIM as invalid for EPS services */ - user->emm_data->usim_is_valid = FALSE; + user->emm_data->usim_is_valid = false; /* Delete the list of equivalent PLMNs */ user->emm_data->nvdata.eplmn.n_plmns = 0; break; @@ -682,7 +682,7 @@ int emm_proc_attach_reject(nas_user_t *user, int emm_cause, const OctetString *e if (esm_msg_pP != NULL) { esm_sap_t esm_sap; esm_sap.primitive = ESM_PDN_CONNECTIVITY_REJ; - esm_sap.is_standalone = FALSE; + esm_sap.is_standalone = false; esm_sap.recv = esm_msg_pP; rc = esm_sap_send(user, &esm_sap); } @@ -731,7 +731,7 @@ int emm_proc_attach_complete(void *args) /* Set the EPS update status to EU1 UPDATED */ user->emm_data->status = EU1_UPDATED; - user->emm_data->is_attached = TRUE; + user->emm_data->is_attached = true; /* * Notify EMM that network attach complete message has been delivered @@ -747,7 +747,7 @@ int emm_proc_attach_complete(void *args) * Complete message */ esm_sap.primitive = ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_CNF; - esm_sap.is_standalone = FALSE; + esm_sap.is_standalone = false; rc = esm_sap_send(user, &esm_sap); } @@ -766,7 +766,7 @@ int emm_proc_attach_complete(void *args) ** The UE shall restart the attach procedure when timer ** ** T3411 expires. ** ** ** - ** Inputs: is_initial: TRUE if the NAS message that failed to be ** + ** Inputs: is_initial: true if the NAS message that failed to be ** ** transfered is an initial NAS message (ESM ** ** message embedded within an Attach Request ** ** message) ** @@ -778,7 +778,7 @@ int emm_proc_attach_complete(void *args) ** Others: T3410, T3411 ** ** ** ***************************************************************************/ -int emm_proc_attach_failure(int is_initial, void *args) +int emm_proc_attach_failure(bool is_initial, void *args) { LOG_FUNC_IN; int rc = RETURNok; @@ -804,7 +804,7 @@ int emm_proc_attach_failure(int is_initial, void *args) * to be transmitted */ esm_sap.primitive = ESM_PDN_CONNECTIVITY_REJ; - esm_sap.is_standalone = FALSE; + esm_sap.is_standalone = false; esm_sap.recv = NULL; } else { /* @@ -813,7 +813,7 @@ int emm_proc_attach_failure(int is_initial, void *args) * has failed to be transmitted */ esm_sap.primitive = ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_REJ; - esm_sap.is_standalone = FALSE; + esm_sap.is_standalone = false; esm_sap.recv = NULL; } @@ -919,7 +919,7 @@ int emm_proc_attach_set_emergency(emm_data_t *emm_data) LOG_TRACE(WARNING, "EMM-PROC - UE is now attached to the network for " "emergency bearer services only"); - emm_data->is_emergency = TRUE; + emm_data->is_emergency = true; LOG_FUNC_RETURN(RETURNok); } @@ -950,7 +950,7 @@ int emm_proc_attach_set_detach(void *nas_user) "EMM-PROC - UE is now locally detached from the network"); /* Reset the network attachment indicator */ - user->emm_data->is_attached = FALSE; + user->emm_data->is_attached = false; /* * Notify that the UE is locally detached from the network */ diff --git a/openair3/NAS/UE/EMM/Authentication.c b/openair3/NAS/UE/EMM/Authentication.c index a2762d08e83..a3b58f89f42 100644 --- a/openair3/NAS/UE/EMM/Authentication.c +++ b/openair3/NAS/UE/EMM/Authentication.c @@ -129,7 +129,7 @@ static int _authentication_kasme(const OctetString *autn, ** authentication challenge data and respond with an AUTHEN- ** ** TICATION RESPONSE message to the network. ** ** ** - ** Inputs: native_ksi: TRUE if the security context is of type ** + ** Inputs: native_ksi: true if the security context is of type ** ** native (for KSIASME) ** ** ksi: The NAS ket sey identifier ** ** rand: Authentication parameter RAND ** @@ -179,14 +179,14 @@ int emm_proc_authentication_request(nas_user_t *user, int native_ksi, int ksi, OctetString res = {AUTH_RES_SIZE, authentication_data->res}; if ((memcmp(authentication_data->rand, rand->value, AUTH_CK_SIZE) != 0) || - (authentication_data->auth_process_started == FALSE)) { + (authentication_data->auth_process_started == false)) { /* * There is no valid stored RAND in the ME or the stored RAND is * different from the new received value in the AUTHENTICATION * REQUEST message OR if this is first time UE starting the * Authentication process */ - authentication_data->auth_process_started = TRUE; + authentication_data->auth_process_started = true; OctetString auts; auts.length = 0; auts.value = (uint8_t *)malloc(AUTH_AUTS_SIZE); @@ -308,7 +308,7 @@ int emm_proc_authentication_request(nas_user_t *user, int native_ksi, int ksi, emm_sap.u.emm_as.u.security.res = &res; /* Setup EPS NAS security data */ emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, - user->emm_data->security, FALSE, TRUE); + user->emm_data->security, false, true); rc = emm_sap_send(user, &emm_sap); if (rc != RETURNerror) { @@ -398,7 +398,7 @@ int emm_proc_authentication_reject(nas_user_t *user) } /* Consider the USIM invalid */ - user->emm_data->usim_is_valid = FALSE; + user->emm_data->usim_is_valid = false; /* Stop timer T3410 */ if (emm_timers->T3410.id != NAS_TIMER_INACTIVE_ID) { @@ -652,7 +652,7 @@ static int _authentication_abnormal_cases_cde(nas_user_t *user, int emm_cause, emm_sap.u.emm_as.u.security.auts = auts; /* Setup EPS NAS security data */ emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, - user->emm_data->security, FALSE, TRUE); + user->emm_data->security, false, true); rc = emm_sap_send(user, &emm_sap); if (rc != RETURNerror) { diff --git a/openair3/NAS/UE/EMM/Detach.c b/openair3/NAS/UE/EMM/Detach.c index b61bcdc14dc..654486226e0 100644 --- a/openair3/NAS/UE/EMM/Detach.c +++ b/openair3/NAS/UE/EMM/Detach.c @@ -114,7 +114,7 @@ static int _emm_detach_abort(nas_user_t *user, emm_proc_detach_type_t type); ** Return: RETURNok, RETURNerror ** ** ** ***************************************************************************/ -int emm_proc_detach(nas_user_t *user, emm_proc_detach_type_t type, int switch_off) +int emm_proc_detach(nas_user_t *user, emm_proc_detach_type_t type, bool switch_off) { LOG_FUNC_IN; @@ -154,7 +154,7 @@ int emm_proc_detach(nas_user_t *user, emm_proc_detach_type_t type, int switch_of emm_as->guti = user->emm_data->guti; emm_as->ueid = user->ueid; /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_as->sctx, user->emm_data->security, FALSE, TRUE); + emm_as_set_security_data(&emm_as->sctx, user->emm_data->security, false, true); /* * Notify EMM-AS SAP that Detach Request message has to @@ -280,7 +280,7 @@ int emm_proc_detach_accept(void* args) ** Others: None ** ** ** ***************************************************************************/ -int emm_proc_detach_failure(int is_initial, void *args) +int emm_proc_detach_failure(bool is_initial, void *args) { LOG_FUNC_IN; @@ -405,8 +405,7 @@ void *emm_detach_t3421_handler(void *args) emm_as->guti = user->emm_data->guti; emm_as->ueid = user->ueid; /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_as->sctx, user->emm_data->security, - FALSE, TRUE); + emm_as_set_security_data(&emm_as->sctx, user->emm_data->security, false, true); /* * Notify EMM-AS SAP that Detach Request message has to diff --git a/openair3/NAS/UE/EMM/EmmStatusHdl.c b/openair3/NAS/UE/EMM/EmmStatusHdl.c index 367d0327f4f..9ac2fc794b9 100644 --- a/openair3/NAS/UE/EMM/EmmStatusHdl.c +++ b/openair3/NAS/UE/EMM/EmmStatusHdl.c @@ -137,8 +137,7 @@ int emm_proc_status(nas_user_t *user, int emm_cause) emm_sap.u.emm_as.u.status.guti = user->emm_data->guti; sctx = user->emm_data->security; /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_sap.u.emm_as.u.status.sctx, sctx, - FALSE, TRUE); + emm_as_set_security_data(&emm_sap.u.emm_as.u.status.sctx, sctx, false, true); rc = emm_sap_send(user, &emm_sap); diff --git a/openair3/NAS/UE/EMM/Identification.c b/openair3/NAS/UE/EMM/Identification.c index 0364c6d22f2..d4fc85a931b 100644 --- a/openair3/NAS/UE/EMM/Identification.c +++ b/openair3/NAS/UE/EMM/Identification.c @@ -199,8 +199,7 @@ int emm_proc_identification_request(nas_user_t *user, emm_proc_identity_type_t t emm_sap.u.emm_as.u.security.ueid = user->ueid; emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_IDENT; /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, - user->emm_data->security, FALSE, TRUE); + emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, user->emm_data->security, false, true); rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); diff --git a/openair3/NAS/UE/EMM/IdleMode.c b/openair3/NAS/UE/EMM/IdleMode.c index 362d5e5b4af..50a318355c5 100644 --- a/openair3/NAS/UE/EMM/IdleMode.c +++ b/openair3/NAS/UE/EMM/IdleMode.c @@ -663,8 +663,8 @@ int emm_proc_plmn_selection(nas_user_t *user, int index) ** to camp on an acceptable cell, irrespective of its PLMN ** ** identity, so that only emergency calls can be made. ** ** ** - ** Inputs: found: TRUE if a suitable cell of the chosen ** - ** PLMN has been found; FALSE otherwise. ** + ** Inputs: found: true if a suitable cell of the chosen ** + ** PLMN has been found; false otherwise. ** ** tac: The code of the location/tracking area the ** ** chosen PLMN belongs to ** ** ci: The identifier of the cell ** @@ -685,7 +685,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci, emm_plmn_list_t *emm_plmn_list = user->emm_plmn_list; user_api_id_t *user_api_id = user->user_api_id; int index = emm_plmn_list->index; - int select_next_plmn = FALSE; + bool select_next_plmn = false; LOG_TRACE(INFO, "EMM-IDLE - %s cell found for PLMN %d in %s mode", (found)? "One" : "No", index, @@ -694,7 +694,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci, "Automatic/manual"); if (found) { - int is_forbidden = FALSE; + bool is_forbidden = false; /* Select the PLMN of which a suitable cell has been found */ emm_data->splmn = *emm_plmn_list->plmn[index]; @@ -721,7 +721,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci, /* Check if the selected PLMN is in the forbidden list */ for (i = 0; i < emm_data->fplmn.n_plmns; i++) { if (PLMNS_ARE_EQUAL(emm_data->splmn, emm_data->fplmn.plmn[i])) { - is_forbidden = TRUE; + is_forbidden = true; break; } } @@ -730,7 +730,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci, for (i = 0; i < emm_data->fplmn_gprs.n_plmns; i++) { if (PLMNS_ARE_EQUAL(emm_data->splmn, emm_data->fplmn_gprs.plmn[i])) { - is_forbidden = TRUE; + is_forbidden = true; break; } } @@ -745,7 +745,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci, if (!is_forbidden) { for (i = 0; i < emm_data->ftai.n_tais; i++) { if (TAIS_ARE_EQUAL(tai, emm_data->ftai.tai[i])) { - is_forbidden = TRUE; + is_forbidden = true; break; } } @@ -754,7 +754,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci, if (!is_forbidden) { for (i = 0; i < emm_data->ftai_roaming.n_tais; i++) { if (TAIS_ARE_EQUAL(tai, emm_data->ftai_roaming.tai[i])) { - is_forbidden = TRUE; + is_forbidden = true; break; } } @@ -793,7 +793,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci, * Try to select the next PLMN in the ordered list of available PLMNs */ index += 1; - select_next_plmn = TRUE; + select_next_plmn = true; /* Bypass the previously selected PLMN */ if (index == emm_plmn_list->splmn) { @@ -809,7 +809,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci, * registered or equivalent PLMNs is ongoing */ index += 1; - select_next_plmn = TRUE; + select_next_plmn = true; } else if (emm_data->plmn_mode == EMM_DATA_PLMN_MANUAL) { @@ -830,7 +830,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci, */ emm_data->plmn_mode = EMM_DATA_PLMN_AUTO; index = emm_plmn_list->hplmn; - select_next_plmn = TRUE; + select_next_plmn = true; } /* @@ -851,7 +851,7 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci, } else { /* No suitable cell of any PLMN within the ordered list * of available PLMNs has been found */ - select_next_plmn = FALSE; + select_next_plmn = false; emm_sap.primitive = EMMREG_NO_CELL; } } @@ -892,11 +892,11 @@ int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci, if (emm_plmn_list->splmn == emm_plmn_list->rplmn) { /* The selected PLMN is the registered PLMN */ LOG_TRACE(INFO, "EMM-IDLE - The selected PLMN is the registered PLMN"); - emm_data->is_rplmn = TRUE; + emm_data->is_rplmn = true; } else if (emm_plmn_list->splmn < emm_plmn_list->hplmn) { /* The selected PLMN is in the list of equivalent PLMNs */ LOG_TRACE(INFO, "EMM-IDLE - The selected PLMN is in the list of equivalent PLMNs"); - emm_data->is_eplmn = TRUE; + emm_data->is_eplmn = true; } /* diff --git a/openair3/NAS/UE/EMM/LowerLayer.c b/openair3/NAS/UE/EMM/LowerLayer.c index 01b07fc3560..538ba210991 100644 --- a/openair3/NAS/UE/EMM/LowerLayer.c +++ b/openair3/NAS/UE/EMM/LowerLayer.c @@ -208,7 +208,7 @@ int lowerlayer_data_ind(nas_user_t *user, const OctetString *data) LOG_FUNC_IN; esm_sap.primitive = ESM_UNITDATA_IND; - esm_sap.is_standalone = TRUE; + esm_sap.is_standalone = true; esm_sap.ueid = user->ueid; esm_sap.recv = data; @@ -250,7 +250,7 @@ int lowerlayer_data_req(nas_user_t *user, const OctetString *data) emm_sap.u.emm_as.u.data.NASmsg.length = data->length; emm_sap.u.emm_as.u.data.NASmsg.value = data->value; /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_sap.u.emm_as.u.data.sctx, sctx, FALSE, TRUE); + emm_as_set_security_data(&emm_sap.u.emm_as.u.data.sctx, sctx, false, true); rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); @@ -336,7 +336,7 @@ int emm_proc_lowerlayer_success(lowerlayer_data_t *lowerlayer_data) ** Description: Handles EMM procedure to be executed upon receiving noti- ** ** fication that data failed to be delivered to the network. ** ** ** - ** Inputs: is_initial: TRUE if the NAS message that failed to be ** + ** Inputs: is_initial: true if the NAS message that failed to be ** ** transfered is an initial NAS message ** ** Others: None ** ** ** @@ -345,7 +345,7 @@ int emm_proc_lowerlayer_success(lowerlayer_data_t *lowerlayer_data) ** Others: None ** ** ** ***************************************************************************/ -int emm_proc_lowerlayer_failure(lowerlayer_data_t *lowerlayer_data, int is_initial) +int emm_proc_lowerlayer_failure(lowerlayer_data_t *lowerlayer_data, bool is_initial) { LOG_FUNC_IN; diff --git a/openair3/NAS/UE/EMM/LowerLayer.h b/openair3/NAS/UE/EMM/LowerLayer.h index 0d8eefc7f38..ed60e379bc7 100644 --- a/openair3/NAS/UE/EMM/LowerLayer.h +++ b/openair3/NAS/UE/EMM/LowerLayer.h @@ -72,7 +72,7 @@ int emm_proc_lowerlayer_initialize(lowerlayer_data_t *lowerlayer_data, lowerlaye lowerlayer_release_callback_t release, void *args); int emm_proc_lowerlayer_success(lowerlayer_data_t *lowerlayer_data); -int emm_proc_lowerlayer_failure(lowerlayer_data_t *lowerlayer_data, int is_initial); +int emm_proc_lowerlayer_failure(lowerlayer_data_t *lowerlayer_data, bool is_initial); int emm_proc_lowerlayer_release(lowerlayer_data_t *lowerlayer_data); diff --git a/openair3/NAS/UE/EMM/LowerLayer_defs.h b/openair3/NAS/UE/EMM/LowerLayer_defs.h index 6035d4ed12d..1a0ae7d6564 100644 --- a/openair3/NAS/UE/EMM/LowerLayer_defs.h +++ b/openair3/NAS/UE/EMM/LowerLayer_defs.h @@ -11,7 +11,7 @@ typedef int (*lowerlayer_success_callback_t)(void *); * Type of EMM procedure callback function executed when data are not * delivered to the network because a lower layer failure occurred */ -typedef int (*lowerlayer_failure_callback_t)(int, void *); +typedef int (*lowerlayer_failure_callback_t)(bool, void *); /* * Type of EMM procedure callback function executed when NAS signalling diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c index f58cf4b9e09..3fa47094c7b 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c @@ -120,7 +120,7 @@ int EmmDeregisteredAttemptingToAttach(nas_user_t *user, const emm_reg_t *evt) /* * Data failed to be delivered to the network */ - rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, FALSE); + rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, false); break; default: diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c index 4310f963cd4..c0763009b85 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c @@ -133,7 +133,7 @@ int EmmDeregisteredLimitedService(nas_user_t *user, const emm_reg_t *evt) /* * Initial NAS message failed to be delivered to the network */ - rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, TRUE); + rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, true); break; case _EMMREG_LOWERLAYER_RELEASE: diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c index f77c2921a31..0925cb4e0f2 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c @@ -141,7 +141,7 @@ int EmmDeregisteredNormalService(nas_user_t *user, const emm_reg_t *evt) /* * Initial NAS message failed to be delivered to the network */ - rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, TRUE); + rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, true); break; case _EMMREG_LOWERLAYER_RELEASE: diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegistered.c b/openair3/NAS/UE/EMM/SAP/EmmRegistered.c index fbd3e1ce63e..2cd25f77d60 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmRegistered.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegistered.c @@ -143,7 +143,7 @@ int EmmRegistered(nas_user_t *user, const emm_reg_t *evt) /* * Data transfer message failed to be delivered */ - rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, FALSE); + rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, false); break; case _EMMREG_LOWERLAYER_RELEASE: diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c index 36929fc4d7f..a770e08bab2 100644 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c @@ -240,7 +240,7 @@ int EmmRegisteredInitiated(nas_user_t *user, const emm_reg_t *evt) * any message transfered by EMM common procedures requested * by the network. */ - rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, FALSE); + rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, false); break; case _EMMREG_LOWERLAYER_RELEASE: diff --git a/openair3/NAS/UE/EMM/SAP/emm_as.c b/openair3/NAS/UE/EMM/SAP/emm_as.c index ea4eefadeba..de6dee4a5e1 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_as.c +++ b/openair3/NAS/UE/EMM/SAP/emm_as.c @@ -679,7 +679,7 @@ static int _emm_as_cell_info_res(nas_user_t *user, const emm_as_cell_info_t *msg int AcT = NET_ACCESS_EUTRAN; - if (msg->found == TRUE) { + if (msg->found == true) { /* Get the first supported access technology */ while (AcT != NET_ACCESS_UNAVAILABLE) { if (msg->rat & (1 << AcT)) { @@ -1081,7 +1081,7 @@ static int _emm_as_data_req(const emm_data_t *emm_data, const emm_as_data_t *msg LOG_FUNC_IN; ul_info_transfer_req_t *as_msg = (ul_info_transfer_req_t *)ul_info_transfer_req_unaligned; int size = 0; - int is_encoded = FALSE; + bool is_encoded = false; LOG_TRACE(INFO, "EMMAS-SAP - Send AS data transfer request"); @@ -1114,7 +1114,7 @@ static int _emm_as_data_req(const emm_data_t *emm_data, const emm_as_data_t *msg default: /* Send other NAS messages as already encoded ESM messages */ size = msg->NASmsg.length; - is_encoded = TRUE; + is_encoded = true; break; } diff --git a/openair3/NAS/UE/EMM/SAP/emm_asDef.h b/openair3/NAS/UE/EMM/SAP/emm_asDef.h index 7bd464ec04d..4f6182a2c9c 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_asDef.h +++ b/openair3/NAS/UE/EMM/SAP/emm_asDef.h @@ -150,7 +150,7 @@ typedef struct emm_as_establish_s { uint32_t ueid; /* UE lower layer identifier */ emm_as_EPS_identity_t UEid; /* UE's EPS mobile identity */ emm_as_security_data_t sctx;/* EPS NAS security context */ - int switch_off; /* TRUE if the UE is switched off */ + bool switch_off; /* true if the UE is switched off */ uint8_t type; /* Network attach/detach type */ uint8_t RRCcause; /* Connection establishment cause */ uint8_t RRCtype; /* Associated call type */ @@ -194,7 +194,7 @@ typedef struct emm_as_data_s { uint32_t ueid; /* UE lower layer identifier */ const GUTI_t *guti; /* GUTI temporary mobile identity */ emm_as_security_data_t sctx;/* EPS NAS security context */ - int switch_off; /* TRUE if the UE is switched off */ + bool switch_off; /* true if the UE is switched off */ uint8_t type; /* Network detach type */ uint8_t delivered; /* Data message delivery indicator */ #define EMM_AS_NAS_DATA_ATTACH 0x01 /* Attach complete */ diff --git a/openair3/NAS/UE/EMM/SAP/emm_esmDef.h b/openair3/NAS/UE/EMM/SAP/emm_esmDef.h index aac37b46bfb..6e7065f9139 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_esmDef.h +++ b/openair3/NAS/UE/EMM/SAP/emm_esmDef.h @@ -71,9 +71,9 @@ typedef enum { * --------------------------------------------- */ typedef struct { - int is_emergency; /* Indicates whether the PDN connection is established + bool is_emergency; /* Indicates whether the PDN connection is established * for emergency bearer services only */ - int is_attached; /* Indicates whether the UE remains attached to the + bool is_attached; /* Indicates whether the UE remains attached to the * network */ } emm_esm_establish_t; diff --git a/openair3/NAS/UE/EMM/SAP/emm_regDef.h b/openair3/NAS/UE/EMM/SAP/emm_regDef.h index b66c0565ea6..752f328375b 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_regDef.h +++ b/openair3/NAS/UE/EMM/SAP/emm_regDef.h @@ -100,7 +100,7 @@ typedef struct { * ------------------------------------- */ typedef struct { - int is_emergency; /* TRUE if the UE was attempting to register to + bool is_emergency; /* true if the UE was attempting to register to * the network for emergency services only */ } emm_reg_attach_t; @@ -109,7 +109,7 @@ typedef struct { * ------------------------------------- */ typedef struct { - int switch_off; /* TRUE if the UE is switched off */ + bool switch_off; /* true if the UE is switched off */ int type; /* Network detach type */ } emm_reg_detach_t; diff --git a/openair3/NAS/UE/EMM/SecurityModeControl.c b/openair3/NAS/UE/EMM/SecurityModeControl.c index f9a02b1a705..fd3332669b0 100644 --- a/openair3/NAS/UE/EMM/SecurityModeControl.c +++ b/openair3/NAS/UE/EMM/SecurityModeControl.c @@ -124,7 +124,7 @@ static void _security_release(emm_security_context_t *ctx); ** grity algorithm and ciphered with the selected NAS ciphe- ** ** ring algorithm. ** ** ** - ** Inputs: native_ksi: TRUE if the security context is of type ** + ** Inputs: native_ksi: true if the security context is of type ** ** native (for KSIASME) ** ** ksi: The NAS ket sey identifier ** ** seea: Selected EPS cyphering algorithm ** @@ -145,7 +145,7 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi, int rc = RETURNerror; int emm_cause = EMM_CAUSE_SUCCESS; - int security_context_is_new = FALSE; + int security_context_is_new = false; security_data_t *security_data = user->security_data; LOG_TRACE(INFO, "EMM-PROC - Security mode control requested (ksi=%d)", @@ -263,7 +263,7 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi, user->emm_data->security->ul_count.overflow = 0; user->emm_data->security->ul_count.seq_num = 0; /* Set new security context indicator */ - security_context_is_new = TRUE; + security_context_is_new = true; } } @@ -328,7 +328,7 @@ int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi, emm_sap.u.emm_as.u.security.emm_cause = emm_cause; /* Setup EPS NAS security data */ emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, - user->emm_data->security, security_context_is_new, TRUE); + user->emm_data->security, security_context_is_new, true); rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); diff --git a/openair3/NAS/UE/EMM/emmData.h b/openair3/NAS/UE/EMM/emmData.h index dfdfb34e77e..50219b78837 100644 --- a/openair3/NAS/UE/EMM/emmData.h +++ b/openair3/NAS/UE/EMM/emmData.h @@ -112,7 +112,7 @@ typedef struct { #define EMM_DETACH_COUNTER_MAX 5 unsigned int count; /* Counter used to limit the number of * subsequently detach attempts */ - int switch_off; /* UE switch-off indicator */ + bool switch_off; /* UE switch-off indicator */ emm_proc_detach_type_t type; /* Type of the detach procedure * currently in progress */ } emm_detach_data_t; @@ -249,8 +249,8 @@ typedef struct emm_data_s { emm_eps_update_t status; /* The current EPS update status */ emm_ecm_state_t ecm_status; /* The EPS Connection Management status */ - int is_attached; /* Network attachment indicator */ - int is_emergency; /* Emergency bearer services indicator*/ + bool is_attached; /* Network attachment indicator */ + bool is_emergency; /* Emergency bearer services indicator*/ /* Tracking Areas list the UE is registered to * Contains the list of TAIs that identify the tracking areas that diff --git a/openair3/NAS/UE/EMM/emm_main.c b/openair3/NAS/UE/EMM/emm_main.c index 329b59fae67..74676c8b36b 100644 --- a/openair3/NAS/UE/EMM/emm_main.c +++ b/openair3/NAS/UE/EMM/emm_main.c @@ -113,7 +113,7 @@ void _emm_attach_initialize(emm_attach_data_t *emm_attach_data) { void _emm_detach_initialize(emm_detach_data_t *emm_detach) { emm_detach->count = 0; - emm_detach->switch_off = FALSE; + emm_detach->switch_off = false; emm_detach->type = EMM_DETACH_TYPE_RESERVED; } @@ -137,7 +137,7 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c LOG_FUNC_IN; user->emm_data = calloc_or_fail(sizeof(emm_data_t)); /* USIM validity indicator */ - user->emm_data->usim_is_valid = FALSE; + user->emm_data->usim_is_valid = false; /* The IMEI read from the UE's non-volatile memory */ user->emm_data->imei = (imei_t *)malloc(sizeof(imei_t)); user->emm_data->imei->length = _emm_main_get_imei(user->emm_data->imei, imei); @@ -157,14 +157,14 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c user->emm_data->plmn_rat = NET_ACCESS_UNAVAILABLE; /* Selected PLMN */ memset(&user->emm_data->splmn, 0xFF, sizeof(plmn_t)); - user->emm_data->is_rplmn = FALSE; - user->emm_data->is_eplmn = FALSE; + user->emm_data->is_rplmn = false; + user->emm_data->is_eplmn = false; /* Radio Access Technology of the serving cell */ user->emm_data->rat = NET_ACCESS_UNAVAILABLE; /* Network registration status */ user->emm_data->stat = NET_REG_STATE_OFF; - user->emm_data->is_attached = FALSE; - user->emm_data->is_emergency = FALSE; + user->emm_data->is_attached = false; + user->emm_data->is_emergency = false; /* Location/Tracking area code */ user->emm_data->tac = 0; // two byte in hexadecimal format /* Identifier of the serving cell */ @@ -201,7 +201,7 @@ void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const c /* The USIM application is present and valid */ LOG_TRACE(INFO, "EMM-MAIN - USIM application data successfully read"); - user->emm_data->usim_is_valid = TRUE; + user->emm_data->usim_is_valid = true; /* print keys (for debugging) */ { @@ -844,12 +844,12 @@ AcT_t emm_main_get_plmn_rat(emm_data_t *emm_data) ** Others: user->emm_data-> ** ** ** ** Outputs: None ** - ** Return: TRUE if the UE is currently attached to ** - ** the network; FALSE otherwise. ** + ** Return: true if the UE is currently attached to ** + ** the network; false otherwise. ** ** Others: None ** ** ** ***************************************************************************/ -int emm_main_is_attached(emm_data_t *emm_data) +bool emm_main_is_attached(emm_data_t *emm_data) { LOG_FUNC_IN; LOG_FUNC_RETURN (emm_data->is_attached); @@ -866,13 +866,13 @@ int emm_main_is_attached(emm_data_t *emm_data) ** Others: user->emm_data-> ** ** ** ** Outputs: None ** - ** Return: TRUE if the UE is currently attached or is ** + ** Return: true if the UE is currently attached or is ** ** attempting to attach to the network for ** - ** emergency bearer services; FALSE otherwise ** + ** emergency bearer services; false otherwise ** ** Others: None ** ** ** ***************************************************************************/ -int emm_main_is_emergency(emm_data_t *emm_data) +bool emm_main_is_emergency(emm_data_t *emm_data) { LOG_FUNC_IN; LOG_FUNC_RETURN (emm_data->is_attached && emm_data->is_emergency); @@ -967,8 +967,8 @@ static int _emm_main_get_imei(imei_t *imei, const char *imei_str) ** Others: None ** ** ** ** Outputs: None ** - ** Return: TRUE if the first IMSI is found to match ** - ** the second; FALSE otherwise. ** + ** Return: true if the first IMSI is found to match ** + ** the second; false otherwise. ** ** Others: None ** ** ** ***************************************************************************/ @@ -977,16 +977,16 @@ static int _emm_main_imsi_cmp(imsi_t *imsi1, imsi_t *imsi2) int i; if (imsi1->length != imsi2->length) { - return FALSE; + return false; } for (i = 0; i < imsi1->length; i++) { if (imsi1->u.value[i] != imsi2->u.value[i]) { - return FALSE; + return false; } } - return TRUE; + return true; } /**************************************************************************** diff --git a/openair3/NAS/UE/EMM/emm_main.h b/openair3/NAS/UE/EMM/emm_main.h index d30f778e3b7..d081024548a 100644 --- a/openair3/NAS/UE/EMM/emm_main.h +++ b/openair3/NAS/UE/EMM/emm_main.h @@ -94,8 +94,8 @@ AcT_t emm_main_get_plmn_rat(emm_data_t *emm_data); const char *emm_main_get_registered_plmn(emm_plmn_list_t *emm_plmn_list, emm_data_t *emm_data, network_plmn_t *plmn, int format); /* User's getter for network attachment */ -int emm_main_is_attached(emm_data_t *emm_data); -int emm_main_is_emergency(emm_data_t *emm_data); +bool emm_main_is_attached(emm_data_t *emm_data); +bool emm_main_is_emergency(emm_data_t *emm_data); #endif /* __EMM_MAIN_H__*/ diff --git a/openair3/NAS/UE/EMM/emm_proc.h b/openair3/NAS/UE/EMM/emm_proc.h index 7d4024d9d63..b93bb33bf16 100644 --- a/openair3/NAS/UE/EMM/emm_proc.h +++ b/openair3/NAS/UE/EMM/emm_proc.h @@ -89,7 +89,7 @@ int emm_proc_attach_accept(nas_user_t *user, long T3412, long T3402, long T3423, const OctetString *esm_msg); int emm_proc_attach_reject(nas_user_t *user, int emm_cause, const OctetString *esm_msg); int emm_proc_attach_complete(void *args); -int emm_proc_attach_failure(int is_initial, void *args); +int emm_proc_attach_failure(bool is_initial, void *args); int emm_proc_attach_release(void *args); int emm_proc_attach_restart(nas_user_t *user); @@ -103,10 +103,10 @@ int emm_proc_attach_set_detach(void *user); * Detach procedure * -------------------------------------------------------------------------- */ -int emm_proc_detach(nas_user_t *user, emm_proc_detach_type_t type, int switch_off); +int emm_proc_detach(nas_user_t *user, emm_proc_detach_type_t type, bool switch_off); int emm_proc_detach_request(void *args); int emm_proc_detach_accept(void *args); -int emm_proc_detach_failure(int is_initial, void *args); +int emm_proc_detach_failure(bool is_initial, void *args); int emm_proc_detach_release(void *args); diff --git a/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c b/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c index 21c3da3f195..db95dd648f7 100644 --- a/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c +++ b/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c @@ -131,7 +131,7 @@ int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int } /* Assign dedicated EPS bearer context */ - int new_ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, FALSE); + int new_ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, false); if (new_ebi == ESM_EBI_UNASSIGNED) { /* 3GPP TS 24.301, section 6.4.2.5, abnormal cases a and b @@ -141,7 +141,7 @@ int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int int old_pid, old_bid; /* Locally deactivate the existing EPS bearer context and proceed * with the requested dedicated EPS bearer context activation */ - rc = esm_proc_eps_bearer_context_deactivate(user, TRUE, ebi, + rc = esm_proc_eps_bearer_context_deactivate(user, true, ebi, &old_pid, &old_bid); if (rc != RETURNok) { @@ -149,7 +149,7 @@ int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; } else { /* Assign new dedicated EPS bearer context */ - ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, FALSE); + ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, false); } } @@ -165,7 +165,7 @@ int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int *esm_cause = ESM_CAUSE_SYNTACTICAL_ERROR_IN_PACKET_FILTER; } else { /* Create new dedicated EPS bearer context */ - default_ebi = esm_ebr_context_create(esm_data, user->ueid, pid, ebi, FALSE, qos, tft); + default_ebi = esm_ebr_context_create(esm_data, user->ueid, pid, ebi, false, qos, tft); if (default_ebi != ESM_EBI_UNASSIGNED) { /* Dedicated EPS bearer contextx successfully created */ @@ -197,7 +197,7 @@ int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int ** Inputs: is_standalone: Not used ** ** ebi: EPS bearer identity ** ** msg: Encoded ESM message to be sent ** - ** ue_triggered: TRUE if the EPS bearer context procedure ** + ** ue_triggered: true if the EPS bearer context procedure ** ** was triggered by the UE ** ** Others: None ** ** ** @@ -206,8 +206,8 @@ int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_dedicated_eps_bearer_context_accept(nas_user_t *user, int is_standalone, int ebi, - OctetString *msg, int ue_triggered) +int esm_proc_dedicated_eps_bearer_context_accept(nas_user_t *user, bool is_standalone, int ebi, + OctetString *msg, bool ue_triggered) { LOG_FUNC_IN; @@ -268,8 +268,8 @@ int esm_proc_dedicated_eps_bearer_context_accept(nas_user_t *user, int is_standa ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_dedicated_eps_bearer_context_reject(nas_user_t *user, int is_standalone, int ebi, - OctetString *msg, int ue_triggered) +int esm_proc_dedicated_eps_bearer_context_reject(nas_user_t *user, bool is_standalone, int ebi, + OctetString *msg, bool ue_triggered) { LOG_FUNC_IN; diff --git a/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c b/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c index 7c528d75691..f61b1498226 100644 --- a/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c +++ b/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c @@ -103,7 +103,7 @@ int esm_proc_default_eps_bearer_context_request(nas_user_t *user, int pid, int e "requested by the network (ebi=%d)", ebi); /* Assign default EPS bearer context */ - int new_ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, TRUE); + int new_ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, true); if (new_ebi == ESM_EBI_UNASSIGNED) { /* 3GPP TS 24.301, section 6.4.1.5, abnormal cases a and b @@ -113,7 +113,7 @@ int esm_proc_default_eps_bearer_context_request(nas_user_t *user, int pid, int e int old_pid, old_bid; /* Locally deactivate the existing EPS bearer context and proceed * with the requested default EPS bearer context activation */ - rc = esm_proc_eps_bearer_context_deactivate(user, TRUE, ebi, + rc = esm_proc_eps_bearer_context_deactivate(user, true, ebi, &old_pid, &old_bid); if (rc != RETURNok) { @@ -121,13 +121,13 @@ int esm_proc_default_eps_bearer_context_request(nas_user_t *user, int pid, int e *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; } else { /* Assign new default EPS bearer context */ - ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, TRUE); + ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, true); } } if (ebi != ESM_EBI_UNASSIGNED) { /* Create new default EPS bearer context */ - ebi = esm_ebr_context_create(esm_data, user->ueid, pid, ebi, TRUE, qos, NULL); + ebi = esm_ebr_context_create(esm_data, user->ueid, pid, ebi, true, qos, NULL); if (ebi != ESM_EBI_UNASSIGNED) { /* Default EPS bearer contextx successfully created */ @@ -165,9 +165,9 @@ int esm_proc_default_eps_bearer_context_request(nas_user_t *user, int pid, int e ** te message ** ** ebi: EPS bearer identity ** ** msg: Encoded ESM message to be sent ** - ** ue_triggered: TRUE if the EPS bearer context procedure ** + ** ue_triggered: true if the EPS bearer context procedure ** ** was triggered by the UE (should be always ** - ** TRUE) ** + ** true) ** ** Others: None ** ** ** ** Outputs: None ** @@ -175,8 +175,8 @@ int esm_proc_default_eps_bearer_context_request(nas_user_t *user, int pid, int e ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_default_eps_bearer_context_accept(nas_user_t *user, int is_standalone, int ebi, - OctetString *msg, int ue_triggered) +int esm_proc_default_eps_bearer_context_accept(nas_user_t *user, bool is_standalone, int ebi, + OctetString *msg, bool ue_triggered) { LOG_FUNC_IN; @@ -245,8 +245,8 @@ int esm_proc_default_eps_bearer_context_accept(nas_user_t *user, int is_standalo ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_default_eps_bearer_context_reject(nas_user_t *user, int is_standalone, int ebi, - OctetString *msg, int ue_triggered) +int esm_proc_default_eps_bearer_context_reject(nas_user_t *user, bool is_standalone, int ebi, + OctetString *msg, bool ue_triggered) { LOG_FUNC_IN; @@ -344,7 +344,7 @@ int esm_proc_default_eps_bearer_context_failure(nas_user_t *user) "ESM-PROC - Default EPS bearer context activation failure"); /* Release the default EPS bearer context and enter state INACTIVE */ - int rc = esm_proc_eps_bearer_context_deactivate(user, TRUE, ebi, &pid, &bid); + int rc = esm_proc_eps_bearer_context_deactivate(user, true, ebi, &pid, &bid); if (rc != RETURNerror) { /* Reset default EPS bearer context internal data */ diff --git a/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c b/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c index 5adbae05c6f..742e70cd4a7 100644 --- a/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c +++ b/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c @@ -97,7 +97,7 @@ static int _eps_bearer_release(nas_user_t *user, int ebi, int *pid, int *bid); ** has an EPS bearer context with specified EPS bearer iden- ** ** tity activated. ** ** ** - ** Inputs: is local: TRUE if the EPS bearer context has to be ** + ** Inputs: is local: true if the EPS bearer context has to be ** ** locally released without peer-to-peer si- ** ** gnalling between the UE and the MME ** ** ebi: EPS bearer identity of the EPS bearer con- ** @@ -111,7 +111,7 @@ static int _eps_bearer_release(nas_user_t *user, int ebi, int *pid, int *bid); ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_eps_bearer_context_deactivate(nas_user_t *user, int is_local, int ebi, +int esm_proc_eps_bearer_context_deactivate(nas_user_t *user, bool is_local, int ebi, int *pid, int *bid) { LOG_FUNC_IN; @@ -213,7 +213,7 @@ int esm_proc_eps_bearer_context_deactivate_request(nas_user_t *user, int ebi, in * the PDN connection */ if (*esm_cause == ESM_CAUSE_REACTIVATION_REQUESTED) { esm_sap_t esm_sap; - int active = FALSE; + bool active = false; /* 3GPP TS 24.301, section 6.4.4.3 * The UE should re-initiate the UE requested PDN connectivity @@ -242,8 +242,8 @@ int esm_proc_eps_bearer_context_deactivate_request(nas_user_t *user, int ebi, in * Notify ESM to re-initiate PDN connectivity procedure */ esm_sap.primitive = ESM_PDN_CONNECTIVITY_REQ; - esm_sap.is_standalone = TRUE; - esm_sap.data.pdn_connect.is_defined = TRUE; + esm_sap.is_standalone = true; + esm_sap.data.pdn_connect.is_defined = true; esm_sap.data.pdn_connect.cid = pid + 1; rc = esm_sap_send(user, &esm_sap); } @@ -265,10 +265,10 @@ int esm_proc_eps_bearer_context_deactivate_request(nas_user_t *user, int ebi, in ** DEACTIVATE EPS BEARER CONTEXT ACCEPT message and entering ** ** the state BEARER CONTEXT INACTIVE. ** ** ** - ** Inputs: is_standalone: Should be always TRUE ** + ** Inputs: is_standalone: Should be always true ** ** ebi: EPS bearer identity ** ** msg: Encoded ESM message to be sent ** - ** ue_triggered: TRUE if the EPS bearer context procedure ** + ** ue_triggered: true if the EPS bearer context procedure ** ** was triggered by the UE ** ** Others: None ** ** ** @@ -277,8 +277,8 @@ int esm_proc_eps_bearer_context_deactivate_request(nas_user_t *user, int ebi, in ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_eps_bearer_context_deactivate_accept(nas_user_t *user, int is_standalone, int ebi, - OctetString *msg, int ue_triggered) +int esm_proc_eps_bearer_context_deactivate_accept(nas_user_t *user, bool is_standalone, int ebi, + OctetString *msg, bool ue_triggered) { LOG_FUNC_IN; @@ -371,7 +371,7 @@ static int _eps_bearer_release(nas_user_t *user, int ebi, int *pid, int *bid) LOG_TRACE(WARNING, "ESM-PROC - Failed to release EPS bearer context"); } else { /* Set the EPS bearer context state to INACTIVE */ - rc = esm_ebr_set_status(user_api_id, esm_ebr_data, ebi, ESM_EBR_INACTIVE, FALSE); + rc = esm_ebr_set_status(user_api_id, esm_ebr_data, ebi, ESM_EBR_INACTIVE, false); if (rc != RETURNok) { /* The EPS bearer context was already in INACTIVE state */ diff --git a/openair3/NAS/UE/ESM/EsmStatusHdl.c b/openair3/NAS/UE/ESM/EsmStatusHdl.c index def498a89b9..88f6550251f 100644 --- a/openair3/NAS/UE/ESM/EsmStatusHdl.c +++ b/openair3/NAS/UE/ESM/EsmStatusHdl.c @@ -149,7 +149,7 @@ int esm_proc_status_ind( ** ** ** Description: Initiates ESM status procedure. ** ** ** - ** Inputs: is_standalone: Not used - Always TRUE ** + ** Inputs: is_standalone: Not used - Always true ** ** ueid: UE lower layer identifier ** ** ebi: Not used ** ** msg: Encoded ESM status message to be sent ** @@ -161,9 +161,9 @@ int esm_proc_status_ind( ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_status(nas_user_t *user, int is_standalone, +int esm_proc_status(nas_user_t *user, bool is_standalone, int ebi, OctetString *msg, - int ue_triggered) + bool ue_triggered) { LOG_FUNC_IN; diff --git a/openair3/NAS/UE/ESM/PdnConnectivity.c b/openair3/NAS/UE/ESM/PdnConnectivity.c index d17b5fde3c7..a79320cccbd 100644 --- a/openair3/NAS/UE/ESM/PdnConnectivity.c +++ b/openair3/NAS/UE/ESM/PdnConnectivity.c @@ -80,7 +80,7 @@ Description Defines the PDN connectivity ESM procedure executed by the * PDN connection handlers */ static int _pdn_connectivity_create(esm_data_t *esm_data, int pid, const OctetString *apn, - esm_proc_pdn_type_t pdn_type, int is_emergency); + esm_proc_pdn_type_t pdn_type, bool is_emergency); static int _pdn_connectivity_update(esm_data_t *esm_data, int pid, const OctetString *apn, esm_proc_pdn_type_t pdn_type, const OctetString *pdn_addr, int esm_cause); static int _pdn_connectivity_delete(esm_data_t *esm_data, int pid); @@ -121,7 +121,7 @@ static void *_pdn_connectivity_t3482_handler(void *); ** to be defined or undefined ** ** pdn_type: PDN connection type (IPv4, IPv6, IPv4v6) ** ** apn: Access Point logical Name to be used ** - ** is_emergency: TRUE if the PDN connection has to be esta- ** + ** is_emergency: true if the PDN connection has to be esta- ** ** blished for emergency bearer services ** ** Others: None ** ** ** @@ -133,7 +133,7 @@ static void *_pdn_connectivity_t3482_handler(void *); ***************************************************************************/ int esm_proc_pdn_connectivity(nas_user_t *user, int cid, int is_to_define, esm_proc_pdn_type_t pdn_type, - const OctetString *apn, int is_emergency, + const OctetString *apn, bool is_emergency, unsigned int *pti) { LOG_FUNC_IN; @@ -270,7 +270,7 @@ int esm_proc_pdn_connectivity(nas_user_t *user, int cid, int is_to_define, ** pti: Procedure transaction identity ** ** msg: Encoded PDN connectivity request message ** ** to be sent ** - ** sent_by_ue: Not used - Always TRUE ** + ** sent_by_ue: Not used - Always true ** ** Others: None ** ** ** ** Outputs: None ** @@ -278,8 +278,8 @@ int esm_proc_pdn_connectivity(nas_user_t *user, int cid, int is_to_define, ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_pdn_connectivity_request(nas_user_t *user, int is_standalone, int pti, - OctetString *msg, int sent_by_ue) +int esm_proc_pdn_connectivity_request(nas_user_t *user, bool is_standalone, int pti, + OctetString *msg, bool sent_by_ue) { LOG_FUNC_IN; esm_pt_data_t *esm_pt_data = user->esm_pt_data; @@ -523,7 +523,7 @@ int esm_proc_pdn_connectivity_complete(nas_user_t *user) ** PDN connectivity procedure which is still pending in the ** ** PROCEDURE TRANSACTION INACTIVE or PENDING state. ** ** ** - ** Inputs: is_pending: TRUE if this PDN connectivity procedure ** + ** Inputs: is_pending: true if this PDN connectivity procedure ** ** transaction is in the PENDING state ** ** Others: None ** ** ** @@ -679,7 +679,7 @@ static void *_pdn_connectivity_t3482_handler(void *args) ** Inputs: pid: Identifier of the PDN connection entry ** ** apn: Access Point Name of the PDN connection ** ** pdn_type: PDN type (IPv4, IPv6, IPv4v6) ** - ** is_emergency: TRUE if the PDN connection has to be esta- ** + ** is_emergency: true if the PDN connection has to be esta- ** ** blished for emergency bearer services ** ** ** ** Outputs: None ** @@ -688,7 +688,7 @@ static void *_pdn_connectivity_t3482_handler(void *args) ***************************************************************************/ static int _pdn_connectivity_create(esm_data_t *esm_data, int pid, const OctetString *apn, esm_proc_pdn_type_t pdn_type, - int is_emergency) + bool is_emergency) { esm_pdn_t *pdn = NULL; @@ -720,7 +720,7 @@ static int _pdn_connectivity_create(esm_data_t *esm_data, int pid, const OctetSt /* Set the PDN connection identifier */ esm_data->pdn[pid].pid = pid; /* Reset the PDN connection active indicator */ - esm_data->pdn[pid].is_active = FALSE; + esm_data->pdn[pid].is_active = false; /* Setup the PDN connection data */ esm_data->pdn[pid].data = pdn; } @@ -744,7 +744,7 @@ static int _pdn_connectivity_create(esm_data_t *esm_data, int pid, const OctetSt } pdn->type = pdn_type; - pdn->addr_realloc = FALSE; + pdn->addr_realloc = false; return (RETURNok); } @@ -825,7 +825,7 @@ static int _pdn_connectivity_update(esm_data_t *esm_data, int pid, const OctetSt * the other IP version using the UE requested PDN connectivity * procedure to the same APN with a single address PDN type * (IPv4 or IPv6) other than the one already activated */ - pdn->addr_realloc = TRUE; + pdn->addr_realloc = true; } else if ( (esm_cause == ESM_CAUSE_PDN_TYPE_IPV4_ONLY_ALLOWED) || (esm_cause == ESM_CAUSE_PDN_TYPE_IPV6_ONLY_ALLOWED) ) { /* The UE requested IPv4 or IPv6 address and the network allows @@ -833,9 +833,9 @@ static int _pdn_connectivity_update(esm_data_t *esm_data, int pid, const OctetSt * The UE shall not subsequently initiate another UE requested * PDN connectivity procedure to the same APN to obtain a PDN * type different from the one allowed by the network */ - pdn->addr_realloc = FALSE; + pdn->addr_realloc = false; } else if (pdn_type != ESM_PDN_TYPE_IPV4V6) { - pdn->addr_realloc = TRUE; + pdn->addr_realloc = true; } return (RETURNok); diff --git a/openair3/NAS/UE/ESM/PdnDisconnect.c b/openair3/NAS/UE/ESM/PdnDisconnect.c index 6665126e40a..cb7b3225bcf 100644 --- a/openair3/NAS/UE/ESM/PdnDisconnect.c +++ b/openair3/NAS/UE/ESM/PdnDisconnect.c @@ -155,7 +155,7 @@ int esm_proc_pdn_disconnect(esm_data_t *esm_data, int cid, unsigned int *pti, un ** PDN DISCONNECT REQUEST message to the MME, starting timer ** ** T3492 and entering state PROCEDURE TRANSACTION PENDING. ** ** ** - ** Inputs: is_standalone: Should be always TRUE ** + ** Inputs: is_standalone: Should be always true ** ** pti: Procedure transaction identity ** ** msg: Encoded PDN disconnect request message to ** ** be sent ** @@ -167,8 +167,8 @@ int esm_proc_pdn_disconnect(esm_data_t *esm_data, int cid, unsigned int *pti, un ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_pdn_disconnect_request(nas_user_t *user, int is_standalone, int pti, - OctetString *msg, int sent_by_ue) +int esm_proc_pdn_disconnect_request(nas_user_t *user, bool is_standalone, int pti, + OctetString *msg, bool sent_by_ue) { LOG_FUNC_IN; @@ -326,7 +326,7 @@ int esm_proc_pdn_disconnect_reject(nas_user_t *user, int pti, int *esm_cause) */ esm_sap_t esm_sap; esm_sap.primitive = ESM_EPS_BEARER_CONTEXT_DEACTIVATE_REQ; - esm_sap.is_standalone = TRUE; + esm_sap.is_standalone = true; esm_sap.recv = NULL; esm_sap.send.length = 0; esm_sap.data.eps_bearer_context_deactivate.ebi = ebi; @@ -444,7 +444,7 @@ static void *_pdn_disconnect_t3492_handler(void *args) */ esm_sap_t esm_sap; esm_sap.primitive = ESM_EPS_BEARER_CONTEXT_DEACTIVATE_REQ; - esm_sap.is_standalone = TRUE; + esm_sap.is_standalone = true; esm_sap.recv = NULL; esm_sap.send.length = 0; esm_sap.data.eps_bearer_context_deactivate.ebi = ebi; diff --git a/openair3/NAS/UE/ESM/SAP/esm_sap.c b/openair3/NAS/UE/ESM/SAP/esm_sap.c index e039f66a3a8..f1663175d43 100644 --- a/openair3/NAS/UE/ESM/SAP/esm_sap.c +++ b/openair3/NAS/UE/ESM/SAP/esm_sap.c @@ -63,9 +63,9 @@ Description Defines the ESM Service Access Points at which the EPS /******************* L O C A L D E F I N I T I O N S *******************/ /****************************************************************************/ -static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone, +static int _esm_sap_recv(nas_user_t *user, int msg_type, bool is_standalone, const OctetString *req, OctetString *rsp, esm_sap_error_t *err); -static int _esm_sap_send(nas_user_t *user, int msg_type, int is_standalone, int pti, int ebi, +static int _esm_sap_send(nas_user_t *user, int msg_type, bool is_standalone, int pti, int ebi, const esm_sap_data_t *data, OctetString *rsp); @@ -171,7 +171,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg) } /* Define new PDN context */ - rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, TRUE, + rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, true, pdn_connect->pdn_type, &apn, pdn_connect->is_emergency, NULL); @@ -183,7 +183,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg) if (pdn_connect->is_defined) { unsigned int pti; /* Assign new procedure transaction identity */ - rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, TRUE, + rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, true, pdn_connect->pdn_type, NULL, pdn_connect->is_emergency, &pti); @@ -205,7 +205,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg) if ( msg->is_standalone && pdn_connect->is_defined ) { /* Undefine the specified PDN context */ - rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, FALSE, + rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, false, pdn_connect->pdn_type, NULL, pdn_connect->is_emergency, NULL); } else if (msg->recv != NULL) { @@ -214,7 +214,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg) msg->recv, &msg->send, &msg->err); } else { /* The PDN connectivity procedure locally failed */ - rc = esm_proc_pdn_connectivity_failure(user, TRUE); + rc = esm_proc_pdn_connectivity_failure(user, true); } } break; @@ -230,7 +230,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg) if (rc != RETURNerror) { /* Send PDN disconnect request */ - rc = _esm_sap_send(user, PDN_DISCONNECT_REQUEST, TRUE, pti, ebi, + rc = _esm_sap_send(user, PDN_DISCONNECT_REQUEST, true, pti, ebi, &msg->data, &msg->send); } } @@ -278,7 +278,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg) rc = esm_proc_default_eps_bearer_context_failure(user); if (rc != RETURNerror) { - rc = esm_proc_pdn_connectivity_failure(user, FALSE); + rc = esm_proc_pdn_connectivity_failure(user, false); } break; @@ -306,7 +306,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg) /* * Locally deactivate EPS bearer context */ - rc = esm_proc_eps_bearer_context_deactivate(user, TRUE, + rc = esm_proc_eps_bearer_context_deactivate(user, true, msg->data.eps_bearer_context_deactivate.ebi, &pid, &bid); } break; @@ -359,7 +359,7 @@ int esm_sap_send(nas_user_t *user, esm_sap_t *msg) ** Return: RETURNok, RETURNerror ** ** ** ***************************************************************************/ -static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone, +static int _esm_sap_recv(nas_user_t *user, int msg_type, bool is_standalone, const OctetString *req, OctetString *rsp, esm_sap_error_t *err) { @@ -422,7 +422,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone, * was triggered network-internally */ int triggered_by_ue = (pti != PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED); /* Indicate whether the received message shall be ignored */ - int is_discarded = FALSE; + bool is_discarded = false; if (esm_cause != ESM_CAUSE_SUCCESS) { LOG_TRACE(ERROR, "ESM-SAP - Failed to decode expected ESM message " @@ -455,7 +455,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone, * of already accepted activate default EPS bearer context * request message */ - is_discarded = TRUE; + is_discarded = true; } } else { /* Return reject message */ @@ -493,7 +493,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone, * of already accepted activate dedicated EPS bearer context * request message */ - is_discarded = TRUE; + is_discarded = true; } } else { /* Return reject message */ @@ -525,7 +525,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone, * received with PTI reserved value, or assigned value * that does not match any PTI in use */ - is_discarded = TRUE; + is_discarded = true; } else if ( (esm_cause == ESM_CAUSE_SUCCESS) || (esm_cause == ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY) ) { /* Return accept message */ @@ -541,7 +541,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone, * message with the EPS bearer identity set to the received * EPS bearer identity */ - is_discarded = TRUE; + is_discarded = true; } } @@ -565,7 +565,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone, * Ignore PDN connectivity reject message received with * reserved or unassigned EPS bearer identity value */ - is_discarded = TRUE; + is_discarded = true; } break; @@ -588,7 +588,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone, * Ignore PDN disconnect reject message received with * reserved or unassigned EPS bearer identity value */ - is_discarded = TRUE; + is_discarded = true; } break; @@ -629,7 +629,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone, * onto the network */ esm_procedure = esm_proc_status; /* Discard received ESM message */ - is_discarded = TRUE; + is_discarded = true; } } else { /* ESM message processing succeed */ @@ -687,7 +687,7 @@ static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone, ** Return: RETURNok, RETURNerror ** ** ** ***************************************************************************/ -static int _esm_sap_send(nas_user_t *user, int msg_type, int is_standalone, +static int _esm_sap_send(nas_user_t *user, int msg_type, bool is_standalone, int pti, int ebi, const esm_sap_data_t *data, OctetString *rsp) { @@ -697,7 +697,7 @@ static int _esm_sap_send(nas_user_t *user, int msg_type, int is_standalone, int rc = RETURNok; /* Indicate whether the message is sent by the UE or the MME */ - int sent_by_ue = TRUE; + bool sent_by_ue = true; ESM_msg esm_msg; memset(&esm_msg, 0 , sizeof(ESM_msg)); diff --git a/openair3/NAS/UE/ESM/SAP/esm_sapDef.h b/openair3/NAS/UE/ESM/SAP/esm_sapDef.h index 4ff7c7e9ddc..2d3227ba75f 100644 --- a/openair3/NAS/UE/ESM/SAP/esm_sapDef.h +++ b/openair3/NAS/UE/ESM/SAP/esm_sapDef.h @@ -109,11 +109,11 @@ typedef struct esm_activate_eps_default_bearer_context_s { */ typedef struct esm_pdn_connectivity_s { int cid; /* PDN connection local identifier */ - int is_defined; /* Indicates whether a PDN context has been defined + bool is_defined; /* Indicates whether a PDN context has been defined * for the specified APN */ int pdn_type; /* PDN address type (IPv4, IPv6, IPv4v6) */ const char *apn; /* PDN's Access Point Name */ - int is_emergency; /* Indicates whether the PDN context has been + bool is_emergency; /* Indicates whether the PDN context has been * defined to establish connection for emergency * bearer services */ } esm_pdn_connectivity_t; @@ -149,7 +149,7 @@ typedef union { typedef struct esm_sap_s { esm_primitive_t primitive; /* ESM-SAP primitive to process */ - int is_standalone; /* Indicates whether the ESM message handled + bool is_standalone; /* Indicates whether the ESM message handled * within this primitive has to be sent/received * standalone or together within an EMM related * message */ diff --git a/openair3/NAS/UE/ESM/SAP/esm_send.c b/openair3/NAS/UE/ESM/SAP/esm_send.c index 020d9d89e3c..e710d745ad5 100644 --- a/openair3/NAS/UE/ESM/SAP/esm_send.c +++ b/openair3/NAS/UE/ESM/SAP/esm_send.c @@ -132,7 +132,7 @@ int esm_send_status(int pti, int ebi, esm_status_msg *msg, int esm_cause) ** Others: None ** ** ** ***************************************************************************/ -int esm_send_pdn_connectivity_request(int pti, int is_emergency, int pdn_type, +int esm_send_pdn_connectivity_request(int pti, bool is_emergency, int pdn_type, const char *apn, pdn_connectivity_request_msg *msg) { diff --git a/openair3/NAS/UE/ESM/SAP/esm_send.h b/openair3/NAS/UE/ESM/SAP/esm_send.h index f97454027ae..b9bcab0f397 100644 --- a/openair3/NAS/UE/ESM/SAP/esm_send.h +++ b/openair3/NAS/UE/ESM/SAP/esm_send.h @@ -40,6 +40,8 @@ Description Defines functions executed at the ESM Service Access #ifndef __ESM_SEND_H__ #define __ESM_SEND_H__ +#include <stdbool.h> + #include "EsmStatus.h" @@ -90,7 +92,7 @@ int esm_send_status(int pti, int ebi, esm_status_msg *msg, int esm_cause); * Transaction related messages * ---------------------------- */ -int esm_send_pdn_connectivity_request(int pti, int is_emergency, int pdn_type, +int esm_send_pdn_connectivity_request(int pti, bool is_emergency, int pdn_type, const char *apn, pdn_connectivity_request_msg *msg); int esm_send_pdn_disconnect_request(int pti, int ebi, pdn_disconnect_request_msg *msg); diff --git a/openair3/NAS/UE/ESM/esmData.h b/openair3/NAS/UE/ESM/esmData.h index 16f4707a377..525f4ec00a7 100644 --- a/openair3/NAS/UE/ESM/esmData.h +++ b/openair3/NAS/UE/ESM/esmData.h @@ -37,6 +37,7 @@ Description Defines internal private data handled by EPS Session *****************************************************************************/ #include <stdio.h> // sprintf +#include <stdbool.h> #include "networkDef.h" #include "OctetString.h" @@ -92,7 +93,7 @@ typedef enum { typedef struct esm_ebr_context_s { unsigned char ebi; /* EPS bearer identity */ esm_ebr_state status; /* EPS bearer context status */ - int is_default_ebr; /* TRUE if the bearer context is associated + bool is_default_ebr; /* bool if the bearer context is associated * to a default EPS bearer */ char cid; /* Identifier of the PDN context the EPS * bearer context has been assigned to */ @@ -137,7 +138,7 @@ typedef struct esm_bearer_s { typedef struct esm_pdn_s { unsigned int pti; /* Identity of the procedure transaction executed * to activate the PDN connection entry */ - int is_emergency; /* Emergency bearer services indicator */ + bool is_emergency; /* Emergency bearer services indicator */ OctetString apn; /* Access Point Name currently in used */ int ambr; /* Aggregate Maximum Bit Rate of this APN */ int type; /* Address PDN type (IPv4, IPv6, IPv4v6) */ @@ -147,7 +148,7 @@ typedef struct esm_pdn_s { ESM_DATA_IPV6_ADDRESS_SIZE) /* IPv4 PDN address and/or IPv6 prefix */ char ip_addr[ESM_DATA_IP_ADDRESS_SIZE+1]; - int addr_realloc; /* Indicates whether the UE is allowed to subsequently + bool addr_realloc; /* Indicates whether the UE is allowed to subsequently * request another PDN connectivity to the same APN * using an address PDN type (IPv4 or IPv6) other * than the one already activated */ @@ -175,7 +176,7 @@ typedef struct esm_data_context_s { #define ESM_DATA_PDN_MAX 4 struct { int pid; /* Identifier of the PDN connection */ - int is_active; /* TRUE/FALSE if the PDN connection is active/inactive + bool is_active; /* true/false if the PDN connection is active/inactive * or the process to activate/deactivate the PDN * connection is in progress */ esm_pdn_t *data; /* Active PDN connection data */ diff --git a/openair3/NAS/UE/ESM/esm_ebr.c b/openair3/NAS/UE/ESM/esm_ebr.c index 3a62812eca7..4c6b56cec9a 100644 --- a/openair3/NAS/UE/ESM/esm_ebr.c +++ b/openair3/NAS/UE/ESM/esm_ebr.c @@ -153,7 +153,7 @@ void esm_ebr_register_callback(esm_indication_callback_t cb) ** ebi: Identity of the new EPS bearer context ** ** cid: Identifier of the PDN context the EPS bea- ** ** rer context is associated to ** - ** default_ebr TRUE if the new bearer context is associa- ** + ** default_ebr bool if the new bearer context is associa- ** ** ted to a default EPS bearer ** ** Others: None ** ** ** @@ -163,7 +163,7 @@ void esm_ebr_register_callback(esm_indication_callback_t cb) ** the not assigned EBI (0) otherwise. ** ** ** ***************************************************************************/ -int esm_ebr_assign(esm_ebr_data_t *esm_ebr_data, int ebi, int cid, int default_ebr) +int esm_ebr_assign(esm_ebr_data_t *esm_ebr_data, int ebi, int cid, bool default_ebr) { esm_ebr_context_t *ebr_ctx = NULL; int i; @@ -284,7 +284,7 @@ int esm_ebr_release(esm_ebr_data_t *esm_ebr_data, ** ** ** ebi: The identity of the EPS bearer ** ** status: The new EPS bearer context status ** - ** ue_requested: TRUE/FALSE if the modification of the EPS ** + ** ue_requested: true/false if the modification of the EPS ** ** bearer context status was requested by the ** ** UE/network ** ** Others: None ** @@ -294,7 +294,7 @@ int esm_ebr_release(esm_ebr_data_t *esm_ebr_data, ** ** ***************************************************************************/ int esm_ebr_set_status(user_api_id_t *user_api_id, esm_ebr_data_t *esm_ebr_data, - int ebi, esm_ebr_state status, int ue_requested) + int ebi, esm_ebr_state status, bool ue_requested) { esm_ebr_context_t *ebr_ctx; esm_ebr_state old_status; @@ -385,11 +385,11 @@ esm_ebr_state esm_ebr_get_status(esm_ebr_data_t *esm_ebr_data, ** Others: None ** ** ** ** Outputs: None ** - ** Return: TRUE, FALSE ** + ** Return: true, false ** ** Others: None ** ** ** ***************************************************************************/ -int esm_ebr_is_reserved(esm_ebr_data_t *esm_ebr_data, int ebi) +bool esm_ebr_is_reserved(esm_ebr_data_t *esm_ebr_data, int ebi) { return ( (ebi != ESM_EBI_UNASSIGNED) && (ebi < ESM_EBI_MIN) ); } @@ -404,12 +404,11 @@ int esm_ebr_is_reserved(esm_ebr_data_t *esm_ebr_data, int ebi) ** ebi: The identity of the EPS bearer ** ** ** ** Outputs: None ** - ** Return: TRUE, FALSE ** + ** Return: true, false ** ** Others: None ** ** ** ***************************************************************************/ -int esm_ebr_is_not_in_use(esm_ebr_data_t *esm_ebr_data, - int ebi) +bool esm_ebr_is_not_in_use(esm_ebr_data_t *esm_ebr_data, int ebi) { return ( (ebi == ESM_EBI_UNASSIGNED) || diff --git a/openair3/NAS/UE/ESM/esm_ebr.h b/openair3/NAS/UE/ESM/esm_ebr.h index 6de4a048a49..4447a227baa 100644 --- a/openair3/NAS/UE/ESM/esm_ebr.h +++ b/openair3/NAS/UE/ESM/esm_ebr.h @@ -75,15 +75,15 @@ typedef int (*esm_indication_callback_t) (user_api_id_t *user_api_id, int, netwo void esm_ebr_register_callback(esm_indication_callback_t cb); -int esm_ebr_is_reserved(esm_ebr_data_t *esm_ebr_data, int ebi); +bool esm_ebr_is_reserved(esm_ebr_data_t *esm_ebr_data, int ebi); esm_ebr_data_t *esm_ebr_initialize(void); -int esm_ebr_assign(esm_ebr_data_t *esm_ebr_data, int ebi, int cid, int default_ebr); +int esm_ebr_assign(esm_ebr_data_t *esm_ebr_data, int ebi, int cid, bool default_ebr); int esm_ebr_release(esm_ebr_data_t *esm_ebr_data, int ebi); -int esm_ebr_set_status(user_api_id_t *user_api_id, esm_ebr_data_t *esm_ebr_data, int ebi, esm_ebr_state status, int ue_requested); +int esm_ebr_set_status(user_api_id_t *user_api_id, esm_ebr_data_t *esm_ebr_data, int ebi, esm_ebr_state status, bool ue_requested); esm_ebr_state esm_ebr_get_status(esm_ebr_data_t *esm_ebr_data, int ebi); -int esm_ebr_is_not_in_use(esm_ebr_data_t *esm_ebr_data, int ebi); +bool esm_ebr_is_not_in_use(esm_ebr_data_t *esm_ebr_data, int ebi); #endif /* __ESM_EBR_H__*/ diff --git a/openair3/NAS/UE/ESM/esm_ebr_context.c b/openair3/NAS/UE/ESM/esm_ebr_context.c index b801ca2ad54..ca69687abe5 100644 --- a/openair3/NAS/UE/ESM/esm_ebr_context.c +++ b/openair3/NAS/UE/ESM/esm_ebr_context.c @@ -84,7 +84,7 @@ static int _esm_ebr_context_check_precedence(const network_tft_t *, ** Inputs: ** ** pid: PDN connection identifier ** ** ebi: EPS bearer identity ** - ** is_default: TRUE if the new bearer is a default EPS ** + ** is_default: true if the new bearer is a default EPS ** ** bearer context ** ** esm_qos: EPS bearer level QoS parameters ** ** tft: Traffic flow template parameters ** @@ -98,7 +98,7 @@ static int _esm_ebr_context_check_precedence(const network_tft_t *, ***************************************************************************/ int esm_ebr_context_create( esm_data_t *esm_data, int ueid, - int pid, int ebi, int is_default, + int pid, int ebi, bool is_default, const network_qos_t *qos, const network_tft_t *tft) { int bid = 0; esm_data_context_t *esm_ctx = NULL; @@ -185,11 +185,11 @@ int esm_ebr_context_create( if (is_default) { /* Set the PDN connection activation indicator */ - esm_ctx->pdn[pid].is_active = TRUE; + esm_ctx->pdn[pid].is_active = true; /* Update the emergency bearer services indicator */ if (pdn->is_emergency) { - esm_ctx->emergency = TRUE; + esm_ctx->emergency = true; } // LG ADD TEMP @@ -383,7 +383,7 @@ int esm_ebr_context_create( ***************************************************************************/ int esm_ebr_context_release(nas_user_t *user, int ebi, int *pid, int *bid) { - int found = FALSE; + bool found = false; esm_pdn_t *pdn = NULL; esm_data_context_t *esm_ctx; esm_ebr_data_t *esm_ebr_data = user->esm_ebr_data; @@ -416,7 +416,7 @@ int esm_ebr_context_release(nas_user_t *user, } /* The EPS bearer context entry is found */ - found = TRUE; + found = true; break; } } @@ -450,7 +450,7 @@ int esm_ebr_context_release(nas_user_t *user, if (pdn->bearer[*bid] != NULL) { ebi = pdn->bearer[*bid]->ebi; - found = TRUE; + found = true; } } } @@ -503,7 +503,7 @@ int esm_ebr_context_release(nas_user_t *user, /* Set the EPS bearer context state to INACTIVE */ esm_ebr_set_status(user_api_id, esm_ebr_data, pdn->bearer[i]->ebi, - ESM_EBR_INACTIVE, TRUE); + ESM_EBR_INACTIVE, true); /* Release EPS bearer data */ esm_ebr_release(esm_ebr_data, pdn->bearer[i]->ebi); // esm_ebr_release() @@ -519,11 +519,11 @@ int esm_ebr_context_release(nas_user_t *user, } /* Reset the PDN connection activation indicator */ - esm_ctx->pdn[*pid].is_active = FALSE; + esm_ctx->pdn[*pid].is_active = false; /* Update the emergency bearer services indicator */ if (pdn->is_emergency) { - esm_ctx->emergency = FALSE; + esm_ctx->emergency = false; } } @@ -534,7 +534,7 @@ int esm_ebr_context_release(nas_user_t *user, if (esm_ctx->n_ebrs == 0) { emm_sap_t emm_sap; emm_sap.primitive = EMMESM_ESTABLISH_CNF; - emm_sap.u.emm_esm.u.establish.is_attached = FALSE; + emm_sap.u.emm_esm.u.establish.is_attached = false; (void) emm_sap_send(user, &emm_sap); } /* 3GPP TS 24.301, section 6.4.4.3, 6.4.4.6 @@ -546,8 +546,8 @@ int esm_ebr_context_release(nas_user_t *user, else if (esm_ctx->emergency && (esm_ctx->n_ebrs == 1) ) { emm_sap_t emm_sap; emm_sap.primitive = EMMESM_ESTABLISH_CNF; - emm_sap.u.emm_esm.u.establish.is_attached = TRUE; - emm_sap.u.emm_esm.u.establish.is_emergency = TRUE; + emm_sap.u.emm_esm.u.establish.is_attached = true; + emm_sap.u.emm_esm.u.establish.is_emergency = true; (void) emm_sap_send(user, &emm_sap); } diff --git a/openair3/NAS/UE/ESM/esm_ebr_context.h b/openair3/NAS/UE/ESM/esm_ebr_context.h index d7dfb1da70f..c72f3f0e8b6 100644 --- a/openair3/NAS/UE/ESM/esm_ebr_context.h +++ b/openair3/NAS/UE/ESM/esm_ebr_context.h @@ -66,7 +66,7 @@ typedef enum { /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -int esm_ebr_context_create(esm_data_t *esm_data, int ueid, int pid, int ebi, int is_default, +int esm_ebr_context_create(esm_data_t *esm_data, int ueid, int pid, int ebi, bool is_default, const network_qos_t *qos, const network_tft_t *tft); int esm_ebr_context_release(nas_user_t *user, int ebi, int *pid, int *bid); diff --git a/openair3/NAS/UE/ESM/esm_main.c b/openair3/NAS/UE/ESM/esm_main.c index 288e7486796..895e463726b 100644 --- a/openair3/NAS/UE/ESM/esm_main.c +++ b/openair3/NAS/UE/ESM/esm_main.c @@ -96,12 +96,12 @@ void esm_main_initialize(nas_user_t *user, esm_indication_callback_t cb) for (i = 0; i < ESM_DATA_PDN_MAX + 1; i++) { esm_data->pdn[i].pid = -1; - esm_data->pdn[i].is_active = FALSE; + esm_data->pdn[i].is_active = false; esm_data->pdn[i].data = NULL; } /* Emergency bearer services indicator */ - esm_data->emergency = FALSE; + esm_data->emergency = false; /* Initialize the procedure transaction identity manager */ @@ -225,12 +225,12 @@ int esm_main_get_nb_pdns(esm_data_t *esm_data) ** Inputs: None ** ** ** ** Outputs: None ** - ** Return: TRUE if a PDN connection for emergency ** + ** Return: true if a PDN connection for emergency ** ** bearer services is established ** ** Others: None ** ** ** ***************************************************************************/ -int esm_main_has_emergency(esm_data_t *esm_data) +bool esm_main_has_emergency(esm_data_t *esm_data) { LOG_FUNC_IN; @@ -245,16 +245,16 @@ int esm_main_has_emergency(esm_data_t *esm_data) ** ** ** Inputs: cid: PDN connection identifier ** ** ** - ** Outputs: state: TRUE if the current state of the PDN con- ** - ** nection is ACTIVE; FALSE otherwise. ** - ** Return: TRUE if the specified PDN connection has a ** - ** PDN context defined; FALSE if no any PDN ** + ** Outputs: state: true if the current state of the PDN con- ** + ** nection is ACTIVE; false otherwise. ** + ** Return: true if the specified PDN connection has a ** + ** PDN context defined; false if no any PDN ** ** context has been defined for the specified ** ** connection. ** ** Others: None ** ** ** ***************************************************************************/ -int esm_main_get_pdn_status(nas_user_t *user, int cid, int *state) +bool esm_main_get_pdn_status(nas_user_t *user, int cid, bool *state) { LOG_FUNC_IN; @@ -263,14 +263,14 @@ int esm_main_get_pdn_status(nas_user_t *user, int cid, int *state) esm_ebr_data_t *esm_ebr_data = user-> esm_ebr_data; if (pid >= ESM_DATA_PDN_MAX) { - return (FALSE); + return (false); } else if (pid != esm_data->pdn[pid].pid) { LOG_TRACE(WARNING, "ESM-MAIN - PDN connection %d is not defined", cid); - return (FALSE); + return (false); } else if (esm_data->pdn[pid].data == NULL) { LOG_TRACE(ERROR, "ESM-MAIN - PDN connection %d has not been allocated", cid); - return (FALSE); + return (false); } if (esm_data->pdn[pid].data->bearer[0] != NULL) { @@ -281,7 +281,7 @@ int esm_main_get_pdn_status(nas_user_t *user, int cid, int *state) } /* The PDN connection has not been activated yet */ - LOG_FUNC_RETURN (TRUE); + LOG_FUNC_RETURN (true); } /**************************************************************************** @@ -301,7 +301,7 @@ int esm_main_get_pdn_status(nas_user_t *user, int cid, int *state) ** ** ***************************************************************************/ int esm_main_get_pdn(esm_data_t *esm_data, int cid, int *type, const char **apn, - int *is_emergency, int *is_active) + bool *is_emergency, bool *is_active) { LOG_FUNC_IN; diff --git a/openair3/NAS/UE/ESM/esm_main.h b/openair3/NAS/UE/ESM/esm_main.h index 6e6ecc0db46..ca8679c5b7a 100644 --- a/openair3/NAS/UE/ESM/esm_main.h +++ b/openair3/NAS/UE/ESM/esm_main.h @@ -69,10 +69,9 @@ void esm_main_cleanup(esm_data_t *esm_data); /* User's getter for PDN connections and EPS bearer contexts */ int esm_main_get_nb_pdns_max(esm_data_t *esm_data); int esm_main_get_nb_pdns(esm_data_t *esm_data); -int esm_main_has_emergency(esm_data_t *esm_data); -int esm_main_get_pdn_status(nas_user_t *user, int cid, int *state); -int esm_main_get_pdn(esm_data_t *esm_data, int cid, int *type, const char **apn, int *is_emergency, - int *is_active); +bool esm_main_has_emergency(esm_data_t *esm_data); +bool esm_main_get_pdn_status(nas_user_t *user, int cid, bool *state); +int esm_main_get_pdn(esm_data_t *esm_data, int cid, int *type, const char **apn, bool *is_emergency, bool *is_active); int esm_main_get_pdn_addr(esm_data_t *esm_data, int cid, const char **ipv4addr, const char **ipv6addr); diff --git a/openair3/NAS/UE/ESM/esm_proc.h b/openair3/NAS/UE/ESM/esm_proc.h index 941cfa620db..42a925327e3 100644 --- a/openair3/NAS/UE/ESM/esm_proc.h +++ b/openair3/NAS/UE/ESM/esm_proc.h @@ -79,7 +79,7 @@ typedef enum { * Type of the ESM procedure callback executed when requested by the UE * or initiated by the network */ -typedef int (*esm_proc_procedure_t) (nas_user_t *user, int, int, OctetString *, int); +typedef int (*esm_proc_procedure_t) (nas_user_t *user, bool, int, OctetString *, bool); /* EPS bearer level QoS parameters */ typedef network_qos_t esm_proc_qos_t; @@ -113,8 +113,7 @@ typedef struct { * -------------------------------------------------------------------------- */ int esm_proc_status_ind(int pti, int ebi, int *esm_cause); -int esm_proc_status(nas_user_t *user, int is_standalone, int pti, OctetString *msg, - int sent_by_ue); +int esm_proc_status(nas_user_t *user, bool is_standalone, int pti, OctetString *msg, bool sent_by_ue); /* @@ -123,10 +122,10 @@ int esm_proc_status(nas_user_t *user, int is_standalone, int pti, OctetString *m * -------------------------------------------------------------------------- */ int esm_proc_pdn_connectivity(nas_user_t *user, int cid, int to_define, - esm_proc_pdn_type_t pdn_type, const OctetString *apn, int is_emergency, + esm_proc_pdn_type_t pdn_type, const OctetString *apn, bool is_emergency, unsigned int *pti); -int esm_proc_pdn_connectivity_request(nas_user_t *user, int is_standalone, int pti, - OctetString *msg, int sent_by_ue); +int esm_proc_pdn_connectivity_request(nas_user_t *user, bool is_standalone, int pti, + OctetString *msg, bool sent_by_ue); int esm_proc_pdn_connectivity_accept(nas_user_t *user, int pti, esm_proc_pdn_type_t pdn_type, const OctetString *pdn_address, const OctetString *apn, int *esm_cause); int esm_proc_pdn_connectivity_reject(nas_user_t *user, int pti, int *esm_cause); @@ -140,8 +139,8 @@ int esm_proc_pdn_connectivity_failure(nas_user_t *user, int is_pending); * -------------------------------------------------------------------------- */ int esm_proc_pdn_disconnect(esm_data_t *esm_data, int cid, unsigned int *pti, unsigned int *ebi); -int esm_proc_pdn_disconnect_request(nas_user_t *user, int is_standalone, int pti, - OctetString *msg, int sent_by_ue); +int esm_proc_pdn_disconnect_request(nas_user_t *user, bool is_standalone, int pti, + OctetString *msg, bool sent_by_ue); int esm_proc_pdn_disconnect_accept(esm_pt_data_t *esm_pt_data, int pti, int *esm_cause); int esm_proc_pdn_disconnect_reject(nas_user_t *user, int pti, int *esm_cause); @@ -157,10 +156,10 @@ int esm_proc_default_eps_bearer_context_request(nas_user_t *user, int pid, int e int esm_proc_default_eps_bearer_context_complete(default_eps_bearer_context_data_t *default_eps_bearer_context_data); int esm_proc_default_eps_bearer_context_failure(nas_user_t *user); -int esm_proc_default_eps_bearer_context_accept(nas_user_t *user, int is_standalone, int ebi, - OctetString *msg, int ue_triggered); -int esm_proc_default_eps_bearer_context_reject(nas_user_t *user, int is_standalone, int ebi, - OctetString *msg, int ue_triggered); +int esm_proc_default_eps_bearer_context_accept(nas_user_t *user, bool is_standalone, int ebi, + OctetString *msg, bool ue_triggered); +int esm_proc_default_eps_bearer_context_reject(nas_user_t *user, bool is_standalone, int ebi, + OctetString *msg, bool ue_triggered); /* * -------------------------------------------------------------------------- @@ -171,10 +170,10 @@ int esm_proc_default_eps_bearer_context_reject(nas_user_t *user, int is_standalo int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int default_ebi, const esm_proc_qos_t *qos, const esm_proc_tft_t *tft, int *esm_cause); -int esm_proc_dedicated_eps_bearer_context_accept(nas_user_t *user, int is_standalone, int ebi, - OctetString *msg, int ue_triggered); -int esm_proc_dedicated_eps_bearer_context_reject(nas_user_t *user, int is_standalone, int ebi, - OctetString *msg, int ue_triggered); +int esm_proc_dedicated_eps_bearer_context_accept(nas_user_t *user, bool is_standalone, int ebi, + OctetString *msg, bool ue_triggered); +int esm_proc_dedicated_eps_bearer_context_reject(nas_user_t *user, bool is_standalone, int ebi, + OctetString *msg, bool ue_triggered); /* * -------------------------------------------------------------------------- @@ -182,11 +181,11 @@ int esm_proc_dedicated_eps_bearer_context_reject(nas_user_t *user, int is_standa * -------------------------------------------------------------------------- */ -int esm_proc_eps_bearer_context_deactivate(nas_user_t *user, int is_local, int ebi, int *pid, +int esm_proc_eps_bearer_context_deactivate(nas_user_t *user, bool is_local, int ebi, int *pid, int *bid); int esm_proc_eps_bearer_context_deactivate_request(nas_user_t *user, int ebi, int *esm_cause); -int esm_proc_eps_bearer_context_deactivate_accept(nas_user_t *user, int is_standalone, int ebi, - OctetString *msg, int ue_triggered); +int esm_proc_eps_bearer_context_deactivate_accept(nas_user_t *user, bool is_standalone, int ebi, + OctetString *msg, bool ue_triggered); #endif /* __ESM_PROC_H__*/ diff --git a/openair3/NAS/UE/ESM/esm_pt.c b/openair3/NAS/UE/ESM/esm_pt.c index f253291fd9f..d9f593fb571 100644 --- a/openair3/NAS/UE/ESM/esm_pt.c +++ b/openair3/NAS/UE/ESM/esm_pt.c @@ -482,11 +482,11 @@ int esm_pt_get_pending_pti(esm_pt_data_t *esm_pt_data, esm_pt_state status) ** Inputs: pti: The identity of the procedure transaction ** ** ** ** Outputs: None ** - ** Return: TRUE, FALSE ** + ** Return: true, false ** ** Others: None ** ** ** ***************************************************************************/ -int esm_pt_is_not_in_use(esm_pt_data_t *esm_pt_data, int pti) +bool esm_pt_is_not_in_use(esm_pt_data_t *esm_pt_data, int pti) { return ( (pti == ESM_PT_UNASSIGNED) || (esm_pt_data->context[pti - ESM_PTI_MIN] == NULL) || @@ -504,11 +504,11 @@ int esm_pt_is_not_in_use(esm_pt_data_t *esm_pt_data, int pti) ** Others: None ** ** ** ** Outputs: None ** - ** Return: TRUE, FALSE ** + ** Return: true, false ** ** Others: None ** ** ** ***************************************************************************/ -int esm_pt_is_reserved(int pti) +bool esm_pt_is_reserved(int pti) { return ( (pti != ESM_PT_UNASSIGNED) && (pti > ESM_PTI_MAX) ); } diff --git a/openair3/NAS/UE/ESM/esm_pt.h b/openair3/NAS/UE/ESM/esm_pt.h index 3179e0f47b7..b0c62253abc 100644 --- a/openair3/NAS/UE/ESM/esm_pt.h +++ b/openair3/NAS/UE/ESM/esm_pt.h @@ -64,7 +64,7 @@ Description Defines functions used to handle ESM procedure transactions. /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -int esm_pt_is_reserved(int pti); +bool esm_pt_is_reserved(int pti); esm_pt_data_t *esm_pt_initialize(void); @@ -79,6 +79,6 @@ int esm_pt_set_status(esm_pt_data_t *esm_pt_data, int pti, esm_pt_state status); esm_pt_state esm_pt_get_status(esm_pt_data_t *esm_pt_data, int pti); int esm_pt_get_pending_pti(esm_pt_data_t *esm_pt_data, esm_pt_state status); -int esm_pt_is_not_in_use(esm_pt_data_t *esm_pt_data, int pti); +bool esm_pt_is_not_in_use(esm_pt_data_t *esm_pt_data, int pti); #endif /* __ESM_PT_H__*/ diff --git a/openair3/NAS/UE/UEprocess.c b/openair3/NAS/UE/UEprocess.c index 7b9a1be4224..a3a1c9c79b6 100644 --- a/openair3/NAS/UE/UEprocess.c +++ b/openair3/NAS/UE/UEprocess.c @@ -205,7 +205,7 @@ static void *_nas_user_mngr(void *args) LOG_FUNC_IN; pthread_setname_np( pthread_self(), "nas_user_mngr"); - int exit_loop = FALSE; + bool exit_loop = false; int *fd = (int *) args; @@ -251,7 +251,7 @@ static void *_nas_network_mngr(void *args) LOG_TRACE (INFO, "UE-MAIN - Network connection manager started (%d)", *fd); /* Network receiving loop */ - while (TRUE) { + while (true) { /* Read the network data message */ bytes = network_api_read_data (*fd); diff --git a/openair3/NAS/UE/nas_proc.c b/openair3/NAS/UE/nas_proc.c index 9350590788a..41230696a48 100644 --- a/openair3/NAS/UE/nas_proc.c +++ b/openair3/NAS/UE/nas_proc.c @@ -64,8 +64,8 @@ Description NAS procedure call manager #define NAS_PROC_RSRP_UNKNOWN 255 -static int _nas_proc_activate(nas_user_t *user, int cid, int apply_to_all); -static int _nas_proc_deactivate(nas_user_t *user, int cid, int apply_to_all); +static int _nas_proc_activate(nas_user_t *user, int cid, bool apply_to_all); +static int _nas_proc_deactivate(nas_user_t *user, int cid, bool apply_to_all); /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ @@ -93,7 +93,7 @@ void nas_proc_initialize(nas_user_t *user, emm_indication_callback_t emm_cb, LOG_FUNC_IN; /* Initialize local NAS data */ - user->proc.EPS_capability_status = FALSE; + user->proc.EPS_capability_status = false; user->proc.rsrq = NAS_PROC_RSRQ_UNKNOWN; user->proc.rsrp = NAS_PROC_RSRP_UNKNOWN; @@ -129,7 +129,7 @@ void nas_proc_cleanup(nas_user_t *user) LOG_FUNC_IN; /* Detach the UE from the EPS network */ - int rc = nas_proc_detach(user, TRUE); + int rc = nas_proc_detach(user, true); if (rc != RETURNok) { LOG_TRACE(ERROR, "NAS-PROC - Failed to detach from the network"); @@ -176,7 +176,7 @@ int nas_proc_enable_s1_mode(nas_user_t *user) * Notify the EMM procedure call manager that EPS capability * of the UE is enabled */ - user->proc.EPS_capability_status = TRUE; + user->proc.EPS_capability_status = true; emm_sap.primitive = EMMREG_S1_ENABLED; rc = emm_sap_send(user, &emm_sap); @@ -209,7 +209,7 @@ int nas_proc_disable_s1_mode(nas_user_t *user) * Notify the EMM procedure call manager that EPS capability * of the UE is disabled */ - user->proc.EPS_capability_status = FALSE; + user->proc.EPS_capability_status = false; emm_sap.primitive = EMMREG_S1_DISABLED; rc = emm_sap_send(user, &emm_sap); @@ -231,7 +231,7 @@ int nas_proc_disable_s1_mode(nas_user_t *user) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_eps(nas_user_t *user, int *stat) +int nas_proc_get_eps(nas_user_t *user, bool *stat) { LOG_FUNC_IN; @@ -449,7 +449,7 @@ int nas_proc_deregister(nas_user_t *user) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_reg_data(nas_user_t *user, int *mode, int *selected, int format, +int nas_proc_get_reg_data(nas_user_t *user, int *mode, bool *selected, int format, network_plmn_t *oper, int *AcT) { LOG_FUNC_IN; @@ -462,12 +462,12 @@ int nas_proc_get_reg_data(nas_user_t *user, int *mode, int *selected, int format if (oper_name != NULL) { /* An operator is currently selected */ - *selected = TRUE; + *selected = true; /* Get the supported Radio Access Technology */ *AcT = emm_main_get_plmn_rat(user->emm_data); } else { /* No any operator is selected */ - *selected = FALSE; + *selected = false; *AcT = NET_ACCESS_UNAVAILABLE; } @@ -558,7 +558,7 @@ int nas_proc_get_loc_info(nas_user_t *user, char *tac, char *ci, int *AcT) ** ** ** Description: Initiates a detach procedure ** ** ** - ** Inputs: switch_off: TRUE if the detach is due to UE switch-off ** + ** Inputs: switch_off: true if the detach is due to UE switch-off ** ** Others: None ** ** ** ** Outputs: None ** @@ -566,7 +566,7 @@ int nas_proc_get_loc_info(nas_user_t *user, char *tac, char *ci, int *AcT) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_detach(nas_user_t *user, int switch_off) +int nas_proc_detach(nas_user_t *user, bool switch_off) { LOG_FUNC_IN; @@ -607,7 +607,7 @@ int nas_proc_attach(nas_user_t *user) if ( !emm_main_is_attached(user->emm_data) ) { /* Initiate an Attach procedure */ emm_sap.primitive = EMMREG_ATTACH_INIT; - emm_sap.u.emm_reg.u.attach.is_emergency = FALSE; + emm_sap.u.emm_reg.u.attach.is_emergency = false; rc = emm_sap_send(user, &emm_sap); } @@ -624,16 +624,16 @@ int nas_proc_attach(nas_user_t *user) ** Others: None ** ** ** ** Outputs: None ** - ** Return: TRUE if the UE is currently attached to ** + ** Return: true if the UE is currently attached to ** ** the network ** ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_attach_status(nas_user_t *user) +bool nas_proc_get_attach_status(nas_user_t *user) { LOG_FUNC_IN; - int is_attached = emm_main_is_attached(user->emm_data); + bool is_attached = emm_main_is_attached(user->emm_data); LOG_FUNC_RETURN (is_attached); } @@ -690,10 +690,10 @@ int nas_proc_get_pdn_status(nas_user_t *user, int *cids, int *states, int n_pdn_ /* For all PDN contexts */ for (cid = 1; (cid < n_pdn+1) && (n_defined_pdn < n_pdn_max); cid++) { /* Get the status of this PDN */ - int state = FALSE; - int is_defined = esm_main_get_pdn_status(user, cid, &state); + bool state = false; + bool is_defined = esm_main_get_pdn_status(user, cid, &state); - if (is_defined != FALSE) { + if (is_defined != false) { /* This PDN has been defined */ *(cids++) = cid; *(states++) = state; @@ -734,7 +734,7 @@ int nas_proc_get_pdn_param(esm_data_t *esm_data, int *cids, int *types, const ch /* For all PDN contexts */ for (cid = 1; (cid < n_pdn+1) && (n_defined_pdn < n_pdn_max); cid++) { - int emergency, active; + bool emergency, active; /* Get PDN connection parameters */ int rc = esm_main_get_pdn(esm_data, cid, types, apns, &emergency, &active); @@ -845,8 +845,8 @@ int nas_proc_set_pdn(nas_user_t *user, int cid, int type, const char *apn, int i esm_sap_t esm_sap; esm_sap.primitive = ESM_PDN_CONNECTIVITY_REQ; - esm_sap.is_standalone = TRUE; - esm_sap.data.pdn_connect.is_defined = FALSE; + esm_sap.is_standalone = true; + esm_sap.data.pdn_connect.is_defined = false; esm_sap.data.pdn_connect.cid = cid; esm_sap.data.pdn_connect.pdn_type = type; esm_sap.data.pdn_connect.apn = apn; @@ -882,8 +882,8 @@ int nas_proc_reset_pdn(nas_user_t *user, int cid) esm_sap_t esm_sap; esm_sap.primitive = ESM_PDN_CONNECTIVITY_REJ; - esm_sap.is_standalone = TRUE; - esm_sap.data.pdn_connect.is_defined = TRUE; + esm_sap.is_standalone = true; + esm_sap.data.pdn_connect.is_defined = true; esm_sap.data.pdn_connect.cid = cid; /* * Notify ESM that the specified PDN context has to be undefined @@ -916,7 +916,7 @@ int nas_proc_deactivate_pdn(nas_user_t *user, int cid) if (cid > 0) { /* Deactivate only the specified PDN context */ - rc = _nas_proc_deactivate(user, cid, FALSE); + rc = _nas_proc_deactivate(user, cid, false); } else { /* Do not deactivate the PDN connection established during initial * network attachment (identifier 1) */ @@ -924,7 +924,7 @@ int nas_proc_deactivate_pdn(nas_user_t *user, int cid) /* Deactivate all active PDN contexts */ while ((rc != RETURNerror) && (cid < esm_main_get_nb_pdns_max(user->esm_data)+1)) { - rc = _nas_proc_deactivate(user, cid++, TRUE); + rc = _nas_proc_deactivate(user, cid++, true); } } @@ -970,13 +970,13 @@ int nas_proc_activate_pdn(nas_user_t *user, int cid) if (rc != RETURNerror) { if (cid > 0) { /* Activate only the specified PDN context */ - rc = _nas_proc_activate(user, cid, FALSE); + rc = _nas_proc_activate(user, cid, false); } else { cid = 1; /* Activate all defined PDN contexts */ while ((rc != RETURNerror) && (cid < esm_main_get_nb_pdns_max(user->esm_data)+1)) { - rc = _nas_proc_activate(user, cid++, TRUE); + rc = _nas_proc_activate(user, cid++, true); } } } @@ -1177,7 +1177,7 @@ int nas_proc_ul_transfer_cnf(nas_user_t *user) */ emm_sap.primitive = EMMAS_DATA_IND; emm_sap.u.emm_as.u.data.ueid = user->ueid; - emm_sap.u.emm_as.u.data.delivered = TRUE; + emm_sap.u.emm_as.u.data.delivered = true; emm_sap.u.emm_as.u.data.NASmsg.length = 0; rc = emm_sap_send(user, &emm_sap); @@ -1214,7 +1214,7 @@ int nas_proc_ul_transfer_rej(nas_user_t *user) */ emm_sap.primitive = EMMAS_DATA_IND; emm_sap.u.emm_as.u.data.ueid = user->ueid; - emm_sap.u.emm_as.u.data.delivered = FALSE; + emm_sap.u.emm_as.u.data.delivered = false; emm_sap.u.emm_as.u.data.NASmsg.length = 0; rc = emm_sap_send(user, &emm_sap); @@ -1251,7 +1251,7 @@ int nas_proc_dl_transfer_ind(nas_user_t *user, const Byte_t *data, uint32_t len) */ emm_sap.primitive = EMMAS_DATA_IND; emm_sap.u.emm_as.u.data.ueid = user->ueid; - emm_sap.u.emm_as.u.data.delivered = TRUE; + emm_sap.u.emm_as.u.data.delivered = true; emm_sap.u.emm_as.u.data.NASmsg.length = len; emm_sap.u.emm_as.u.data.NASmsg.value = (uint8_t *)data; rc = emm_sap_send(user, &emm_sap); @@ -1274,7 +1274,7 @@ int nas_proc_dl_transfer_ind(nas_user_t *user, const Byte_t *data, uint32_t len) ** ** ** Inputs: cid: Identifier of the PDN context used to es- ** ** tablished connectivity to specified PDN ** - ** apply_to_all: TRUE if the PDN connectivity procedure is ** + ** apply_to_all: true if the PDN connectivity procedure is ** ** initiated to establish connectivity to all ** ** defined PDNs ** ** Others: None ** @@ -1284,12 +1284,12 @@ int nas_proc_dl_transfer_ind(nas_user_t *user, const Byte_t *data, uint32_t len) ** Others: None ** ** ** ***************************************************************************/ -static int _nas_proc_activate(nas_user_t *user, int cid, int apply_to_all) +static int _nas_proc_activate(nas_user_t *user, int cid, bool apply_to_all) { LOG_FUNC_IN; int rc; - int active = FALSE; + bool active = false; esm_sap_t esm_sap; @@ -1332,8 +1332,8 @@ static int _nas_proc_activate(nas_user_t *user, int cid, int apply_to_all) * for the specified PDN */ esm_sap.primitive = ESM_PDN_CONNECTIVITY_REQ; - esm_sap.is_standalone = TRUE; - esm_sap.data.pdn_connect.is_defined = TRUE; + esm_sap.is_standalone = true; + esm_sap.data.pdn_connect.is_defined = true; esm_sap.data.pdn_connect.cid = cid; rc = esm_sap_send(user, &esm_sap); @@ -1347,7 +1347,7 @@ static int _nas_proc_activate(nas_user_t *user, int cid, int apply_to_all) ** Description: Initiates a PDN disconnect procedure ** ** ** ** Inputs: cid: Identifier of the PDN context ** - ** apply_to_all: TRUE if the PDN disconnect procedure is ** + ** apply_to_all: true if the PDN disconnect procedure is ** ** initiated to request disconnection from ** ** all active PDNs ** ** Others: None ** @@ -1357,15 +1357,15 @@ static int _nas_proc_activate(nas_user_t *user, int cid, int apply_to_all) ** Others: None ** ** ** ***************************************************************************/ -static int _nas_proc_deactivate(nas_user_t *user, int cid, int apply_to_all) +static int _nas_proc_deactivate(nas_user_t *user, int cid, bool apply_to_all) { LOG_FUNC_IN; int rc; int pdn_type; const char *apn; - int emergency = FALSE; - int active = FALSE; + bool emergency = false; + bool active = false; /* Get PDN context parameters */ rc = esm_main_get_pdn(user->esm_data, cid, &pdn_type, &apn, &emergency, &active); diff --git a/openair3/NAS/UE/nas_proc.h b/openair3/NAS/UE/nas_proc.h index 4e653549ae0..bd88691de87 100644 --- a/openair3/NAS/UE/nas_proc.h +++ b/openair3/NAS/UE/nas_proc.h @@ -74,7 +74,7 @@ void nas_proc_cleanup(nas_user_t *user); int nas_proc_enable_s1_mode(nas_user_t *user); int nas_proc_disable_s1_mode(nas_user_t *user); -int nas_proc_get_eps(nas_user_t *user, int *stat); +int nas_proc_get_eps(nas_user_t *user, bool *stat); int nas_proc_get_imsi(emm_data_t *emm_data, char *imsi_str); int nas_proc_get_msisdn(nas_user_t *user, char *msisdn_str, int *ton_npi); @@ -83,16 +83,16 @@ int nas_proc_get_signal_quality(nas_user_t *user, int *rsrq, int *rsrp); int nas_proc_register(nas_user_t *user, int mode, int format, const network_plmn_t *oper, int AcT); int nas_proc_deregister(nas_user_t *user); -int nas_proc_get_reg_data(nas_user_t *user, int *mode, int *selected, int format, +int nas_proc_get_reg_data(nas_user_t *user, int *mode, bool *selected, int format, network_plmn_t *oper, int *AcT); int nas_proc_get_oper_list(nas_user_t *user, const char **oper_list); int nas_proc_get_reg_status(nas_user_t *user, int *stat); int nas_proc_get_loc_info(nas_user_t *user, char *tac, char *ci, int *AcT); -int nas_proc_detach(nas_user_t *user, int switch_off); +int nas_proc_detach(nas_user_t *user, bool switch_off); int nas_proc_attach(nas_user_t *user); -int nas_proc_get_attach_status(nas_user_t *user); +bool nas_proc_get_attach_status(nas_user_t *user); int nas_proc_reset_pdn(nas_user_t *user, int cid); int nas_proc_set_pdn(nas_user_t *user, int cid, int type, const char *apn, int ipv4_addr, diff --git a/openair3/NAS/UE/nas_proc_defs.h b/openair3/NAS/UE/nas_proc_defs.h index 1ce2bfd929d..09cf8e834e2 100644 --- a/openair3/NAS/UE/nas_proc_defs.h +++ b/openair3/NAS/UE/nas_proc_defs.h @@ -1,12 +1,14 @@ #ifndef _NAS_PROC_DEFS_H #define _NAS_PROC_DEFS_H +#include <stdbool.h> + /* * Local NAS data */ typedef struct { /* EPS capibility status */ - int EPS_capability_status; + bool EPS_capability_status; /* Reference signal received quality */ int rsrq; /* Reference signal received power */ diff --git a/openair3/NAS/UE/nas_ue_task.c b/openair3/NAS/UE/nas_ue_task.c index a94445349cf..34bf6cb3ad5 100644 --- a/openair3/NAS/UE/nas_ue_task.c +++ b/openair3/NAS/UE/nas_ue_task.c @@ -43,10 +43,10 @@ uint16_t ue_idx_standalone = 0xFFFF; char *make_port_str_from_ueid(const char *base_port_str, int ueid); -static int nas_ue_process_events(nas_user_container_t *users, struct epoll_event *events, int nb_events) +static bool nas_ue_process_events(nas_user_container_t *users, struct epoll_event *events, int nb_events) { int event; - int exit_loop = FALSE; + bool exit_loop = false; LOG_I(NAS, "[UE] Received %d events\n", nb_events); @@ -310,7 +310,7 @@ void *nas_ue_task(void *args_p) nb_events = itti_get_events(TASK_NAS_UE, &events); if ((nb_events > 0) && (events != NULL)) { - if (nas_ue_process_events(users, events, nb_events) == TRUE) { + if (nas_ue_process_events(users, events, nb_events) == true) { LOG_E(NAS, "[UE] Received exit loop\n"); } } diff --git a/openair3/NAS/UE/nas_user.c b/openair3/NAS/UE/nas_user.c index d3467eddd51..56e41e4610e 100644 --- a/openair3/NAS/UE/nas_user.c +++ b/openair3/NAS/UE/nas_user.c @@ -187,10 +187,10 @@ void nas_user_initialize(nas_user_t *user, emm_indication_callback_t emm_cb, ** from which data have been received ** ** Others: None ** ** ** - ** Outputs: Return: FALSE, TRUE ** + ** Outputs: Return: false, true ** ** ** ***************************************************************************/ -int nas_user_receive_and_process(nas_user_t *user, char *message) +bool nas_user_receive_and_process(nas_user_t *user, char *message) { LOG_FUNC_IN; @@ -212,13 +212,13 @@ int nas_user_receive_and_process(nas_user_t *user, char *message) * exit from the receiving loop */ LOG_TRACE (ERROR, "UE-MAIN - " "Failed to read data from the user application layer"); - LOG_FUNC_RETURN(TRUE); + LOG_FUNC_RETURN(true); } } if (bytes == 0) { /* A signal was caught before any data were available */ - LOG_FUNC_RETURN(FALSE); + LOG_FUNC_RETURN(false); } /* Decode the user data message */ @@ -268,12 +268,12 @@ int nas_user_receive_and_process(nas_user_t *user, char *message) * exit from the receiving loop */ LOG_TRACE (ERROR, "UE-MAIN - " "Failed to send data to the user application layer"); - LOG_FUNC_RETURN(TRUE); + LOG_FUNC_RETURN(true); } } } - LOG_FUNC_RETURN(FALSE); + LOG_FUNC_RETURN(false); } /**************************************************************************** @@ -989,7 +989,7 @@ static int _nas_user_proc_cops(nas_user_t *user, const at_command_t *data) char oper_buffer[NET_FORMAT_MAX_SIZE], *oper = oper_buffer; memset(oper, 0, NET_FORMAT_MAX_SIZE); - int oper_is_selected; + bool oper_is_selected; at_response->id = data->id; at_response->type = data->type; @@ -1266,7 +1266,7 @@ static int _nas_user_proc_cgatt(nas_user_t *user, const at_command_t *data) if (data->command.cgatt.state == AT_CGATT_ATTACHED) { ret_code = nas_proc_attach(user); } else if (data->command.cgatt.state == AT_CGATT_DETACHED) { - ret_code = nas_proc_detach(user, FALSE); + ret_code = nas_proc_detach(user, false); } if (ret_code != RETURNok) { @@ -1284,7 +1284,7 @@ static int _nas_user_proc_cgatt(nas_user_t *user, const at_command_t *data) /* * Read command returns the current EPS service state. */ - if (nas_proc_get_attach_status(user) != TRUE) { + if (nas_proc_get_attach_status(user) != true) { cgatt->state = AT_CGATT_DETACHED; } else { cgatt->state = AT_CGATT_ATTACHED; @@ -1821,7 +1821,7 @@ static int _nas_user_proc_cgdcont(nas_user_t *user, const at_command_t *data) int emergency = AT_CGDCONT_EBS_DEFAULT; int p_cscf = AT_CGDCONT_PCSCF_DEFAULT; int im_cn_signalling = AT_CGDCONT_IM_CM_DEFAULT; - int reset_pdn = TRUE; + bool reset_pdn = true; at_response->id = data->id; at_response->type = data->type; @@ -1870,7 +1870,7 @@ static int _nas_user_proc_cgdcont(nas_user_t *user, const at_command_t *data) break; } - reset_pdn = FALSE; + reset_pdn = false; } if (data->mask & AT_CGDCONT_APN_MASK) { diff --git a/openair3/NAS/UE/nas_user.h b/openair3/NAS/UE/nas_user.h index 1ded438ddd1..63920540d4d 100644 --- a/openair3/NAS/UE/nas_user.h +++ b/openair3/NAS/UE/nas_user.h @@ -63,7 +63,7 @@ Description NAS procedure functions triggered by the user void nas_user_initialize(nas_user_t *user, emm_indication_callback_t emm_cb, esm_indication_callback_t esm_cb, const char *version); -int nas_user_receive_and_process(nas_user_t *user, char *message); +bool nas_user_receive_and_process(nas_user_t *user, char *message); int nas_user_process_data(nas_user_t *user, const void *data); diff --git a/openair3/NGAP/ngap_common.h b/openair3/NGAP/ngap_common.h index 60f7beacd06..a550b6e4367 100644 --- a/openair3/NGAP/ngap_common.h +++ b/openair3/NGAP/ngap_common.h @@ -102,13 +102,6 @@ # error "You are compiling ngap with the wrong version of ASN1C" #endif -#ifndef FALSE -# define FALSE (0) -#endif -#ifndef TRUE -# define TRUE (!FALSE) -#endif - #define NGAP_UE_ID_FMT "0x%06"PRIX32 extern int asn_debug; diff --git a/openair3/S1AP/s1ap_common.h b/openair3/S1AP/s1ap_common.h index 3c07f92a7f5..d383b622b61 100644 --- a/openair3/S1AP/s1ap_common.h +++ b/openair3/S1AP/s1ap_common.h @@ -61,13 +61,6 @@ # error "You are compiling s1ap with the wrong version of ASN1C" #endif -#ifndef FALSE -# define FALSE (0) -#endif -#ifndef TRUE -# define TRUE (!FALSE) -#endif - #define S1AP_UE_ID_FMT "0x%06"PRIX32 extern int asn_debug; diff --git a/openair3/S1AP/s1ap_eNB_trace.c b/openair3/S1AP/s1ap_eNB_trace.c index 695eeb4ef83..de84682ec1a 100644 --- a/openair3/S1AP/s1ap_eNB_trace.c +++ b/openair3/S1AP/s1ap_eNB_trace.c @@ -115,7 +115,7 @@ int s1ap_eNB_handle_trace_start(uint32_t assoc_id, container = &pdu->choice.initiatingMessage.value.choice.TraceStart; S1AP_FIND_PROTOCOLIE_BY_ID(S1AP_TraceStartIEs_t, ie, container, - S1AP_ProtocolIE_ID_id_eNB_UE_S1AP_ID, TRUE); + S1AP_ProtocolIE_ID_id_eNB_UE_S1AP_ID, true); mme_ref_p = s1ap_eNB_get_MME(NULL, assoc_id, 0); DevAssert(mme_ref_p != NULL); if (ie != NULL) { diff --git a/openair3/SCTP/sctp_eNB_task.c b/openair3/SCTP/sctp_eNB_task.c index 06e606e36b6..df6dde0f997 100644 --- a/openair3/SCTP/sctp_eNB_task.c +++ b/openair3/SCTP/sctp_eNB_task.c @@ -859,7 +859,7 @@ sctp_eNB_accept_associations( struct sctp_cnx_list_elm_s *sctp_cnx) { int client_sd; - struct sockaddr saddr; + struct sockaddr_in6 saddr; socklen_t saddr_size; DevAssert(sctp_cnx != NULL); @@ -868,14 +868,14 @@ sctp_eNB_accept_associations( /* There is a new client connecting. Accept it... */ - if ((client_sd = accept(sctp_cnx->sd, &saddr, &saddr_size)) < 0) { + if ((client_sd = accept(sctp_cnx->sd, (struct sockaddr*)&saddr, &saddr_size)) < 0) { SCTP_ERROR("[%d] accept failed: %s:%d\n", sctp_cnx->sd, strerror(errno), errno); } else { struct sctp_cnx_list_elm_s *new_cnx; uint16_t port; /* This is an ipv6 socket */ - port = ((struct sockaddr_in6*)&saddr)->sin6_port; + port = saddr.sin6_port; /* Contrary to BSD, client socket does not inherit O_NONBLOCK option */ if (fcntl(client_sd, F_SETFL, O_NONBLOCK) < 0) { diff --git a/openair3/UTILS/conversions.h b/openair3/UTILS/conversions.h index 00b650a3025..0361c34f334 100644 --- a/openair3/UTILS/conversions.h +++ b/openair3/UTILS/conversions.h @@ -70,8 +70,8 @@ /* Convert an integer on 16 bits to the given bUFFER */ #define INT16_TO_BUFFER(x, buf) \ do { \ - (buf)[0] = (x) >> 8; \ - (buf)[1] = (x); \ + (buf)[0] = ((x) >> 8) & 0xff; \ + (buf)[1] = (x) & 0xff; \ } while(0) /* Convert an array of char containing vALUE to x */ @@ -84,9 +84,9 @@ do { \ /* Convert an integer on 24 bits to the given bUFFER */ #define INT24_TO_BUFFER(x, buf) \ do { \ - (buf)[0] = (x) >> 16; \ - (buf)[1] = (x) >> 8; \ - (buf)[2] = (x); \ + (buf)[0] = ((x) >> 16) & 0xff;\ + (buf)[1] = ((x) >> 8) & 0xff; \ + (buf)[2] = (x) & 0xff; \ } while(0) /* Convert an array of char containing vALUE to x */ @@ -101,10 +101,10 @@ do { \ /* Convert an integer on 32 bits to the given bUFFER */ #define INT32_TO_BUFFER(x, buf) \ do { \ - (buf)[0] = (x) >> 24; \ - (buf)[1] = (x) >> 16; \ - (buf)[2] = (x) >> 8; \ - (buf)[3] = (x); \ + (buf)[0] = ((x) >> 24) & 0xff;\ + (buf)[1] = ((x) >> 16) & 0xff;\ + (buf)[2] = ((x) >> 8) & 0xff; \ + (buf)[3] = (x) & 0xff; \ } while(0) /* Convert an array of char containing vALUE to x */ diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp index 7b8ba308bfb..e318f0cf95c 100644 --- a/openair3/ocp-gtpu/gtp_itf.cpp +++ b/openair3/ocp-gtpu/gtp_itf.cpp @@ -17,11 +17,10 @@ extern "C" { #include <openair2/COMMON/gtpv1_u_messages_types.h> #include <openair3/ocp-gtpu/gtp_itf.h> #include <openair2/LAYER2/PDCP_v10.1.0/pdcp.h> +#include <openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h> #include "openair2/SDAP/nr_sdap/nr_sdap.h" //#include <openair1/PHY/phy_extern.h> -static boolean_t is_gnb = false; - #pragma pack(1) typedef struct Gtpv1uMsgHeader { @@ -36,6 +35,22 @@ typedef struct Gtpv1uMsgHeader { teid_t teid; } __attribute__((packed)) Gtpv1uMsgHeaderT; +//TS 38.425, Figure 5.5.2.2-1 +typedef struct DlDataDeliveryStatus_flags { + uint8_t LPR:1; //Lost packet report + uint8_t FFI:1; //Final Frame Ind + uint8_t deliveredPdcpSn:1; //Highest Delivered NR PDCP SN Ind + uint8_t transmittedPdcpSn:1; //Highest Transmitted NR PDCP SN Ind + uint8_t pduType:4; //PDU type + uint8_t CR:1; //Cause Report + uint8_t deliveredReTxPdcpSn:1; //Delivered retransmitted NR PDCP SN Ind + uint8_t reTxPdcpSn:1; //Retransmitted NR PDCP SN Ind + uint8_t DRI:1; //Data Rate Indication + uint8_t deliveredPdcpSnRange:1; //Delivered NR PDCP SN Range Ind + uint8_t spare:3; + uint32_t drbBufferSize; //Desired buffer size for the data radio bearer +} __attribute__((packed)) DlDataDeliveryStatus_flagsT; + typedef struct Gtpv1uMsgHeaderOptFields { uint8_t seqNum1Oct; uint8_t seqNum2Oct; @@ -43,24 +58,29 @@ typedef struct Gtpv1uMsgHeaderOptFields { uint8_t NextExtHeaderType; } __attribute__((packed)) Gtpv1uMsgHeaderOptFieldsT; -typedef struct PDUSessionContainer { +#define DL_PDU_SESSION_INFORMATION 0 +#define UL_PDU_SESSION_INFORMATION 1 + + typedef struct PDUSessionContainer { uint8_t spare:4; uint8_t PDU_type:4; uint8_t QFI:6; - uint8_t RQI:1; - uint8_t PPP:1; + uint8_t Reflective_QoS_activation:1; + uint8_t Paging_Policy_Indicator:1; } __attribute__((packed)) PDUSessionContainerT; typedef struct Gtpv1uExtHeader { uint8_t ExtHeaderLen; PDUSessionContainerT pdusession_cntr; - //uint8_t NextExtHeaderType; + uint8_t NextExtHeaderType; }__attribute__((packed)) Gtpv1uExtHeaderT; #pragma pack() // TS 29.281, fig 5.2.1-3 #define PDU_SESSION_CONTAINER (0x85) +#define NR_RAN_CONTAINER (0x84) + // TS 29.281, 5.2.1 #define EXT_HDR_LNTH_OCTET_UNITS (4) #define NO_MORE_EXT_HDRS (0) @@ -84,16 +104,19 @@ typedef struct gtpv1u_bearer_s { tcp_udp_port_t outgoing_port; uint16_t seqNum; uint8_t npduNum; + int outgoing_qfi; } gtpv1u_bearer_t; typedef struct { map<int, gtpv1u_bearer_t> bearers; + teid_t outgoing_teid; } teidData_t; typedef struct { rnti_t rnti; ebi_t incoming_rb_id; gtpCallback callBack; + teid_t outgoing_teid; gtpCallbackSDAP callBackSDAP; int pdusession_id; } rntiData_t; @@ -137,53 +160,81 @@ instance_t legacyInstanceMapping=0; #define compatInst(a) ((a)==0 || (a)==INSTANCE_DEFAULT?legacyInstanceMapping:a) #define GTPV1U_HEADER_SIZE (8) - - -static int gtpv1uCreateAndSendMsg(int h, uint32_t peerIp, uint16_t peerPort, int msgType, teid_t teid, uint8_t *Msg,int msgLen, - bool seqNumFlag, bool npduNumFlag, bool extHdrFlag, int seqNum, int npduNum, int extHdrType) { - AssertFatal(extHdrFlag==false,"Not developped"); - int headerAdditional=0; - - if ( seqNumFlag || npduNumFlag || extHdrFlag) - headerAdditional=4; - - int fullSize=GTPV1U_HEADER_SIZE+headerAdditional+msgLen; - uint8_t buffer[fullSize]; + + #define HDR_MAX 256 // 256 is supposed to be larger than any gtp header +static int gtpv1uCreateAndSendMsg(int h, + uint32_t peerIp, + uint16_t peerPort, + int msgType, + teid_t teid, + uint8_t *Msg, + int msgLen, + bool seqNumFlag, + bool npduNumFlag, + int seqNum, + int npduNum, + int extHdrType, + uint8_t *extensionHeader_buffer, + uint8_t extensionHeader_length) { + LOG_D(GTPU, "Peer IP:%u peer port:%u outgoing teid:%u \n", peerIp, peerPort, teid); + + uint8_t buffer[msgLen+HDR_MAX]; + uint8_t *curPtr=buffer; Gtpv1uMsgHeaderT *msgHdr = (Gtpv1uMsgHeaderT *)buffer ; // N should be 0 for us (it was used only in 2G and 3G) msgHdr->PN=npduNumFlag; msgHdr->S=seqNumFlag; - msgHdr->E=extHdrFlag; + msgHdr->E = extHdrType; msgHdr->spare=0; //PT=0 is for GTP' TS 32.295 (charging) msgHdr->PT=1; msgHdr->version=1; msgHdr->msgType=msgType; - msgHdr->msgLength=htons(msgLen); + msgHdr->msgLength = htons(msgLen + extensionHeader_length); + msgHdr->teid=htonl(teid); - if ( seqNumFlag || extHdrFlag || npduNumFlag) - msgHdr->msgLength+=4; + curPtr+=sizeof(Gtpv1uMsgHeaderT); - msgHdr->teid=htonl(teid); + if (seqNumFlag || (extHdrType != NO_MORE_EXT_HDRS) || npduNumFlag) { + msgHdr->msgLength += htons(4); + *(uint16_t *)curPtr = seqNumFlag ? seqNum : 0x0000; + curPtr+=sizeof(uint16_t); + *(uint8_t *)curPtr = npduNumFlag ? npduNum : 0x00; + curPtr++; + *(uint8_t *)curPtr = extHdrType; + curPtr++; + } + + // Bug: if there is more than one extension, infinite loop on extensionHeader_buffer + while (extHdrType != NO_MORE_EXT_HDRS) { + if (extensionHeader_length > 0) { + memcpy(curPtr, extensionHeader_buffer, extensionHeader_length); + curPtr += extensionHeader_length; + LOG_D(GTPU, "Extension Header for DDD added. The length is: %d, extension header type is: %x \n", extensionHeader_length, *((uint8_t *)(buffer + 11))); + extHdrType = extensionHeader_buffer[extensionHeader_length - 1]; + LOG_D(GTPU, "Next extension header type is: %x \n", *((uint8_t *)(buffer + 11))); + } else { + LOG_W(GTPU, "Extension header type not supported, returning... \n"); + } + } - if(seqNumFlag || extHdrFlag || npduNumFlag) { - *((uint16_t *) (buffer+8)) = seqNumFlag ? htons(seqNum) : 0x0000; - *((uint8_t *) (buffer+10)) = npduNumFlag ? htons(npduNum) : 0x00; - *((uint8_t *) (buffer+11)) = extHdrFlag ? htons(extHdrType) : 0x00; + if (Msg!= NULL){ + memcpy(curPtr, Msg, msgLen); + curPtr+=msgLen; } - memcpy(buffer+GTPV1U_HEADER_SIZE+headerAdditional, Msg, msgLen); + AssertFatal(curPtr-(buffer+msgLen) < HDR_MAX, ""); // Fix me: add IPv6 support, using flag ipVersion static struct sockaddr_in to= {0}; to.sin_family = AF_INET; to.sin_port = htons(peerPort); to.sin_addr.s_addr = peerIp ; - LOG_D(GTPU,"sending packet size: %d to %s\n",fullSize, inet_ntoa(to.sin_addr) ); + LOG_D(GTPU,"sending packet size: %ld to %s\n",curPtr-buffer, inet_ntoa(to.sin_addr) ); int ret; - if ((ret=sendto(h, (void *)buffer, (size_t)fullSize, 0,(struct sockaddr *)&to, sizeof(to) )) != fullSize ) { - LOG_E(GTPU, "[SD %d] Failed to send data to " IPV4_ADDR " on port %d, buffer size %u, ret: %d, errno: %d\n", - h, IPV4_ADDR_FORMAT(peerIp), peerPort, fullSize, ret, errno); + if ((ret=sendto(h, (void *)buffer, curPtr-buffer, 0,(struct sockaddr *)&to, sizeof(to) )) != curPtr-buffer ) { + LOG_E(GTPU, "[SD %d] Failed to send data to " IPV4_ADDR " on port %d, buffer size %lu, ret: %d, errno: %d\n", + h, IPV4_ADDR_FORMAT(peerIp), peerPort, curPtr-buffer, ret, errno); return GTPNOK; } @@ -225,12 +276,8 @@ static void gtpv1uSend(instance_t instance, gtpv1u_enb_tunnel_data_req_t *req, b // copy to release the mutex gtpv1u_bearer_t tmp=ptr2->second; pthread_mutex_unlock(&globGtp.gtp_lock); - gtpv1uCreateAndSendMsg(compatInst(instance), - tmp.outgoing_ip_addr, - tmp.outgoing_port, - GTP_GPDU, - tmp.teid_outgoing, - buffer, length, seqNumFlag, npduNumFlag, false, tmp.seqNum, tmp.npduNum, 0) ; + gtpv1uCreateAndSendMsg( + compatInst(instance), tmp.outgoing_ip_addr, tmp.outgoing_port, GTP_GPDU, tmp.teid_outgoing, buffer, length, seqNumFlag, npduNumFlag, tmp.seqNum, tmp.npduNum, NO_MORE_EXT_HDRS, NULL, 0); } static void gtpv1uSend2(instance_t instance, gtpv1u_gnb_tunnel_data_req_t *req, bool seqNumFlag, bool npduNumFlag) { @@ -268,12 +315,98 @@ static void gtpv1uSend2(instance_t instance, gtpv1u_gnb_tunnel_data_req_t *req, // copy to release the mutex gtpv1u_bearer_t tmp=ptr2->second; pthread_mutex_unlock(&globGtp.gtp_lock); - gtpv1uCreateAndSendMsg(compatInst(instance), - tmp.outgoing_ip_addr, - tmp.outgoing_port, - GTP_GPDU, - tmp.teid_outgoing, - buffer, length, seqNumFlag, npduNumFlag, false, tmp.seqNum, tmp.npduNum, 0) ; + + if (tmp.outgoing_qfi != -1) { + Gtpv1uExtHeaderT ext = { 0 }; + ext.ExtHeaderLen = 1; // in quad bytes EXT_HDR_LNTH_OCTET_UNITS + ext.pdusession_cntr.spare = 0; + ext.pdusession_cntr.PDU_type = UL_PDU_SESSION_INFORMATION; + ext.pdusession_cntr.QFI = tmp.outgoing_qfi; + ext.pdusession_cntr.Reflective_QoS_activation = false; + ext.pdusession_cntr.Paging_Policy_Indicator = false; + ext.NextExtHeaderType = NO_MORE_EXT_HDRS; + + gtpv1uCreateAndSendMsg(compatInst(instance), + tmp.outgoing_ip_addr, + tmp.outgoing_port, + GTP_GPDU, + tmp.teid_outgoing, + buffer, + length, + seqNumFlag, + npduNumFlag, + tmp.seqNum, + tmp.npduNum, + PDU_SESSION_CONTAINER, + (uint8_t *)&ext, + sizeof(ext)); + } else { + gtpv1uCreateAndSendMsg( + compatInst(instance), tmp.outgoing_ip_addr, tmp.outgoing_port, GTP_GPDU, tmp.teid_outgoing, buffer, length, seqNumFlag, npduNumFlag, tmp.seqNum, tmp.npduNum, NO_MORE_EXT_HDRS, NULL, 0); + } +} + +static void fillDlDeliveryStatusReport(extensionHeader_t *extensionHeader, uint32_t RLC_buffer_availability, uint32_t NR_PDCP_PDU_SN){ + + extensionHeader->buffer[0] = (1+sizeof(DlDataDeliveryStatus_flagsT)+(NR_PDCP_PDU_SN>0?3:0)+(NR_PDCP_PDU_SN>0?1:0)+1)/4; + DlDataDeliveryStatus_flagsT DlDataDeliveryStatus; + DlDataDeliveryStatus.deliveredPdcpSn = 0; + DlDataDeliveryStatus.transmittedPdcpSn= NR_PDCP_PDU_SN>0?1:0; + DlDataDeliveryStatus.pduType = 1; + DlDataDeliveryStatus.drbBufferSize = htonl(RLC_buffer_availability); + memcpy(extensionHeader->buffer+1, &DlDataDeliveryStatus, sizeof(DlDataDeliveryStatus_flagsT)); + uint8_t offset = sizeof(DlDataDeliveryStatus_flagsT)+1; + + if(NR_PDCP_PDU_SN>0){ + extensionHeader->buffer[offset] = (NR_PDCP_PDU_SN >> 16) & 0xff; + extensionHeader->buffer[offset+1] = (NR_PDCP_PDU_SN >> 8) & 0xff; + extensionHeader->buffer[offset+2] = NR_PDCP_PDU_SN & 0xff; + LOG_D(GTPU, "Octets reporting NR_PDCP_PDU_SN, extensionHeader->buffer[offset]: %u, extensionHeader->buffer[offset+1]:%u, extensionHeader->buffer[offset+2]:%u \n", extensionHeader->buffer[offset], extensionHeader->buffer[offset+1],extensionHeader->buffer[offset+2]); + extensionHeader->buffer[offset+3] = 0x00; //Padding octet + offset = offset+3; + } + extensionHeader->buffer[offset] = 0x00; //No more extension headers + /*Total size of DDD_status PDU = size of mandatory part + + * 3 octets for highest transmitted/delivered PDCP SN + + * 1 octet for padding + 1 octet for next extension header type, + * according to TS 38.425: Fig. 5.5.2.2-1 and section 5.5.3.24*/ + extensionHeader->length = 1+sizeof(DlDataDeliveryStatus_flagsT)+ + (NR_PDCP_PDU_SN>0?3:0)+ + (NR_PDCP_PDU_SN>0?1:0)+1; +} + +static void gtpv1uSendDlDeliveryStatus(instance_t instance, gtpv1u_DU_buffer_report_req_t *req){ + rnti_t rnti=req->rnti; + int rab_id=req->pdusession_id; + pthread_mutex_lock(&globGtp.gtp_lock); + auto inst=&globGtp.instances[compatInst(instance)]; + auto ptrRnti=inst->ue2te_mapping.find(rnti); + + if ( ptrRnti==inst->ue2te_mapping.end() ) { + LOG_E(GTPU, "[%ld] GTP-U gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", instance, rnti); + pthread_mutex_unlock(&globGtp.gtp_lock); + return; + } + + map<int, gtpv1u_bearer_t>::iterator ptr2=ptrRnti->second.bearers.find(rab_id); + + if ( ptr2 == ptrRnti->second.bearers.end() ) { + LOG_D(GTPU,"GTP-U instance: %ld sending a packet to a non existant RNTI:RAB: %x/%x\n", instance, rnti, rab_id); + pthread_mutex_unlock(&globGtp.gtp_lock); + return; + } + + extensionHeader_t *extensionHeader; + extensionHeader = (extensionHeader_t *) calloc(1, sizeof(extensionHeader_t)); + fillDlDeliveryStatusReport(extensionHeader, req->buffer_availability,0); + + LOG_I(GTPU,"[%ld] GTP-U sending DL Data Delivery status to RNTI:RAB:teid %x/%x/%x, oldseq %d, oldnum %d\n", + instance, rnti, rab_id,ptr2->second.teid_outgoing, ptr2->second.seqNum,ptr2->second.npduNum ); + // copy to release the mutex + gtpv1u_bearer_t tmp=ptr2->second; + pthread_mutex_unlock(&globGtp.gtp_lock); + gtpv1uCreateAndSendMsg( + compatInst(instance), tmp.outgoing_ip_addr, tmp.outgoing_port, GTP_GPDU, tmp.teid_outgoing, NULL, 0, false, false, 0, 0, NR_RAN_CONTAINER, extensionHeader->buffer, extensionHeader->length); } static void gtpv1uEndTunnel(instance_t instance, gtpv1u_enb_tunnel_data_req_t *req) { @@ -455,14 +588,22 @@ void GtpuUpdateTunnelOutgoingTeid(instance_t instance, rnti_t rnti, ebi_t bearer return; } -teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer_id, int outgoing_bearer_id, teid_t outgoing_teid, - transport_layer_addr_t remoteAddr, int port, gtpCallback callBack) { +teid_t newGtpuCreateTunnel(instance_t instance, + rnti_t rnti, + int incoming_bearer_id, + int outgoing_bearer_id, + teid_t outgoing_teid, + int outgoing_qfi, + transport_layer_addr_t remoteAddr, + int port, + gtpCallback callBack, + gtpCallbackSDAP callBackSDAP) { pthread_mutex_lock(&globGtp.gtp_lock); instance=compatInst(instance); auto inst=&globGtp.instances[instance]; auto it=inst->ue2te_mapping.find(rnti); - if ( it != inst->ue2te_mapping.end() ) { + if ( it != inst->ue2te_mapping.end() && it->second.bearers.find(outgoing_bearer_id) != it->second.bearers.end()) { LOG_W(GTPU,"[%ld] Create a config for a already existing GTP tunnel (rnti %x)\n", instance, rnti); inst->ue2te_mapping.erase(it); } @@ -478,9 +619,11 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer inst->te2ue_mapping[incoming_teid].incoming_rb_id= incoming_bearer_id; + inst->te2ue_mapping[incoming_teid].outgoing_teid= outgoing_teid; + inst->te2ue_mapping[incoming_teid].callBack=callBack; - - inst->te2ue_mapping[incoming_teid].callBackSDAP = sdap_data_req; + + inst->te2ue_mapping[incoming_teid].callBackSDAP = callBackSDAP; inst->te2ue_mapping[incoming_teid].pdusession_id = (uint8_t)outgoing_bearer_id; @@ -511,6 +654,7 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer tmp->teid_incoming = incoming_teid; tmp->outgoing_port=port; tmp->teid_outgoing= outgoing_teid; + tmp->outgoing_qfi=outgoing_qfi; pthread_mutex_unlock(&globGtp.gtp_lock); char ip4[INET_ADDRSTRLEN]; char ip6[INET6_ADDRSTRLEN]; @@ -539,12 +683,16 @@ int gtpv1u_create_s1u_tunnel(instance_t instance, "From legacy code not clear, seems impossible (bearer=%d)\n", create_tunnel_req->eps_bearer_id[i]); int incoming_rb_id=create_tunnel_req->eps_bearer_id[i]-4; - teid_t teid=newGtpuCreateTunnel(compatInst(instance), create_tunnel_req->rnti, - incoming_rb_id, - create_tunnel_req->eps_bearer_id[i], - create_tunnel_req->sgw_S1u_teid[i], - create_tunnel_req->sgw_addr[i], dstport, - pdcp_data_req); + teid_t teid = newGtpuCreateTunnel(compatInst(instance), + create_tunnel_req->rnti, + incoming_rb_id, + create_tunnel_req->eps_bearer_id[i], + create_tunnel_req->sgw_S1u_teid[i], + -1, // no pdu session in 4G + create_tunnel_req->sgw_addr[i], + dstport, + pdcp_data_req, + NULL); create_tunnel_resp->status=0; create_tunnel_resp->rnti=create_tunnel_req->rnti; create_tunnel_resp->num_tunnels=create_tunnel_req->num_tunnels; @@ -601,15 +749,18 @@ int gtpv1u_create_ngu_tunnel( const instance_t instance, create_tunnel_req->rnti, create_tunnel_req->num_tunnels, create_tunnel_req->outgoing_teid[0]); - tcp_udp_port_t dstport=globGtp.instances[compatInst(instance)].get_dstport(); - is_gnb = true; + tcp_udp_port_t dstport = globGtp.instances[compatInst(instance)].get_dstport(); for (int i = 0; i < create_tunnel_req->num_tunnels; i++) { - teid_t teid=newGtpuCreateTunnel(instance, create_tunnel_req->rnti, - create_tunnel_req->incoming_rb_id[i], - create_tunnel_req->pdusession_id[i], - create_tunnel_req->outgoing_teid[i], - create_tunnel_req->dst_addr[i], dstport, - pdcp_data_req); + teid_t teid = newGtpuCreateTunnel(instance, + create_tunnel_req->rnti, + create_tunnel_req->incoming_rb_id[i], + create_tunnel_req->pdusession_id[i], + create_tunnel_req->outgoing_teid[i], + create_tunnel_req->outgoing_qfi[i], + create_tunnel_req->dst_addr[i], + dstport, + pdcp_data_req, + sdap_data_req); create_tunnel_resp->status=0; create_tunnel_resp->rnti=create_tunnel_req->rnti; create_tunnel_resp->num_tunnels=create_tunnel_req->num_tunnels; @@ -739,9 +890,7 @@ static int Gtpv1uHandleEchoReq(int h, uint16_t seq=ntohs(*(uint16_t *)(msgHdr+1)); LOG_D(GTPU, "[%d] Received a echo request, TEID: %d, seq: %hu\n", h, msgHdr->teid, seq); uint8_t recovery[2]= {14,0}; - return gtpv1uCreateAndSendMsg(h, peerIp, peerPort, GTP_ECHO_RSP, ntohl(msgHdr->teid), - recovery, sizeof recovery, - 1, 0, 0, seq, 0, 0); + return gtpv1uCreateAndSendMsg(h, peerIp, peerPort, GTP_ECHO_RSP, ntohl(msgHdr->teid), recovery, sizeof recovery, true, false, seq, 0, NO_MORE_EXT_HDRS, NULL, 0); } static int Gtpv1uHandleError(int h, @@ -850,26 +999,63 @@ static int Gtpv1uHandleGpdu(int h, return GTPNOK; } - int offset=sizeof(Gtpv1uMsgHeaderT); - - uint8_t qfi = 0; - boolean_t rqi = FALSE; - - if( msgHdr->E || msgHdr->S || msgHdr->PN){ - Gtpv1uMsgHeaderOptFieldsT *msgHdrOpt = (Gtpv1uMsgHeaderOptFieldsT *)(msgBuf+offset); - offset+=sizeof(Gtpv1uMsgHeaderOptFieldsT); - if( msgHdr->E && msgHdrOpt->NextExtHeaderType == PDU_SESSION_CONTAINER){ - Gtpv1uExtHeaderT *msgHdrExt = (Gtpv1uExtHeaderT *)(msgBuf+offset); - offset+=msgHdrExt->ExtHeaderLen*EXT_HDR_LNTH_OCTET_UNITS; - qfi = msgHdrExt->pdusession_cntr.QFI; - rqi = msgHdrExt->pdusession_cntr.RQI; - - /* - * Check if the next extension header type of GTP extension header is set to 0 - * We can not put it in the struct Gtpv1uExtHeaderT because the length is dynamic. - */ - if(*(msgBuf+offset-1) != NO_MORE_EXT_HDRS) - LOG_W(GTPU, "Warning - Next extension header is not zero, handle it \n"); + /* see TS 29.281 5.1 */ + //Minimum length of GTP-U header if non of the optional fields are present + int offset = sizeof(Gtpv1uMsgHeaderT); + + uint8_t qfi = -1; + bool rqi = false; + uint32_t NR_PDCP_PDU_SN = 0; + + /* if E, S, or PN is set then there are 4 more bytes of header */ + if( msgHdr->E || msgHdr->S ||msgHdr->PN) + offset += 4; + + if (msgHdr->E) { + int next_extension_header_type = msgBuf[offset - 1]; + int extension_header_length; + + while (next_extension_header_type != NO_MORE_EXT_HDRS) { + extension_header_length = msgBuf[offset]; + switch (next_extension_header_type) { + case PDU_SESSION_CONTAINER: { + PDUSessionContainerT *pdusession_cntr = (PDUSessionContainerT *)(msgBuf + offset + 1); + qfi = pdusession_cntr->QFI; + rqi = pdusession_cntr->Reflective_QoS_activation; + break; + } + case NR_RAN_CONTAINER: { + uint8_t PDU_type = (msgBuf[offset+1]>>4) & 0x0f; + if (PDU_type == 0){ //DL USER Data Format + int additional_offset = 6; //Additional offset capturing the first non-mandatory octet (TS 38.425, Figure 5.5.2.1-1) + if(msgBuf[offset+1]>>2 & 0x1){ //DL Discard Blocks flag is present + LOG_I(GTPU, "DL User Data: DL Discard Blocks handling not enabled\n"); + additional_offset = additional_offset + 9; //For the moment ignore + } + if(msgBuf[offset+1]>>1 & 0x1){ //DL Flush flag is present + LOG_I(GTPU, "DL User Data: DL Flush handling not enabled\n"); + additional_offset = additional_offset + 3; //For the moment ignore + } + if((msgBuf[offset+2]>>3)& 0x1){ //"Report delivered" enabled (TS 38.425, 5.4) + /*Store the NR PDCP PDU SN for which a delivery status report shall be generated once the + *PDU gets forwarded to the lower layers*/ + //NR_PDCP_PDU_SN = msgBuf[offset+6] << 16 | msgBuf[offset+7] << 8 | msgBuf[offset+8]; + NR_PDCP_PDU_SN = msgBuf[offset+additional_offset] << 16 | msgBuf[offset+additional_offset+1] << 8 | msgBuf[offset+additional_offset+2]; + LOG_D(GTPU, " NR_PDCP_PDU_SN: %u \n", NR_PDCP_PDU_SN); + } + } + else{ + LOG_W(GTPU, "NR-RAN container type: %d not supported \n", PDU_type); + } + break; + } + default: + LOG_W(GTPU, "unhandled extension 0x%2.2x, skipping\n", next_extension_header_type); + break; + } + + offset += extension_header_length * EXT_HDR_LNTH_OCTET_UNITS; + next_extension_header_type = msgBuf[offset - 1]; } } @@ -896,7 +1082,7 @@ static int Gtpv1uHandleGpdu(int h, const uint32_t destinationL2Id=0; pthread_mutex_unlock(&globGtp.gtp_lock); - if(is_gnb && qfi){ + if (qfi != -1 && tunnel->second.callBackSDAP) { if ( !tunnel->second.callBackSDAP(&ctxt, srb_flag, rb_id, @@ -925,6 +1111,40 @@ static int Gtpv1uHandleGpdu(int h, LOG_E(GTPU,"[%d] down layer refused incoming packet\n", h); } + if(NR_PDCP_PDU_SN > 0 && NR_PDCP_PDU_SN %5 ==0){ + LOG_D (GTPU, "Create and send DL DATA Delivery status for the previously received PDU, NR_PDCP_PDU_SN: %u \n", NR_PDCP_PDU_SN); + int rlc_tx_buffer_space = nr_rlc_get_available_tx_space(ctxt.rnti, rb_id); + LOG_D(GTPU, "Available buffer size in RLC for Tx: %d \n", rlc_tx_buffer_space); + /*Total size of DDD_status PDU = 1 octet to report extension header length + * size of mandatory part + 3 octets for highest transmitted/delivered PDCP SN + * 1 octet for padding + 1 octet for next extension header type, + * according to TS 38.425: Fig. 5.5.2.2-1 and section 5.5.3.24*/ + extensionHeader_t *extensionHeader; + extensionHeader = (extensionHeader_t *) calloc(1, sizeof(extensionHeader_t)) ; + extensionHeader->buffer[0] = (1+sizeof(DlDataDeliveryStatus_flagsT)+3+1+1)/4; + DlDataDeliveryStatus_flagsT DlDataDeliveryStatus; + DlDataDeliveryStatus.deliveredPdcpSn = 0; + DlDataDeliveryStatus.transmittedPdcpSn= 1; + DlDataDeliveryStatus.pduType = 1; + DlDataDeliveryStatus.drbBufferSize = htonl(rlc_tx_buffer_space); //htonl(10000000); //hardcoded for now but normally we should extract it from RLC + memcpy(extensionHeader->buffer+1, &DlDataDeliveryStatus, sizeof(DlDataDeliveryStatus_flagsT)); + uint8_t offset = sizeof(DlDataDeliveryStatus_flagsT)+1; + + extensionHeader->buffer[offset] = (NR_PDCP_PDU_SN >> 16) & 0xff; + extensionHeader->buffer[offset+1] = (NR_PDCP_PDU_SN >> 8) & 0xff; + extensionHeader->buffer[offset+2] = NR_PDCP_PDU_SN & 0xff; + LOG_D(GTPU, "Octets reporting NR_PDCP_PDU_SN, extensionHeader->buffer[offset]: %u, extensionHeader->buffer[offset+1]:%u, extensionHeader->buffer[offset+2]:%u \n", extensionHeader->buffer[offset], extensionHeader->buffer[offset+1],extensionHeader->buffer[offset+2]); + extensionHeader->buffer[offset+3] = 0x00; //Padding octet + extensionHeader->buffer[offset+4] = 0x00; //No more extension headers + /*Total size of DDD_status PDU = size of mandatory part + + * 3 octets for highest transmitted/delivered PDCP SN + + * 1 octet for padding + 1 octet for next extension header type, + * according to TS 38.425: Fig. 5.5.2.2-1 and section 5.5.3.24*/ + extensionHeader->length = 1+sizeof(DlDataDeliveryStatus_flagsT)+3+1+1; + gtpv1uCreateAndSendMsg( + h, peerIp, peerPort, GTP_GPDU, inst->te2ue_mapping[ntohl(msgHdr->teid)].outgoing_teid, NULL, 0, false, false, 0, 0, NR_RAN_CONTAINER, extensionHeader->buffer, extensionHeader->length); + } + LOG_D(GTPU,"[%d] Received a %d bytes packet for: teid:%x\n", h, msgBufLen-offset, ntohl(msgHdr->teid)); @@ -1009,6 +1229,12 @@ void *gtpv1uTask(void *args) { } break; + case GTPV1U_DU_BUFFER_REPORT_REQ:{ + gtpv1uSendDlDeliveryStatus(compatInst(ITTI_MSG_DESTINATION_INSTANCE(message_p)), + >PV1U_DU_BUFFER_REPORT_REQ(message_p)); + } + break; + case TERMINATE_MESSAGE: break; diff --git a/openair3/ocp-gtpu/gtp_itf.h b/openair3/ocp-gtpu/gtp_itf.h index 17882ebf1e7..7951c4db09b 100644 --- a/openair3/ocp-gtpu/gtp_itf.h +++ b/openair3/ocp-gtpu/gtp_itf.h @@ -8,32 +8,30 @@ extern "C" { #endif -typedef boolean_t (*gtpCallback)( - protocol_ctxt_t *ctxt_pP, - const srb_flag_t srb_flagP, - const rb_id_t rb_idP, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_buffer_sizeP, - unsigned char *const sdu_buffer_pP, - const pdcp_transmission_mode_t modeP, - const uint32_t *sourceL2Id, - const uint32_t *destinationL2Id); +typedef bool (*gtpCallback)(protocol_ctxt_t *ctxt_pP, + const srb_flag_t srb_flagP, + const rb_id_t rb_idP, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_buffer_sizeP, + unsigned char *const sdu_buffer_pP, + const pdcp_transmission_mode_t modeP, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id); -typedef boolean_t (*gtpCallbackSDAP)( - protocol_ctxt_t *ctxt_pP, - const srb_flag_t srb_flagP, - const rb_id_t rb_idP, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_buffer_sizeP, - unsigned char *const sdu_buffer_pP, - const pdcp_transmission_mode_t modeP, - const uint32_t *sourceL2Id, - const uint32_t *destinationL2Id, - const uint8_t qfi, - const boolean_t rqi, - const int pdusession_id); +typedef bool (*gtpCallbackSDAP)(protocol_ctxt_t *ctxt_pP, + const srb_flag_t srb_flagP, + const rb_id_t rb_idP, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_buffer_sizeP, + unsigned char *const sdu_buffer_pP, + const pdcp_transmission_mode_t modeP, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id, + const uint8_t qfi, + const bool rqi, + const int pdusession_id); typedef struct openAddr_s { char originHost[HOST_NAME_MAX]; @@ -43,6 +41,11 @@ typedef struct openAddr_s { instance_t originInstance; } openAddr_t; +typedef struct extensionHeader_s{ + uint8_t buffer[500]; + uint8_t length; +}extensionHeader_t; + // the init function create a gtp instance and return the gtp instance id // the parameter originInstance will be sent back in each message from gtp to the creator void gtpv1uReceiver(int h); @@ -63,8 +66,16 @@ int gtpv1u_create_x2u_tunnel( // New API -teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer_id, int outgoing_rb_id, teid_t teid, - transport_layer_addr_t remoteAddr, int port, gtpCallback callBack); +teid_t newGtpuCreateTunnel(instance_t instance, + rnti_t rnti, + int incoming_bearer_id, + int outgoing_rb_id, + teid_t teid, + int outgoing_qfi, + transport_layer_addr_t remoteAddr, + int port, + gtpCallback callBack, + gtpCallbackSDAP callBackSDAP); void GtpuUpdateTunnelOutgoingTeid(instance_t instance, rnti_t rnti, ebi_t bearer_id, teid_t newOutgoingTeid); int newGtpuDeleteAllTunnels(instance_t instance, rnti_t rnti); int newGtpuDeleteTunnels(instance_t instance, rnti_t rnti, int nbTunnels, pdusessionid_t *pdusession_id); diff --git a/rxsigF0.m b/rxsigF0.m new file mode 100644 index 00000000000..3309e1aa6f5 --- /dev/null +++ b/rxsigF0.m @@ -0,0 +1,57345 @@ +rxsF0 = [173 + j*(-306) +-141 + j*(-130) +-166 + j*(-246) +-107 + j*(-42) +-105 + j*(0) +-179 + j*(-28) +-87 + j*(186) +-95 + j*(151) +-1 + j*(228) +172 + j*(-62) +110 + j*(-5) +-178 + j*(-33) +-18 + j*(57) +9 + j*(146) +-11 + j*(103) +-67 + j*(64) +28 + j*(-375) +-72 + j*(-75) +-14 + j*(-318) +194 + j*(193) +-173 + j*(-228) +295 + j*(119) +203 + j*(-179) +-238 + j*(-276) +-286 + j*(112) +-409 + j*(95) +-260 + j*(84) +72 + j*(40) +105 + j*(-120) +57 + j*(66) +58 + j*(173) +-170 + j*(-189) +192 + j*(-50) +-88 + j*(160) +-187 + j*(-132) +120 + j*(41) +239 + j*(-115) +80 + j*(263) +-45 + j*(-30) +396 + j*(192) +161 + j*(-11) +-325 + j*(296) +-64 + j*(-192) +-181 + j*(-59) +-272 + j*(192) +11 + j*(192) +-215 + j*(50) +122 + j*(177) +-255 + j*(26) +87 + j*(11) +-86 + j*(-129) +-199 + j*(199) +-238 + j*(163) +29 + j*(134) +175 + j*(81) +30 + j*(-214) +-344 + j*(131) +124 + j*(-252) +134 + j*(-325) +224 + j*(-78) +223 + j*(-190) +-15 + j*(88) +-223 + j*(128) +-48 + j*(-223) +-109 + j*(-209) +-17 + j*(-84) +179 + j*(73) +-25 + j*(-81) +6 + j*(88) +8 + j*(83) +-75 + j*(38) +-119 + j*(51) +15 + j*(199) +140 + j*(42) +44 + j*(-132) +-247 + j*(118) +242 + j*(-82) +140 + j*(-258) +-98 + j*(28) +262 + j*(107) +-141 + j*(-21) +137 + j*(382) +64 + j*(-163) +-81 + j*(62) +54 + j*(245) +-132 + j*(75) +196 + j*(-219) +-146 + j*(211) +-64 + j*(64) +-146 + j*(-37) +-37 + j*(-94) +-318 + j*(160) +-237 + j*(112) +-98 + j*(2) +-286 + j*(209) +-69 + j*(192) +-52 + j*(105) +-63 + j*(-35) +119 + j*(59) +-19 + j*(-25) +110 + j*(54) +45 + j*(-37) +42 + j*(-107) +57 + j*(74) +190 + j*(105) +246 + j*(20) +233 + j*(93) +290 + j*(180) +232 + j*(-113) +281 + j*(243) +280 + j*(-250) +47 + j*(-245) +144 + j*(-150) +-272 + j*(25) +-94 + j*(163) +-135 + j*(-334) +16 + j*(-211) +-165 + j*(214) +88 + j*(34) +27 + j*(-36) +-161 + j*(-243) +94 + j*(151) +112 + j*(-66) +-180 + j*(48) +-77 + j*(-64) +-293 + j*(300) +-42 + j*(-139) +-177 + j*(91) +-37 + j*(-39) +-88 + j*(216) +-123 + j*(1) +141 + j*(-250) +100 + j*(-148) +-11 + j*(265) +30 + j*(-212) +-9 + j*(146) +281 + j*(223) +-166 + j*(141) +-7 + j*(-51) +69 + j*(-37) +-91 + j*(45) +198 + j*(-225) +560 + j*(-64) +-245 + j*(-145) +194 + j*(231) +-96 + j*(216) +8 + j*(-158) +117 + j*(42) +-42 + j*(132) +97 + j*(178) +-182 + j*(-65) +-59 + j*(118) +129 + j*(-45) +75 + j*(-6) +-88 + j*(20) +-425 + j*(35) +140 + j*(424) +-40 + j*(116) +27 + j*(-297) +123 + j*(230) +86 + j*(-293) +104 + j*(-127) +47 + j*(-89) +60 + j*(97) +-23 + j*(197) +-7 + j*(-93) +115 + j*(205) +271 + j*(-159) +-56 + j*(159) +-57 + j*(556) +-48 + j*(-196) +-71 + j*(-63) +-353 + j*(-221) +-84 + j*(-173) +30 + j*(45) +-302 + j*(371) +354 + j*(-22) +-233 + j*(35) +-308 + j*(-202) +-433 + j*(-44) +-158 + j*(73) +185 + j*(-150) +48 + j*(124) +-7 + j*(168) +190 + j*(78) +211 + j*(-9) +-71 + j*(-193) +-119 + j*(97) +-234 + j*(-197) +341 + j*(-197) +-346 + j*(74) +105 + j*(17) +57 + j*(-105) +-161 + j*(-138) +-180 + j*(180) +-156 + j*(91) +-9 + j*(-139) +-87 + j*(165) +-64 + j*(-238) +15 + j*(-221) +-113 + j*(8) +-331 + j*(59) +90 + j*(-150) +-136 + j*(-325) +73 + j*(178) +-18 + j*(170) +67 + j*(-96) +85 + j*(-37) +-9 + j*(-114) +-22 + j*(136) +-175 + j*(165) +-87 + j*(-25) +-31 + j*(-152) +-301 + j*(-18) +42 + j*(-54) +-32 + j*(-168) +-74 + j*(163) +-54 + j*(-52) +-76 + j*(-21) +67 + j*(73) +129 + j*(-255) +-270 + j*(203) +-112 + j*(-71) +-106 + j*(13) +175 + j*(-194) +6 + j*(110) +115 + j*(135) +-22 + j*(-50) +143 + j*(220) +-17 + j*(-82) +-65 + j*(204) +-46 + j*(-112) +86 + j*(-199) +3 + j*(-52) +88 + j*(116) +184 + j*(227) +-65 + j*(189) +-54 + j*(-150) +139 + j*(206) +122 + j*(72) +-71 + j*(194) +-134 + j*(287) +44 + j*(-124) +13 + j*(-250) +-100 + j*(95) +-110 + j*(16) +233 + j*(-139) +228 + j*(-39) +-252 + j*(133) +-122 + j*(-129) +21 + j*(-143) +-55 + j*(-144) +-199 + j*(14) +110 + j*(-195) +85 + j*(-45) +-243 + j*(-35) +59 + j*(-86) +-361 + j*(179) +69 + j*(34) +-22 + j*(42) +-267 + j*(-294) +28 + j*(-84) +40 + j*(-247) +-112 + j*(128) +54 + j*(182) +71 + j*(-33) +-40 + j*(448) +-75 + j*(-132) +10 + j*(-37) +272 + j*(-126) +-209 + j*(-100) +-98 + j*(58) +72 + j*(391) +25 + j*(21) +-126 + j*(-110) +-238 + j*(138) +227 + j*(-283) +64 + j*(-523) +-42 + j*(392) +103 + j*(-288) +-131 + j*(-207) +88 + j*(3) +-81 + j*(382) +-4 + j*(119) +177 + j*(-137) +-95 + j*(228) +39 + j*(-127) +-265 + j*(202) +145 + j*(66) +-358 + j*(127) +-320 + j*(-144) +-48 + j*(-260) +119 + j*(37) +-359 + j*(49) +257 + j*(-112) +112 + j*(84) +30 + j*(171) +136 + j*(-186) +-250 + j*(-115) +-274 + j*(-281) +-37 + j*(1) +69 + j*(130) +-125 + j*(-184) +-315 + j*(-75) +-93 + j*(104) +64 + j*(-6) +198 + j*(141) +-88 + j*(18) +248 + j*(-57) +-107 + j*(74) +-71 + j*(26) +-90 + j*(-21) +-282 + j*(-201) +57 + j*(47) +-15 + j*(33) +-144 + j*(153) +-202 + j*(-221) +-124 + j*(-175) +-146 + j*(-276) +-74 + j*(39) +-91 + j*(512) +125 + j*(213) +139 + j*(168) +-233 + j*(-91) +60 + j*(-132) +-36 + j*(-132) +21 + j*(105) +-129 + j*(231) +-283 + j*(191) +320 + j*(134) +-171 + j*(70) +-133 + j*(66) +189 + j*(47) +188 + j*(-88) +-16 + j*(263) +-44 + j*(4) +93 + j*(-2) +33 + j*(2) +30 + j*(211) +-114 + j*(-76) +54 + j*(12) +-128 + j*(-8) +-23 + j*(265) +-235 + j*(224) +-56 + j*(260) +30 + j*(106) +-150 + j*(-223) +-37 + j*(-291) +-175 + j*(177) +-165 + j*(259) +-206 + j*(63) +131 + j*(-61) +-43 + j*(-186) +-90 + j*(14) +79 + j*(-190) +-127 + j*(115) +48 + j*(28) +-5 + j*(17) +-28 + j*(47) +163 + j*(135) +44 + j*(-125) +-86 + j*(275) +1 + j*(117) +49 + j*(-62) +147 + j*(80) +85 + j*(84) +-31 + j*(-101) +243 + j*(150) +-181 + j*(-219) +-138 + j*(-10) +-214 + j*(-151) +27 + j*(-88) +211 + j*(86) +-162 + j*(-350) +-455 + j*(77) +237 + j*(30) +18 + j*(189) +-131 + j*(119) +18 + j*(96) +85 + j*(78) +182 + j*(155) +6 + j*(250) +195 + j*(-153) +-74 + j*(-51) +44 + j*(-60) +-234 + j*(221) +359 + j*(-139) +-228 + j*(291) +-28 + j*(173) +-147 + j*(-59) +-357 + j*(100) +-86 + j*(464) +-113 + j*(-74) +-282 + j*(356) +16 + j*(-52) +204 + j*(-316) +258 + j*(178) +-75 + j*(100) +-113 + j*(83) +158 + j*(309) +65 + j*(-170) +91 + j*(-125) +-151 + j*(318) +-52 + j*(-18) +-138 + j*(176) +-226 + j*(30) +-177 + j*(39) +-150 + j*(-13) +35 + j*(-183) +204 + j*(-308) +186 + j*(-243) +-115 + j*(-71) +66 + j*(55) +-88 + j*(-128) +-109 + j*(195) +-244 + j*(-90) +175 + j*(-177) +231 + j*(-194) +-59 + j*(101) +23 + j*(-8) +-117 + j*(209) +-16 + j*(-97) +4 + j*(190) +-28 + j*(-67) +-94 + j*(3) +-54 + j*(-21) +-27 + j*(83) +-127 + j*(-21) +187 + j*(-289) +3 + j*(-82) +-1 + j*(-223) +-168 + j*(232) +-148 + j*(163) +274 + j*(-324) +-156 + j*(-82) +384 + j*(162) +-91 + j*(94) +-37 + j*(10) +-66 + j*(330) +-85 + j*(-8) +62 + j*(216) +-98 + j*(95) +126 + j*(189) +196 + j*(-243) +81 + j*(-42) +-250 + j*(-2) +118 + j*(146) +-1 + j*(-98) +88 + j*(-234) +-151 + j*(25) +175 + j*(235) +36 + j*(-182) +-108 + j*(69) +105 + j*(-38) +-175 + j*(-36) +-327 + j*(-45) +80 + j*(268) +13 + j*(-43) +-87 + j*(57) +-70 + j*(-112) +192 + j*(71) +-369 + j*(-114) +224 + j*(341) +-144 + j*(-145) +262 + j*(105) +-91 + j*(-185) +-6 + j*(116) +-344 + j*(-245) +90 + j*(-101) +147 + j*(-123) +-76 + j*(-71) +6 + j*(197) +-44 + j*(-130) +21 + j*(-84) +448 + j*(74) +175 + j*(-3) +-175 + j*(-156) +-18 + j*(-110) +-95 + j*(-250) +-107 + j*(172) +-110 + j*(157) +132 + j*(6) +47 + j*(146) +212 + j*(-167) +95 + j*(40) +-239 + j*(-44) +97 + j*(134) +-104 + j*(-193) +-363 + j*(-244) +86 + j*(-1) +72 + j*(-13) +62 + j*(157) +214 + j*(-103) +-161 + j*(-3) +-252 + j*(-139) +147 + j*(39) +30 + j*(-73) +-100 + j*(-203) +159 + j*(-250) +-323 + j*(-118) +-35 + j*(-88) +-76 + j*(-105) +-24 + j*(28) +-194 + j*(-233) +-272 + j*(23) +-204 + j*(89) +-83 + j*(-110) +-88 + j*(110) +254 + j*(-103) +32 + j*(136) +92 + j*(-226) +-92 + j*(-203) +-136 + j*(94) +-283 + j*(-192) +161 + j*(272) +-102 + j*(30) +71 + j*(-71) +158 + j*(58) +-71 + j*(-139) +220 + j*(-131) +225 + j*(-135) +-222 + j*(332) +-296 + j*(-165) +-156 + j*(-104) +-216 + j*(164) +305 + j*(-68) +-102 + j*(47) +-25 + j*(66) +28 + j*(250) +120 + j*(-64) +-120 + j*(-134) +-42 + j*(114) +18 + j*(32) +-83 + j*(157) +115 + j*(-25) +-247 + j*(-110) +-53 + j*(206) +170 + j*(-30) +-86 + j*(100) +384 + j*(119) +-332 + j*(-5) +-37 + j*(163) +74 + j*(285) +139 + j*(-320) +-286 + j*(18) +21 + j*(313) +125 + j*(50) +-30 + j*(530) +153 + j*(24) +115 + j*(-141) +-392 + j*(-131) +194 + j*(-179) +167 + j*(211) +161 + j*(133) +101 + j*(-263) +-185 + j*(-81) +-6 + j*(240) +257 + j*(71) +-30 + j*(68) +-143 + j*(29) +124 + j*(154) +296 + j*(-67) +360 + j*(-25) +187 + j*(-21) +-70 + j*(409) +-95 + j*(39) +53 + j*(161) +-158 + j*(64) +-141 + j*(112) +414 + j*(-13) +-153 + j*(-59) +-189 + j*(-54) +-69 + j*(19) +1 + j*(-12) +191 + j*(192) +-133 + j*(-95) +-245 + j*(232) +86 + j*(-66) +-173 + j*(129) +63 + j*(131) +-348 + j*(-260) +143 + j*(-136) +-97 + j*(-107) +135 + j*(58) +184 + j*(-80) +-7 + j*(363) +-285 + j*(-198) +-103 + j*(290) +134 + j*(87) +-22 + j*(-163) +66 + j*(-226) +182 + j*(54) +-204 + j*(-52) +-194 + j*(161) +-63 + j*(-117) +61 + j*(98) +49 + j*(-33) +-152 + j*(40) +177 + j*(-91) +22 + j*(-106) +89 + j*(-54) +37 + j*(-148) +286 + j*(-67) +-114 + j*(69) +13 + j*(127) +-218 + j*(-8) +-154 + j*(19) +73 + j*(138) +-132 + j*(16) +185 + j*(117) +-136 + j*(351) +-121 + j*(98) +184 + j*(-65) +187 + j*(51) +119 + j*(68) +-85 + j*(-50) +145 + j*(-25) +-8 + j*(61) +137 + j*(325) +-124 + j*(-22) +326 + j*(-175) +-25 + j*(86) +279 + j*(-95) +8 + j*(159) +-4 + j*(186) +390 + j*(-138) +-162 + j*(-42) +-28 + j*(114) +153 + j*(44) +340 + j*(-112) +-300 + j*(-58) +-86 + j*(-173) +267 + j*(-119) +209 + j*(74) +-279 + j*(105) +-37 + j*(-37) +-59 + j*(80) +-148 + j*(-163) +81 + j*(-156) +-163 + j*(80) +-73 + j*(378) +-189 + j*(190) +-35 + j*(-102) +-49 + j*(-172) +-177 + j*(-221) +-4 + j*(215) +-297 + j*(1) +-94 + j*(-299) +129 + j*(-374) +-38 + j*(-16) +-21 + j*(-97) +-215 + j*(-75) +147 + j*(111) +-173 + j*(-72) +92 + j*(-138) +110 + j*(132) +28 + j*(16) +-143 + j*(-182) +-109 + j*(325) +-30 + j*(128) +-200 + j*(-168) +-148 + j*(-261) +132 + j*(-63) +-30 + j*(-14) +-238 + j*(-55) +-67 + j*(26) +-214 + j*(1) +-180 + j*(-286) +-147 + j*(-66) +205 + j*(41) +152 + j*(-89) +35 + j*(148) +-112 + j*(38) +156 + j*(-81) +-177 + j*(104) +-194 + j*(307) +-46 + j*(-199) +-290 + j*(35) +-170 + j*(28) +-23 + j*(214) +-78 + j*(-90) +-52 + j*(249) +-140 + j*(-72) +175 + j*(-34) +103 + j*(115) +266 + j*(-186) +70 + j*(-192) +-204 + j*(94) +18 + j*(287) +-173 + j*(289) +136 + j*(216) +-98 + j*(164) +-37 + j*(185) +-147 + j*(59) +-105 + j*(-132) +51 + j*(139) +68 + j*(165) +-330 + j*(-124) +-30 + j*(-76) +5 + j*(-193) +209 + j*(-233) +63 + j*(117) +-260 + j*(-180) +-34 + j*(182) +40 + j*(-52) +97 + j*(-188) +-62 + j*(-71) +-13 + j*(-250) +-15 + j*(234) +243 + j*(-193) +26 + j*(-392) +-129 + j*(69) +-143 + j*(-115) +-108 + j*(56) +-52 + j*(282) +-7 + j*(-90) +37 + j*(-105) +-615 + j*(-199) +-74 + j*(85) +-322 + j*(-64) +69 + j*(-165) +-70 + j*(101) +29 + j*(92) +-150 + j*(-327) +54 + j*(89) +-398 + j*(186) +-102 + j*(-121) +-269 + j*(-71) +52 + j*(-62) +170 + j*(-125) +6 + j*(-69) +-76 + j*(-327) +35 + j*(139) +-3 + j*(-87) +-322 + j*(167) +4 + j*(-26) +184 + j*(160) +-178 + j*(-75) +109 + j*(62) +50 + j*(54) +-64 + j*(-115) +-371 + j*(-247) +-124 + j*(-45) +-211 + j*(-123) +153 + j*(86) +-222 + j*(-161) +-163 + j*(-173) +-17 + j*(263) +171 + j*(27) +287 + j*(105) +31 + j*(-233) +-8 + j*(-81) +37 + j*(120) +-8 + j*(21) +3 + j*(-138) +95 + j*(202) +511 + j*(81) +-117 + j*(-196) +35 + j*(28) +-136 + j*(-301) +182 + j*(-140) +-60 + j*(-66) +-206 + j*(-111) +231 + j*(27) +48 + j*(49) +206 + j*(315) +86 + j*(93) +131 + j*(-232) +-161 + j*(6) +22 + j*(306) +-307 + j*(-81) +-170 + j*(87) +173 + j*(1) +-286 + j*(-155) +-278 + j*(-192) +10 + j*(-42) +-153 + j*(202) +377 + j*(35) +8 + j*(-47) +-54 + j*(-46) +138 + j*(-201) +26 + j*(-49) +235 + j*(-73) +-143 + j*(-291) +-103 + j*(-30) +18 + j*(-281) +311 + j*(122) +9 + j*(-27) +-240 + j*(50) +-110 + j*(209) +187 + j*(-209) +68 + j*(247) +498 + j*(-59) +161 + j*(-189) +-132 + j*(72) +-127 + j*(18) +-193 + j*(-185) +-127 + j*(-276) +-104 + j*(235) +-26 + j*(165) +148 + j*(-181) +87 + j*(-107) +-177 + j*(136) +173 + j*(2) +-298 + j*(-63) +218 + j*(29) +-330 + j*(-167) +110 + j*(127) +-18 + j*(-42) +-85 + j*(153) +-92 + j*(-119) +23 + j*(115) +149 + j*(-76) +-132 + j*(85) +-163 + j*(-52) +-139 + j*(303) +151 + j*(113) +264 + j*(74) +48 + j*(115) +-38 + j*(-9) +-232 + j*(262) +412 + j*(123) +28 + j*(108) +-53 + j*(-95) +-79 + j*(184) +-252 + j*(192) +170 + j*(39) +220 + j*(249) +-5 + j*(-8) +125 + j*(27) +147 + j*(-80) +25 + j*(-272) +52 + j*(47) +248 + j*(-56) +-84 + j*(-51) +-93 + j*(-395) +-179 + j*(221) +-110 + j*(108) +13 + j*(26) +332 + j*(336) +31 + j*(-141) +-2 + j*(76) +334 + j*(-79) +28 + j*(86) +307 + j*(-129) +-251 + j*(197) +-21 + j*(-36) +-117 + j*(71) +-279 + j*(42) +220 + j*(216) +135 + j*(-161) +345 + j*(-245) +40 + j*(-155) +-61 + j*(159) +105 + j*(52) +278 + j*(-63) +-40 + j*(35) +-47 + j*(326) +-171 + j*(-151) +83 + j*(177) +-250 + j*(-70) +20 + j*(-68) +87 + j*(-123) +-325 + j*(-98) +-3 + j*(81) +-21 + j*(165) +97 + j*(295) +554 + j*(168) +-192 + j*(-154) +14 + j*(-11) +-201 + j*(67) +-163 + j*(153) +-23 + j*(-153) +-44 + j*(-7) +-18 + j*(63) +-110 + j*(-35) +471 + j*(-202) +267 + j*(-194) +-140 + j*(-358) +-204 + j*(-94) +-25 + j*(-147) +59 + j*(199) +58 + j*(-13) +-36 + j*(-114) +115 + j*(-163) +190 + j*(226) +-142 + j*(-144) +51 + j*(-93) +68 + j*(-77) +1 + j*(-323) +95 + j*(-72) +-112 + j*(3) +202 + j*(284) +-261 + j*(18) +-358 + j*(122) +-129 + j*(-37) +80 + j*(-91) +59 + j*(132) +274 + j*(-385) +54 + j*(-131) +-49 + j*(-127) +-94 + j*(-332) +276 + j*(-44) +332 + j*(139) +13 + j*(-103) +-63 + j*(137) +115 + j*(-137) +-117 + j*(233) +10 + j*(-170) +-358 + j*(-182) +-37 + j*(15) +68 + j*(9) +342 + j*(-268) +-127 + j*(-199) +141 + j*(-452) +-265 + j*(1) +-180 + j*(236) +-18 + j*(4) +35 + j*(228) +-30 + j*(8) +182 + j*(-211) +-233 + j*(0) +-79 + j*(-53) +-159 + j*(100) +-29 + j*(-131) +-22 + j*(27) +-136 + j*(165) +44 + j*(146) +-162 + j*(21) +60 + j*(-158) +-127 + j*(-2) +-11 + j*(191) +-139 + j*(9) +315 + j*(115) +175 + j*(-193) +-45 + j*(250) +36 + j*(2) +141 + j*(-198) +-307 + j*(2) +144 + j*(-59) +122 + j*(-27) +-211 + j*(-483) +185 + j*(58) +39 + j*(127) +-238 + j*(-109) +106 + j*(345) +76 + j*(33) +239 + j*(207) +-109 + j*(-249) +-146 + j*(45) +-38 + j*(-150) +78 + j*(-186) +8 + j*(71) +-207 + j*(-255) +85 + j*(16) +-23 + j*(-153) +82 + j*(-11) +-10 + j*(116) +162 + j*(-201) +66 + j*(-116) +277 + j*(163) +102 + j*(-358) +54 + j*(10) +37 + j*(-112) +127 + j*(-64) +-74 + j*(-93) +-54 + j*(214) +149 + j*(-37) +-269 + j*(-66) +-13 + j*(-220) +-120 + j*(76) +97 + j*(75) +238 + j*(-78) +263 + j*(-293) +-57 + j*(-131) +127 + j*(-202) +235 + j*(-105) +226 + j*(-18) +-107 + j*(-286) +194 + j*(-118) +104 + j*(-121) +21 + j*(117) +380 + j*(92) +22 + j*(-190) +79 + j*(37) +175 + j*(180) +42 + j*(-70) +40 + j*(-174) +-36 + j*(-141) +-165 + j*(92) +9 + j*(-335) +328 + j*(-194) +-198 + j*(-147) +342 + j*(-129) +71 + j*(-201) +176 + j*(-66) +16 + j*(-255) +179 + j*(-119) +89 + j*(133) +144 + j*(-78) +106 + j*(235) +175 + j*(-324) +-68 + j*(315) +-265 + j*(-374) +-28 + j*(14) +-213 + j*(106) +106 + j*(-163) +49 + j*(-71) +-151 + j*(6) +-421 + j*(119) +-244 + j*(23) +81 + j*(-57) +-259 + j*(-230) +177 + j*(101) +-48 + j*(-308) +147 + j*(57) +152 + j*(47) +-194 + j*(-25) +-116 + j*(356) +-68 + j*(149) +7 + j*(-132) +-126 + j*(-159) +-177 + j*(272) +226 + j*(-257) +-158 + j*(51) +-73 + j*(214) +47 + j*(-237) +161 + j*(250) +83 + j*(105) +103 + j*(35) +99 + j*(81) +-6 + j*(0) +-122 + j*(39) +-116 + j*(-209) +-172 + j*(-250) +179 + j*(-8) +-174 + j*(134) +-71 + j*(-194) +105 + j*(257) +-124 + j*(100) +33 + j*(-117) +-73 + j*(53) +144 + j*(-12) +-185 + j*(-141) +136 + j*(110) +45 + j*(117) +-7 + j*(-195) +-86 + j*(172) +-23 + j*(-103) +-263 + j*(-26) +-37 + j*(124) +166 + j*(392) +-373 + j*(111) +-34 + j*(-202) +63 + j*(299) +474 + j*(273) +-264 + j*(-284) +-119 + j*(33) +227 + j*(-117) +-98 + j*(135) +-47 + j*(-141) +-158 + j*(-36) +160 + j*(38) +-29 + j*(66) +144 + j*(-272) +-171 + j*(-107) +357 + j*(-86) +-231 + j*(-86) +-75 + j*(-76) +216 + j*(156) +-13 + j*(-187) +-88 + j*(37) +119 + j*(270) +31 + j*(-77) +-140 + j*(37) +21 + j*(-17) +211 + j*(-33) +-287 + j*(101) +-112 + j*(142) +-3 + j*(-140) +-91 + j*(-151) +150 + j*(-243) +-64 + j*(96) +-262 + j*(163) +196 + j*(-39) +-126 + j*(-71) +-161 + j*(102) +-125 + j*(35) +292 + j*(98) +-6 + j*(192) +107 + j*(-71) +83 + j*(-193) +272 + j*(-25) +235 + j*(67) +-87 + j*(-159) +-54 + j*(-118) +-279 + j*(-4) +29 + j*(-20) +132 + j*(314) +-73 + j*(-148) +-470 + j*(86) +262 + j*(-260) +-76 + j*(-42) +256 + j*(64) +-18 + j*(-144) +40 + j*(-151) +75 + j*(-166) +-196 + j*(21) +-45 + j*(184) +121 + j*(18) +-89 + j*(-148) +-170 + j*(-18) +338 + j*(-150) +-276 + j*(221) +-177 + j*(236) +139 + j*(-134) +139 + j*(213) +33 + j*(233) +-53 + j*(16) +-219 + j*(-206) +301 + j*(-21) +83 + j*(-59) +47 + j*(-66) +325 + j*(-275) +53 + j*(10) +-25 + j*(106) +85 + j*(-86) +-150 + j*(-16) +-172 + j*(-122) +317 + j*(-115) +66 + j*(-1) +-176 + j*(4) +-47 + j*(-43) +-122 + j*(-28) +79 + j*(519) +-87 + j*(190) +81 + j*(-124) +149 + j*(-67) +-68 + j*(-148) +-154 + j*(-199) +-127 + j*(94) +-21 + j*(-108) +-185 + j*(155) +-327 + j*(223) +127 + j*(27) +140 + j*(118) +260 + j*(-68) +-228 + j*(200) +-431 + j*(-226) +97 + j*(153) +68 + j*(25) +-226 + j*(245) +-83 + j*(133) +23 + j*(45) +70 + j*(52) +-4 + j*(-66) +-137 + j*(71) +-110 + j*(78) +95 + j*(-11) +93 + j*(-266) +-163 + j*(103) +-246 + j*(-91) +-9 + j*(-296) +177 + j*(-14) +-151 + j*(-157) +60 + j*(73) +54 + j*(308) +165 + j*(-85) +106 + j*(-66) +-205 + j*(-183) +45 + j*(107) +71 + j*(-59) +249 + j*(27) +10 + j*(168) +-153 + j*(-134) +-40 + j*(208) +-214 + j*(156) +77 + j*(220) +115 + j*(103) +52 + j*(-8) +-93 + j*(133) +-163 + j*(78) +283 + j*(22) +-500 + j*(-91) +-42 + j*(-286) +25 + j*(143) +-62 + j*(350) +303 + j*(157) +-164 + j*(-109) +36 + j*(-296) +166 + j*(19) +298 + j*(161) +99 + j*(-253) +37 + j*(-6) +-117 + j*(245) +191 + j*(-123) +153 + j*(-14) +107 + j*(77) +-71 + j*(-195) +266 + j*(-438) +163 + j*(3) +-202 + j*(-173) +-95 + j*(62) +11 + j*(337) +33 + j*(-120) +206 + j*(-425) +-189 + j*(-49) +183 + j*(118) +-66 + j*(144) +-214 + j*(-160) +88 + j*(-28) +-49 + j*(102) +-262 + j*(-225) +-136 + j*(-174) +-87 + j*(265) +-43 + j*(-2) +68 + j*(36) +47 + j*(-197) +-139 + j*(194) +14 + j*(332) +89 + j*(-95) +-348 + j*(-112) +122 + j*(-240) +221 + j*(132) +170 + j*(-24) +310 + j*(-73) +-103 + j*(-392) +61 + j*(-144) +112 + j*(-128) +73 + j*(52) +48 + j*(435) +224 + j*(169) +116 + j*(-322) +91 + j*(-1) +-40 + j*(243) +72 + j*(-96) +159 + j*(-83) +69 + j*(30) +-173 + j*(316) +322 + j*(-42) +99 + j*(208) +76 + j*(-222) +-35 + j*(-66) +4 + j*(-345) +-223 + j*(-115) +-37 + j*(212) +-119 + j*(6) +-23 + j*(-83) +-25 + j*(-12) +-78 + j*(-47) +166 + j*(69) +116 + j*(72) +-60 + j*(105) +165 + j*(53) +83 + j*(-57) +-48 + j*(337) +35 + j*(-71) +-260 + j*(124) +-185 + j*(49) +-117 + j*(-358) +138 + j*(-20) +-103 + j*(-228) +-87 + j*(105) +-141 + j*(-50) +160 + j*(124) +-448 + j*(42) +-87 + j*(36) +-227 + j*(-343) +-188 + j*(-226) +-101 + j*(-183) +-8 + j*(-93) +-264 + j*(-92) +233 + j*(57) +5 + j*(6) +-47 + j*(122) +46 + j*(11) +-13 + j*(-95) +-35 + j*(60) +203 + j*(-5) +-267 + j*(25) +112 + j*(-79) +329 + j*(-30) +111 + j*(-98) +-238 + j*(286) +-76 + j*(-166) +103 + j*(-232) +-41 + j*(-90) +28 + j*(182) +190 + j*(-57) +203 + j*(-90) +-51 + j*(-117) +74 + j*(120) +-161 + j*(-360) +72 + j*(-57) +296 + j*(-36) +146 + j*(-111) +149 + j*(-75) +-59 + j*(-81) +104 + j*(-30) +198 + j*(124) +-120 + j*(-214) +-98 + j*(63) +-127 + j*(-165) +284 + j*(-8) +-92 + j*(-310) +-368 + j*(105) +-314 + j*(-363) +184 + j*(265) +-100 + j*(-36) +-134 + j*(-56) +-158 + j*(121) +72 + j*(-204) +130 + j*(44) +-209 + j*(-211) +62 + j*(-212) +177 + j*(100) +78 + j*(-333) +-42 + j*(-40) +-37 + j*(125) +57 + j*(21) +182 + j*(-21) +3 + j*(-171) +243 + j*(-354) +344 + j*(57) +-157 + j*(-167) +121 + j*(59) +151 + j*(145) +-162 + j*(-107) +181 + j*(-11) +-32 + j*(383) +86 + j*(7) +-135 + j*(-260) +-79 + j*(-11) +-136 + j*(-334) +66 + j*(219) +300 + j*(1) +-116 + j*(-202) +186 + j*(-223) +228 + j*(400) +-150 + j*(-101) +161 + j*(-204) +-10 + j*(53) +-236 + j*(172) +143 + j*(-182) +10 + j*(272) +55 + j*(184) +32 + j*(-390) +-69 + j*(317) +-37 + j*(11) +-74 + j*(30) +140 + j*(-83) +53 + j*(-136) +200 + j*(-285) +-189 + j*(-378) +-101 + j*(-253) +-25 + j*(78) +17 + j*(-104) +-180 + j*(196) +-148 + j*(-309) +-317 + j*(119) +141 + j*(79) +-41 + j*(-72) +-162 + j*(-63) +-65 + j*(-35) +-110 + j*(49) +110 + j*(-48) +19 + j*(92) +-148 + j*(14) +-102 + j*(280) +139 + j*(43) +-36 + j*(-207) +40 + j*(-76) +172 + j*(-279) +-35 + j*(224) +414 + j*(-378) +157 + j*(-112) +529 + j*(-307) +-1 + j*(-74) +-11 + j*(330) +236 + j*(-36) +-158 + j*(-353) +-215 + j*(-29) +185 + j*(174) +-8 + j*(-27) +306 + j*(170) +-214 + j*(-102) +-73 + j*(37) +199 + j*(-156) +230 + j*(-113) +-2 + j*(-106) +-80 + j*(204) +40 + j*(-276) +196 + j*(-459) +-330 + j*(-98) +-267 + j*(83) +-15 + j*(-58) +-163 + j*(403) +-126 + j*(-262) +-215 + j*(178) +89 + j*(121) +-132 + j*(130) +154 + j*(210) +-159 + j*(337) +-264 + j*(161) +25 + j*(201) +-21 + j*(102) +-132 + j*(101) +6 + j*(98) +-19 + j*(-328) +62 + j*(-122) +-151 + j*(-103) +-72 + j*(316) +150 + j*(-520) +438 + j*(378) +144 + j*(462) +161 + j*(15) +42 + j*(-182) +-123 + j*(479) +-248 + j*(145) +-416 + j*(305) +34 + j*(-459) +334 + j*(133) +391 + j*(-385) +-167 + j*(324) +-98 + j*(104) +444 + j*(-168) +151 + j*(-241) +-143 + j*(56) +-148 + j*(281) +-276 + j*(269) +260 + j*(-255) +173 + j*(-64) +534 + j*(206) +-692 + j*(597) +173 + j*(-259) +235 + j*(346) +-59 + j*(-310) +124 + j*(334) +-416 + j*(-148) +438 + j*(66) +-269 + j*(421) +-455 + j*(235) +355 + j*(-293) +-326 + j*(-148) +-332 + j*(-433) +-89 + j*(75) +468 + j*(-103) +376 + j*(-51) +-180 + j*(12) +91 + j*(-346) +-95 + j*(447) +-214 + j*(281) +107 + j*(256) +179 + j*(-77) +-397 + j*(-168) +-208 + j*(528) +-342 + j*(282) +212 + j*(-330) +-327 + j*(119) +339 + j*(-146) +112 + j*(346) +361 + j*(142) +-556 + j*(260) +-226 + j*(-152) +-368 + j*(-221) +-532 + j*(-147) +-494 + j*(-18) +614 + j*(-132) +274 + j*(-102) +-269 + j*(-486) +-263 + j*(134) +-486 + j*(426) +-143 + j*(-286) +-215 + j*(-343) +-383 + j*(-17) +-139 + j*(245) +346 + j*(157) +2 + j*(60) +264 + j*(64) +304 + j*(-49) +298 + j*(-491) +-375 + j*(-129) +170 + j*(109) +-226 + j*(-220) +450 + j*(117) +-173 + j*(221) +-119 + j*(484) +-325 + j*(-109) +-301 + j*(-263) +-227 + j*(-337) +-144 + j*(-313) +-93 + j*(-265) +-14 + j*(-269) +-456 + j*(25) +-330 + j*(127) +-286 + j*(351) +482 + j*(-336) +-387 + j*(436) +-182 + j*(260) +-327 + j*(-333) +-502 + j*(-140) +-131 + j*(-227) +-261 + j*(-309) +183 + j*(195) +-160 + j*(-465) +-325 + j*(-431) +212 + j*(-549) +19 + j*(-120) +73 + j*(-1) +-316 + j*(347) +192 + j*(265) +-192 + j*(-124) +260 + j*(417) +431 + j*(-404) +192 + j*(-508) +-54 + j*(-424) +370 + j*(18) +-393 + j*(-101) +434 + j*(-268) +50 + j*(-37) +504 + j*(-91) +462 + j*(337) +-223 + j*(-328) +298 + j*(-308) +140 + j*(-303) +-208 + j*(-406) +378 + j*(-223) +-325 + j*(105) +-467 + j*(-122) +297 + j*(279) +-589 + j*(-381) +252 + j*(185) +161 + j*(-177) +348 + j*(605) +-329 + j*(116) +122 + j*(-226) +-303 + j*(-57) +357 + j*(-264) +-152 + j*(-261) +-234 + j*(-112) +-66 + j*(37) +239 + j*(446) +-20 + j*(170) +-202 + j*(72) +-132 + j*(-164) +-121 + j*(-69) +-368 + j*(-541) +-16 + j*(356) +-226 + j*(-168) +-274 + j*(-315) +606 + j*(-180) +-187 + j*(-28) +-444 + j*(333) +-466 + j*(-235) +-121 + j*(-71) +-236 + j*(-49) +506 + j*(-332) +218 + j*(248) +-22 + j*(-289) +308 + j*(-8) +-85 + j*(414) +-154 + j*(360) +46 + j*(-332) +199 + j*(10) +-243 + j*(485) +-368 + j*(-624) +-367 + j*(170) +-339 + j*(274) +895 + j*(286) +148 + j*(-251) +167 + j*(156) +195 + j*(205) +27 + j*(-98) +86 + j*(-226) +-197 + j*(-206) +417 + j*(-226) +308 + j*(503) +401 + j*(-250) +-139 + j*(158) +108 + j*(190) +462 + j*(257) +14 + j*(-387) +360 + j*(155) +-435 + j*(-99) +361 + j*(416) +258 + j*(-62) +25 + j*(-333) +66 + j*(352) +546 + j*(-286) +-180 + j*(-458) +280 + j*(-151) +72 + j*(-216) +-368 + j*(403) +464 + j*(527) +-344 + j*(-60) +-129 + j*(516) +-279 + j*(348) +-249 + j*(257) +95 + j*(226) +180 + j*(170) +-97 + j*(-238) +-234 + j*(-164) +148 + j*(-344) +-190 + j*(-359) +152 + j*(537) +187 + j*(-93) +-264 + j*(311) +100 + j*(115) +329 + j*(-129) +-264 + j*(495) +281 + j*(296) +-216 + j*(-100) +255 + j*(635) +-410 + j*(324) +368 + j*(349) +-515 + j*(-427) +-296 + j*(-91) +-89 + j*(-357) +23 + j*(-220) +-39 + j*(-482) +366 + j*(613) +359 + j*(44) +270 + j*(-241) +146 + j*(-653) +-220 + j*(441) +269 + j*(125) +-350 + j*(321) +284 + j*(12) +-209 + j*(-60) +305 + j*(144) +-368 + j*(272) +468 + j*(-231) +176 + j*(12) +-149 + j*(-216) +424 + j*(-84) +-462 + j*(-520) +349 + j*(-377) +-361 + j*(166) +165 + j*(238) +-78 + j*(201) +-188 + j*(330) +-70 + j*(-25) +-220 + j*(330) +-206 + j*(308) +378 + j*(-181) +-203 + j*(-356) +501 + j*(-574) +63 + j*(134) +-493 + j*(-103) +-26 + j*(-341) +-390 + j*(158) +69 + j*(249) +279 + j*(358) +441 + j*(-253) +-142 + j*(142) +-346 + j*(-387) +332 + j*(-606) +187 + j*(240) +431 + j*(-35) +308 + j*(-181) +240 + j*(-338) +240 + j*(-168) +-429 + j*(-134) +161 + j*(-89) +-460 + j*(-346) +-382 + j*(247) +-521 + j*(-66) +99 + j*(318) +-193 + j*(-20) +148 + j*(551) +366 + j*(200) +560 + j*(-170) +281 + j*(280) +-462 + j*(-173) +-424 + j*(66) +190 + j*(354) +-135 + j*(-346) +-283 + j*(-282) +306 + j*(-280) +308 + j*(341) +57 + j*(-380) +-439 + j*(-147) +46 + j*(-188) +-189 + j*(136) +-167 + j*(281) +-73 + j*(-352) +286 + j*(165) +-353 + j*(152) +255 + j*(-443) +458 + j*(300) +126 + j*(-267) +-147 + j*(430) +756 + j*(232) +-462 + j*(-200) +-246 + j*(368) +392 + j*(501) +593 + j*(-118) +-341 + j*(274) +240 + j*(221) +-474 + j*(-129) +277 + j*(418) +-134 + j*(231) +-302 + j*(115) +101 + j*(337) +-122 + j*(-20) +503 + j*(-217) +473 + j*(-235) +-338 + j*(-158) +-43 + j*(472) +-428 + j*(-216) +-344 + j*(75) +-728 + j*(233) +-86 + j*(6) +337 + j*(-549) +-318 + j*(4) +-322 + j*(177) +141 + j*(-152) +445 + j*(85) +260 + j*(178) +54 + j*(128) +-45 + j*(103) +-320 + j*(307) +-640 + j*(-346) +-98 + j*(445) +-356 + j*(-291) +173 + j*(229) +-5 + j*(130) +142 + j*(248) +-248 + j*(412) +-18 + j*(494) +238 + j*(195) +-159 + j*(-196) +338 + j*(211) +767 + j*(-549) +516 + j*(185) +252 + j*(87) +-416 + j*(387) +371 + j*(-352) +-396 + j*(34) +455 + j*(34) +298 + j*(-147) +-377 + j*(119) +214 + j*(-19) +-242 + j*(-141) +115 + j*(305) +542 + j*(292) +58 + j*(-453) +199 + j*(-347) +-431 + j*(-128) +260 + j*(-252) +-175 + j*(491) +535 + j*(-119) +330 + j*(69) +-240 + j*(-301) +499 + j*(525) +-400 + j*(-455) +549 + j*(636) +247 + j*(-328) +-293 + j*(-170) +-178 + j*(270) +-119 + j*(250) +183 + j*(57) +252 + j*(97) +-539 + j*(-34) +-353 + j*(-15) +-105 + j*(-148) +-272 + j*(-336) +-338 + j*(-402) +-396 + j*(57) +292 + j*(41) +-204 + j*(-299) +281 + j*(333) +77 + j*(323) +-190 + j*(-385) +426 + j*(-128) +263 + j*(282) +16 + j*(18) +327 + j*(-40) +-411 + j*(-99) +387 + j*(91) +-238 + j*(166) +-72 + j*(11) +-508 + j*(233) +244 + j*(-490) +-442 + j*(216) +178 + j*(-419) +313 + j*(187) +266 + j*(-521) +390 + j*(-337) +448 + j*(-103) +425 + j*(-349) +-151 + j*(310) +283 + j*(-153) +320 + j*(-281) +56 + j*(99) +-202 + j*(-406) +-141 + j*(-409) +121 + j*(317) +380 + j*(371) +-177 + j*(-47) +361 + j*(-379) +-448 + j*(-28) +296 + j*(-269) +508 + j*(-238) +659 + j*(-47) +-298 + j*(-180) +104 + j*(174) +49 + j*(-67) +233 + j*(-449) +339 + j*(156) +258 + j*(-158) +-181 + j*(426) +278 + j*(-175) +-68 + j*(-334) +327 + j*(-599) +118 + j*(-216) +45 + j*(-304) +-158 + j*(216) +-257 + j*(204) +396 + j*(-415) +338 + j*(229) +-194 + j*(256) +-583 + j*(306) +103 + j*(-457) +185 + j*(-439) +478 + j*(66) +-255 + j*(464) +-145 + j*(346) +-660 + j*(-47) +-511 + j*(-410) +-288 + j*(453) +-258 + j*(250) +-115 + j*(-121) +134 + j*(344) +349 + j*(-287) +-503 + j*(205) +-383 + j*(-410) +-470 + j*(240) +325 + j*(-687) +221 + j*(-151) +426 + j*(418) +134 + j*(206) +88 + j*(-121) +-111 + j*(362) +-305 + j*(-182) +93 + j*(-185) +-174 + j*(406) +-417 + j*(240) +104 + j*(-155) +146 + j*(375) +618 + j*(146) +134 + j*(196) +-393 + j*(343) +-454 + j*(-76) +260 + j*(-24) +132 + j*(-68) +242 + j*(426) +106 + j*(-454) +-266 + j*(-200) +337 + j*(576) +180 + j*(95) +-257 + j*(116) +459 + j*(417) +-129 + j*(-160) +142 + j*(-197) +219 + j*(504) +154 + j*(170) +132 + j*(185) +316 + j*(264) +-440 + j*(200) +97 + j*(-3) +-9 + j*(-173) +249 + j*(-28) +612 + j*(-663) +-484 + j*(-26) +419 + j*(425) +-228 + j*(330) +4 + j*(-297) +445 + j*(201) +519 + j*(37) +333 + j*(158) +362 + j*(45) +333 + j*(-542) +187 + j*(-188) +-148 + j*(-273) +-329 + j*(241) +-148 + j*(-251) +423 + j*(-16) +90 + j*(-232) +-293 + j*(551) +-190 + j*(165) +-256 + j*(-518) +143 + j*(-260) +463 + j*(-392) +-295 + j*(-20) +14 + j*(-130) +2 + j*(293) +-354 + j*(-299) +409 + j*(298) +185 + j*(238) +383 + j*(220) +316 + j*(-39) +177 + j*(-8) +-269 + j*(-223) +-332 + j*(132) +-312 + j*(137) +-254 + j*(-224) +-279 + j*(-206) +103 + j*(276) +-81 + j*(235) +106 + j*(-356) +-250 + j*(170) +146 + j*(-256) +375 + j*(206) +35 + j*(285) +179 + j*(-480) +-4 + j*(262) +286 + j*(339) +349 + j*(3) +262 + j*(-317) +-188 + j*(314) +258 + j*(280) +-60 + j*(-63) +-358 + j*(-431) +355 + j*(-313) +602 + j*(-572) +-97 + j*(29) +-361 + j*(112) +426 + j*(-446) +-334 + j*(-248) +-468 + j*(-301) +-134 + j*(-296) +344 + j*(-398) +-33 + j*(361) +339 + j*(-470) +238 + j*(311) +455 + j*(372) +-419 + j*(47) +-267 + j*(-6) +313 + j*(-315) +-314 + j*(148) +-167 + j*(-559) +371 + j*(-467) +-377 + j*(337) +535 + j*(-262) +170 + j*(-213) +-719 + j*(-409) +-59 + j*(155) +-137 + j*(240) +-403 + j*(-211) +-310 + j*(-119) +405 + j*(-72) +-488 + j*(136) +-270 + j*(-495) +375 + j*(-124) +294 + j*(-73) +494 + j*(406) +423 + j*(311) +-401 + j*(-383) +378 + j*(293) +-290 + j*(-348) +111 + j*(-182) +414 + j*(523) +-121 + j*(746) +129 + j*(-466) +409 + j*(-359) +342 + j*(63) +-325 + j*(174) +-292 + j*(103) +221 + j*(407) +298 + j*(240) +-343 + j*(363) +192 + j*(-296) +-291 + j*(180) +-76 + j*(-33) +-58 + j*(-362) +-260 + j*(-202) +-301 + j*(-129) +86 + j*(400) +-240 + j*(337) +77 + j*(-55) +279 + j*(831) +20 + j*(-13) +305 + j*(-124) +551 + j*(99) +439 + j*(438) +-194 + j*(490) +592 + j*(216) +-382 + j*(228) +-316 + j*(76) +98 + j*(30) +216 + j*(-286) +268 + j*(18) +-13 + j*(233) +-497 + j*(-483) +25 + j*(-332) +168 + j*(227) +301 + j*(143) +73 + j*(-48) +-3 + j*(-291) +588 + j*(16) +192 + j*(-489) +243 + j*(76) +254 + j*(539) +-380 + j*(229) +489 + j*(15) +241 + j*(131) +158 + j*(-295) +306 + j*(195) +-283 + j*(428) +412 + j*(-48) +384 + j*(-260) +-188 + j*(38) +-104 + j*(-159) +64 + j*(142) +-39 + j*(92) +-73 + j*(243) +114 + j*(-292) +-19 + j*(36) +-160 + j*(345) +123 + j*(-62) +-45 + j*(297) +299 + j*(33) +117 + j*(-93) +-214 + j*(44) +-345 + j*(-15) +-11 + j*(-78) +204 + j*(16) +132 + j*(-22) +-45 + j*(59) +-220 + j*(-21) +145 + j*(-76) +-124 + j*(120) +156 + j*(-31) +21 + j*(-187) +-81 + j*(160) +-43 + j*(-79) +114 + j*(7) +247 + j*(-122) +90 + j*(96) +-132 + j*(27) +228 + j*(11) +-179 + j*(40) +78 + j*(89) +-513 + j*(3) +-152 + j*(246) +-60 + j*(211) +-108 + j*(-76) +-30 + j*(-112) +-68 + j*(-276) +18 + j*(42) +-13 + j*(-322) +-76 + j*(-78) +156 + j*(48) +-25 + j*(121) +106 + j*(-127) +-110 + j*(257) +263 + j*(132) +-168 + j*(303) +18 + j*(271) +6 + j*(-148) +133 + j*(-263) +-25 + j*(130) +71 + j*(329) +406 + j*(-14) +-28 + j*(-89) +-214 + j*(40) +-121 + j*(194) +-138 + j*(-7) +107 + j*(97) +213 + j*(-98) +114 + j*(73) +-233 + j*(3) +-34 + j*(290) +18 + j*(-125) +-28 + j*(263) +-121 + j*(12) +53 + j*(-48) +95 + j*(-21) +-461 + j*(13) +213 + j*(110) +223 + j*(98) +-137 + j*(-126) +-167 + j*(30) +-60 + j*(-438) +86 + j*(-72) +94 + j*(-175) +-103 + j*(111) +93 + j*(57) +-177 + j*(-207) +-134 + j*(130) +194 + j*(159) +25 + j*(36) +25 + j*(-231) +134 + j*(7) +117 + j*(-178) +-200 + j*(214) +11 + j*(51) +-337 + j*(-10) +259 + j*(-6) +-61 + j*(129) +-28 + j*(39) +-150 + j*(-81) +67 + j*(1) +-139 + j*(144) +-64 + j*(-216) +107 + j*(-387) +-105 + j*(93) +342 + j*(-31) +-133 + j*(26) +18 + j*(-242) +-230 + j*(-160) +-255 + j*(-103) +288 + j*(70) +45 + j*(18) +91 + j*(-15) +95 + j*(69) +6 + j*(193) +-107 + j*(-19) +264 + j*(-83) +42 + j*(-170) +-48 + j*(-8) +242 + j*(4) +320 + j*(47) +-75 + j*(-93) +-161 + j*(45) +-58 + j*(-127) +112 + j*(66) +193 + j*(224) +-577 + j*(-352) +-33 + j*(142) +117 + j*(72) +1 + j*(-115) +-107 + j*(167) +-45 + j*(187) +29 + j*(-117) +108 + j*(-128) +103 + j*(226) +-436 + j*(-210) +-245 + j*(54) +37 + j*(-62) +1 + j*(-59) +-233 + j*(82) +-101 + j*(299) +74 + j*(46) +59 + j*(-214) +-245 + j*(-179) +153 + j*(-385) +-86 + j*(215) +-105 + j*(-47) +-48 + j*(-337) +51 + j*(153) +118 + j*(159) +-117 + j*(-160) +131 + j*(19) +245 + j*(74) +-171 + j*(86) +-31 + j*(-61) +-144 + j*(179) +35 + j*(-370) +170 + j*(-76) +280 + j*(-52) +-89 + j*(-163) +78 + j*(47) +-345 + j*(-32) +-236 + j*(-15) +204 + j*(-49) +-517 + j*(-52) +-93 + j*(-81) +264 + j*(18) +-144 + j*(-25) +212 + j*(121) +26 + j*(-342) +165 + j*(53) +41 + j*(-14) +-111 + j*(197) +-179 + j*(233) +121 + j*(255) +208 + j*(-71) +187 + j*(293) +110 + j*(-317) +118 + j*(225) +250 + j*(187) +4 + j*(-260) +-48 + j*(72) +-195 + j*(97) +91 + j*(-210) +113 + j*(-173) +-32 + j*(2) +-112 + j*(-9) +373 + j*(-229) +42 + j*(-64) +-106 + j*(-13) +-58 + j*(25) +68 + j*(89) +-93 + j*(-106) +204 + j*(-76) +-177 + j*(13) +-84 + j*(-198) +168 + j*(287) +-218 + j*(220) +-139 + j*(-203) +346 + j*(156) +-194 + j*(-30) +134 + j*(-30) +-124 + j*(147) +-199 + j*(-285) +168 + j*(-201) +122 + j*(-271) +103 + j*(-25) +40 + j*(-42) +-129 + j*(42) +119 + j*(234) +91 + j*(185) +154 + j*(-153) +114 + j*(396) +103 + j*(156) +-127 + j*(-274) +122 + j*(-151) +34 + j*(112) +-236 + j*(-66) +266 + j*(-33) +-177 + j*(-86) +-26 + j*(-129) +52 + j*(164) +-59 + j*(-304) +-383 + j*(-279) +146 + j*(136) +419 + j*(40) +-30 + j*(113) +-105 + j*(142) +213 + j*(-259) +30 + j*(363) +168 + j*(-375) +-107 + j*(60) +128 + j*(199) +-71 + j*(113) +-95 + j*(-124) +-17 + j*(48) +-57 + j*(65) +-76 + j*(23) +-274 + j*(-206) +125 + j*(276) +98 + j*(-57) +-129 + j*(-179) +-58 + j*(311) +54 + j*(52) +-351 + j*(226) +-252 + j*(55) +-142 + j*(-17) +202 + j*(107) +176 + j*(-477) +-71 + j*(18) +-174 + j*(125) +144 + j*(-108) +-10 + j*(-19) +-28 + j*(112) +-26 + j*(132) +-236 + j*(-8) +37 + j*(-214) +111 + j*(216) +260 + j*(70) +-30 + j*(-69) +-91 + j*(157) +221 + j*(-96) +-162 + j*(-126) +-71 + j*(110) +16 + j*(117) +128 + j*(-4) +69 + j*(35) +-62 + j*(177) +143 + j*(88) +-124 + j*(-195) +-118 + j*(-61) +26 + j*(-187) +-76 + j*(262) +-21 + j*(-103) +-164 + j*(-139) +-73 + j*(-175) +262 + j*(-58) +44 + j*(58) +78 + j*(-43) +-245 + j*(336) +-28 + j*(-38) +-124 + j*(-168) +-320 + j*(34) +-175 + j*(-11) +-190 + j*(-241) +119 + j*(-78) +-242 + j*(264) +-91 + j*(234) +-57 + j*(-42) +-189 + j*(11) +130 + j*(103) +217 + j*(-100) +170 + j*(-62) +-327 + j*(82) +-132 + j*(-118) +19 + j*(1) +15 + j*(-6) +-479 + j*(69) +38 + j*(68) +1 + j*(-229) +93 + j*(-98) +54 + j*(-93) +-23 + j*(-100) +1 + j*(-197) +-269 + j*(-126) +177 + j*(23) +-412 + j*(-282) +-78 + j*(88) +-214 + j*(225) +-96 + j*(127) +-40 + j*(181) +276 + j*(175) +-191 + j*(-257) +163 + j*(-84) +-82 + j*(92) +171 + j*(132) +213 + j*(-79) +234 + j*(125) +-62 + j*(-272) +57 + j*(-56) +62 + j*(-363) +-136 + j*(64) +40 + j*(33) +-63 + j*(-95) +-162 + j*(172) +-141 + j*(-281) +-13 + j*(40) +248 + j*(-70) +-104 + j*(-439) +57 + j*(192) +21 + j*(16) +-385 + j*(-86) +86 + j*(-322) +-263 + j*(279) +238 + j*(83) +62 + j*(-112) +-68 + j*(-26) +30 + j*(182) +6 + j*(-152) +100 + j*(-80) +91 + j*(1) +-49 + j*(-240) +88 + j*(19) +74 + j*(98) +87 + j*(234) +5 + j*(-245) +-310 + j*(57) +-78 + j*(-243) +-163 + j*(-32) +114 + j*(-437) +44 + j*(150) +158 + j*(-68) +327 + j*(-263) +-3 + j*(-2) +151 + j*(268) +-274 + j*(-351) +-291 + j*(-420) +-409 + j*(204) +-454 + j*(-66) +66 + j*(26) +-187 + j*(277) +73 + j*(-33) +118 + j*(123) +136 + j*(-40) +87 + j*(138) +264 + j*(47) +93 + j*(288) +113 + j*(107) +-233 + j*(95) +19 + j*(170) +-23 + j*(-486) +30 + j*(-47) +146 + j*(107) +177 + j*(226) +-82 + j*(-301) +155 + j*(58) +78 + j*(-10) +390 + j*(233) +-5 + j*(74) +-33 + j*(25) +-117 + j*(394) +202 + j*(-98) +18 + j*(83) +47 + j*(-127) +230 + j*(-156) +255 + j*(112) +-26 + j*(358) +50 + j*(109) +-56 + j*(-51) +-78 + j*(-240) +-190 + j*(42) +119 + j*(98) +-146 + j*(84) +-37 + j*(-115) +76 + j*(38) +99 + j*(-181) +31 + j*(-63) +69 + j*(61) +-100 + j*(62) +-81 + j*(161) +130 + j*(-101) +134 + j*(-168) +40 + j*(25) +-57 + j*(-278) +-58 + j*(244) +-368 + j*(-64) +214 + j*(367) +43 + j*(104) +347 + j*(-150) +293 + j*(45) +-139 + j*(-16) +198 + j*(120) +286 + j*(255) +342 + j*(-254) +70 + j*(-104) +-275 + j*(-223) +-37 + j*(-50) +-337 + j*(-89) +-74 + j*(-56) +133 + j*(202) +-61 + j*(255) +-209 + j*(-103) +-110 + j*(-83) +130 + j*(244) +-274 + j*(2) +78 + j*(-186) +56 + j*(163) +-122 + j*(-139) +90 + j*(-124) +-6 + j*(-28) +99 + j*(-203) +-340 + j*(-146) +90 + j*(-62) +215 + j*(-257) +42 + j*(-3) +170 + j*(380) +2 + j*(62) +-43 + j*(-52) +-331 + j*(12) +-26 + j*(33) +77 + j*(141) +-184 + j*(-206) +349 + j*(74) +128 + j*(-83) +-309 + j*(213) +233 + j*(22) +155 + j*(-16) +-82 + j*(-190) +-129 + j*(-1) +131 + j*(-341) +182 + j*(-120) +211 + j*(81) +47 + j*(-32) +-79 + j*(233) +-113 + j*(-443) +89 + j*(170) +218 + j*(-257) +-78 + j*(74) +-11 + j*(-57) +-220 + j*(233) +-165 + j*(62) +19 + j*(44) +-121 + j*(-240) +-3 + j*(-156) +272 + j*(11) +-161 + j*(-361) +-133 + j*(-153) +-51 + j*(122) +-30 + j*(56) +-116 + j*(-74) +90 + j*(-298) +97 + j*(-151) +126 + j*(-69) +64 + j*(49) +-18 + j*(-126) +-45 + j*(-190) +72 + j*(-124) +42 + j*(-128) +238 + j*(-228) +18 + j*(-296) +182 + j*(188) +52 + j*(-131) +-25 + j*(47) +66 + j*(-49) +327 + j*(-474) +110 + j*(71) +-76 + j*(-78) +86 + j*(30) +-158 + j*(221) +-16 + j*(-371) +-144 + j*(100) +9 + j*(197) +-65 + j*(-11) +-218 + j*(-257) +278 + j*(75) +-103 + j*(40) +42 + j*(-145) +496 + j*(53) +-161 + j*(-137) +-82 + j*(-205) +116 + j*(-37) +-134 + j*(98) +-26 + j*(392) +221 + j*(-45) +-209 + j*(-288) +-261 + j*(96) +199 + j*(-429) +516 + j*(-110) +18 + j*(112) +106 + j*(-329) +-83 + j*(-117) +-190 + j*(36) +177 + j*(252) +13 + j*(15) +0 + j*(-269) +18 + j*(49) +262 + j*(17) +-161 + j*(154) +71 + j*(-43) +274 + j*(-88) +-167 + j*(67) +192 + j*(-173) +-156 + j*(251) +-127 + j*(31) +53 + j*(112) +-47 + j*(306) +-409 + j*(-194) +70 + j*(172) +-108 + j*(-223) +-54 + j*(6) +215 + j*(283) +281 + j*(-138) +53 + j*(102) +12 + j*(-93) +293 + j*(48) +-223 + j*(-163) +37 + j*(127) +-21 + j*(-30) +122 + j*(139) +-6 + j*(147) +-168 + j*(-25) +-1 + j*(63) +203 + j*(-30) +-184 + j*(-281) +0 + j*(-66) +245 + j*(80) +-3 + j*(-154) +-151 + j*(-327) +-185 + j*(-123) +105 + j*(-202) +-218 + j*(190) +-54 + j*(29) +25 + j*(-47) +-437 + j*(-132) +-42 + j*(-11) +-264 + j*(-191) +-55 + j*(-18) +277 + j*(-223) +69 + j*(-213) +-334 + j*(-90) +185 + j*(-269) +-95 + j*(-21) +-281 + j*(240) +-86 + j*(132) +-134 + j*(-120) +17 + j*(-402) +-30 + j*(-4) +124 + j*(-308) +-21 + j*(-54) +107 + j*(-12) +86 + j*(-109) +23 + j*(53) +-42 + j*(-352) +-68 + j*(-250) +354 + j*(-155) +34 + j*(-111) +-156 + j*(228) +127 + j*(-209) +47 + j*(69) +-118 + j*(298) +33 + j*(-36) +62 + j*(392) +-269 + j*(-88) +-366 + j*(-47) +-127 + j*(-98) +91 + j*(40) +-138 + j*(-253) +-57 + j*(181) +186 + j*(-102) +83 + j*(-89) +-9 + j*(-419) +109 + j*(265) +124 + j*(316) +12 + j*(-206) +-10 + j*(153) +-159 + j*(27) +53 + j*(-252) +-21 + j*(168) +129 + j*(91) +-205 + j*(-82) +85 + j*(143) +-11 + j*(17) +71 + j*(-145) +45 + j*(80) +71 + j*(50) +180 + j*(49) +110 + j*(0) +-60 + j*(233) +24 + j*(-153) +-16 + j*(137) +269 + j*(187) +-115 + j*(156) +29 + j*(81) +-232 + j*(-161) +206 + j*(-56) +-47 + j*(17) +-18 + j*(-177) +-100 + j*(126) +-270 + j*(82) +-180 + j*(42) +238 + j*(366) +69 + j*(236) +182 + j*(-151) +0 + j*(180) +232 + j*(-28) +72 + j*(299) +87 + j*(84) +35 + j*(-416) +-200 + j*(-43) +206 + j*(-60) +-245 + j*(-146) +89 + j*(95) +-127 + j*(250) +-342 + j*(-6) +-5 + j*(342) +-239 + j*(-119) +169 + j*(-29) +-375 + j*(98) +81 + j*(-380) +-65 + j*(4) +-139 + j*(-205) +69 + j*(-94) +-81 + j*(-175) +16 + j*(-124) +-81 + j*(185) +165 + j*(378) +-140 + j*(337) +42 + j*(91) +-156 + j*(201) +-127 + j*(-64) +-35 + j*(-177) +-238 + j*(-87) +-241 + j*(-294) +88 + j*(-289) +-164 + j*(56) +-141 + j*(-109) +64 + j*(29) +-239 + j*(-172) +88 + j*(-416) +-188 + j*(-76) +-222 + j*(103) +7 + j*(-53) +218 + j*(-284) +82 + j*(-288) +111 + j*(40) +-47 + j*(111) +-57 + j*(176) +20 + j*(-96) +-25 + j*(284) +-29 + j*(87) +63 + j*(266) +-67 + j*(-129) +154 + j*(-69) +141 + j*(78) +38 + j*(-177) +-46 + j*(-306) +271 + j*(125) +378 + j*(130) +-303 + j*(-30) +148 + j*(-64) +-124 + j*(-332) +-153 + j*(71) +-49 + j*(18) +-78 + j*(-183) +-334 + j*(-199) +-238 + j*(-58) +-269 + j*(-38) +253 + j*(-426) +-166 + j*(197) +197 + j*(-147) +-33 + j*(-86) +190 + j*(80) +-111 + j*(-462) +-76 + j*(-369) +501 + j*(-119) +192 + j*(-117) +106 + j*(-60) +148 + j*(-238) +10 + j*(79) +97 + j*(53) +64 + j*(-66) +-162 + j*(-535) +60 + j*(83) +-188 + j*(-98) +32 + j*(15) +-74 + j*(-52) +-30 + j*(-102) +61 + j*(300) +-64 + j*(8) +-245 + j*(105) +114 + j*(-330) +83 + j*(141) +98 + j*(98) +-74 + j*(-268) +112 + j*(49) +451 + j*(-61) +-107 + j*(52) +136 + j*(-39) +-157 + j*(350) +33 + j*(-122) +258 + j*(173) +334 + j*(45) +-48 + j*(170) +78 + j*(-82) +59 + j*(-108) +347 + j*(75) +-314 + j*(86) +-387 + j*(275) +6 + j*(132) +-204 + j*(294) +124 + j*(98) +-254 + j*(22) +-89 + j*(-156) +-392 + j*(-168) +141 + j*(-159) +201 + j*(-175) +-28 + j*(5) +132 + j*(116) +4 + j*(-4) +227 + j*(-108) +-268 + j*(-85) +115 + j*(-98) +-57 + j*(139) +200 + j*(-103) +-65 + j*(-194) +-146 + j*(-59) +-314 + j*(45) +146 + j*(-1) +26 + j*(40) +-290 + j*(-56) +-260 + j*(-264) +165 + j*(35) +235 + j*(-228) +149 + j*(-168) +-25 + j*(-196) +33 + j*(-211) +-172 + j*(-173) +-148 + j*(168) +-281 + j*(62) +-56 + j*(-12) +179 + j*(-24) +54 + j*(45) +-128 + j*(-153) +72 + j*(-62) +-12 + j*(343) +214 + j*(-173) +-105 + j*(41) +151 + j*(-11) +-226 + j*(140) +24 + j*(175) +-57 + j*(12) +-25 + j*(86) +-269 + j*(27) +175 + j*(13) +238 + j*(9) +107 + j*(62) +15 + j*(-73) +115 + j*(-37) +80 + j*(-197) +-50 + j*(118) +-206 + j*(123) +23 + j*(35) +-257 + j*(-112) +-66 + j*(183) +-155 + j*(-4) +-161 + j*(135) +132 + j*(-220) +-22 + j*(-358) +197 + j*(277) +339 + j*(8) +-232 + j*(-293) +134 + j*(-162) +-253 + j*(179) +-255 + j*(-197) +-110 + j*(-202) +-216 + j*(-243) +-247 + j*(103) +-16 + j*(-33) +107 + j*(-113) +-93 + j*(-20) +-52 + j*(299) +-43 + j*(-234) +-131 + j*(-33) +135 + j*(207) +88 + j*(-26) +125 + j*(206) +164 + j*(5) +78 + j*(-178) +-151 + j*(-197) +190 + j*(-16) +151 + j*(88) +-52 + j*(255) +19 + j*(-182) +144 + j*(-44) +-16 + j*(-112) +145 + j*(81) +-35 + j*(-1) +-107 + j*(-6) +148 + j*(351) +-156 + j*(421) +-252 + j*(-71) +373 + j*(-182) +228 + j*(51) +-71 + j*(137) +83 + j*(201) +54 + j*(-112) +26 + j*(-145) +-55 + j*(4) +161 + j*(330) +-30 + j*(-250) +-421 + j*(-114) +30 + j*(-16) +69 + j*(106) +-43 + j*(43) +-155 + j*(178) +20 + j*(-208) +-395 + j*(226) +-147 + j*(129) +11 + j*(-42) +-331 + j*(91) +81 + j*(56) +-460 + j*(-49) +-269 + j*(1) +19 + j*(216) +-124 + j*(30) +16 + j*(190) +-293 + j*(-240) +-170 + j*(149) +-101 + j*(95) +130 + j*(-82) +-33 + j*(116) +28 + j*(21) +83 + j*(-83) +-211 + j*(257) +-6 + j*(133) +32 + j*(-163) +44 + j*(-69) +36 + j*(95) +-80 + j*(24) +-17 + j*(-354) +115 + j*(130) +28 + j*(-41) +287 + j*(195) +433 + j*(-71) +-191 + j*(195) +-75 + j*(-296) +-195 + j*(170) +291 + j*(-35) +-164 + j*(128) +271 + j*(50) +132 + j*(-71) +202 + j*(26) +12 + j*(-90) +-260 + j*(25) +165 + j*(29) +-89 + j*(250) +-25 + j*(-21) +-33 + j*(-4) +284 + j*(108) +-162 + j*(-106) +76 + j*(-163) +85 + j*(70) +-106 + j*(61) +-273 + j*(32) +24 + j*(-115) +268 + j*(-297) +-211 + j*(58) +243 + j*(16) +105 + j*(-155) +-36 + j*(-225) +64 + j*(80) +-42 + j*(31) +115 + j*(276) +-332 + j*(-232) +111 + j*(7) +-216 + j*(-134) +-154 + j*(-279) +-182 + j*(76) +121 + j*(-49) +-88 + j*(-52) +167 + j*(-93) +-135 + j*(-245) +-210 + j*(405) +-69 + j*(212) +-48 + j*(-240) +385 + j*(306) +31 + j*(108) +-7 + j*(-222) +30 + j*(-53) +-194 + j*(-183) +-21 + j*(57) +-330 + j*(171) +-42 + j*(-16) +199 + j*(221) +-12 + j*(25) +-70 + j*(458) +-371 + j*(-155) +-78 + j*(100) +49 + j*(-85) +110 + j*(-243) +-23 + j*(40) +12 + j*(-71) +-82 + j*(-624) +-156 + j*(53) +-153 + j*(264) +2 + j*(-132) +63 + j*(86) +133 + j*(40) +129 + j*(221) +192 + j*(-300) +-122 + j*(202) +76 + j*(-155) +94 + j*(28) +-17 + j*(281) +-382 + j*(105) +310 + j*(158) +20 + j*(122) +211 + j*(-99) +217 + j*(-166) +-1 + j*(-130) +32 + j*(-39) +-64 + j*(-286) +365 + j*(-83) +216 + j*(89) +167 + j*(-338) +324 + j*(67) +223 + j*(123) +44 + j*(-21) +66 + j*(79) +-109 + j*(105) +59 + j*(-62) +211 + j*(35) +-165 + j*(-54) +142 + j*(123) +-187 + j*(-115) +76 + j*(100) +-290 + j*(-316) +-78 + j*(162) +156 + j*(49) +-69 + j*(-29) +202 + j*(151) +37 + j*(11) +-40 + j*(-138) +31 + j*(10) +-28 + j*(-112) +-195 + j*(175) +-178 + j*(187) +51 + j*(-35) +112 + j*(-6) +-207 + j*(-35) +-70 + j*(19) +-129 + j*(-331) +99 + j*(-210) +275 + j*(123) +-262 + j*(250) +-9 + j*(129) +156 + j*(223) +59 + j*(42) +-272 + j*(-320) +-107 + j*(-27) +-274 + j*(317) +-271 + j*(238) +74 + j*(-22) +181 + j*(-249) +286 + j*(86) +57 + j*(268) +-69 + j*(-50) +22 + j*(233) +137 + j*(168) +156 + j*(88) +250 + j*(165) +175 + j*(-258) +-250 + j*(-158) +-57 + j*(251) +-192 + j*(98) +88 + j*(208) +-175 + j*(130) +40 + j*(-162) +-237 + j*(-4) +272 + j*(8) +-54 + j*(163) +105 + j*(72) +216 + j*(-69) +-257 + j*(139) +-250 + j*(53) +30 + j*(-439) +78 + j*(-208) +182 + j*(177) +262 + j*(83) +318 + j*(-4) +-6 + j*(214) +-37 + j*(-172) +-144 + j*(-33) +-278 + j*(42) +195 + j*(29) +158 + j*(76) +-30 + j*(-395) +189 + j*(-122) +-165 + j*(-22) +-307 + j*(240) +18 + j*(-73) +11 + j*(422) +-108 + j*(-59) +366 + j*(13) +-81 + j*(-116) +-286 + j*(244) +99 + j*(349) +-102 + j*(-100) +-247 + j*(-32) +2 + j*(175) +-40 + j*(337) +284 + j*(124) +107 + j*(-8) +126 + j*(107) +-348 + j*(-184) +206 + j*(-15) +242 + j*(-8) +248 + j*(9) +83 + j*(65) +-153 + j*(53) +-117 + j*(169) +-359 + j*(41) +-34 + j*(3) +-264 + j*(-237) +42 + j*(-223) +218 + j*(116) +-92 + j*(-192) +-259 + j*(-144) +304 + j*(78) +-10 + j*(337) +8 + j*(122) +-57 + j*(28) +-35 + j*(37) +-46 + j*(13) +55 + j*(261) +-244 + j*(-163) +42 + j*(-45) +-339 + j*(-79) +82 + j*(412) +7 + j*(150) +132 + j*(199) +137 + j*(-323) +269 + j*(-166) +-7 + j*(54) +-243 + j*(232) +-180 + j*(-30) +-78 + j*(-49) +-113 + j*(4) +30 + j*(-32) +95 + j*(64) +-1 + j*(-146) +20 + j*(-11) +91 + j*(194) +51 + j*(-269) +-250 + j*(-105) +-141 + j*(-33) +-114 + j*(310) +177 + j*(211) +-138 + j*(417) +-13 + j*(258) +260 + j*(-113) +47 + j*(169) +11 + j*(-429) +-204 + j*(-11) +-370 + j*(33) +401 + j*(-77) +74 + j*(186) +322 + j*(146) +57 + j*(-364) +18 + j*(-114) +171 + j*(-362) +-86 + j*(66) +11 + j*(-148) +-72 + j*(190) +185 + j*(-168) +-73 + j*(-161) +182 + j*(18) +-256 + j*(-304) +-103 + j*(21) +-41 + j*(358) +-136 + j*(132) +-18 + j*(-144) +267 + j*(102) +76 + j*(146) +-5 + j*(-34) +-105 + j*(29) +-261 + j*(-179) +-86 + j*(63) +106 + j*(280) +-15 + j*(-155) +144 + j*(-52) +-55 + j*(-344) +156 + j*(-20) +161 + j*(-242) +163 + j*(-223) +-354 + j*(64) +-5 + j*(-21) +20 + j*(-246) +210 + j*(-316) +396 + j*(-194) +16 + j*(225) +-228 + j*(165) +46 + j*(21) +-43 + j*(-298) +-129 + j*(-132) +-201 + j*(77) +-32 + j*(21) +-37 + j*(107) +-16 + j*(94) +18 + j*(-93) +207 + j*(-175) +88 + j*(226) +216 + j*(-142) +-170 + j*(102) +21 + j*(-291) +119 + j*(-173) +-236 + j*(-33) +49 + j*(302) +-151 + j*(136) +-284 + j*(-181) +286 + j*(39) +-70 + j*(160) +-56 + j*(122) +5 + j*(320) +-34 + j*(-181) +-272 + j*(83) +33 + j*(-203) +-248 + j*(-199) +146 + j*(255) +-190 + j*(28) +-60 + j*(-340) +13 + j*(-252) +134 + j*(269) +130 + j*(-115) +137 + j*(-25) +292 + j*(141) +171 + j*(82) +14 + j*(49) +11 + j*(23) +-257 + j*(124) +-130 + j*(-160) +-247 + j*(164) +-13 + j*(168) +-62 + j*(-258) +-11 + j*(-66) +291 + j*(274) +42 + j*(224) +-135 + j*(266) +-109 + j*(47) +-37 + j*(-110) +84 + j*(-120) +-73 + j*(322) +-52 + j*(33) +-139 + j*(24) +42 + j*(-132) +41 + j*(259) +-45 + j*(165) +248 + j*(-201) +-334 + j*(-131) +-92 + j*(154) +202 + j*(7) +88 + j*(154) +-100 + j*(42) +-251 + j*(9) +129 + j*(-116) +-187 + j*(82) +134 + j*(-412) +-271 + j*(-181) +-137 + j*(-20) +-57 + j*(79) +136 + j*(95) +81 + j*(157) +-100 + j*(107) +-235 + j*(233) +117 + j*(-72) +388 + j*(-156) +-147 + j*(-264) +0 + j*(-124) +-18 + j*(156) +-119 + j*(-114) +-334 + j*(144) +206 + j*(303) +181 + j*(84) +-198 + j*(-121) +-146 + j*(91) +-49 + j*(-77) +313 + j*(148) +-241 + j*(57) +33 + j*(11) +161 + j*(-20) +-76 + j*(158) +51 + j*(28) +-106 + j*(67) +-6 + j*(-136) +-172 + j*(-97) +77 + j*(112) +0 + j*(59) +34 + j*(-29) +276 + j*(-67) +-209 + j*(-214) +21 + j*(-59) +19 + j*(23) +35 + j*(-177) +-221 + j*(242) +49 + j*(-40) +291 + j*(248) +220 + j*(57) +-193 + j*(65) +129 + j*(101) +-36 + j*(-160) +-431 + j*(-53) +-78 + j*(-492) +147 + j*(-326) +-260 + j*(-37) +322 + j*(-134) +-202 + j*(-203) +58 + j*(40) +45 + j*(-83) +-66 + j*(-205) +-130 + j*(-68) +122 + j*(47) +124 + j*(-115) +-37 + j*(281) +-276 + j*(-77) +-188 + j*(379) +195 + j*(-42) +-4 + j*(110) +-288 + j*(-63) +1 + j*(-96) +69 + j*(-42) +100 + j*(173) +-129 + j*(246) +311 + j*(-30) +-71 + j*(-151) +-368 + j*(-41) +-347 + j*(190) +-173 + j*(-92) +-170 + j*(224) +-40 + j*(-163) +-103 + j*(90) +373 + j*(301) +-206 + j*(55) +-8 + j*(-184) +30 + j*(-18) +-184 + j*(15) +-132 + j*(103) +69 + j*(88) +-115 + j*(-293) +-318 + j*(124) +250 + j*(284) +33 + j*(-127) +193 + j*(317) +-72 + j*(242) +-32 + j*(122) +-214 + j*(277) +78 + j*(-18) +-173 + j*(-41) +-135 + j*(-180) +-31 + j*(-104) +-22 + j*(278) +52 + j*(-16) +204 + j*(-62) +-30 + j*(-24) +171 + j*(-48) +-54 + j*(-339) +-84 + j*(91) +-95 + j*(-288) +40 + j*(-330) +-115 + j*(16) +-451 + j*(-48) +119 + j*(99) +-36 + j*(135) +200 + j*(144) +127 + j*(-43) +252 + j*(91) +105 + j*(218) +29 + j*(176) +139 + j*(-190) +-108 + j*(-139) +144 + j*(-76) +120 + j*(214) +47 + j*(228) +-42 + j*(-4) +279 + j*(3) +-140 + j*(-100) +-16 + j*(49) +-148 + j*(-21) +102 + j*(-150) +-48 + j*(-264) +-204 + j*(-53) +207 + j*(81) +-272 + j*(-115) +-28 + j*(-252) +-61 + j*(-4) +-114 + j*(116) +64 + j*(182) +131 + j*(101) +117 + j*(-1) +148 + j*(-296) +99 + j*(248) +112 + j*(-18) +198 + j*(306) +-63 + j*(13) +-226 + j*(-149) +93 + j*(121) +-233 + j*(140) +-156 + j*(-279) +-182 + j*(-107) +-117 + j*(-240) +-209 + j*(36) +32 + j*(-31) +257 + j*(-126) +-320 + j*(94) +25 + j*(-454) +-35 + j*(81) +-132 + j*(170) +-161 + j*(230) +365 + j*(304) +-53 + j*(-175) +101 + j*(165) +242 + j*(301) +113 + j*(190) +164 + j*(-160) +25 + j*(-512) +343 + j*(31) +-228 + j*(4) +185 + j*(-76) +-13 + j*(272) +69 + j*(6) +45 + j*(-23) +3 + j*(135) +-240 + j*(-105) +124 + j*(143) +-40 + j*(-218) +-35 + j*(-109) +-23 + j*(-3) +-96 + j*(-139) +93 + j*(240) +-193 + j*(-181) +-45 + j*(80) +165 + j*(-144) +-176 + j*(-94) +-85 + j*(-242) +-100 + j*(-11) +-73 + j*(181) +-6 + j*(-151) +98 + j*(109) +-223 + j*(101) +-279 + j*(58) +81 + j*(86) +14 + j*(102) +56 + j*(-215) +-228 + j*(-92) +-165 + j*(-62) +262 + j*(52) +-40 + j*(-160) +-183 + j*(-139) +226 + j*(-66) +-107 + j*(184) +115 + j*(-64) +-129 + j*(139) +90 + j*(-296) +-88 + j*(-1) +-81 + j*(-83) +78 + j*(-35) +68 + j*(-37) +-86 + j*(-149) +-1 + j*(84) +-124 + j*(-24) +-319 + j*(-315) +-105 + j*(-221) +-185 + j*(77) +-211 + j*(28) +-58 + j*(-169) +59 + j*(-424) +97 + j*(222) +-82 + j*(216) +170 + j*(-109) +185 + j*(6) +-328 + j*(202) +-128 + j*(-71) +-34 + j*(-259) +23 + j*(409) +-218 + j*(55) +55 + j*(-269) +-49 + j*(368) +62 + j*(131) +15 + j*(29) +79 + j*(349) +9 + j*(-190) +-188 + j*(232) +194 + j*(153) +74 + j*(291) +-152 + j*(119) +148 + j*(-206) +-110 + j*(-170) +194 + j*(-139) +113 + j*(-100) +-209 + j*(-302) +2 + j*(64) +-128 + j*(-59) +13 + j*(-122) +7 + j*(-200) +25 + j*(-101) +104 + j*(-127) +168 + j*(-125) +93 + j*(-216) +-91 + j*(-49) +-179 + j*(-68) +-95 + j*(117) +267 + j*(-81) +-48 + j*(-41) +-122 + j*(-340) +-91 + j*(216) +104 + j*(142) +-69 + j*(-206) +-82 + j*(-101) +-93 + j*(136) +6 + j*(-57) +-51 + j*(-202) +53 + j*(-167) +-127 + j*(-216) +-292 + j*(-243) +170 + j*(-228) +-241 + j*(-90) +-132 + j*(-216) +-81 + j*(-295) +-40 + j*(96) +-180 + j*(-167) +-404 + j*(42) +-64 + j*(-373) +-190 + j*(100) +75 + j*(-219) +430 + j*(219) +-23 + j*(-146) +-93 + j*(25) +18 + j*(257) +-28 + j*(303) +-209 + j*(261) +748 + j*(271) +177 + j*(154) +352 + j*(577) +-202 + j*(-223) +-177 + j*(11) +327 + j*(256) +346 + j*(-228) +-372 + j*(398) +354 + j*(666) +399 + j*(-1) +406 + j*(-42) +105 + j*(-37) +-281 + j*(523) +-76 + j*(-529) +675 + j*(81) +-245 + j*(418) +333 + j*(275) +-395 + j*(136) +-63 + j*(338) +-166 + j*(-158) +-139 + j*(-445) +-238 + j*(407) +-342 + j*(-115) +-323 + j*(101) +-547 + j*(289) +329 + j*(117) +-255 + j*(-172) +375 + j*(-109) +-52 + j*(-234) +643 + j*(-313) +-18 + j*(258) +11 + j*(168) +-12 + j*(15) +351 + j*(-247) +-199 + j*(334) +387 + j*(21) +-126 + j*(63) +-375 + j*(263) +23 + j*(206) +31 + j*(261) +-211 + j*(334) +633 + j*(210) +-194 + j*(-467) +335 + j*(-243) +368 + j*(-135) +542 + j*(-241) +-190 + j*(-300) +-18 + j*(-262) +279 + j*(-42) +-548 + j*(-407) +107 + j*(-480) +318 + j*(274) +-220 + j*(-252) +142 + j*(66) +-156 + j*(290) +-474 + j*(320) +602 + j*(255) +-226 + j*(187) +-403 + j*(-288) +-443 + j*(-303) +159 + j*(-513) +-480 + j*(-58) +263 + j*(-127) +-346 + j*(537) +187 + j*(-350) +-146 + j*(336) +-175 + j*(-127) +250 + j*(532) +317 + j*(173) +-38 + j*(-279) +339 + j*(-542) +168 + j*(-103) +606 + j*(-121) +128 + j*(-260) +132 + j*(-116) +487 + j*(497) +-177 + j*(-310) +-281 + j*(-375) +-33 + j*(-250) +-459 + j*(37) +13 + j*(-3) +206 + j*(-288) +167 + j*(-218) +225 + j*(163) +-460 + j*(-350) +-422 + j*(-256) +-273 + j*(-288) +145 + j*(-539) +264 + j*(675) +-177 + j*(-416) +-278 + j*(92) +256 + j*(93) +-11 + j*(122) +119 + j*(205) +264 + j*(-350) +267 + j*(320) +628 + j*(115) +-300 + j*(206) +-256 + j*(127) +46 + j*(644) +-257 + j*(174) +397 + j*(-358) +437 + j*(-221) +-404 + j*(-392) +-453 + j*(-234) +211 + j*(-168) +-473 + j*(-173) +378 + j*(297) +206 + j*(280) +-203 + j*(-341) +-251 + j*(-229) +173 + j*(-60) +-311 + j*(-156) +1 + j*(134) +-24 + j*(-322) +-291 + j*(-203) +-424 + j*(127) +134 + j*(-62) +-295 + j*(-141) +-380 + j*(-233) +-83 + j*(320) +-169 + j*(171) +-419 + j*(263) +219 + j*(-126) +-227 + j*(221) +-533 + j*(-33) +139 + j*(162) +-259 + j*(81) +-77 + j*(-316) +-334 + j*(368) +78 + j*(-279) +-127 + j*(-14) +186 + j*(-54) +-317 + j*(-562) +127 + j*(424) +23 + j*(241) +-170 + j*(-218) +533 + j*(511) +-530 + j*(-110) +-246 + j*(576) +151 + j*(-443) +38 + j*(358) +-462 + j*(-40) +-293 + j*(386) +403 + j*(404) +465 + j*(126) +-39 + j*(220) +546 + j*(-482) +187 + j*(267) +-166 + j*(-417) +293 + j*(-158) +190 + j*(-276) +291 + j*(-456) +-256 + j*(177) +236 + j*(83) +-21 + j*(566) +-309 + j*(-536) +-276 + j*(274) +291 + j*(30) +316 + j*(480) +471 + j*(114) +-284 + j*(197) +344 + j*(-291) +-263 + j*(-347) +81 + j*(33) +-381 + j*(-364) +49 + j*(-97) +300 + j*(516) +303 + j*(-48) +192 + j*(499) +115 + j*(-372) +387 + j*(-398) +264 + j*(2) +-104 + j*(286) +643 + j*(-144) +327 + j*(447) +33 + j*(-457) +-221 + j*(-59) +-251 + j*(37) +300 + j*(4) +245 + j*(77) +-199 + j*(-344) +-103 + j*(16) +-275 + j*(596) +226 + j*(-307) +-321 + j*(379) +151 + j*(237) +403 + j*(-258) +292 + j*(-358) +728 + j*(378) +204 + j*(601) +-392 + j*(-49) +205 + j*(56) +-96 + j*(143) +-361 + j*(270) +132 + j*(159) +342 + j*(156) +171 + j*(262) +252 + j*(55) +205 + j*(-261) +272 + j*(-192) +225 + j*(139) +-375 + j*(241) +-179 + j*(325) +-121 + j*(-150) +178 + j*(-279) +532 + j*(-95) +-397 + j*(361) +149 + j*(-227) +-253 + j*(-415) +-622 + j*(-208) +-309 + j*(369) +305 + j*(361) +224 + j*(394) +385 + j*(617) +-238 + j*(-120) +524 + j*(-277) +-209 + j*(-190) +387 + j*(658) +405 + j*(211) +45 + j*(333) +-313 + j*(137) +-313 + j*(-31) +492 + j*(320) +138 + j*(-307) +-240 + j*(364) +316 + j*(204) +177 + j*(-408) +204 + j*(-63) +358 + j*(-165) +-47 + j*(-238) +425 + j*(361) +596 + j*(-56) +409 + j*(-180) +-61 + j*(-536) +-389 + j*(262) +-337 + j*(-270) +-185 + j*(-47) +-414 + j*(-222) +394 + j*(200) +102 + j*(201) +-581 + j*(-57) +312 + j*(118) +284 + j*(421) +171 + j*(242) +385 + j*(-218) +119 + j*(166) +408 + j*(484) +215 + j*(188) +269 + j*(434) +8 + j*(337) +-308 + j*(514) +366 + j*(-49) +167 + j*(-166) +638 + j*(185) +344 + j*(-203) +-331 + j*(174) +315 + j*(-16) +264 + j*(-185) +-389 + j*(382) +-76 + j*(-346) +284 + j*(221) +216 + j*(309) +-296 + j*(-339) +-290 + j*(89) +341 + j*(400) +126 + j*(-108) +267 + j*(288) +-211 + j*(177) +355 + j*(-21) +522 + j*(255) +268 + j*(-234) +436 + j*(392) +703 + j*(57) +-435 + j*(-436) +284 + j*(-130) +-115 + j*(-286) +-614 + j*(-284) +-152 + j*(-368) +219 + j*(-30) +313 + j*(-261) +-134 + j*(-260) +-55 + j*(-498) +-254 + j*(291) +196 + j*(-122) +318 + j*(334) +-264 + j*(366) +13 + j*(-230) +314 + j*(609) +241 + j*(-139) +-88 + j*(347) +323 + j*(-305) +-443 + j*(-257) +-231 + j*(300) +-424 + j*(479) +320 + j*(543) +23 + j*(-188) +-392 + j*(22) +-497 + j*(93) +-218 + j*(-392) +-286 + j*(-441) +-263 + j*(-591) +-153 + j*(-87) +-125 + j*(204) +-385 + j*(54) +92 + j*(269) +-45 + j*(46) +-571 + j*(-607) +-372 + j*(122) +-384 + j*(19) +193 + j*(258) +-22 + j*(377) +-268 + j*(331) +-184 + j*(425) +554 + j*(-243) +-146 + j*(490) +-168 + j*(-530) +180 + j*(38) +-352 + j*(25) +-334 + j*(57) +-215 + j*(188) +57 + j*(89) +196 + j*(182) +397 + j*(491) +-361 + j*(-99) +214 + j*(161) +-84 + j*(346) +112 + j*(364) +-244 + j*(346) +-320 + j*(79) +406 + j*(93) +-196 + j*(-371) +158 + j*(-298) +82 + j*(189) +-342 + j*(-235) +202 + j*(-280) +-194 + j*(-349) +-197 + j*(-312) +-291 + j*(-99) +-171 + j*(283) +87 + j*(-41) +-266 + j*(92) +595 + j*(573) +-362 + j*(-139) +154 + j*(-235) +127 + j*(-603) +191 + j*(663) +387 + j*(-70) +275 + j*(505) +161 + j*(-393) +411 + j*(-243) +-258 + j*(366) +-273 + j*(35) +-436 + j*(-470) +472 + j*(62) +-401 + j*(75) +99 + j*(-165) +180 + j*(421) +270 + j*(-199) +-52 + j*(-218) +-260 + j*(-283) +-527 + j*(277) +-286 + j*(456) +-444 + j*(97) +-276 + j*(309) +132 + j*(-304) +-231 + j*(-378) +-245 + j*(153) +406 + j*(305) +-338 + j*(229) +163 + j*(180) +-281 + j*(290) +477 + j*(-118) +-377 + j*(457) +169 + j*(-161) +-347 + j*(-248) +291 + j*(-45) +-157 + j*(60) +124 + j*(227) +-281 + j*(-433) +513 + j*(-282) +333 + j*(235) +299 + j*(-273) +322 + j*(211) +391 + j*(402) +198 + j*(-60) +-58 + j*(-472) +559 + j*(125) +130 + j*(334) +-93 + j*(245) +471 + j*(-211) +93 + j*(276) +36 + j*(-378) +780 + j*(281) +-291 + j*(301) +286 + j*(334) +227 + j*(-363) +351 + j*(163) +194 + j*(98) +-512 + j*(317) +-47 + j*(197) +-325 + j*(393) +122 + j*(9) +-264 + j*(-231) +339 + j*(141) +-274 + j*(-426) +330 + j*(-318) +625 + j*(-276) +-372 + j*(406) +-253 + j*(-171) +-314 + j*(-271) +159 + j*(161) +264 + j*(-505) +-280 + j*(563) +326 + j*(3) +235 + j*(78) +66 + j*(-384) +368 + j*(156) +-227 + j*(-17) +-409 + j*(-381) +-252 + j*(-306) +108 + j*(218) +-433 + j*(-35) +16 + j*(23) +648 + j*(-353) +296 + j*(47) +-291 + j*(360) +408 + j*(-459) +530 + j*(156) +175 + j*(262) +8 + j*(-363) +57 + j*(221) +142 + j*(161) +-162 + j*(72) +185 + j*(-160) +280 + j*(-128) +-272 + j*(-232) +31 + j*(-88) +-626 + j*(-132) +122 + j*(-325) +-274 + j*(126) +-312 + j*(206) +231 + j*(37) +-261 + j*(-124) +86 + j*(450) +-328 + j*(-586) +-175 + j*(-283) +25 + j*(-170) +340 + j*(372) +385 + j*(181) +354 + j*(-480) +-204 + j*(30) +-368 + j*(273) +-315 + j*(204) +-453 + j*(269) +-433 + j*(173) +532 + j*(258) +351 + j*(-124) +-26 + j*(-1) +208 + j*(83) +84 + j*(141) +-620 + j*(-32) +-229 + j*(34) +-146 + j*(-315) +-143 + j*(-223) +-135 + j*(375) +421 + j*(345) +498 + j*(-307) +425 + j*(-670) +315 + j*(613) +-361 + j*(253) +470 + j*(-390) +-8 + j*(132) +-173 + j*(74) +-375 + j*(317) +278 + j*(-225) +-247 + j*(156) +-371 + j*(-346) +-366 + j*(-146) +417 + j*(-374) +27 + j*(-231) +462 + j*(311) +-147 + j*(385) +433 + j*(-363) +-347 + j*(-521) +-345 + j*(206) +-503 + j*(473) +238 + j*(-395) +159 + j*(-239) +-163 + j*(189) +-468 + j*(-154) +-351 + j*(-30) +-271 + j*(491) +277 + j*(94) +-4 + j*(-162) +331 + j*(-389) +-246 + j*(496) +165 + j*(330) +453 + j*(257) +-64 + j*(-125) +-544 + j*(-247) +135 + j*(-176) +-383 + j*(-524) +-16 + j*(693) +-104 + j*(189) +139 + j*(110) +525 + j*(236) +172 + j*(-342) +313 + j*(223) +307 + j*(-435) +-525 + j*(-231) +317 + j*(-317) +-525 + j*(-696) +245 + j*(-131) +-568 + j*(-351) +71 + j*(-274) +-57 + j*(95) +-313 + j*(-417) +250 + j*(-74) +338 + j*(-238) +270 + j*(-151) +-166 + j*(437) +-414 + j*(460) +-285 + j*(304) +-274 + j*(511) +408 + j*(-422) +25 + j*(-37) +-370 + j*(107) +367 + j*(146) +-135 + j*(-324) +-329 + j*(180) +163 + j*(-82) +-568 + j*(185) +-496 + j*(-288) +-416 + j*(-366) +37 + j*(-95) +70 + j*(-424) +88 + j*(38) +-277 + j*(87) +-44 + j*(404) +-184 + j*(-651) +-304 + j*(-487) +-301 + j*(-136) +-36 + j*(-501) +416 + j*(104) +130 + j*(-443) +127 + j*(-177) +387 + j*(-144) +-186 + j*(6) +-333 + j*(-57) +-101 + j*(-190) +450 + j*(161) +85 + j*(-147) +442 + j*(-466) +-52 + j*(-173) +45 + j*(13) +289 + j*(96) +148 + j*(461) +-49 + j*(330) +-6 + j*(-279) +-44 + j*(152) +279 + j*(-176) +404 + j*(178) +239 + j*(297) +-267 + j*(449) +-371 + j*(-45) +-206 + j*(-267) +144 + j*(-57) +-352 + j*(199) +249 + j*(472) +-87 + j*(136) +-147 + j*(-480) +442 + j*(397) +-30 + j*(129) +-322 + j*(417) +818 + j*(11) +-14 + j*(338) +-257 + j*(-72) +352 + j*(-235) +-411 + j*(82) +348 + j*(-66) +50 + j*(257) +-315 + j*(103) +-394 + j*(-30) +-274 + j*(336) +-436 + j*(-178) +-147 + j*(-202) +173 + j*(264) +-167 + j*(-347) +-430 + j*(-67) +229 + j*(-447) +-255 + j*(771) +29 + j*(-579) +412 + j*(208) +385 + j*(-573) +-523 + j*(-310) +-513 + j*(-223) +148 + j*(-237) +-70 + j*(127) +-346 + j*(12) +-245 + j*(-208) +-146 + j*(204) +-216 + j*(23) +4 + j*(87) +-163 + j*(274) +-146 + j*(-27) +-74 + j*(250) +-97 + j*(69) +18 + j*(85) +-33 + j*(-192) +-84 + j*(-299) +15 + j*(32) +182 + j*(-194) +30 + j*(-209) +-151 + j*(-126) +315 + j*(-103) +-146 + j*(-21) +79 + j*(168) +535 + j*(44) +169 + j*(-331) +-139 + j*(229) +-192 + j*(55) +-84 + j*(-47) +221 + j*(78) +-83 + j*(-228) +86 + j*(-13) +-165 + j*(58) +-315 + j*(72) +-57 + j*(-23) +16 + j*(-209) +-50 + j*(-103) +-206 + j*(-19) +36 + j*(-36) +-78 + j*(-187) +-224 + j*(173) +172 + j*(29) +284 + j*(66) +155 + j*(194) +14 + j*(28) +144 + j*(-105) +-102 + j*(-113) +-132 + j*(-83) +15 + j*(-325) +40 + j*(-86) +203 + j*(-185) +64 + j*(115) +427 + j*(-47) +20 + j*(40) +-71 + j*(127) +238 + j*(44) +112 + j*(-142) +39 + j*(-171) +122 + j*(-204) +62 + j*(-64) +-33 + j*(-149) +-170 + j*(106) +296 + j*(52) +332 + j*(279) +203 + j*(70) +286 + j*(76) +-206 + j*(42) +-11 + j*(298) +129 + j*(-209) +110 + j*(218) +-17 + j*(-75) +198 + j*(15) +153 + j*(256) +-6 + j*(-125) +71 + j*(-89) +64 + j*(-11) +80 + j*(-31) +192 + j*(112) +-196 + j*(-18) +-21 + j*(204) +-54 + j*(305) +10 + j*(292) +30 + j*(238) +-144 + j*(333) +-230 + j*(-60) +-354 + j*(76) +87 + j*(-45) +193 + j*(215) +-170 + j*(204) +143 + j*(93) +-206 + j*(231) +151 + j*(121) +323 + j*(-74) +-132 + j*(-209) +-150 + j*(-150) +-153 + j*(-82) +-243 + j*(-144) +310 + j*(95) +342 + j*(-61) +-155 + j*(-117) +357 + j*(66) +-360 + j*(119) +86 + j*(-33) +209 + j*(40) +-105 + j*(62) +163 + j*(43) +-58 + j*(56) +134 + j*(-247) +14 + j*(84) +-105 + j*(-28) +-193 + j*(-215) +-51 + j*(-180) +97 + j*(-98) +-116 + j*(-25) +422 + j*(107) +105 + j*(62) +-30 + j*(62) +255 + j*(141) +-247 + j*(240) +23 + j*(25) +-163 + j*(6) +0 + j*(308) +-115 + j*(-250) +-83 + j*(-33) +-345 + j*(-57) +495 + j*(-29) +148 + j*(-51) +-203 + j*(144) +-57 + j*(39) +-52 + j*(283) +-7 + j*(218) +300 + j*(-182) +274 + j*(202) +59 + j*(13) +-74 + j*(259) +300 + j*(28) +1 + j*(117) +151 + j*(242) +267 + j*(332) +57 + j*(-315) +38 + j*(-178) +65 + j*(8) +-144 + j*(-271) +213 + j*(-199) +151 + j*(-91) +-252 + j*(-130) +-93 + j*(-66) +74 + j*(69) +-118 + j*(110) +293 + j*(187) +124 + j*(84) +211 + j*(-75) +-40 + j*(-15) +123 + j*(28) +105 + j*(-295) +198 + j*(185) +76 + j*(74) +-236 + j*(203) +-81 + j*(1) +-135 + j*(73) +-333 + j*(-332) +46 + j*(64) +-37 + j*(233) +-17 + j*(37) +321 + j*(182) +146 + j*(307) +98 + j*(-2) +-191 + j*(-138) +-252 + j*(124) +168 + j*(-105) +28 + j*(343) +-59 + j*(-71) +-119 + j*(-351) +18 + j*(-82) +319 + j*(69) +140 + j*(-41) +278 + j*(301) +-142 + j*(166) +-189 + j*(-316) +173 + j*(-260) +-26 + j*(-151) +-94 + j*(-54) +10 + j*(23) +134 + j*(-170) +-45 + j*(-260) +138 + j*(-59) +79 + j*(-220) +2 + j*(102) +163 + j*(74) +-105 + j*(42) +-295 + j*(-200) +184 + j*(-141) +-216 + j*(246) +-66 + j*(-23) +185 + j*(86) +-378 + j*(146) +-137 + j*(250) +233 + j*(190) +-66 + j*(-220) +-30 + j*(-128) +332 + j*(-71) +293 + j*(-6) +-35 + j*(-1) +-58 + j*(247) +252 + j*(-73) +-75 + j*(-220) +-57 + j*(6) +-197 + j*(-8) +321 + j*(149) +-308 + j*(141) +146 + j*(-230) +-168 + j*(-322) +-315 + j*(-190) +120 + j*(-298) +155 + j*(-344) +-15 + j*(146) +-156 + j*(-192) +-91 + j*(-6) +-62 + j*(-40) +-40 + j*(109) +-256 + j*(-19) +118 + j*(-350) +-365 + j*(-211) +-68 + j*(-100) +-86 + j*(-320) +33 + j*(-34) +136 + j*(1) +7 + j*(430) +161 + j*(54) +30 + j*(-78) +-87 + j*(-162) +282 + j*(269) +-277 + j*(260) +-10 + j*(404) +245 + j*(134) +-96 + j*(-129) +-183 + j*(83) +-114 + j*(266) +-3 + j*(-74) +115 + j*(77) +141 + j*(31) +-105 + j*(50) +-20 + j*(-341) +148 + j*(-116) +388 + j*(-106) +-112 + j*(-20) +58 + j*(-6) +207 + j*(-138) +124 + j*(-84) +-174 + j*(71) +-79 + j*(321) +-153 + j*(48) +-171 + j*(-315) +-115 + j*(19) +-73 + j*(-77) +-2 + j*(-59) +71 + j*(-69) +13 + j*(1) +129 + j*(-286) +-316 + j*(162) +303 + j*(210) +32 + j*(136) +-199 + j*(85) +-248 + j*(169) +246 + j*(88) +309 + j*(-105) +83 + j*(-149) +-46 + j*(-25) +-194 + j*(-202) +-88 + j*(-108) +76 + j*(29) +79 + j*(-213) +-90 + j*(14) +-88 + j*(106) +-194 + j*(-71) +-57 + j*(42) +-478 + j*(-83) +269 + j*(-33) +180 + j*(25) +-47 + j*(-96) +-190 + j*(115) +-10 + j*(-342) +-144 + j*(-26) +-264 + j*(4) +-192 + j*(48) +-303 + j*(117) +-49 + j*(268) +95 + j*(-177) +419 + j*(69) +-131 + j*(156) +-170 + j*(-4) +-8 + j*(-139) +-42 + j*(185) +0 + j*(-301) +20 + j*(-200) +397 + j*(-147) +-130 + j*(-238) +-42 + j*(33) +-78 + j*(12) +-59 + j*(-111) +-206 + j*(-145) +-141 + j*(-148) +-94 + j*(-163) +146 + j*(-16) +43 + j*(211) +202 + j*(244) +-67 + j*(-282) +223 + j*(64) +65 + j*(194) +-76 + j*(-1) +14 + j*(240) +-51 + j*(136) +-23 + j*(165) +-44 + j*(64) +110 + j*(132) +-153 + j*(-107) +-20 + j*(-114) +-226 + j*(-141) +-103 + j*(4) +-113 + j*(211) +153 + j*(-9) +252 + j*(-18) +-115 + j*(-216) +-83 + j*(295) +165 + j*(47) +66 + j*(-152) +194 + j*(88) +-46 + j*(-30) +100 + j*(-37) +148 + j*(-224) +167 + j*(84) +-174 + j*(-62) +-333 + j*(-233) +250 + j*(-173) +325 + j*(-9) +36 + j*(-29) +-85 + j*(20) +141 + j*(179) +-13 + j*(15) +-179 + j*(-415) +-358 + j*(87) +-236 + j*(236) +291 + j*(-188) +-114 + j*(268) +-187 + j*(-233) +62 + j*(-151) +-139 + j*(-336) +301 + j*(-37) +-75 + j*(74) +12 + j*(-259) +-351 + j*(-17) +193 + j*(-151) +-4 + j*(105) +206 + j*(5) +-153 + j*(-107) +185 + j*(242) +-5 + j*(-105) +20 + j*(14) +36 + j*(368) +37 + j*(139) +11 + j*(-123) +-218 + j*(-71) +-122 + j*(86) +-95 + j*(95) +-412 + j*(-148) +-218 + j*(-69) +-326 + j*(-87) +-131 + j*(11) +-11 + j*(84) +98 + j*(-194) +-49 + j*(-99) +207 + j*(-170) +-200 + j*(-292) +-46 + j*(152) +-144 + j*(-54) +196 + j*(268) +100 + j*(31) +-132 + j*(157) +-95 + j*(-239) +185 + j*(-6) +-117 + j*(-161) +106 + j*(164) +122 + j*(48) +-47 + j*(45) +47 + j*(83) +195 + j*(361) +68 + j*(207) +43 + j*(17) +-120 + j*(-76) +1 + j*(-81) +-138 + j*(-8) +1 + j*(-15) +10 + j*(-10) +30 + j*(37) +-24 + j*(-55) +-235 + j*(251) +-16 + j*(236) +139 + j*(-286) +62 + j*(86) +183 + j*(-165) +-71 + j*(-117) +57 + j*(-56) +71 + j*(-23) +-518 + j*(52) +189 + j*(-45) +3 + j*(-190) +89 + j*(186) +36 + j*(-11) +-308 + j*(283) +153 + j*(-55) +170 + j*(68) +16 + j*(-214) +141 + j*(223) +13 + j*(163) +-99 + j*(197) +-350 + j*(-84) +361 + j*(-123) +-153 + j*(-35) +184 + j*(-101) +-250 + j*(104) +-256 + j*(147) +-56 + j*(166) +-67 + j*(-78) +1 + j*(-257) +-173 + j*(-69) +-109 + j*(-93) +-17 + j*(71) +243 + j*(-110) +54 + j*(166) +-80 + j*(-250) +-134 + j*(-32) +-169 + j*(-201) +-98 + j*(-239) +339 + j*(-90) +-11 + j*(-78) +25 + j*(45) +109 + j*(-8) +45 + j*(-274) +-215 + j*(-130) +-139 + j*(178) +213 + j*(-269) +-202 + j*(-202) +-221 + j*(-17) +219 + j*(-466) +87 + j*(-278) +358 + j*(-91) +5 + j*(169) +-129 + j*(330) +42 + j*(0) +-86 + j*(-29) +-80 + j*(295) +-154 + j*(-121) +76 + j*(233) +238 + j*(-31) +97 + j*(-160) +23 + j*(-81) +5 + j*(-187) +-39 + j*(-139) +-262 + j*(83) +128 + j*(23) +-274 + j*(-51) +229 + j*(-56) +127 + j*(486) +104 + j*(112) +-46 + j*(257) +-210 + j*(-244) +81 + j*(111) +112 + j*(198) +231 + j*(319) +-86 + j*(103) +-7 + j*(-55) +-6 + j*(-153) +139 + j*(141) +37 + j*(212) +56 + j*(346) +298 + j*(-73) +-4 + j*(-55) +163 + j*(36) +-46 + j*(229) +124 + j*(-144) +-156 + j*(122) +-209 + j*(-109) +117 + j*(-151) +-235 + j*(-193) +-38 + j*(-64) +136 + j*(28) +66 + j*(-388) +-102 + j*(101) +171 + j*(182) +-192 + j*(81) +251 + j*(-343) +261 + j*(-61) +88 + j*(-33) +-158 + j*(408) +305 + j*(-63) +-8 + j*(-103) +565 + j*(250) +-128 + j*(-51) +-211 + j*(-122) +-115 + j*(170) +42 + j*(-29) +-99 + j*(-112) +-30 + j*(-85) +232 + j*(213) +282 + j*(-5) +-86 + j*(113) +-300 + j*(-236) +-132 + j*(-146) +-4 + j*(93) +99 + j*(215) +-70 + j*(-24) +-95 + j*(23) +-104 + j*(-33) +237 + j*(-209) +190 + j*(-75) +15 + j*(73) +106 + j*(86) +3 + j*(-178) +148 + j*(-86) +105 + j*(209) +34 + j*(-276) +10 + j*(204) +135 + j*(-187) +-57 + j*(-210) +69 + j*(93) +-7 + j*(487) +-141 + j*(-340) +33 + j*(13) +106 + j*(-265) +51 + j*(105) +-247 + j*(-185) +-168 + j*(-27) +-46 + j*(-325) +79 + j*(139) +-74 + j*(535) +245 + j*(-96) +334 + j*(-317) +-103 + j*(159) +-204 + j*(-19) +144 + j*(239) +36 + j*(-187) +98 + j*(-91) +-249 + j*(-33) +9 + j*(-223) +326 + j*(-165) +-135 + j*(-42) +-125 + j*(-16) +15 + j*(-2) +-243 + j*(-287) +-33 + j*(182) +-91 + j*(15) +-81 + j*(-71) +-194 + j*(-63) +37 + j*(-23) +-138 + j*(-11) +-54 + j*(100) +50 + j*(31) +-43 + j*(115) +-36 + j*(-128) +153 + j*(-170) +23 + j*(-226) +-72 + j*(13) +130 + j*(-53) +-259 + j*(93) +-315 + j*(-78) +-141 + j*(-96) +241 + j*(112) +-54 + j*(159) +58 + j*(57) +-355 + j*(63) +307 + j*(-132) +192 + j*(88) +-240 + j*(15) +-35 + j*(-6) +123 + j*(291) +-161 + j*(158) +34 + j*(-92) +36 + j*(233) +302 + j*(-199) +71 + j*(56) +-144 + j*(91) +131 + j*(276) +-77 + j*(151) +-110 + j*(214) +12 + j*(-490) +-186 + j*(-77) +308 + j*(84) +-203 + j*(3) +113 + j*(-112) +-222 + j*(-176) +81 + j*(-112) +15 + j*(-14) +-50 + j*(-186) +144 + j*(-47) +-120 + j*(-125) +215 + j*(207) +-32 + j*(-16) +-383 + j*(247) +-96 + j*(81) +-148 + j*(-11) +48 + j*(148) +173 + j*(0) +79 + j*(390) +180 + j*(-223) +274 + j*(40) +-153 + j*(47) +-116 + j*(112) +121 + j*(255) +198 + j*(176) +74 + j*(134) +-170 + j*(168) +91 + j*(129) +105 + j*(-324) +-326 + j*(25) +-109 + j*(74) +174 + j*(-59) +-244 + j*(54) +-314 + j*(279) +-145 + j*(213) +238 + j*(103) +28 + j*(190) +46 + j*(-172) +-28 + j*(-190) +-122 + j*(-110) +-112 + j*(-82) +298 + j*(-21) +-171 + j*(83) +99 + j*(16) +143 + j*(71) +-141 + j*(-247) +-214 + j*(-83) +-9 + j*(14) +-66 + j*(-51) +-175 + j*(-115) +233 + j*(-421) +117 + j*(54) +148 + j*(-204) +-122 + j*(128) +-4 + j*(20) +-139 + j*(-47) +105 + j*(-64) +21 + j*(-56) +-144 + j*(-13) +-238 + j*(-225) +-97 + j*(139) +-83 + j*(15) +45 + j*(80) +-1 + j*(173) +260 + j*(141) +-125 + j*(2) +117 + j*(100) +100 + j*(-3) +255 + j*(-33) +-214 + j*(-199) +243 + j*(344) +85 + j*(158) +-322 + j*(-165) +-214 + j*(296) +-128 + j*(58) +-74 + j*(-222) +-25 + j*(-93) +44 + j*(5) +-63 + j*(-137) +-160 + j*(-328) +29 + j*(12) +-78 + j*(107) +142 + j*(238) +205 + j*(-250) +-207 + j*(191) +165 + j*(-142) +199 + j*(141) +28 + j*(-93) +-141 + j*(175) +-177 + j*(148) +274 + j*(-18) +-224 + j*(-92) +17 + j*(-247) +265 + j*(-45) +-121 + j*(134) +-66 + j*(-78) +253 + j*(-176) +-52 + j*(86) +-156 + j*(13) +-239 + j*(-81) +51 + j*(-115) +-134 + j*(36) +-83 + j*(-69) +-117 + j*(78) +145 + j*(91) +288 + j*(114) +6 + j*(136) +121 + j*(240) +-60 + j*(37) +197 + j*(100) +-275 + j*(78) +57 + j*(321) +-260 + j*(170) +91 + j*(-288) +-168 + j*(-164) +-171 + j*(-35) +-136 + j*(344) +43 + j*(3) +-206 + j*(168) +-343 + j*(124) +-222 + j*(-301) +98 + j*(146) +-30 + j*(-252) +203 + j*(-21) +-42 + j*(-90) +49 + j*(-36) +-62 + j*(-53) +-202 + j*(103) +2 + j*(53) +95 + j*(297) +67 + j*(-303) +183 + j*(-70) +-399 + j*(74) +-272 + j*(-213) +-167 + j*(158) +68 + j*(-21) +-180 + j*(77) +25 + j*(-18) +-57 + j*(-4) +136 + j*(-37) +215 + j*(-322) +322 + j*(34) +-122 + j*(-172) +185 + j*(264) +-144 + j*(247) +5 + j*(-125) +36 + j*(-313) +189 + j*(5) +140 + j*(-150) +7 + j*(69) +-113 + j*(11) +190 + j*(368) +-284 + j*(-105) +-62 + j*(5) +-132 + j*(-367) +-225 + j*(-90) +50 + j*(-269) +134 + j*(243) +-141 + j*(-52) +-226 + j*(53) +342 + j*(-53) +93 + j*(-263) +-92 + j*(-141) +125 + j*(162) +-123 + j*(66) +42 + j*(49) +-93 + j*(-114) +-92 + j*(-310) +-271 + j*(-95) +114 + j*(-197) +322 + j*(158) +-43 + j*(28) +-215 + j*(-171) +173 + j*(204) +332 + j*(213) +94 + j*(67) +328 + j*(23) +392 + j*(-35) +155 + j*(-135) +3 + j*(315) +-211 + j*(50) +226 + j*(-136) +-25 + j*(-26) +-126 + j*(78) +-107 + j*(-45) +24 + j*(227) +-100 + j*(100) +260 + j*(22) +-76 + j*(390) +-288 + j*(49) +66 + j*(110) +-163 + j*(-91) +-273 + j*(-385) +28 + j*(-218) +-231 + j*(156) +47 + j*(-76) +75 + j*(-82) +-43 + j*(133) +3 + j*(-226) +-69 + j*(-83) +231 + j*(-101) +-290 + j*(-52) +47 + j*(57) +-200 + j*(89) +-70 + j*(265) +55 + j*(-255) +-156 + j*(127) +91 + j*(337) +-3 + j*(163) +-129 + j*(-339) +-16 + j*(167) +-245 + j*(291) +-114 + j*(168) +-84 + j*(-148) +-7 + j*(-243) +-47 + j*(-44) +166 + j*(50) +227 + j*(-92) +215 + j*(291) +149 + j*(35) +-109 + j*(-145) +-190 + j*(-100) +-102 + j*(-8) +230 + j*(169) +16 + j*(58) +133 + j*(-169) +-16 + j*(291) +267 + j*(72) +84 + j*(52) +-342 + j*(73) +-101 + j*(228) +-16 + j*(180) +-2 + j*(122) +3 + j*(-344) +-93 + j*(-185) +38 + j*(92) +226 + j*(71) +390 + j*(-98) +179 + j*(-201) +-180 + j*(-31) +-40 + j*(-165) +109 + j*(-119) +105 + j*(-171) +-322 + j*(313) +-1 + j*(-18) +-47 + j*(256) +282 + j*(-29) +-383 + j*(-225) +284 + j*(16) +81 + j*(244) +252 + j*(279) +257 + j*(-23) +-491 + j*(254) +-102 + j*(175) +-46 + j*(269) +102 + j*(91) +5 + j*(123) +55 + j*(69) +29 + j*(105) +-197 + j*(4) +-84 + j*(226) +-12 + j*(95) +-57 + j*(-259) +195 + j*(-243) +134 + j*(133) +25 + j*(-165) +-71 + j*(-205) +91 + j*(-71) +-201 + j*(18) +-135 + j*(-405) +180 + j*(153) +323 + j*(276) +376 + j*(73) +221 + j*(65) +-231 + j*(236) +164 + j*(156) +238 + j*(97) +-18 + j*(-199) +144 + j*(-33) +-231 + j*(33) +-23 + j*(154) +50 + j*(24) +-145 + j*(-113) +32 + j*(138) +110 + j*(-121) +168 + j*(-242) +233 + j*(20) +30 + j*(87) +115 + j*(-67) +221 + j*(-12) +23 + j*(64) +66 + j*(161) +-91 + j*(-159) +-98 + j*(158) +-73 + j*(49) +-74 + j*(-26) +-209 + j*(76) +280 + j*(88) +1 + j*(-30) +474 + j*(136) +-39 + j*(-202) +61 + j*(-49) +-82 + j*(-31) +-25 + j*(267) +110 + j*(286) +-257 + j*(-42) +288 + j*(-35) +16 + j*(324) +449 + j*(-50) +-169 + j*(190) +108 + j*(-13) +-151 + j*(33) +-21 + j*(119) +82 + j*(-81) +132 + j*(-28) +-413 + j*(-19) +-295 + j*(-208) +153 + j*(145) +-7 + j*(194) +-110 + j*(-147) +-145 + j*(-126) +284 + j*(64) +-81 + j*(110) +263 + j*(-72) +12 + j*(-312) +-76 + j*(119) +154 + j*(52) +138 + j*(109) +-98 + j*(-220) +-433 + j*(-9) +267 + j*(-3) +-168 + j*(203) +33 + j*(-329) +129 + j*(-35) +-177 + j*(-58) +-161 + j*(-55) +-161 + j*(108) +-168 + j*(320) +-258 + j*(65) +-165 + j*(30) +-131 + j*(-6) +-98 + j*(25) +136 + j*(410) +1 + j*(332) +6 + j*(117) +-42 + j*(-151) +-15 + j*(-139) +292 + j*(-97) +208 + j*(-216) +113 + j*(-93) +168 + j*(160) +-261 + j*(88) +226 + j*(110) +70 + j*(-298) +-221 + j*(312) +54 + j*(101) +-108 + j*(166) +306 + j*(162) +75 + j*(52) +-129 + j*(-223) +47 + j*(59) +235 + j*(75) +-226 + j*(45) +238 + j*(91) +324 + j*(168) +132 + j*(-354) +-504 + j*(151) +234 + j*(112) +236 + j*(179) +-25 + j*(-47) +136 + j*(-141) +311 + j*(352) +20 + j*(-145) +61 + j*(-187) +146 + j*(-66) +-111 + j*(-25) +238 + j*(-6) +-248 + j*(-57) +255 + j*(169) +368 + j*(-76) +13 + j*(7) +-101 + j*(33) +1 + j*(227) +-243 + j*(-105) +-4 + j*(59) +118 + j*(38) +-23 + j*(57) +85 + j*(-116) +-170 + j*(-131) +-13 + j*(-11) +49 + j*(-61) +-37 + j*(294) +118 + j*(308) +-120 + j*(-21) +-232 + j*(-107) +393 + j*(312) +25 + j*(76) +74 + j*(23) +59 + j*(-136) +306 + j*(86) +-260 + j*(-314) +194 + j*(163) +-199 + j*(257) +-175 + j*(-257) +-232 + j*(13) +240 + j*(-95) +-155 + j*(-172) +361 + j*(-116) +-132 + j*(-152) +-110 + j*(71) +-279 + j*(288) +-4 + j*(-28) +-12 + j*(154) +89 + j*(190) +104 + j*(42) +-221 + j*(-151) +-91 + j*(115) +162 + j*(-30) +-471 + j*(-45) +225 + j*(-34) +161 + j*(199) +136 + j*(164) +-116 + j*(87) +-48 + j*(195) +74 + j*(156) +-23 + j*(7) +204 + j*(166) +-150 + j*(1) +19 + j*(79) +44 + j*(5) +-161 + j*(76) +122 + j*(-240) +151 + j*(-18) +-23 + j*(53) +-227 + j*(97) +-26 + j*(-221) +-358 + j*(-142) +217 + j*(-240) +-139 + j*(-170) +39 + j*(202) +55 + j*(-36) +122 + j*(-217) +65 + j*(242) +23 + j*(13) +-46 + j*(-73) +-81 + j*(-328) +131 + j*(-276) +-136 + j*(186) +158 + j*(204) +100 + j*(-209) +35 + j*(43) +4 + j*(43) +-263 + j*(6) +-16 + j*(159) +316 + j*(139) +336 + j*(-135) +-201 + j*(-235) +-13 + j*(-197) +275 + j*(139) +-188 + j*(13) +-152 + j*(-9) +-61 + j*(-177) +-369 + j*(-195) +160 + j*(-98) +56 + j*(-1) +-276 + j*(-13) +112 + j*(-183) +-231 + j*(206) +42 + j*(-163) +76 + j*(-34) +25 + j*(-84) +62 + j*(-61) +-258 + j*(-87) +-145 + j*(169) +-240 + j*(289) +-204 + j*(-272) +-191 + j*(-68) +45 + j*(91) +-124 + j*(46) +-261 + j*(-18) +144 + j*(340) +-24 + j*(216) +-7 + j*(-41) +239 + j*(52) +-292 + j*(-157) +210 + j*(-414) +-299 + j*(-11) +6 + j*(71) +226 + j*(-406) +27 + j*(187) +-72 + j*(-43) +-115 + j*(-215) +41 + j*(-39) +220 + j*(38) +-158 + j*(-246) +-24 + j*(-111) +-69 + j*(126) +137 + j*(-32) +-279 + j*(11) +-98 + j*(-329) +-38 + j*(68) +-366 + j*(19) +-94 + j*(-104) +197 + j*(-37) +-93 + j*(34) +-352 + j*(-19) +64 + j*(40) +165 + j*(-195) +37 + j*(42) +-177 + j*(-74) +-194 + j*(-129) +269 + j*(174) +55 + j*(-28) +-56 + j*(-37) +-309 + j*(-131) +69 + j*(-18) +-173 + j*(-9) +122 + j*(-270) +64 + j*(-221) +197 + j*(66) +-66 + j*(354) +1 + j*(133) +-125 + j*(129) +-255 + j*(-137) +180 + j*(106) +-223 + j*(385) +335 + j*(42) +-99 + j*(-32) +182 + j*(91) +213 + j*(29) +32 + j*(-33) +-75 + j*(37) +-109 + j*(-296) +134 + j*(99) +-53 + j*(-76) +140 + j*(176) +248 + j*(-379) +-76 + j*(-151) +-132 + j*(-22) +-116 + j*(110) +-82 + j*(-76) +-199 + j*(-174) +118 + j*(240) +-144 + j*(13) +-25 + j*(173) +-230 + j*(-95) +125 + j*(182) +-105 + j*(122) +-101 + j*(195) +20 + j*(-121) +35 + j*(-342) +-119 + j*(-385) +-188 + j*(-165) +-252 + j*(-393) +-269 + j*(-127) +-31 + j*(-12) +336 + j*(-78) +-52 + j*(-105) +-25 + j*(330) +11 + j*(149) +-81 + j*(-163) +-153 + j*(-223) +107 + j*(-33) +-294 + j*(-106) +-189 + j*(247) +-218 + j*(-154) +99 + j*(-35) +127 + j*(-290) +404 + j*(-88) +-135 + j*(268) +316 + j*(313) +206 + j*(161) +-385 + j*(36) +-17 + j*(266) +4 + j*(-23) +-83 + j*(73) +0 + j*(116) +160 + j*(199) +178 + j*(-109) +-69 + j*(-147) +125 + j*(59) +244 + j*(98) +-146 + j*(197) +59 + j*(234) +218 + j*(386) +23 + j*(-74) +438 + j*(90) +259 + j*(55) +181 + j*(214) +-38 + j*(-76) +-182 + j*(55) +-148 + j*(-138) +-130 + j*(281) +125 + j*(-132) +-90 + j*(-105) +183 + j*(255) +-138 + j*(288) +-165 + j*(-25) +-207 + j*(427) +259 + j*(-175) +147 + j*(-359) +116 + j*(-28) +-263 + j*(-146) +-217 + j*(48) +9 + j*(-62) +77 + j*(-11) +61 + j*(-215) +35 + j*(66) +85 + j*(1) +6 + j*(-23) +161 + j*(37) +-124 + j*(280) +111 + j*(-3) +26 + j*(233) +-76 + j*(130) +15 + j*(-241) +-78 + j*(-167) +44 + j*(-25) +-167 + j*(205) +-99 + j*(-188) +-154 + j*(120) +-61 + j*(11) +361 + j*(-10) +236 + j*(-204) +139 + j*(-104) +-106 + j*(44) +-40 + j*(99) +-1 + j*(-134) +-148 + j*(30) +-134 + j*(54) +-239 + j*(85) +-275 + j*(-269) +90 + j*(-83) +-225 + j*(-148) +332 + j*(-88) +-47 + j*(424) +-128 + j*(78) +163 + j*(69) +-175 + j*(88) +-146 + j*(243) +308 + j*(25) +301 + j*(26) +110 + j*(-218) +-139 + j*(-78) +279 + j*(92) +161 + j*(252) +-91 + j*(81) +-100 + j*(11) +-90 + j*(92) +-98 + j*(-146) +404 + j*(216) +178 + j*(-197) +-50 + j*(-149) +165 + j*(-58) +27 + j*(-303) +95 + j*(169) +-108 + j*(52) +294 + j*(-26) +-37 + j*(-3) +-101 + j*(-292) +187 + j*(250) +-71 + j*(339) +42 + j*(-67) +-66 + j*(50) +-37 + j*(-90) +93 + j*(56) +141 + j*(-18) +77 + j*(-32) +74 + j*(28) +248 + j*(223) +232 + j*(-345) +66 + j*(-51) +42 + j*(49) +54 + j*(113) +25 + j*(-40) +-88 + j*(156) +52 + j*(-112) +-214 + j*(325) +144 + j*(122) +-170 + j*(147) +-251 + j*(33) +-195 + j*(-218) +433 + j*(224) +-174 + j*(-269) +-75 + j*(-378) +-30 + j*(-155) +227 + j*(-212) +-1 + j*(-420) +-45 + j*(331) +139 + j*(-228) +114 + j*(438) +313 + j*(-54) +-460 + j*(-39) +125 + j*(-170) +222 + j*(-85) +-127 + j*(-302) +97 + j*(279) +114 + j*(121) +-226 + j*(144) +69 + j*(10) +162 + j*(-109) +206 + j*(-395) +-243 + j*(-5) +-86 + j*(294) +15 + j*(68) +206 + j*(-216) +-190 + j*(151) +-88 + j*(-41) +44 + j*(202) +-36 + j*(-110) +-35 + j*(16) +-29 + j*(85) +0 + j*(155) +-35 + j*(-83) +221 + j*(-148) +18 + j*(-342) +-83 + j*(7) +-8 + j*(-144) +9 + j*(-88) +-103 + j*(-317) +191 + j*(187) +-337 + j*(-266) +-24 + j*(8) +-515 + j*(-130) +-129 + j*(142) +78 + j*(138) +-70 + j*(264) +117 + j*(-196) +214 + j*(263) +45 + j*(-140) +127 + j*(-354) +-16 + j*(-46) +-6 + j*(-17) +-69 + j*(-194) +8 + j*(315) +52 + j*(119) +243 + j*(65) +19 + j*(1) +-163 + j*(-174) +124 + j*(-188) +-438 + j*(25) +102 + j*(-9) +88 + j*(-352) +214 + j*(-132) +150 + j*(-23) +-28 + j*(58) +52 + j*(-147) +-59 + j*(332) +-248 + j*(88) +47 + j*(138) +210 + j*(-60) +129 + j*(-173) +-54 + j*(235) +-190 + j*(284) +-74 + j*(142) +73 + j*(-128) +-46 + j*(-215) +126 + j*(328) +-136 + j*(105) +-32 + j*(-168) +-313 + j*(-133) +59 + j*(-33) +-39 + j*(158) +93 + j*(-158) +-30 + j*(-192) +119 + j*(21) +-8 + j*(180) +177 + j*(-231) +211 + j*(-264) +98 + j*(146) +46 + j*(13) +-170 + j*(98) +93 + j*(18) +-115 + j*(-21) +-86 + j*(-20) +76 + j*(325) +77 + j*(33) +199 + j*(-40) +154 + j*(-236) +-14 + j*(139) +37 + j*(65) +-121 + j*(36) +-206 + j*(247) +-18 + j*(65) +573 + j*(148) +169 + j*(-257) +-64 + j*(40) +53 + j*(-59) +-46 + j*(88) +-197 + j*(176) +18 + j*(-134) +-177 + j*(-109) +-76 + j*(142) +252 + j*(-144) +-2 + j*(-101) +41 + j*(-153) +-109 + j*(-24) +4 + j*(141) +49 + j*(-73) +-151 + j*(134) +-125 + j*(151) +-78 + j*(272) +49 + j*(-177) +-193 + j*(-143) +-164 + j*(-261) +29 + j*(-115) +195 + j*(-140) +85 + j*(13) +-86 + j*(27) +-77 + j*(-128) +378 + j*(114) +-436 + j*(49) +-55 + j*(134) +-144 + j*(-27) +99 + j*(315) +92 + j*(154) +148 + j*(177) +93 + j*(83) +119 + j*(310) +190 + j*(-248) +-259 + j*(-248) +218 + j*(310) +63 + j*(197) +226 + j*(81) +22 + j*(-151) +60 + j*(-168) +-285 + j*(231) +-40 + j*(-78) +144 + j*(-128) +-20 + j*(-402) +66 + j*(-8) +-71 + j*(17) +94 + j*(-111) +-22 + j*(-16) +128 + j*(-156) +-212 + j*(324) +-320 + j*(409) +-137 + j*(235) +52 + j*(-438) +205 + j*(178) +86 + j*(-149) +246 + j*(-124) +129 + j*(-48) +-23 + j*(72) +54 + j*(-18) +-136 + j*(225) +-134 + j*(198) +255 + j*(-239) +-378 + j*(-39) +-23 + j*(110) +35 + j*(-124) +47 + j*(-40) +177 + j*(-16) +178 + j*(-54) +-197 + j*(33) +141 + j*(-42) +134 + j*(245) +68 + j*(101) +-353 + j*(-16) +-375 + j*(47) +129 + j*(-129) +-75 + j*(-96) +192 + j*(66) +116 + j*(41) +-33 + j*(17) +103 + j*(81) +-52 + j*(214) +132 + j*(59) +-342 + j*(375) +-308 + j*(-103) +-68 + j*(140) +460 + j*(110) +-18 + j*(-97) +551 + j*(-522) +243 + j*(69) +534 + j*(264) +-373 + j*(-374) +-543 + j*(503) +292 + j*(223) +494 + j*(-12) +-96 + j*(-122) +600 + j*(-210) +378 + j*(-357) +39 + j*(477) +298 + j*(82) +-46 + j*(604) +-197 + j*(28) +-313 + j*(460) +-57 + j*(168) +368 + j*(-167) +-82 + j*(-532) +12 + j*(-259) +-498 + j*(-542) +567 + j*(190) +18 + j*(-402) +675 + j*(32) +-188 + j*(272) +778 + j*(51) +245 + j*(479) +-82 + j*(-250) +342 + j*(-177) +360 + j*(-356) +279 + j*(286) +-396 + j*(-656) +154 + j*(-335) +-88 + j*(-243) +327 + j*(-137) +488 + j*(274) +322 + j*(-62) +-43 + j*(507) +660 + j*(265) +-264 + j*(81) +-158 + j*(-299) +-449 + j*(-491) +557 + j*(78) +-6 + j*(-75) +569 + j*(135) +478 + j*(-146) +-92 + j*(-381) +-289 + j*(170) +276 + j*(-35) +-373 + j*(-409) +-288 + j*(-107) +173 + j*(-235) +286 + j*(-235) +236 + j*(-559) +52 + j*(164) +-2 + j*(-477) +169 + j*(346) +-322 + j*(-5) +-154 + j*(151) +250 + j*(66) +-477 + j*(79) +281 + j*(-82) +214 + j*(-72) +188 + j*(394) +146 + j*(-163) +-297 + j*(292) +133 + j*(-588) +648 + j*(-378) +285 + j*(453) +377 + j*(-400) +441 + j*(349) +388 + j*(-69) +396 + j*(550) +-27 + j*(-142) +446 + j*(361) +255 + j*(-25) +138 + j*(-252) +443 + j*(162) +471 + j*(-293) +309 + j*(359) +187 + j*(178) +359 + j*(-255) +-251 + j*(292) +-246 + j*(-288) +-402 + j*(427) +77 + j*(211) +-254 + j*(364) +123 + j*(-347) +-223 + j*(-178) +-245 + j*(-308) +392 + j*(192) +-302 + j*(453) +-384 + j*(-284) +-161 + j*(-283) +117 + j*(-281) +-272 + j*(274) +-211 + j*(249) +-530 + j*(-353) +204 + j*(471) +23 + j*(-124) +-119 + j*(-276) +-35 + j*(-373) +443 + j*(-426) +-23 + j*(-441) +149 + j*(-441) +-160 + j*(335) +224 + j*(-366) +-166 + j*(81) +30 + j*(-435) +213 + j*(-171) +337 + j*(364) +-301 + j*(121) +163 + j*(358) +-417 + j*(255) +-170 + j*(-19) +198 + j*(-239) +418 + j*(-470) +187 + j*(225) +-338 + j*(-273) +-581 + j*(87) +167 + j*(-600) +-685 + j*(414) +351 + j*(-370) +6 + j*(-515) +-279 + j*(-240) +45 + j*(-40) +-130 + j*(233) +-637 + j*(-235) +-187 + j*(165) +-135 + j*(386) +16 + j*(355) +-219 + j*(8) +469 + j*(-107) +71 + j*(108) +-16 + j*(15) +-14 + j*(-530) +-252 + j*(68) +288 + j*(536) +288 + j*(-182) +-478 + j*(-6) +-134 + j*(151) +-38 + j*(-388) +-414 + j*(-317) +440 + j*(-426) +-218 + j*(-705) +-304 + j*(-85) +-662 + j*(54) +273 + j*(-4) +268 + j*(211) +18 + j*(315) +141 + j*(292) +116 + j*(268) +-253 + j*(146) +235 + j*(-55) +-259 + j*(-178) +-197 + j*(-585) +-64 + j*(441) +-271 + j*(-188) +358 + j*(506) +13 + j*(-94) +-339 + j*(-167) +329 + j*(400) +50 + j*(-484) +91 + j*(366) +-407 + j*(-144) +-439 + j*(165) +170 + j*(-325) +-479 + j*(355) +237 + j*(-239) +99 + j*(-355) +-122 + j*(281) +515 + j*(148) +-132 + j*(-269) +-174 + j*(34) +11 + j*(-386) +291 + j*(-351) +243 + j*(52) +-300 + j*(129) +344 + j*(-442) +-232 + j*(83) +-10 + j*(2) +300 + j*(733) +-139 + j*(28) +83 + j*(-425) +-403 + j*(-188) +-344 + j*(-337) +345 + j*(144) +-245 + j*(-193) +-552 + j*(105) +433 + j*(-513) +426 + j*(188) +12 + j*(385) +-114 + j*(-211) +-261 + j*(-512) +268 + j*(139) +327 + j*(305) +309 + j*(-86) +366 + j*(407) +-206 + j*(277) +-81 + j*(319) +-21 + j*(108) +33 + j*(-84) +234 + j*(349) +-337 + j*(759) +169 + j*(324) +-183 + j*(333) +1 + j*(-487) +156 + j*(-346) +240 + j*(-270) +224 + j*(-426) +-71 + j*(-328) +117 + j*(-204) +79 + j*(-344) +-361 + j*(113) +-165 + j*(332) +-582 + j*(-463) +504 + j*(204) +-578 + j*(139) +-26 + j*(209) +-121 + j*(378) +-511 + j*(55) +156 + j*(-371) +12 + j*(-390) +231 + j*(-57) +11 + j*(-35) +-498 + j*(-8) +-465 + j*(-315) +-45 + j*(-214) +245 + j*(53) +-460 + j*(-199) +-151 + j*(272) +-453 + j*(-342) +194 + j*(8) +-68 + j*(-393) +-231 + j*(168) +-364 + j*(-337) +-414 + j*(-211) +701 + j*(-303) +-287 + j*(-534) +201 + j*(140) +177 + j*(110) +-54 + j*(-180) +-344 + j*(-205) +280 + j*(53) +432 + j*(-19) +376 + j*(99) +363 + j*(509) +404 + j*(-474) +-279 + j*(28) +-496 + j*(74) +308 + j*(-384) +680 + j*(230) +620 + j*(-209) +295 + j*(444) +194 + j*(411) +-185 + j*(-2) +546 + j*(317) +-5 + j*(313) +-415 + j*(229) +188 + j*(429) +247 + j*(617) +-12 + j*(495) +175 + j*(312) +-170 + j*(-268) +-74 + j*(-233) +-162 + j*(-310) +-210 + j*(156) +395 + j*(-435) +-184 + j*(268) +-24 + j*(-264) +431 + j*(-350) +-389 + j*(453) +-98 + j*(-118) +117 + j*(531) +-165 + j*(358) +74 + j*(-362) +-304 + j*(61) +-199 + j*(158) +228 + j*(167) +397 + j*(170) +266 + j*(-310) +450 + j*(93) +-215 + j*(-63) +-231 + j*(-31) +411 + j*(-336) +443 + j*(173) +288 + j*(240) +70 + j*(208) +-298 + j*(-249) +349 + j*(279) +-82 + j*(-6) +-282 + j*(-40) +227 + j*(-322) +93 + j*(695) +-433 + j*(392) +65 + j*(-356) +-249 + j*(250) +297 + j*(-205) +107 + j*(363) +95 + j*(270) +310 + j*(-12) +-228 + j*(532) +111 + j*(78) +227 + j*(-24) +141 + j*(-596) +-252 + j*(409) +-277 + j*(-249) +-53 + j*(532) +-173 + j*(-244) +519 + j*(402) +18 + j*(234) +-135 + j*(307) +-309 + j*(95) +-289 + j*(264) +289 + j*(-284) +147 + j*(-311) +-377 + j*(460) +-298 + j*(549) +177 + j*(332) +599 + j*(-378) +40 + j*(355) +373 + j*(121) +-266 + j*(-45) +-85 + j*(-47) +-186 + j*(-18) +-8 + j*(-195) +409 + j*(-610) +34 + j*(502) +-576 + j*(78) +298 + j*(164) +409 + j*(-331) +506 + j*(-433) +460 + j*(-700) +-84 + j*(269) +-303 + j*(375) +-5 + j*(-106) +30 + j*(85) +296 + j*(361) +-179 + j*(-178) +-477 + j*(-308) +-141 + j*(-696) +-149 + j*(398) +392 + j*(431) +-300 + j*(206) +-248 + j*(515) +462 + j*(217) +253 + j*(244) +164 + j*(-196) +308 + j*(-40) +28 + j*(124) +-172 + j*(-233) +471 + j*(-272) +332 + j*(445) +-217 + j*(200) +-307 + j*(-209) +503 + j*(207) +499 + j*(378) +-203 + j*(87) +-273 + j*(438) +170 + j*(364) +384 + j*(-122) +291 + j*(-509) +-74 + j*(422) +-571 + j*(126) +76 + j*(264) +-383 + j*(-128) +333 + j*(-436) +-105 + j*(-313) +260 + j*(-61) +404 + j*(465) +-172 + j*(363) +-225 + j*(-317) +185 + j*(-140) +132 + j*(40) +-199 + j*(-365) +470 + j*(-37) +89 + j*(-250) +-94 + j*(256) +0 + j*(397) +-326 + j*(531) +-245 + j*(-2) +-105 + j*(-4) +100 + j*(274) +-392 + j*(-227) +-274 + j*(173) +-93 + j*(-418) +646 + j*(214) +-568 + j*(-668) +582 + j*(16) +-129 + j*(-274) +272 + j*(226) +-8 + j*(-176) +351 + j*(387) +467 + j*(194) +-225 + j*(166) +-40 + j*(-489) +82 + j*(-408) +-168 + j*(268) +-28 + j*(-298) +-503 + j*(-358) +94 + j*(-250) +564 + j*(41) +-468 + j*(-158) +331 + j*(311) +303 + j*(-211) +185 + j*(-366) +-262 + j*(171) +-165 + j*(-372) +-414 + j*(-305) +-334 + j*(-371) +-62 + j*(26) +141 + j*(208) +250 + j*(347) +-256 + j*(-16) +-501 + j*(552) +452 + j*(-195) +-239 + j*(-151) +-426 + j*(-532) +10 + j*(-282) +-412 + j*(414) +-482 + j*(-233) +-321 + j*(256) +-124 + j*(32) +409 + j*(-373) +-568 + j*(-613) +-311 + j*(306) +-81 + j*(-678) +432 + j*(-555) +-374 + j*(376) +231 + j*(-211) +404 + j*(-189) +191 + j*(403) +511 + j*(-279) +-544 + j*(202) +136 + j*(-401) +363 + j*(-269) +-499 + j*(-64) +385 + j*(549) +243 + j*(250) +-209 + j*(393) +-231 + j*(-198) +272 + j*(-286) +133 + j*(-260) +-366 + j*(-317) +-76 + j*(25) +-270 + j*(255) +-267 + j*(118) +-217 + j*(-233) +313 + j*(370) +282 + j*(-179) +-513 + j*(120) +-118 + j*(-400) +286 + j*(-403) +-231 + j*(133) +-175 + j*(-118) +-161 + j*(-173) +-118 + j*(411) +-51 + j*(-93) +-542 + j*(16) +233 + j*(-422) +-13 + j*(-86) +345 + j*(-467) +-296 + j*(-259) +-23 + j*(-313) +74 + j*(476) +182 + j*(-244) +-266 + j*(-231) +-251 + j*(-226) +-395 + j*(-360) +-156 + j*(550) +217 + j*(163) +-486 + j*(433) +-281 + j*(248) +-65 + j*(67) +232 + j*(-296) +-383 + j*(-46) +403 + j*(99) +210 + j*(-325) +-217 + j*(-564) +-328 + j*(169) +-196 + j*(132) +-624 + j*(225) +-480 + j*(200) +-418 + j*(307) +367 + j*(-327) +-365 + j*(-371) +422 + j*(-177) +296 + j*(-316) +-284 + j*(-382) +414 + j*(163) +-542 + j*(-593) +332 + j*(40) +-100 + j*(368) +355 + j*(-380) +542 + j*(-166) +63 + j*(267) +-427 + j*(293) +-83 + j*(206) +-610 + j*(45) +348 + j*(-95) +469 + j*(-153) +235 + j*(-150) +-285 + j*(380) +-399 + j*(-140) +247 + j*(-107) +-556 + j*(472) +-168 + j*(-3) +-204 + j*(-325) +590 + j*(303) +-222 + j*(228) +200 + j*(233) +524 + j*(-117) +-57 + j*(257) +-405 + j*(-373) +-441 + j*(-124) +16 + j*(374) +306 + j*(-499) +-36 + j*(-2) +-103 + j*(-356) +378 + j*(214) +-361 + j*(-255) +-180 + j*(328) +-267 + j*(-305) +204 + j*(-63) +45 + j*(-543) +-134 + j*(-142) +321 + j*(508) +-412 + j*(549) +-240 + j*(182) +-353 + j*(177) +-138 + j*(-158) +165 + j*(-395) +234 + j*(-400) +-256 + j*(373) +37 + j*(-249) +69 + j*(-151) +-211 + j*(-291) +-209 + j*(-90) +-366 + j*(-367) +555 + j*(-146) +-202 + j*(-583) +-280 + j*(-259) +264 + j*(-309) +595 + j*(80) +-318 + j*(-107) +-306 + j*(96) +128 + j*(-289) +149 + j*(65) +265 + j*(-255) +-399 + j*(-277) +325 + j*(-206) +-368 + j*(122) +306 + j*(-187) +-261 + j*(329) +-223 + j*(-4) +443 + j*(477) +-476 + j*(403) +112 + j*(-310) +-124 + j*(93) +-25 + j*(-349) +404 + j*(-98) +-134 + j*(328) +-289 + j*(-192) +151 + j*(137) +431 + j*(301) +-76 + j*(-70) +-161 + j*(-161) +-590 + j*(-261) +276 + j*(291) +232 + j*(-365) +-383 + j*(-45) +409 + j*(-97) +-266 + j*(366) +433 + j*(-146) +-308 + j*(18) +238 + j*(80) +-52 + j*(299) +-250 + j*(499) +-395 + j*(358) +-83 + j*(-467) +173 + j*(284) +43 + j*(-25) +97 + j*(293) +-46 + j*(578) +245 + j*(-372) +-127 + j*(197) +-59 + j*(-461) +301 + j*(358) +-95 + j*(205) +-132 + j*(260) +-337 + j*(286) +-215 + j*(-344) +-224 + j*(256) +748 + j*(-341) +402 + j*(-316) +264 + j*(-693) +18 + j*(115) +127 + j*(-64) +-18 + j*(-102) +-95 + j*(-594) +385 + j*(72) +73 + j*(11) +-237 + j*(58) +-177 + j*(-98) +117 + j*(-21) +-536 + j*(173) +231 + j*(89) +-290 + j*(-238) +176 + j*(-135) +-293 + j*(50) +112 + j*(33) +73 + j*(-214) +89 + j*(-269) +62 + j*(6) +-204 + j*(9) +49 + j*(17) +21 + j*(91) +-170 + j*(49) +-112 + j*(-310) +-247 + j*(168) +-28 + j*(221) +98 + j*(-145) +234 + j*(33) +-22 + j*(-23) +-81 + j*(148) +69 + j*(117) +-144 + j*(-127) +-62 + j*(4) +76 + j*(149) +76 + j*(-45) +-6 + j*(61) +75 + j*(95) +-105 + j*(-210) +-378 + j*(-561) +-334 + j*(86) +309 + j*(-91) +309 + j*(-67) +190 + j*(-124) +91 + j*(23) +8 + j*(-58) +-235 + j*(-55) +57 + j*(-322) +-93 + j*(133) +-189 + j*(-179) +278 + j*(-37) +177 + j*(14) +-4 + j*(-166) +-71 + j*(-71) +310 + j*(-178) +107 + j*(-23) +153 + j*(55) +-146 + j*(350) +17 + j*(70) +-94 + j*(180) +-69 + j*(181) +-124 + j*(-424) +-75 + j*(117) +-124 + j*(-28) +-194 + j*(-111) +45 + j*(58) +12 + j*(-58) +197 + j*(-82) +212 + j*(32) +144 + j*(179) +-9 + j*(56) +-200 + j*(-328) +-64 + j*(70) +-48 + j*(332) +-71 + j*(-75) +-189 + j*(-15) +35 + j*(143) +-3 + j*(148) +-158 + j*(-24) +-69 + j*(165) +74 + j*(73) +149 + j*(-45) +-30 + j*(-211) +-195 + j*(158) +-147 + j*(272) +69 + j*(-50) +-73 + j*(54) +-309 + j*(-164) +-44 + j*(-103) +-401 + j*(132) +-271 + j*(104) +-269 + j*(-28) +-303 + j*(267) +-21 + j*(281) +-47 + j*(34) +-164 + j*(-165) +-110 + j*(241) +-37 + j*(62) +-40 + j*(-134) +2 + j*(19) +241 + j*(-375) +-301 + j*(-67) +204 + j*(-37) +303 + j*(-142) +-8 + j*(184) +60 + j*(-178) +-158 + j*(238) +223 + j*(-71) +63 + j*(-277) +144 + j*(-3) +-375 + j*(-45) +-186 + j*(6) +-36 + j*(-61) +46 + j*(-59) +-22 + j*(191) +-127 + j*(84) +-202 + j*(-13) +519 + j*(253) +-378 + j*(129) +16 + j*(176) +14 + j*(66) +-198 + j*(341) +-16 + j*(-180) +16 + j*(54) +42 + j*(49) +116 + j*(127) +60 + j*(-39) +-100 + j*(-65) +94 + j*(-66) +126 + j*(150) +396 + j*(-101) +-228 + j*(-126) +188 + j*(-42) +-88 + j*(-210) +-1 + j*(-69) +132 + j*(85) +-140 + j*(28) +-165 + j*(162) +-105 + j*(129) +-69 + j*(-122) +-130 + j*(-45) +-35 + j*(-15) +-217 + j*(63) +24 + j*(-269) +67 + j*(103) +-230 + j*(-104) +74 + j*(-202) +-48 + j*(-80) +-175 + j*(-81) +-118 + j*(-93) +-151 + j*(-15) +300 + j*(-88) +-107 + j*(-209) +113 + j*(52) +3 + j*(162) +-64 + j*(-366) +-180 + j*(-201) +291 + j*(65) +56 + j*(-347) +-21 + j*(28) +99 + j*(154) +119 + j*(5) +-18 + j*(-43) +101 + j*(-66) +279 + j*(-172) +210 + j*(-234) +119 + j*(-100) +4 + j*(-65) +-221 + j*(-33) +177 + j*(33) +289 + j*(240) +-134 + j*(261) +-474 + j*(50) +274 + j*(-269) +79 + j*(-84) +-164 + j*(63) +-103 + j*(151) +25 + j*(299) +87 + j*(67) +-302 + j*(93) +378 + j*(22) +230 + j*(-15) +70 + j*(-76) +74 + j*(-161) +-108 + j*(46) +52 + j*(-183) +-117 + j*(20) +351 + j*(-247) +169 + j*(115) +143 + j*(-125) +122 + j*(-360) +173 + j*(199) +337 + j*(-138) +-255 + j*(-175) +76 + j*(108) +256 + j*(-67) +184 + j*(-215) +103 + j*(303) +244 + j*(-360) +-130 + j*(-75) +98 + j*(-192) +-126 + j*(244) +249 + j*(-49) +331 + j*(-116) +-232 + j*(-227) +205 + j*(50) +-46 + j*(156) +274 + j*(153) +-392 + j*(-40) +-111 + j*(-1) +45 + j*(-269) +138 + j*(22) +238 + j*(172) +-24 + j*(-80) +160 + j*(-28) +-56 + j*(280) +-26 + j*(-56) +73 + j*(42) +360 + j*(29) +142 + j*(-410) +-126 + j*(107) +-134 + j*(288) +42 + j*(414) +-83 + j*(-246) +170 + j*(19) +1 + j*(-26) +-31 + j*(-13) +113 + j*(40) +82 + j*(145) +139 + j*(362) +-89 + j*(122) +-133 + j*(-552) +-269 + j*(-70) +-29 + j*(-21) +-161 + j*(-243) +-134 + j*(-10) +16 + j*(117) +13 + j*(-63) +-160 + j*(252) +-27 + j*(77) +-252 + j*(-119) +-65 + j*(167) +-71 + j*(259) +62 + j*(-130) +-223 + j*(117) +-58 + j*(-50) +132 + j*(-72) +21 + j*(157) +56 + j*(-150) +-171 + j*(-102) +-42 + j*(106) +-66 + j*(21) +-83 + j*(119) +158 + j*(252) +-252 + j*(-111) +-47 + j*(92) +46 + j*(-76) +-199 + j*(39) +-5 + j*(-91) +-65 + j*(-152) +308 + j*(-76) +36 + j*(276) +-144 + j*(-122) +382 + j*(330) +212 + j*(-305) +-23 + j*(-304) +-19 + j*(117) +150 + j*(-267) +-317 + j*(-182) +-100 + j*(33) +-23 + j*(92) +-258 + j*(-35) +70 + j*(-20) +-83 + j*(-13) +138 + j*(98) +301 + j*(-17) +448 + j*(289) +126 + j*(176) +284 + j*(12) +-176 + j*(-56) +320 + j*(144) +-188 + j*(-220) +-7 + j*(-40) +164 + j*(-198) +23 + j*(148) +260 + j*(184) +-187 + j*(-52) +-47 + j*(146) +-234 + j*(-148) +66 + j*(141) +243 + j*(-199) +-21 + j*(-17) +178 + j*(42) +204 + j*(93) +106 + j*(135) +14 + j*(88) +135 + j*(-242) +-35 + j*(-99) +-186 + j*(-61) +-167 + j*(-122) +-21 + j*(-138) +-41 + j*(-13) +-83 + j*(-98) +343 + j*(-217) +180 + j*(-9) +-476 + j*(-114) +-110 + j*(-219) +-272 + j*(211) +-47 + j*(-130) +-395 + j*(-134) +-200 + j*(54) +-107 + j*(-376) +47 + j*(298) +84 + j*(-206) +-355 + j*(115) +42 + j*(147) +211 + j*(119) +18 + j*(-42) +-173 + j*(77) +-40 + j*(259) +-168 + j*(193) +-167 + j*(-274) +-182 + j*(-132) +45 + j*(124) +351 + j*(-177) +170 + j*(-41) +44 + j*(90) +183 + j*(-95) +-361 + j*(60) +-24 + j*(-53) +122 + j*(-78) +-129 + j*(-28) +-160 + j*(92) +35 + j*(83) +-105 + j*(41) +-86 + j*(-101) +-228 + j*(120) +-27 + j*(-172) +36 + j*(221) +58 + j*(217) +91 + j*(-128) +-58 + j*(-247) +-78 + j*(270) +221 + j*(-192) +267 + j*(66) +115 + j*(48) +200 + j*(33) +155 + j*(-253) +172 + j*(93) +260 + j*(-219) +241 + j*(-64) +21 + j*(309) +37 + j*(-251) +238 + j*(-236) +-4 + j*(121) +38 + j*(-204) +-116 + j*(-143) +349 + j*(137) +60 + j*(23) +174 + j*(-243) +169 + j*(-221) +-192 + j*(-170) +124 + j*(-182) +43 + j*(-52) +209 + j*(223) +146 + j*(172) +-155 + j*(64) +28 + j*(129) +-118 + j*(232) +79 + j*(-8) +-294 + j*(40) +-414 + j*(-79) +45 + j*(234) +50 + j*(23) +-139 + j*(61) +40 + j*(41) +88 + j*(-35) +94 + j*(11) +-35 + j*(-146) +54 + j*(117) +-107 + j*(5) +-321 + j*(-30) +-190 + j*(-89) +227 + j*(90) +-72 + j*(-39) +-107 + j*(-324) +-117 + j*(71) +-33 + j*(99) +-82 + j*(-171) +75 + j*(-69) +33 + j*(151) +-106 + j*(-52) +35 + j*(-5) +-141 + j*(441) +48 + j*(62) +5 + j*(36) +2 + j*(136) +24 + j*(303) +-137 + j*(-233) +-249 + j*(241) +53 + j*(-79) +92 + j*(-265) +98 + j*(210) +-89 + j*(166) +-18 + j*(-91) +-62 + j*(-67) +74 + j*(-53) +91 + j*(-283) +330 + j*(77) +-16 + j*(-185) +293 + j*(47) +-54 + j*(66) +17 + j*(28) +-34 + j*(49) +190 + j*(-28) +-161 + j*(287) +-99 + j*(187) +5 + j*(34) +21 + j*(116) +-105 + j*(335) +-28 + j*(-32) +-74 + j*(-55) +148 + j*(69) +37 + j*(-168) +-233 + j*(42) +-66 + j*(-16) +115 + j*(-319) +81 + j*(-20) +120 + j*(180) +114 + j*(346) +61 + j*(-107) +143 + j*(-15) +70 + j*(-122) +-119 + j*(-272) +-39 + j*(129) +-163 + j*(103) +76 + j*(169) +-243 + j*(-21) +-145 + j*(-156) +-211 + j*(-214) +127 + j*(340) +79 + j*(-57) +-16 + j*(-45) +-24 + j*(87) +161 + j*(52) +-282 + j*(212) +-62 + j*(91) +-44 + j*(-33) +81 + j*(151) +69 + j*(68) +237 + j*(-74) +-132 + j*(260) +143 + j*(-132) +-11 + j*(-6) +-49 + j*(88) +-28 + j*(138) +-341 + j*(6) +231 + j*(35) +88 + j*(81) +-4 + j*(-156) +296 + j*(79) +-458 + j*(51) +35 + j*(-387) +-32 + j*(-234) +88 + j*(-45) +-173 + j*(-64) +-33 + j*(-172) +-204 + j*(-99) +-202 + j*(228) +105 + j*(-313) +-60 + j*(-256) +-104 + j*(-276) +222 + j*(-34) +-1 + j*(-357) +-98 + j*(-369) +-129 + j*(-107) +344 + j*(312) +-262 + j*(249) +108 + j*(-228) +364 + j*(-30) +-10 + j*(83) +-187 + j*(23) +330 + j*(249) +57 + j*(124) +317 + j*(-185) +-100 + j*(34) +225 + j*(82) +-36 + j*(-7) +-25 + j*(71) +-90 + j*(-27) +-132 + j*(155) +-106 + j*(-190) +-29 + j*(403) +-35 + j*(209) +66 + j*(-105) +137 + j*(-29) +84 + j*(238) +-1 + j*(-75) +-158 + j*(-138) +-120 + j*(349) +-66 + j*(-279) +127 + j*(-31) +-247 + j*(42) +186 + j*(-256) +-69 + j*(-107) +60 + j*(280) +237 + j*(190) +-161 + j*(47) +-104 + j*(173) +29 + j*(11) +59 + j*(177) +-43 + j*(-9) +-207 + j*(248) +115 + j*(-81) +-122 + j*(57) +20 + j*(-103) +-25 + j*(-41) +-13 + j*(66) +-169 + j*(23) +16 + j*(-243) +-83 + j*(-59) +121 + j*(-153) +-38 + j*(-99) +269 + j*(252) +303 + j*(-616) +-87 + j*(218) +-23 + j*(-52) +286 + j*(147) +-146 + j*(28) +185 + j*(88) +181 + j*(88) +58 + j*(300) +-59 + j*(-236) +-152 + j*(-32) +-132 + j*(-127) +-42 + j*(62) +200 + j*(-16) +178 + j*(87) +-10 + j*(-289) +85 + j*(-192) +373 + j*(92) +-641 + j*(26) +-253 + j*(-136) +-87 + j*(38) +7 + j*(-527) +79 + j*(-31) +10 + j*(76) +235 + j*(-160) +78 + j*(-93) +346 + j*(-32) +45 + j*(-271) +-30 + j*(269) +180 + j*(-45) +-39 + j*(125) +-256 + j*(206) +-24 + j*(-163) +98 + j*(317) +-194 + j*(-140) +-76 + j*(-12) +523 + j*(-112) +392 + j*(28) +58 + j*(-8) +-118 + j*(-94) +-129 + j*(17) +-217 + j*(18) +200 + j*(34) +-261 + j*(-148) +43 + j*(284) +-160 + j*(16) +332 + j*(67) +36 + j*(-7) +324 + j*(-185) +-134 + j*(-88) +-43 + j*(-363) +161 + j*(-263) +-59 + j*(-300) +-127 + j*(164) +-178 + j*(123) +-146 + j*(44) +-39 + j*(-35) +-131 + j*(-76) +-23 + j*(-384) +-112 + j*(-11) +86 + j*(177) +127 + j*(107) +-75 + j*(-81) +198 + j*(50) +24 + j*(-1) +-17 + j*(78) +-223 + j*(-136) +257 + j*(152) +-81 + j*(81) +-128 + j*(255) +-16 + j*(201) +16 + j*(187) +-143 + j*(-303) +-144 + j*(-173) +95 + j*(-123) +-264 + j*(177) +449 + j*(-10) +65 + j*(21) +-348 + j*(129) +-72 + j*(-158) +-283 + j*(43) +59 + j*(-156) +113 + j*(20) +-1 + j*(115) +201 + j*(25) +-91 + j*(-21) +46 + j*(140) +-54 + j*(-143) +71 + j*(-136) +-296 + j*(-75) +-202 + j*(293) +-51 + j*(202) +-33 + j*(88) +231 + j*(-65) +165 + j*(23) +-1 + j*(165) +-47 + j*(51) +-4 + j*(-314) +-141 + j*(-169) +53 + j*(-211) +89 + j*(204) +-105 + j*(-218) +61 + j*(-53) +-143 + j*(-284) +-11 + j*(-369) +-54 + j*(-280) +189 + j*(250) +-209 + j*(-136) +-65 + j*(-126) +25 + j*(168) +-137 + j*(165) +41 + j*(-85) +76 + j*(231) +-229 + j*(-282) +45 + j*(122) +-92 + j*(66) +-80 + j*(-161) +57 + j*(-59) +-95 + j*(-53) +-37 + j*(-35) +-20 + j*(103) +-124 + j*(-59) +-75 + j*(21) +-260 + j*(-112) +132 + j*(-57) +183 + j*(6) +243 + j*(-146) +102 + j*(384) +-172 + j*(-175) +21 + j*(-363) +192 + j*(-266) +52 + j*(-297) +-293 + j*(155) +58 + j*(-263) +207 + j*(14) +62 + j*(-169) +-152 + j*(250) +46 + j*(-74) +95 + j*(-74) +-75 + j*(147) +29 + j*(8) +-140 + j*(-167) +206 + j*(-33) +249 + j*(168) +47 + j*(38) +72 + j*(-209) +52 + j*(32) +123 + j*(294) +316 + j*(-170) +-91 + j*(-158) +-132 + j*(-92) +124 + j*(127) +215 + j*(110) +95 + j*(141) +-309 + j*(-30) +231 + j*(-153) +165 + j*(-54) +71 + j*(-115) +-250 + j*(-105) +-8 + j*(-131) +251 + j*(214) +-199 + j*(-33) +92 + j*(-49) +86 + j*(187) +-441 + j*(-16) +303 + j*(46) +163 + j*(-116) +6 + j*(45) +-53 + j*(209) +97 + j*(202) +371 + j*(-264) +-113 + j*(-148) +-70 + j*(-216) +-23 + j*(123) +-88 + j*(91) +-146 + j*(96) +45 + j*(-79) +-67 + j*(-41) +51 + j*(-138) +-203 + j*(-65) +-193 + j*(214) +91 + j*(187) +-246 + j*(-214) +-300 + j*(153) +21 + j*(-79) +-18 + j*(-130) +-165 + j*(256) +88 + j*(182) +-160 + j*(105) +120 + j*(-272) +440 + j*(327) +98 + j*(3) +-104 + j*(107) +215 + j*(84) +398 + j*(-12) +146 + j*(32) +343 + j*(6) +-522 + j*(284) +105 + j*(8) +112 + j*(41) +-263 + j*(84) +-36 + j*(-168) +45 + j*(90) +-111 + j*(-188) +1 + j*(83) +-159 + j*(40) +-345 + j*(59) +-17 + j*(-190) +-84 + j*(134) +201 + j*(-206) +46 + j*(-110) +136 + j*(-88) +144 + j*(92) +-11 + j*(-25) +-102 + j*(233) +-190 + j*(285) +50 + j*(123) +112 + j*(102) +72 + j*(387) +14 + j*(-137) +33 + j*(111) +-60 + j*(-201) +-86 + j*(118) +52 + j*(259) +52 + j*(28) +73 + j*(-199) +284 + j*(215) +296 + j*(-136) +-103 + j*(146) +1 + j*(49) +120 + j*(-55) +38 + j*(187) +-581 + j*(158) +163 + j*(-325) +-129 + j*(-29) +257 + j*(113) +135 + j*(250) +-246 + j*(-14) +-285 + j*(78) +-181 + j*(-91) +311 + j*(0) +75 + j*(68) +18 + j*(-100) +144 + j*(43) +324 + j*(95) +-107 + j*(69) +-133 + j*(-156) +-203 + j*(-366) +-245 + j*(-175) +72 + j*(39) +-6 + j*(-11) +-67 + j*(179) +-26 + j*(-18) +-271 + j*(375) +-201 + j*(-147) +-57 + j*(-52) +139 + j*(-216) +-93 + j*(54) +100 + j*(373) +-148 + j*(33) +-171 + j*(-137) +-43 + j*(98) +-4 + j*(-42) +-115 + j*(213) +22 + j*(-251) +-165 + j*(16) +-177 + j*(-170) +-275 + j*(184) +-153 + j*(-170) +-73 + j*(-168) +11 + j*(130) +48 + j*(121) +173 + j*(125) +1 + j*(37) +66 + j*(321) +365 + j*(-200) +240 + j*(107) +231 + j*(-123) +-115 + j*(41) +-211 + j*(16) +-192 + j*(-125) +-108 + j*(50) +-66 + j*(-6) +-8 + j*(-118) +81 + j*(68) +372 + j*(-31) +-280 + j*(66) +105 + j*(16) +-97 + j*(-85) +-175 + j*(-276) +-52 + j*(204) +-220 + j*(64) +-22 + j*(-260) +-138 + j*(88) +-86 + j*(-236) +0 + j*(13) +40 + j*(-56) +-161 + j*(-40) +-106 + j*(-194) +-265 + j*(-81) +86 + j*(83) +-48 + j*(7) +127 + j*(-83) +218 + j*(-228) +155 + j*(88) +-195 + j*(288) +-69 + j*(-33) +-122 + j*(36) +-195 + j*(-75) +-36 + j*(127) +-54 + j*(119) +95 + j*(-52) +18 + j*(-72) +-44 + j*(-35) +39 + j*(105) +109 + j*(-2) +-190 + j*(79) +171 + j*(301) +67 + j*(-164) +93 + j*(-250) +383 + j*(30) +-233 + j*(148) +64 + j*(25) +-22 + j*(-25) +73 + j*(160) +457 + j*(196) +-23 + j*(6) +154 + j*(35) +-78 + j*(-95) +18 + j*(-118) +-17 + j*(100) +125 + j*(-159) +-107 + j*(47) +18 + j*(342) +-83 + j*(-453) +411 + j*(157) +83 + j*(-192) +143 + j*(-182) +-266 + j*(-77) +124 + j*(-392) +94 + j*(-190) +-200 + j*(261) +-146 + j*(-107) +80 + j*(-24) +-113 + j*(57) +-4 + j*(87) +78 + j*(32) +-257 + j*(-225) +252 + j*(98) +121 + j*(222) +20 + j*(15) +-233 + j*(-42) +-76 + j*(-408) +-141 + j*(40) +146 + j*(-282) +52 + j*(-11) +88 + j*(-210) +93 + j*(157) +112 + j*(270) +45 + j*(34) +3 + j*(-139) +20 + j*(197) +86 + j*(-23) +-154 + j*(-133) +98 + j*(-40) +-356 + j*(-88) +-159 + j*(-144) +235 + j*(289) +7 + j*(-182) +-52 + j*(-290) +589 + j*(-199) +-26 + j*(-64) +14 + j*(-146) +-436 + j*(45) +-8 + j*(339) +-64 + j*(-50) +-325 + j*(53) +83 + j*(223) +-16 + j*(-254) +192 + j*(-69) +251 + j*(-84) +228 + j*(8) +114 + j*(163) +-55 + j*(84) +10 + j*(-61) +193 + j*(84) +-214 + j*(-66) +-49 + j*(69) +-231 + j*(-11) +-22 + j*(-81) +-199 + j*(90) +264 + j*(138) +-331 + j*(71) +132 + j*(122) +147 + j*(7) +-77 + j*(-69) +86 + j*(-34) +-98 + j*(143) +-408 + j*(153) +243 + j*(32) +-192 + j*(45) +210 + j*(-25) +2 + j*(16) +-516 + j*(-149) +80 + j*(-56) +-145 + j*(54) +108 + j*(8) +-151 + j*(59) +-255 + j*(200) +28 + j*(30) +-170 + j*(-214) +-14 + j*(14) +221 + j*(3) +-190 + j*(-98) +-173 + j*(-229) +-131 + j*(-164) +313 + j*(-194) +97 + j*(112) +222 + j*(-268) +13 + j*(-59) +117 + j*(-142) +172 + j*(-177) +67 + j*(221) +-87 + j*(-32) +-144 + j*(93) +-135 + j*(-286) +385 + j*(-101) +-86 + j*(202) +-149 + j*(127) +-56 + j*(195) +-2 + j*(-35) +-5 + j*(-182) +195 + j*(170) +202 + j*(-215) +-213 + j*(-109) +101 + j*(-176) +255 + j*(-240) +-86 + j*(214) +-165 + j*(-35) +242 + j*(-112) +-18 + j*(-156) +81 + j*(-96) +-4 + j*(120) +-97 + j*(8) +217 + j*(195) +256 + j*(-281) +71 + j*(-104) +-125 + j*(153) +-89 + j*(86) +-69 + j*(210) +-45 + j*(4) +445 + j*(-89) +-50 + j*(-165) +-212 + j*(58) +405 + j*(202) +153 + j*(383) +-74 + j*(199) +317 + j*(-228) +-6 + j*(-18) +24 + j*(-126) +234 + j*(141) +-113 + j*(-23) +128 + j*(80) +202 + j*(194) +52 + j*(110) +-8 + j*(-151) +-58 + j*(132) +-171 + j*(115) +54 + j*(49) +-151 + j*(-103) +132 + j*(-243) +276 + j*(-27) +-361 + j*(-115) +-150 + j*(84) +-148 + j*(-176) +-145 + j*(82) +219 + j*(-160) +184 + j*(-7) +33 + j*(-124) +-95 + j*(114) +190 + j*(-218) +141 + j*(-73) +-187 + j*(190) +-1 + j*(9) +149 + j*(6) +254 + j*(-40) +-35 + j*(-286) +151 + j*(303) +-139 + j*(-175) +-104 + j*(49) +-400 + j*(-63) +92 + j*(-197) +-318 + j*(10) +25 + j*(-160) +-183 + j*(-194) +74 + j*(45) +33 + j*(-66) +124 + j*(-181) +-93 + j*(74) +206 + j*(-126) +257 + j*(-97) +18 + j*(9) +-128 + j*(64) +119 + j*(125) +-140 + j*(11) +-257 + j*(7) +-356 + j*(-113) +-295 + j*(287) +-144 + j*(104) +174 + j*(59) +-13 + j*(-155) +-43 + j*(92) +-238 + j*(-49) +-195 + j*(238) +112 + j*(-262) +-103 + j*(37) +45 + j*(-238) +-217 + j*(-295) +-153 + j*(156) +281 + j*(88) +-107 + j*(-43) +293 + j*(47) +-215 + j*(80) +-48 + j*(-238) +-395 + j*(122) +-348 + j*(-60) +11 + j*(40) +216 + j*(56) +-78 + j*(163) +8 + j*(-216) +105 + j*(91) +106 + j*(261) +-95 + j*(-192) +112 + j*(67) +312 + j*(-171) +168 + j*(-223) +-7 + j*(171) +-27 + j*(-176) +166 + j*(206) +40 + j*(89) +-80 + j*(-222) +-120 + j*(-236) +-173 + j*(-10) +-48 + j*(-100) +-228 + j*(-205) +303 + j*(134) +222 + j*(18) +-118 + j*(203) +-35 + j*(40) +29 + j*(-70) +226 + j*(-18) +164 + j*(59) +173 + j*(-224) +45 + j*(-255) +149 + j*(-78) +-10 + j*(-176) +-168 + j*(216) +60 + j*(46) +45 + j*(-16) +-254 + j*(-35) +116 + j*(28) +87 + j*(170) +91 + j*(-139) +204 + j*(-61) +-131 + j*(-184) +158 + j*(184) +-118 + j*(-86) +475 + j*(158) +255 + j*(-69) +54 + j*(-293) +-11 + j*(91) +-74 + j*(-40) +-122 + j*(245) +-371 + j*(-127) +-13 + j*(-100) +-156 + j*(1) +71 + j*(-356) +-117 + j*(1) +-56 + j*(319) +-126 + j*(-319) +-159 + j*(-66) +-115 + j*(188) +-153 + j*(257) +187 + j*(-379) +64 + j*(-60) +-56 + j*(6) +-279 + j*(-78) +437 + j*(-305) +164 + j*(161) +371 + j*(-175) +76 + j*(143) +240 + j*(-185) +14 + j*(187) +381 + j*(134) +65 + j*(-382) +274 + j*(-39) +91 + j*(78) +-284 + j*(24) +115 + j*(82) +-64 + j*(194) +33 + j*(182) +-130 + j*(-107) +-77 + j*(-45) +-229 + j*(-103) +199 + j*(594) +117 + j*(59) +143 + j*(-350) +123 + j*(31) +-86 + j*(-33) +-301 + j*(258) +18 + j*(322) +166 + j*(-163) +157 + j*(-4) +201 + j*(228) +-115 + j*(-309) +-33 + j*(-49) +-257 + j*(1) +75 + j*(-115) +45 + j*(367) +-37 + j*(-36) +-77 + j*(-276) +163 + j*(138) +-42 + j*(103) +13 + j*(-232) +56 + j*(110) +-30 + j*(-88) +-47 + j*(-7) +42 + j*(235) +151 + j*(-332) +257 + j*(-101) +152 + j*(216) +-316 + j*(212) +-92 + j*(115) +127 + j*(-179) +-67 + j*(47) +-197 + j*(26) +441 + j*(-165) +-227 + j*(124) +49 + j*(45) +-81 + j*(368) +-62 + j*(-108) +251 + j*(-332) +-36 + j*(-64) +147 + j*(-291) +-129 + j*(-181) +226 + j*(-194) +-74 + j*(-160) +-250 + j*(-107) +-322 + j*(72) +-95 + j*(15) +-130 + j*(14) +-42 + j*(-41) +23 + j*(-275) +-61 + j*(-23) +-400 + j*(257) +73 + j*(-130) +-119 + j*(-42) +-28 + j*(-104) +27 + j*(-366) +-64 + j*(209) +84 + j*(206) +-176 + j*(-442) +103 + j*(-235) +-76 + j*(-279) +99 + j*(52) +-264 + j*(-8) +-288 + j*(71) +14 + j*(24) +-402 + j*(25) +-299 + j*(156) +-146 + j*(135) +-21 + j*(187) +-255 + j*(-52) +-214 + j*(239) +106 + j*(-19) +63 + j*(-71) +25 + j*(-88) +220 + j*(426) +-358 + j*(91) +-252 + j*(-223) +-54 + j*(-177) +122 + j*(-41) +105 + j*(-161) +-65 + j*(84) +252 + j*(10) +-168 + j*(-198) +183 + j*(-35) +11 + j*(172) +-226 + j*(-230) +-184 + j*(-214) +-151 + j*(-233) +-92 + j*(-59) +31 + j*(100) +16 + j*(331) +125 + j*(81) +-301 + j*(-35) +69 + j*(-139) +-60 + j*(107) +-64 + j*(-63) +-43 + j*(-99) +-130 + j*(-54) +134 + j*(381) +-155 + j*(17) +-499 + j*(223) +-148 + j*(-124) +-95 + j*(226) +247 + j*(-55) +-181 + j*(-183) +-94 + j*(-284) +-287 + j*(-103) +-136 + j*(59) +59 + j*(67) +259 + j*(-352) +-150 + j*(-10) +-43 + j*(119) +69 + j*(30) +-106 + j*(351) +-38 + j*(-85) +366 + j*(249) +71 + j*(197) +215 + j*(-37) +-136 + j*(196) +-231 + j*(75) +97 + j*(-383) +103 + j*(95) +99 + j*(-164) +172 + j*(-106) +93 + j*(177) +42 + j*(-337) +-23 + j*(-7) +199 + j*(262) +-141 + j*(70) +60 + j*(-132) +-5 + j*(-18) +-40 + j*(117) +-18 + j*(127) +-224 + j*(245) +-200 + j*(-121) +-22 + j*(74) +-23 + j*(-212) +129 + j*(119) +42 + j*(286) +18 + j*(261) +-17 + j*(-211) +-72 + j*(84) +327 + j*(-28) +2 + j*(-11) +100 + j*(-301) +-37 + j*(9) +-66 + j*(-165) +16 + j*(-57) +-59 + j*(-22) +49 + j*(158) +338 + j*(144) +11 + j*(87) +-276 + j*(-42) +-20 + j*(226) +-117 + j*(0) +-199 + j*(-294) +-274 + j*(18) +-21 + j*(-148) +-173 + j*(216) +103 + j*(101) +162 + j*(18) +301 + j*(157) +-43 + j*(486) +174 + j*(-354) +-61 + j*(-138) +-62 + j*(-337) +24 + j*(161) +106 + j*(-105) +69 + j*(-204) +247 + j*(166) +-199 + j*(235) +11 + j*(107) +273 + j*(180) +157 + j*(-83) +174 + j*(21) +-88 + j*(192) +-171 + j*(-54) +393 + j*(294) +-23 + j*(-21) +-6 + j*(4) +-73 + j*(-25) +-319 + j*(-282) +-407 + j*(-130) +86 + j*(76) +293 + j*(52) +392 + j*(-10) +-297 + j*(-74) +89 + j*(-230) +-149 + j*(286) +-185 + j*(43) +-91 + j*(-103) +-277 + j*(-305) +-189 + j*(-58) +-190 + j*(-8) +-54 + j*(-74) +99 + j*(26) +-83 + j*(-206) +223 + j*(82) +-60 + j*(-88) +342 + j*(-260) +-350 + j*(-141) +154 + j*(-4) +48 + j*(-197) +153 + j*(211) +223 + j*(118) +52 + j*(-206) +158 + j*(-131) +-368 + j*(49) +-180 + j*(-28) +19 + j*(-435) +112 + j*(83) +-167 + j*(-94) +161 + j*(284) +317 + j*(196) +-108 + j*(-390) +-236 + j*(105) +-287 + j*(-153) +-87 + j*(-1) +-42 + j*(-37) +-77 + j*(-438) +-9 + j*(59) +48 + j*(-317) +395 + j*(133) +-83 + j*(86) +-60 + j*(16) +-31 + j*(-90) +144 + j*(-65) +-80 + j*(-160) +42 + j*(-12) +-260 + j*(247) +-56 + j*(185) +16 + j*(70) +-87 + j*(-107) +74 + j*(187) +-37 + j*(210) +303 + j*(52) +-42 + j*(323) +-40 + j*(-14) +54 + j*(119) +-30 + j*(100) +-129 + j*(-9) +223 + j*(11) +-103 + j*(34) +225 + j*(316) +-11 + j*(-108) +-141 + j*(204) +86 + j*(-39) +50 + j*(361) +-120 + j*(-119) +233 + j*(-174) +-277 + j*(-74) +-126 + j*(169) +58 + j*(-33) +-177 + j*(-51) +-153 + j*(-271) +151 + j*(119) +215 + j*(18) +-69 + j*(-188) +305 + j*(130) +-144 + j*(7) +-210 + j*(50) +190 + j*(148) +78 + j*(-69) +37 + j*(96) +42 + j*(209) +243 + j*(57) +103 + j*(-252) +-69 + j*(101) +-43 + j*(-157) +-168 + j*(-206) +27 + j*(-35) +100 + j*(-18) +6 + j*(33) +-52 + j*(5) +13 + j*(-250) +17 + j*(268) +204 + j*(-153) +210 + j*(-54) +-117 + j*(85) +-30 + j*(22) +-255 + j*(19) +-3 + j*(-106) +-87 + j*(-130) +50 + j*(-207) +340 + j*(143) +-350 + j*(-105) +190 + j*(62) +32 + j*(-141) +21 + j*(289) +-322 + j*(394) +29 + j*(-30) +132 + j*(-94) +114 + j*(-328) +-195 + j*(372) +-228 + j*(-20) +54 + j*(66) +-39 + j*(-59) +186 + j*(10) +153 + j*(258) +12 + j*(45) +4 + j*(-96) +-33 + j*(54) +-210 + j*(116) +-369 + j*(72) +28 + j*(180) +93 + j*(114) +-98 + j*(208) +211 + j*(119) +-148 + j*(-176) +-391 + j*(-227) +-63 + j*(122) +59 + j*(30) +41 + j*(269) +-97 + j*(200) +-49 + j*(-78) +-208 + j*(261) +25 + j*(-16) +-253 + j*(8) +146 + j*(68) +71 + j*(28) +221 + j*(-176) +-281 + j*(-49) +278 + j*(134) +83 + j*(168) +-66 + j*(543) +260 + j*(-264) +-245 + j*(-107) +-205 + j*(669) +-275 + j*(207) +-265 + j*(294) +88 + j*(137) +-162 + j*(-23) +-410 + j*(-24) +-228 + j*(-286) +486 + j*(-153) +-10 + j*(112) +113 + j*(-173) +317 + j*(-373) +-211 + j*(-313) +-163 + j*(-56) +362 + j*(-64) +83 + j*(397) +-247 + j*(312) +385 + j*(-145) +-151 + j*(74) +361 + j*(161) +-247 + j*(451) +-320 + j*(-274) +314 + j*(337) +155 + j*(233) +114 + j*(-267) +115 + j*(201) +377 + j*(-134) +194 + j*(218) +36 + j*(202) +-598 + j*(232) +122 + j*(-301) +411 + j*(256) +260 + j*(-323) +12 + j*(466) +-78 + j*(-218) +267 + j*(-318) +-243 + j*(-390) +573 + j*(441) +-57 + j*(-368) +-492 + j*(141) +-271 + j*(-62) +310 + j*(246) +226 + j*(-334) +-395 + j*(-523) +-323 + j*(166) +-339 + j*(-184) +283 + j*(90) +-737 + j*(-246) +196 + j*(335) +354 + j*(-433) +-33 + j*(13) +-402 + j*(-357) +322 + j*(209) +69 + j*(109) +453 + j*(-119) +245 + j*(34) +296 + j*(-48) +283 + j*(-426) +228 + j*(-288) +86 + j*(185) +453 + j*(-25) +-137 + j*(255) +77 + j*(-154) +-166 + j*(-66) +-342 + j*(179) +-454 + j*(-412) +387 + j*(-252) +292 + j*(122) +334 + j*(0) +-254 + j*(129) +-116 + j*(-10) +-292 + j*(-6) +268 + j*(-445) +-209 + j*(-537) +424 + j*(-64) +279 + j*(-367) +-361 + j*(-91) +-243 + j*(-316) +250 + j*(-355) +238 + j*(-216) +-464 + j*(386) +-296 + j*(150) +-192 + j*(-322) +151 + j*(-255) +341 + j*(361) +-467 + j*(269) +-282 + j*(-421) +180 + j*(-375) +-428 + j*(-371) +211 + j*(272) +65 + j*(-426) +-378 + j*(-335) +158 + j*(-18) +-214 + j*(195) +-12 + j*(-337) +-115 + j*(116) +433 + j*(-126) +228 + j*(-88) +-329 + j*(54) +425 + j*(-19) +-443 + j*(496) +358 + j*(-255) +-401 + j*(272) +285 + j*(172) +-81 + j*(405) +10 + j*(-358) +-370 + j*(102) +-477 + j*(30) +8 + j*(519) +-323 + j*(447) +-527 + j*(-167) +-218 + j*(36) +-116 + j*(-40) +501 + j*(-393) +180 + j*(-192) +-93 + j*(-530) +-57 + j*(-521) +21 + j*(-306) +252 + j*(228) +-330 + j*(-42) +35 + j*(-476) +-482 + j*(-399) +221 + j*(348) +-257 + j*(-202) +-110 + j*(-249) +313 + j*(-1) +-303 + j*(51) +-374 + j*(683) +339 + j*(279) +428 + j*(363) +18 + j*(-341) +355 + j*(508) +-128 + j*(265) +-309 + j*(-98) +-28 + j*(-35) +-439 + j*(231) +499 + j*(458) +-546 + j*(-80) +-31 + j*(395) +-47 + j*(-1) +135 + j*(-437) +299 + j*(126) +161 + j*(424) +275 + j*(-41) +-172 + j*(77) +-433 + j*(57) +477 + j*(-182) +334 + j*(349) +233 + j*(-412) +414 + j*(93) +93 + j*(103) +-146 + j*(-267) +-232 + j*(-346) +324 + j*(204) +-500 + j*(-10) +276 + j*(-453) +23 + j*(-245) +343 + j*(-359) +419 + j*(-468) +517 + j*(83) +332 + j*(583) +355 + j*(-421) +-238 + j*(-115) +729 + j*(-23) +218 + j*(148) +305 + j*(-159) +-265 + j*(102) +-346 + j*(109) +343 + j*(140) +504 + j*(-364) +-424 + j*(-228) +-202 + j*(64) +-35 + j*(265) +-456 + j*(599) +-388 + j*(-223) +83 + j*(-33) +375 + j*(-334) +-115 + j*(53) +383 + j*(387) +110 + j*(-587) +518 + j*(49) +318 + j*(418) +-219 + j*(-455) +-37 + j*(-326) +-233 + j*(182) +-334 + j*(406) +559 + j*(327) +-398 + j*(265) +-517 + j*(-204) +436 + j*(204) +260 + j*(644) +407 + j*(-289) +355 + j*(-119) +377 + j*(-563) +171 + j*(-69) +313 + j*(-574) +228 + j*(-445) +-118 + j*(-154) +-161 + j*(424) +124 + j*(-366) +335 + j*(-135) +-99 + j*(-424) +437 + j*(506) +490 + j*(747) +272 + j*(79) +-28 + j*(-279) +214 + j*(333) +-190 + j*(251) +220 + j*(-320) +18 + j*(298) +292 + j*(136) +-164 + j*(-386) +-437 + j*(373) +-122 + j*(-311) +59 + j*(-512) +115 + j*(-47) +371 + j*(105) +432 + j*(-331) +-418 + j*(247) +-438 + j*(356) +231 + j*(-129) +-334 + j*(178) +-309 + j*(-184) +269 + j*(460) +-460 + j*(118) +537 + j*(36) +550 + j*(224) +275 + j*(-334) +-344 + j*(245) +-120 + j*(-237) +122 + j*(-154) +68 + j*(-146) +68 + j*(-363) +-211 + j*(-162) +-258 + j*(-269) +560 + j*(-274) +145 + j*(-81) +562 + j*(231) +-363 + j*(-486) +429 + j*(-189) +317 + j*(286) +298 + j*(-331) +110 + j*(-121) +4 + j*(-651) +4 + j*(648) +318 + j*(506) +478 + j*(79) +103 + j*(40) +-136 + j*(-419) +412 + j*(-26) +-493 + j*(290) +-364 + j*(513) +158 + j*(35) +-472 + j*(-109) +-293 + j*(-365) +372 + j*(437) +-171 + j*(-282) +-439 + j*(202) +-136 + j*(202) +-196 + j*(427) +-387 + j*(283) +-329 + j*(118) +-320 + j*(-251) +-141 + j*(382) +290 + j*(-96) +262 + j*(-165) +-173 + j*(-39) +126 + j*(-477) +-247 + j*(299) +-247 + j*(382) +-315 + j*(356) +141 + j*(-220) +291 + j*(-223) +281 + j*(448) +287 + j*(90) +457 + j*(-190) +-184 + j*(438) +302 + j*(-472) +-176 + j*(286) +-207 + j*(-400) +439 + j*(-117) +74 + j*(125) +292 + j*(-349) +299 + j*(-208) +-30 + j*(-268) +-59 + j*(-288) +-226 + j*(-315) +-499 + j*(-209) +-340 + j*(423) +-389 + j*(-105) +-170 + j*(-335) +-76 + j*(225) +-312 + j*(88) +379 + j*(303) +284 + j*(-255) +-291 + j*(296) +601 + j*(220) +207 + j*(105) +148 + j*(313) +281 + j*(420) +-402 + j*(382) +-141 + j*(148) +-74 + j*(318) +-618 + j*(-348) +-385 + j*(-310) +448 + j*(233) +471 + j*(-279) +9 + j*(125) +-191 + j*(-74) +559 + j*(529) +-421 + j*(-25) +615 + j*(-308) +-161 + j*(370) +493 + j*(-135) +-39 + j*(-309) +-270 + j*(-256) +527 + j*(8) +-204 + j*(474) +88 + j*(514) +-276 + j*(-429) +238 + j*(277) +-216 + j*(165) +-202 + j*(-349) +-73 + j*(-279) +267 + j*(279) +-186 + j*(-200) +-404 + j*(639) +233 + j*(-351) +304 + j*(-202) +-91 + j*(-161) +383 + j*(-247) +-437 + j*(-287) +-275 + j*(-8) +453 + j*(-290) +305 + j*(-100) +323 + j*(-377) +22 + j*(112) +-371 + j*(-85) +-23 + j*(-8) +276 + j*(173) +226 + j*(120) +-491 + j*(337) +-245 + j*(497) +368 + j*(-130) +77 + j*(190) +378 + j*(34) +-298 + j*(187) +146 + j*(322) +-494 + j*(-216) +-312 + j*(80) +361 + j*(195) +213 + j*(-537) +-49 + j*(-452) +-282 + j*(-228) +-171 + j*(382) +74 + j*(-387) +-382 + j*(378) +513 + j*(-339) +67 + j*(-65) +301 + j*(-3) +438 + j*(-215) +-516 + j*(100) +55 + j*(-149) +-47 + j*(-359) +92 + j*(-285) +-182 + j*(193) +152 + j*(-314) +-270 + j*(255) +-334 + j*(-128) +299 + j*(-450) +-197 + j*(311) +-231 + j*(-173) +458 + j*(-262) +-206 + j*(477) +-338 + j*(202) +-37 + j*(454) +-477 + j*(-1) +-157 + j*(-477) +-339 + j*(-322) +-278 + j*(607) +257 + j*(-292) +-199 + j*(77) +132 + j*(182) +-314 + j*(-312) +-439 + j*(366) +-319 + j*(-279) +358 + j*(74) +-198 + j*(-170) +557 + j*(-256) +-207 + j*(-424) +-472 + j*(-307) +158 + j*(228) +-80 + j*(-64) +395 + j*(383) +-168 + j*(-6) +-40 + j*(-215) +78 + j*(-342) +-28 + j*(97) +357 + j*(73) +-584 + j*(-170) +-510 + j*(296) +-155 + j*(42) +187 + j*(13) +510 + j*(334) +113 + j*(-436) +-448 + j*(265) +-327 + j*(184) +128 + j*(141) +211 + j*(-30) +139 + j*(197) +-36 + j*(65) +546 + j*(220) +473 + j*(-143) +-139 + j*(175) +-473 + j*(243) +247 + j*(-214) +18 + j*(262) +28 + j*(-354) +140 + j*(-25) +-325 + j*(-457) +-284 + j*(-313) +229 + j*(-353) +-337 + j*(-385) +448 + j*(501) +-292 + j*(-126) +484 + j*(-617) +-291 + j*(-453) +-297 + j*(-247) +347 + j*(-323) +204 + j*(-272) +-252 + j*(-155) +-148 + j*(-477) +166 + j*(378) +142 + j*(0) +174 + j*(438) +653 + j*(-51) +259 + j*(458) +-282 + j*(237) +13 + j*(350) +-537 + j*(365) +215 + j*(315) +467 + j*(129) +244 + j*(-213) +285 + j*(1) +182 + j*(-56) +135 + j*(-305) +208 + j*(-312) +612 + j*(-123) +303 + j*(473) +102 + j*(-471) +-190 + j*(-270) +3 + j*(-470) +192 + j*(483) +94 + j*(-435) +-69 + j*(333) +527 + j*(9) +-203 + j*(201) +159 + j*(1) +-428 + j*(333) +54 + j*(-194) +391 + j*(303) +-171 + j*(-295) +315 + j*(-127) +260 + j*(197) +-146 + j*(-67) +297 + j*(446) +-474 + j*(285) +-95 + j*(165) +286 + j*(-295) +-482 + j*(-386) +37 + j*(-359) +-295 + j*(-119) +187 + j*(-374) +359 + j*(-55) +-294 + j*(-349) +301 + j*(301) +148 + j*(-211) +-259 + j*(-183) +-325 + j*(28) +-144 + j*(39) +-403 + j*(-242) +-465 + j*(49) +176 + j*(-325) +262 + j*(-41) +547 + j*(260) +-316 + j*(65) +425 + j*(-1) +310 + j*(-226) +-163 + j*(-569) +-361 + j*(268) +385 + j*(-217) +-474 + j*(-19) +-143 + j*(238) +-280 + j*(-138) +170 + j*(233) +124 + j*(-78) +593 + j*(348) +-291 + j*(-136) +98 + j*(542) +-211 + j*(-704) +431 + j*(-303) +79 + j*(-228) +134 + j*(-62) +-247 + j*(-397) +567 + j*(52) +521 + j*(-226) +368 + j*(-127) +-654 + j*(28) +-457 + j*(595) +-162 + j*(-465) +-161 + j*(-552) +202 + j*(-199) +-409 + j*(-440) +623 + j*(137) +305 + j*(6) +-115 + j*(-160) +206 + j*(-120) +182 + j*(285) +-478 + j*(-85) +-197 + j*(-403) +119 + j*(-354) +-308 + j*(349) +482 + j*(-368) +-296 + j*(96) +-27 + j*(141) +665 + j*(389) +458 + j*(179) +-8 + j*(-435) +-648 + j*(-80) +-403 + j*(192) +-212 + j*(161) +319 + j*(-486) +222 + j*(-178) +308 + j*(338) +-88 + j*(-101) +406 + j*(-424) +-95 + j*(-590) +-412 + j*(-542) +-64 + j*(-274) +-245 + j*(320) +144 + j*(192) +144 + j*(300) +225 + j*(-187) +-200 + j*(352) +-576 + j*(-369) +86 + j*(-57) +243 + j*(-177) +-106 + j*(-433) +275 + j*(361) +85 + j*(164) +-300 + j*(338) +-659 + j*(-456) +-293 + j*(-298) +-453 + j*(209) +-493 + j*(165) +-635 + j*(-501) +-353 + j*(357) +-294 + j*(184) +47 + j*(-356) +251 + j*(37) +490 + j*(250) +-204 + j*(-330) +344 + j*(291) +110 + j*(165) +97 + j*(18) +540 + j*(-192) +-569 + j*(-88) +-135 + j*(95) +-326 + j*(-617) +115 + j*(-14) +263 + j*(-353) +436 + j*(-301) +83 + j*(265) +-94 + j*(269) +-194 + j*(-245) +-6 + j*(-158) +-156 + j*(-540) +476 + j*(313) +308 + j*(-288) +-74 + j*(-361) +-286 + j*(-144) +332 + j*(-60) +327 + j*(147) +-452 + j*(477) +95 + j*(116) +477 + j*(413) +343 + j*(427) +548 + j*(351) +-358 + j*(108) +-147 + j*(-146) +-383 + j*(-209) +-431 + j*(-528) +555 + j*(473) +233 + j*(-53) +-44 + j*(-122) +339 + j*(626) +-10 + j*(-454) +-10 + j*(484) +-222 + j*(225) +-47 + j*(90) +170 + j*(162) +61 + j*(-95) +25 + j*(-11) +74 + j*(269) +-2 + j*(243) +3 + j*(30) +-267 + j*(-80) +59 + j*(374) +-35 + j*(-372) +165 + j*(221) +-102 + j*(-175) +-34 + j*(-115) +-75 + j*(-95) +126 + j*(88) +-245 + j*(194) +-351 + j*(72) +33 + j*(47) +-87 + j*(-266) +-95 + j*(165) +-56 + j*(42) +179 + j*(123) +-30 + j*(170) +5 + j*(-428) +279 + j*(346) +-349 + j*(-42) +-9 + j*(-86) +-62 + j*(293) +344 + j*(-372) +148 + j*(-54) +-160 + j*(-57) +-57 + j*(109) +-88 + j*(128) +-73 + j*(156) +-130 + j*(60) +-206 + j*(472) +-129 + j*(4) +231 + j*(-168) +-84 + j*(-132) +-189 + j*(310) +-64 + j*(-107) +274 + j*(-236) +-53 + j*(-1) +8 + j*(-197) +327 + j*(-13) +85 + j*(321) +41 + j*(158) +134 + j*(267) +53 + j*(129) +42 + j*(-11) +144 + j*(-164) +216 + j*(29) +-70 + j*(-49) +-153 + j*(-78) +303 + j*(91) +248 + j*(-240) +60 + j*(191) +51 + j*(51) +38 + j*(30) +-110 + j*(72) +395 + j*(-380) +-98 + j*(-201) +-21 + j*(-40) +26 + j*(122) +6 + j*(268) +-85 + j*(78) +105 + j*(49) +152 + j*(-69) +277 + j*(134) +59 + j*(-185) +-112 + j*(-143) +-12 + j*(275) +-103 + j*(-44) +-190 + j*(-227) +-245 + j*(105) +-21 + j*(-148) +-67 + j*(45) +154 + j*(128) +-110 + j*(-153) +-33 + j*(-143) +-88 + j*(-81) +163 + j*(-1) +42 + j*(-227) +93 + j*(1) +202 + j*(-52) +305 + j*(58) +-170 + j*(-458) +-181 + j*(418) +291 + j*(402) +-198 + j*(166) +196 + j*(-259) +-263 + j*(186) +77 + j*(137) +59 + j*(-204) +379 + j*(-7) +-19 + j*(64) +235 + j*(35) +81 + j*(-90) +24 + j*(79) +54 + j*(-92) +-119 + j*(-243) +99 + j*(187) +-18 + j*(109) +139 + j*(-76) +-267 + j*(-52) +-111 + j*(92) +6 + j*(-2) +57 + j*(158) +158 + j*(-405) +-224 + j*(242) +271 + j*(-42) +131 + j*(-201) +151 + j*(192) +-50 + j*(42) +333 + j*(-21) +-34 + j*(-134) +-121 + j*(110) +-480 + j*(-63) +40 + j*(-447) +-150 + j*(147) +90 + j*(-212) +-186 + j*(-5) +174 + j*(-49) +-319 + j*(91) +145 + j*(-51) +-251 + j*(-44) +57 + j*(13) +-9 + j*(-190) +-72 + j*(107) +54 + j*(114) +156 + j*(20) +-134 + j*(98) +-89 + j*(-16) +-120 + j*(-82) +-135 + j*(-173) +307 + j*(-235) +-24 + j*(-242) +132 + j*(-212) +-139 + j*(-104) +349 + j*(-211) +23 + j*(146) +65 + j*(25) +-104 + j*(140) +-110 + j*(115) +-97 + j*(-174) +162 + j*(35) +86 + j*(-174) +222 + j*(48) +136 + j*(279) +-100 + j*(-28) +-5 + j*(-159) +49 + j*(-167) +-3 + j*(230) +-57 + j*(12) +136 + j*(-295) +62 + j*(-274) +-178 + j*(-213) +-34 + j*(284) +102 + j*(174) +-112 + j*(83) +99 + j*(161) +-141 + j*(-249) +16 + j*(21) +135 + j*(-135) +62 + j*(162) +23 + j*(-67) +-128 + j*(-1) +-24 + j*(-153) +8 + j*(128) +134 + j*(-47) +-240 + j*(185) +18 + j*(310) +-136 + j*(108) +-266 + j*(-65) +174 + j*(33) +-188 + j*(18) +-146 + j*(180) +128 + j*(-28) +339 + j*(157) +-163 + j*(215) +148 + j*(26) +-57 + j*(-83) +-116 + j*(82) +-91 + j*(110) +-258 + j*(1) +-128 + j*(-60) +26 + j*(-158) +-87 + j*(-183) +1 + j*(12) +-73 + j*(313) +265 + j*(-34) +-39 + j*(-241) +-30 + j*(66) +81 + j*(-78) +97 + j*(-133) +-57 + j*(-127) +94 + j*(-61) +228 + j*(-84) +-77 + j*(276) +76 + j*(86) +-38 + j*(-375) +-130 + j*(136) +-11 + j*(-57) +-182 + j*(25) +40 + j*(-249) +-206 + j*(100) +0 + j*(119) +-240 + j*(-139) +-165 + j*(55) +170 + j*(-28) +361 + j*(-87) +91 + j*(132) +10 + j*(139) +-154 + j*(-103) +37 + j*(39) +-142 + j*(-283) +181 + j*(207) +-1 + j*(-238) +-273 + j*(93) +27 + j*(-272) +-78 + j*(-228) +322 + j*(-95) +-100 + j*(-489) +-257 + j*(-308) +-112 + j*(302) +145 + j*(243) +-69 + j*(88) +-78 + j*(-173) +96 + j*(107) +-100 + j*(178) +-348 + j*(45) +-27 + j*(30) +267 + j*(-211) +52 + j*(-66) +236 + j*(-195) +339 + j*(-69) +351 + j*(125) +-79 + j*(-368) +71 + j*(4) +-151 + j*(159) +-47 + j*(-404) +-266 + j*(209) +175 + j*(46) +-301 + j*(-93) +281 + j*(-106) +-25 + j*(-88) +-96 + j*(-258) +160 + j*(-1) +128 + j*(28) +11 + j*(43) +137 + j*(412) +-276 + j*(141) +64 + j*(-101) +-82 + j*(-85) +-194 + j*(100) +-305 + j*(-136) +45 + j*(175) +-28 + j*(-45) +190 + j*(169) +265 + j*(74) +264 + j*(-54) +-26 + j*(112) +-264 + j*(177) +-255 + j*(320) +127 + j*(70) +184 + j*(-347) +132 + j*(244) +298 + j*(-8) +-182 + j*(-144) +-226 + j*(175) +-40 + j*(323) +200 + j*(-257) +-293 + j*(282) +11 + j*(-280) +-1 + j*(-445) +18 + j*(-180) +134 + j*(10) +-3 + j*(-98) +262 + j*(-4) +45 + j*(153) +376 + j*(84) +-324 + j*(185) +-197 + j*(-124) +-152 + j*(-61) +-40 + j*(-2) +-173 + j*(-68) +98 + j*(108) +261 + j*(-73) +119 + j*(76) +28 + j*(-102) +-305 + j*(-276) +243 + j*(180) +-221 + j*(128) +64 + j*(-102) +-108 + j*(267) +-8 + j*(-108) +-116 + j*(139) +-91 + j*(-62) +24 + j*(25) +-83 + j*(98) +45 + j*(-124) +173 + j*(47) +-124 + j*(-233) +-47 + j*(-125) +-88 + j*(-132) +-21 + j*(277) +-112 + j*(-133) +88 + j*(97) +-320 + j*(354) +338 + j*(259) +-6 + j*(-208) +-8 + j*(-50) +310 + j*(-15) +-33 + j*(-134) +93 + j*(-54) +70 + j*(-214) +10 + j*(-65) +123 + j*(78) +317 + j*(147) +-209 + j*(-153) +513 + j*(-206) +-306 + j*(-128) +27 + j*(-395) +112 + j*(90) +-17 + j*(35) +-57 + j*(-4) +-122 + j*(-385) +30 + j*(-61) +-167 + j*(238) +269 + j*(265) +203 + j*(41) +253 + j*(70) +52 + j*(-152) +-53 + j*(-49) +96 + j*(49) +-202 + j*(-424) +34 + j*(-286) +-505 + j*(-199) +-190 + j*(166) +308 + j*(-265) +-186 + j*(451) +-331 + j*(-117) +115 + j*(64) +-171 + j*(111) +-106 + j*(266) +143 + j*(-148) +-13 + j*(16) +-168 + j*(375) +211 + j*(150) +-470 + j*(104) +-274 + j*(-323) +198 + j*(76) +115 + j*(349) +-244 + j*(129) +-5 + j*(-64) +309 + j*(-34) +18 + j*(107) +482 + j*(76) +136 + j*(245) +-91 + j*(-34) +-130 + j*(153) +83 + j*(-168) +0 + j*(-32) +23 + j*(-372) +-44 + j*(-225) +-228 + j*(-75) +28 + j*(244) +-141 + j*(82) +-149 + j*(-58) +-271 + j*(-217) +-331 + j*(270) +-100 + j*(-6) +185 + j*(-83) +325 + j*(-273) +226 + j*(-206) +240 + j*(86) +-154 + j*(-227) +-48 + j*(-69) +-42 + j*(72) +377 + j*(137) +62 + j*(-402) +-53 + j*(-8) +29 + j*(63) +-30 + j*(204) +-255 + j*(390) +233 + j*(180) +-53 + j*(-97) +-42 + j*(-55) +-32 + j*(-76) +66 + j*(410) +33 + j*(243) +163 + j*(-12) +-195 + j*(-38) +254 + j*(98) +-132 + j*(-132) +7 + j*(-87) +136 + j*(240) +59 + j*(42) +225 + j*(-68) +-159 + j*(152) +-129 + j*(-4) +269 + j*(-86) +-37 + j*(79) +-436 + j*(-71) +-23 + j*(211) +163 + j*(176) +-89 + j*(-98) +-129 + j*(-387) +118 + j*(8) +38 + j*(-47) +337 + j*(-88) +-4 + j*(-1) +231 + j*(-82) +54 + j*(366) +-73 + j*(138) +-8 + j*(-69) +-163 + j*(135) +-159 + j*(-257) +-214 + j*(-268) +-60 + j*(-36) +69 + j*(182) +172 + j*(115) +-105 + j*(288) +77 + j*(-184) +-107 + j*(101) +248 + j*(45) +61 + j*(-101) +292 + j*(-93) +69 + j*(-192) +143 + j*(66) +-279 + j*(138) +-74 + j*(-21) +371 + j*(-74) +134 + j*(300) +-71 + j*(8) +108 + j*(-291) +4 + j*(129) +-373 + j*(-51) +59 + j*(-117) +189 + j*(-206) +206 + j*(28) +-242 + j*(-433) +-98 + j*(-260) +-102 + j*(169) +-82 + j*(33) +-11 + j*(-184) +-24 + j*(-47) +77 + j*(-71) +-117 + j*(-44) +204 + j*(-164) +-10 + j*(-81) +179 + j*(-16) +68 + j*(-293) +22 + j*(37) +202 + j*(104) +30 + j*(45) +192 + j*(180) +-136 + j*(-117) +120 + j*(173) +-202 + j*(148) +-172 + j*(173) +-28 + j*(190) +115 + j*(-58) +-167 + j*(199) +-95 + j*(212) +168 + j*(-260) +-250 + j*(-95) +-35 + j*(100) +-360 + j*(-88) +-163 + j*(75) +335 + j*(-58) +-14 + j*(151) +-169 + j*(104) +334 + j*(105) +-157 + j*(102) +-45 + j*(316) +-64 + j*(-126) +-4 + j*(-431) +-91 + j*(-217) +13 + j*(-134) +52 + j*(409) +160 + j*(14) +89 + j*(9) +-217 + j*(5) +-177 + j*(-442) +225 + j*(-34) +-110 + j*(-98) +130 + j*(-428) +-225 + j*(212) +44 + j*(-217) +40 + j*(-213) +-158 + j*(30) +16 + j*(49) +101 + j*(-322) +-93 + j*(38) +330 + j*(214) +-61 + j*(18) +285 + j*(34) +-228 + j*(-156) +146 + j*(83) +-427 + j*(-93) +-119 + j*(58) +-91 + j*(-428) +-177 + j*(-75) +62 + j*(-10) +-29 + j*(-49) +-76 + j*(95) +62 + j*(-320) +-144 + j*(88) +197 + j*(-121) +243 + j*(-54) +113 + j*(223) +59 + j*(-157) +136 + j*(-99) +145 + j*(-90) +-283 + j*(-42) +-247 + j*(-106) +99 + j*(-380) +-8 + j*(-124) +-28 + j*(-31) +407 + j*(250) +-198 + j*(-94) +244 + j*(154) +119 + j*(501) +82 + j*(315) +16 + j*(122) +-6 + j*(-247) +-162 + j*(300) +103 + j*(-98) +221 + j*(-177) +-80 + j*(207) +43 + j*(105) +8 + j*(2) +251 + j*(-303) +143 + j*(-45) +209 + j*(-18) +-35 + j*(76) +-191 + j*(254) +178 + j*(-18) +66 + j*(-378) +45 + j*(-7) +-159 + j*(-144) +-282 + j*(-106) +-225 + j*(2) +-107 + j*(-255) +92 + j*(226) +-39 + j*(-218) +-102 + j*(139) +184 + j*(77) +-78 + j*(134) +56 + j*(-278) +-35 + j*(-81) +-61 + j*(-204) +-65 + j*(-25) +-202 + j*(163) +310 + j*(-28) +-111 + j*(-95) +-2 + j*(141) +-173 + j*(-51) +-21 + j*(182) +-257 + j*(-57) +-83 + j*(81) +-267 + j*(52) +2 + j*(13) +35 + j*(59) +105 + j*(190) +-306 + j*(-253) +19 + j*(88) +-3 + j*(-221) +234 + j*(-160) +-9 + j*(-108) +-325 + j*(356) +-71 + j*(268) +-308 + j*(364) +-308 + j*(183) +193 + j*(-95) +62 + j*(-12) +107 + j*(42) +-100 + j*(62) +-84 + j*(57) +-90 + j*(-427) +-73 + j*(-35) +-191 + j*(134) +-48 + j*(-85) +193 + j*(-242) +-80 + j*(61) +225 + j*(-24) +-179 + j*(-218) +353 + j*(394) +197 + j*(109) +228 + j*(9) +386 + j*(167) +86 + j*(-8) +55 + j*(-312) +-18 + j*(78) +-32 + j*(-191) +-24 + j*(20) +121 + j*(-126) +-80 + j*(16) +-161 + j*(367) +-64 + j*(109) +-22 + j*(37) +-145 + j*(65) +-197 + j*(-272) +103 + j*(-46) +-98 + j*(99) +-325 + j*(-251) +43 + j*(-93) +-54 + j*(-3) +193 + j*(-82) +91 + j*(57) +80 + j*(-122) +151 + j*(-258) +36 + j*(-443) +-69 + j*(-25) +-116 + j*(-222) +-12 + j*(-306) +-298 + j*(-242) +243 + j*(-248) +94 + j*(-47) +-65 + j*(103) +-246 + j*(128) +-27 + j*(52) +-165 + j*(235) +-88 + j*(41) +-21 + j*(-100) +-2 + j*(222) +-156 + j*(163) +209 + j*(279) +55 + j*(177) +-209 + j*(-136) +132 + j*(-42) +-221 + j*(-51) +91 + j*(62) +-34 + j*(129) +-217 + j*(-257) +6 + j*(-36) +-353 + j*(-90) +-7 + j*(-86) +105 + j*(81) +148 + j*(-40) +-20 + j*(-6) +93 + j*(-156) +145 + j*(120) +-110 + j*(465) +-39 + j*(23) +-54 + j*(138) +-69 + j*(87) +-91 + j*(-74) +361 + j*(26) +513 + j*(-134) +-293 + j*(-134) +18 + j*(-93) +424 + j*(177) +-22 + j*(40) +173 + j*(74) +2 + j*(-207) +-162 + j*(-165) +57 + j*(128) +315 + j*(80) +-102 + j*(117) +238 + j*(-75) +-107 + j*(134) +-204 + j*(-153) +-170 + j*(-9) +2 + j*(50) +88 + j*(110) +-8 + j*(-115) +-92 + j*(-237) +-52 + j*(265) +-40 + j*(16) +-74 + j*(-80) +-150 + j*(-26) +-33 + j*(-29) +383 + j*(-48) +-182 + j*(247) +-192 + j*(260) +108 + j*(133) +175 + j*(-317) +-12 + j*(-103) +-24 + j*(-373) +141 + j*(-220) +170 + j*(-106) +-112 + j*(-248) +180 + j*(-78) +-252 + j*(-380) +-39 + j*(-247) +-152 + j*(39) +28 + j*(-119) +-47 + j*(-174) +101 + j*(87) +127 + j*(77) +103 + j*(-255) +66 + j*(257) +-105 + j*(32) +78 + j*(69) +26 + j*(-54) +-31 + j*(73) +346 + j*(346) +8 + j*(26) +-37 + j*(-59) +21 + j*(194) +-28 + j*(183) +100 + j*(-55) +-157 + j*(175) +-322 + j*(-137) +-33 + j*(132) +-477 + j*(-62) +332 + j*(-111) +83 + j*(282) +-134 + j*(92) +-269 + j*(-296) +-4 + j*(5) +69 + j*(-35) +-299 + j*(14) +154 + j*(-176) +-137 + j*(11) +156 + j*(-180) +-66 + j*(-36) +-10 + j*(57) +-261 + j*(-361) +-36 + j*(74) +-31 + j*(147) +-19 + j*(-169) +149 + j*(256) +-332 + j*(29) +-293 + j*(-197) +117 + j*(-184) +235 + j*(134) +251 + j*(86) +54 + j*(-310) +13 + j*(-11) +-385 + j*(-286) +-2 + j*(-37) +-115 + j*(-48) +197 + j*(-20) +264 + j*(136) +-243 + j*(-59) +-187 + j*(30) +92 + j*(28) +-91 + j*(-238) +-93 + j*(-179) +6 + j*(76) +11 + j*(6) +-96 + j*(78) +25 + j*(59) +110 + j*(523) +141 + j*(-14) +-94 + j*(-10) +22 + j*(-120) +443 + j*(-14) +95 + j*(-174) +-141 + j*(125) +-12 + j*(-354) +-193 + j*(-144) +-156 + j*(-74) +210 + j*(317) +281 + j*(-52) +77 + j*(89) +21 + j*(-80) +332 + j*(-6) +292 + j*(18) +57 + j*(-45) +-65 + j*(113) +-317 + j*(-109) +-378 + j*(-298) +185 + j*(1) +-453 + j*(-45) +123 + j*(279) +27 + j*(57) +-299 + j*(23) +112 + j*(47) +-47 + j*(174) +33 + j*(-227) +-288 + j*(9) +-153 + j*(5) +250 + j*(52) +-119 + j*(-208) +127 + j*(262) +-30 + j*(-109) +55 + j*(-247) +-112 + j*(-44) +-82 + j*(-38) +-297 + j*(-16) +59 + j*(60) +-198 + j*(-55) +204 + j*(-151) +12 + j*(40) +-627 + j*(-236) +-112 + j*(-281) +-91 + j*(-167) +38 + j*(83) +-146 + j*(130) +-228 + j*(29) +-67 + j*(-216) +100 + j*(30) +137 + j*(190) +173 + j*(337) +252 + j*(-108) +431 + j*(-163) +217 + j*(-54) +-156 + j*(-250) +286 + j*(-232) +286 + j*(-181) +-103 + j*(-117) +-177 + j*(81) +-246 + j*(-159) +-254 + j*(58) +69 + j*(157) +-110 + j*(34) +262 + j*(95) +-130 + j*(148) +144 + j*(345) +152 + j*(25) +89 + j*(236) +257 + j*(146) +50 + j*(-297) +109 + j*(207) +105 + j*(-262) +330 + j*(-397) +-221 + j*(-162) +60 + j*(-54) +49 + j*(-194) +24 + j*(-104) +-45 + j*(-18) +-180 + j*(266) +-25 + j*(183) +64 + j*(221) +302 + j*(409) +-55 + j*(3) +226 + j*(-310) +37 + j*(-49) +-116 + j*(66) +115 + j*(-84) +-155 + j*(174) +-134 + j*(100) +-211 + j*(-69) +226 + j*(-11) +397 + j*(43) +170 + j*(81) +-107 + j*(-122) +433 + j*(-25) +115 + j*(-77) +-235 + j*(-4) +-308 + j*(-138) +187 + j*(241) +49 + j*(8) +62 + j*(105) +-296 + j*(122) +33 + j*(497) +334 + j*(-1) +194 + j*(41) +204 + j*(-245) +-49 + j*(15) +-103 + j*(16) +-217 + j*(56) +28 + j*(196) +343 + j*(-173) +173 + j*(164) +-100 + j*(167) +-94 + j*(-25) +-79 + j*(-95) +30 + j*(-276) +144 + j*(61) +-120 + j*(-195) +-213 + j*(-366) +209 + j*(30) +6 + j*(-245) +-43 + j*(-83) +28 + j*(61) +4 + j*(-51) +-167 + j*(52) +-245 + j*(4) +-48 + j*(-92) +-53 + j*(210) +-156 + j*(-160) +-82 + j*(-115) +-198 + j*(-206) +-134 + j*(-6) +203 + j*(-311) +-317 + j*(-81) +-66 + j*(-54) +67 + j*(-153) +-34 + j*(-26) +-14 + j*(-69) +91 + j*(163) +-6 + j*(-6) +-141 + j*(66) +-91 + j*(241) +-42 + j*(196) +-49 + j*(-35) +-175 + j*(-137) +16 + j*(267) +49 + j*(-106) +45 + j*(97) +-351 + j*(119) +-276 + j*(-46) +-109 + j*(94) +3 + j*(170) +-182 + j*(323) +97 + j*(-124) +-203 + j*(307) +-233 + j*(231) +-134 + j*(78) +282 + j*(8) +124 + j*(319) +119 + j*(-40) +-176 + j*(-145) +26 + j*(42) +97 + j*(-273) +-319 + j*(-56) +-148 + j*(-65) +-12 + j*(242) +16 + j*(165) +264 + j*(85) +-181 + j*(-34) +1 + j*(-103) +194 + j*(-12) +14 + j*(260) +-251 + j*(-40) +-280 + j*(81) +-42 + j*(-2) +-6 + j*(152) +155 + j*(245) +-267 + j*(103) +-23 + j*(-334) +-177 + j*(100) +8 + j*(-99) +104 + j*(-202) +168 + j*(94) +59 + j*(-193) +57 + j*(116) +98 + j*(-116) +-96 + j*(-264) +-44 + j*(301) +138 + j*(6) +-168 + j*(187) +-306 + j*(-88) +-163 + j*(-206) +-222 + j*(52) +319 + j*(32) +45 + j*(-178) +-207 + j*(-179) +160 + j*(-24) +84 + j*(460) +91 + j*(-168) +168 + j*(119) +11 + j*(-8) +-145 + j*(195) +-145 + j*(-81) +39 + j*(247) +-66 + j*(203) +208 + j*(-63) +167 + j*(40) +-64 + j*(366) +51 + j*(262) +21 + j*(139) +-38 + j*(-226) +158 + j*(-107) +-109 + j*(566) +100 + j*(-16) +2 + j*(43) +1 + j*(-100) +23 + j*(-98) +-48 + j*(-217) +-64 + j*(218) +105 + j*(-83) +-186 + j*(104) +-64 + j*(-268) +1 + j*(131) +-219 + j*(-175) +-100 + j*(69) +34 + j*(-469) +199 + j*(177) +305 + j*(-176) +-184 + j*(-29) +-332 + j*(50) +309 + j*(93) +-19 + j*(-73) +-21 + j*(-3) +56 + j*(81) +171 + j*(-164) +62 + j*(-228) +-21 + j*(-373) +-88 + j*(-193) +201 + j*(-6) +340 + j*(-322) +207 + j*(7) +-89 + j*(-211) +-206 + j*(12) +-161 + j*(-84) +49 + j*(-272) +132 + j*(-129) +-126 + j*(304) +26 + j*(66) +-39 + j*(84) +-228 + j*(-138) +71 + j*(13) +-27 + j*(-319) +157 + j*(104) +98 + j*(291) +187 + j*(-319) +287 + j*(52) +-91 + j*(228) +-42 + j*(-133) +297 + j*(-35) +28 + j*(-127) +50 + j*(38) +253 + j*(-35) +126 + j*(-69) +153 + j*(-41) +-141 + j*(203) +-63 + j*(-108) +-69 + j*(-134) +274 + j*(273) +255 + j*(-329) +202 + j*(31) +-158 + j*(-15) +240 + j*(122) +-249 + j*(205) +-29 + j*(171) +-209 + j*(28) +146 + j*(-77) +124 + j*(-155) +-21 + j*(-257) +342 + j*(292) +-75 + j*(145) +-37 + j*(199) +124 + j*(317) +198 + j*(48) +197 + j*(35) +-71 + j*(-55) +235 + j*(-358) +-136 + j*(62) +-121 + j*(-194) +-129 + j*(190) +126 + j*(160) +153 + j*(154) +223 + j*(-95) +78 + j*(-270) +447 + j*(60) +-184 + j*(-173) +-121 + j*(-134) +141 + j*(-25) +179 + j*(-190) +26 + j*(305) +-180 + j*(-13) +123 + j*(-4) +130 + j*(-310) +-42 + j*(-91) +71 + j*(286) +-192 + j*(33) +130 + j*(206) +147 + j*(2) +-38 + j*(-156) +1 + j*(327) +-34 + j*(-42) +-254 + j*(-168) +189 + j*(227) +143 + j*(32) +-211 + j*(-264) +-39 + j*(-439) +-24 + j*(271) +-25 + j*(110) +190 + j*(-4) +-102 + j*(-243) +-13 + j*(40) +-87 + j*(55) +156 + j*(89) +295 + j*(-50) +210 + j*(-263) +-303 + j*(70) +86 + j*(-102) +-68 + j*(4) +79 + j*(-426) +-152 + j*(-158) +93 + j*(36) +52 + j*(-144) +27 + j*(-280) +58 + j*(-16) +82 + j*(2) +57 + j*(-151) +-76 + j*(-21) +-67 + j*(125) +233 + j*(-44) +72 + j*(-83) +203 + j*(52) +-35 + j*(0) +140 + j*(-147) +110 + j*(144) +96 + j*(23) +288 + j*(-122) +-67 + j*(85) +300 + j*(-56) +-262 + j*(39) +201 + j*(233) +-20 + j*(151) +-323 + j*(-35) +49 + j*(143) +-89 + j*(-158) +-66 + j*(-216) +-244 + j*(163) +240 + j*(-245) +364 + j*(-71) +-205 + j*(280) +66 + j*(-18) +-58 + j*(144) +141 + j*(-151) +154 + j*(-25) +202 + j*(-83) +33 + j*(-127) +-166 + j*(-157) +451 + j*(-244) +-101 + j*(35) +18 + j*(134) +134 + j*(252) +-95 + j*(-264) +320 + j*(211) +-54 + j*(-52) +-145 + j*(122) +-10 + j*(247) +-359 + j*(164) +-93 + j*(-90) +-141 + j*(199) +-122 + j*(-140) +-384 + j*(-230) +34 + j*(2) +-190 + j*(276) +-49 + j*(185) +197 + j*(-12) +-213 + j*(-105) +-110 + j*(-62) +-1 + j*(163) +54 + j*(12) +74 + j*(-148) +-130 + j*(221) +-86 + j*(161) +86 + j*(50) +-110 + j*(-74) +129 + j*(256) +25 + j*(-84) +-35 + j*(-124) +71 + j*(-105) +274 + j*(-267) +298 + j*(-52) +-1 + j*(116) +220 + j*(-17) +147 + j*(126) +69 + j*(53) +-208 + j*(-60) +197 + j*(115) +-140 + j*(13) +122 + j*(-74) +36 + j*(194) +-40 + j*(-26) +-126 + j*(97) +288 + j*(115) +-142 + j*(127) +-20 + j*(-21) +-117 + j*(79) +-73 + j*(308) +-430 + j*(132) +-129 + j*(161) +83 + j*(56) +-63 + j*(-355) +-139 + j*(132) +206 + j*(8) +19 + j*(-193) +156 + j*(-25) +20 + j*(-277) +74 + j*(207) +-312 + j*(-97) +-264 + j*(127) +219 + j*(69) +-16 + j*(126) +92 + j*(-206) +-227 + j*(164) +-172 + j*(-120) +158 + j*(-31) +110 + j*(83) +-103 + j*(6) +-22 + j*(120) +110 + j*(93) +37 + j*(-170) +-148 + j*(136) +-23 + j*(12) +59 + j*(61) +117 + j*(119) +163 + j*(283) +263 + j*(95) +334 + j*(65) +-169 + j*(80) +-129 + j*(543) +-163 + j*(179) +46 + j*(193) +-177 + j*(232) +206 + j*(13) +203 + j*(67) +42 + j*(31) +119 + j*(-159) +-98 + j*(104) +68 + j*(70) +91 + j*(155) +55 + j*(-175) +88 + j*(-54) +-148 + j*(-14) +405 + j*(30) +250 + j*(-249) +6 + j*(234) +71 + j*(69) +57 + j*(-92) +194 + j*(44) +-104 + j*(175) +136 + j*(-145) +137 + j*(-80) +110 + j*(-363) +240 + j*(-14) +-110 + j*(158) +-57 + j*(28) +-112 + j*(-86) +25 + j*(192) +139 + j*(-252) +-250 + j*(-42) +25 + j*(61) +-235 + j*(-152) +310 + j*(-206) +-341 + j*(-164) +-113 + j*(4) +-62 + j*(-13) +216 + j*(90) +-45 + j*(-161) +-129 + j*(-240) +124 + j*(173) +66 + j*(180) +80 + j*(-23) +-62 + j*(144) +28 + j*(-5) +115 + j*(184) +75 + j*(-197) +-325 + j*(100) +94 + j*(-126) +-78 + j*(-344) +-107 + j*(302) +-243 + j*(-243) +62 + j*(227) +-15 + j*(-337) +-49 + j*(-74) +88 + j*(134) +-91 + j*(81) +-34 + j*(103) +-112 + j*(233) +253 + j*(151) +-45 + j*(-25) +212 + j*(-127) +-363 + j*(66) +251 + j*(12) +267 + j*(27) +280 + j*(-414) +136 + j*(131) +-32 + j*(-176) +136 + j*(31) +-139 + j*(171) +185 + j*(103) +84 + j*(198) +88 + j*(81) +104 + j*(-158) +301 + j*(298) +63 + j*(260) +210 + j*(-169) +112 + j*(-52) +-64 + j*(119) +-169 + j*(-281) +-83 + j*(-310) +274 + j*(-79) +209 + j*(-182) +-107 + j*(-240) +-86 + j*(4) +202 + j*(16) +-387 + j*(75) +-81 + j*(85) +17 + j*(260) +-348 + j*(-243) +-39 + j*(88) +259 + j*(-40) +37 + j*(13) +157 + j*(-121) +40 + j*(-37) +267 + j*(-28) +85 + j*(47) +-310 + j*(52) +25 + j*(33) +-366 + j*(-264) +-58 + j*(120) +36 + j*(-93) +187 + j*(6) +93 + j*(23) +44 + j*(-240) +235 + j*(161) +197 + j*(293) +-153 + j*(126) +211 + j*(-71) +213 + j*(-42) +176 + j*(-6) +-176 + j*(-40) +33 + j*(64) +-81 + j*(-133) +52 + j*(256) +160 + j*(-141) +118 + j*(187) +-212 + j*(26) +-257 + j*(157) +192 + j*(18) +199 + j*(295) +49 + j*(-94) +2 + j*(208) +-83 + j*(-170) +-226 + j*(-139) +-197 + j*(18) +40 + j*(-130) +144 + j*(-136) +107 + j*(19) +-102 + j*(472) +-53 + j*(-39) +5 + j*(265) +173 + j*(256) +-349 + j*(40) +54 + j*(-140) +66 + j*(132) +64 + j*(73) +-141 + j*(95) +327 + j*(-69) +-547 + j*(115) +59 + j*(-115) +-62 + j*(69) +81 + j*(182) +-86 + j*(-208) +-100 + j*(-318) +127 + j*(213) +93 + j*(16) +243 + j*(-7) +-23 + j*(333) +-21 + j*(330) +74 + j*(-50) +-40 + j*(-168) +434 + j*(333) +81 + j*(-143) +230 + j*(163) +209 + j*(-187) +-33 + j*(270) +132 + j*(-217) +-127 + j*(-35) +-59 + j*(40) +187 + j*(32) +-11 + j*(-143) +156 + j*(245) +-18 + j*(-28) +-166 + j*(-27) +332 + j*(145) +8 + j*(-192) +-11 + j*(-185) +-190 + j*(72) +-118 + j*(138) +112 + j*(215) +-26 + j*(52) +137 + j*(29) +-200 + j*(-123) +183 + j*(-187) +93 + j*(35) +-336 + j*(-33) +28 + j*(223) +-1 + j*(-18) +-234 + j*(98) +117 + j*(25) +132 + j*(-174) +-430 + j*(-3) +52 + j*(-205) +95 + j*(148) +-55 + j*(-199) +20 + j*(-107) +-113 + j*(-80) +51 + j*(26) +-13 + j*(79) +-182 + j*(20) +-71 + j*(-19) +-16 + j*(-290) +-197 + j*(204) +42 + j*(-184) +-63 + j*(52) +16 + j*(-112) +164 + j*(-293) +-39 + j*(113) +267 + j*(-49) +259 + j*(-80) +-65 + j*(55) +151 + j*(112) +-21 + j*(113) +64 + j*(-163) +71 + j*(28) +155 + j*(126) +226 + j*(47) +173 + j*(195) +11 + j*(-218) +87 + j*(-64) +126 + j*(-53) +34 + j*(-310) +225 + j*(-183) +-148 + j*(-328) +210 + j*(-400) +289 + j*(49) +3 + j*(-170) +231 + j*(54) +136 + j*(21) +-83 + j*(273) +108 + j*(251) +429 + j*(277) +6 + j*(294) +103 + j*(207) +16 + j*(-199) +187 + j*(28) +16 + j*(51) +232 + j*(51) +-148 + j*(9) +77 + j*(-168) +42 + j*(279) +132 + j*(265) +145 + j*(-90) +-49 + j*(-211) +90 + j*(144) +156 + j*(3) +27 + j*(-264) +302 + j*(23) +148 + j*(-5) +-119 + j*(-27) +-100 + j*(-138) +-182 + j*(-56) +-303 + j*(333) +-101 + j*(162) +311 + j*(-143) +-27 + j*(-283) +-215 + j*(-93) +-64 + j*(120) +-10 + j*(-337) +-204 + j*(48) +-91 + j*(-95) +113 + j*(-223) +-68 + j*(-86) +91 + j*(-162) +383 + j*(534) +331 + j*(-151) +296 + j*(-125) +-534 + j*(195) +68 + j*(341) +-64 + j*(338) +202 + j*(199) +277 + j*(-187) +10 + j*(-149) +-89 + j*(-287) +356 + j*(-535) +136 + j*(225) +221 + j*(-13) +245 + j*(105) +-55 + j*(-260) +-246 + j*(-332) +-146 + j*(315) +-602 + j*(-237) +-329 + j*(238) +-173 + j*(-174) +562 + j*(83) +-189 + j*(-310) +339 + j*(361) +-309 + j*(-162) +81 + j*(317) +445 + j*(-265) +-183 + j*(343) +-302 + j*(33) +-663 + j*(180) +-257 + j*(-70) +515 + j*(252) +192 + j*(334) +-560 + j*(68) +214 + j*(11) +-463 + j*(-437) +66 + j*(286) +-305 + j*(236) +-332 + j*(40) +-180 + j*(-321) +420 + j*(-76) +63 + j*(-168) +243 + j*(-251) +176 + j*(-378) +328 + j*(303) +-270 + j*(353) +-407 + j*(-240) +257 + j*(207) +-107 + j*(-203) +-100 + j*(-153) +635 + j*(335) +45 + j*(52) +251 + j*(-25) +238 + j*(232) +-268 + j*(-144) +183 + j*(-70) +-237 + j*(-222) +231 + j*(274) +-132 + j*(372) +383 + j*(50) +-187 + j*(195) +81 + j*(156) +-145 + j*(-689) +139 + j*(312) +-162 + j*(419) +387 + j*(-187) +-168 + j*(-233) +-344 + j*(184) +-337 + j*(-478) +737 + j*(-88) +-106 + j*(486) +44 + j*(226) +-293 + j*(100) +532 + j*(-33) +534 + j*(-52) +-527 + j*(431) +-438 + j*(-312) +223 + j*(-175) +149 + j*(367) +132 + j*(-694) +406 + j*(306) +222 + j*(-339) +-68 + j*(493) +348 + j*(123) +16 + j*(-402) +125 + j*(-231) +-468 + j*(-245) +304 + j*(74) +439 + j*(423) +-438 + j*(18) +-686 + j*(327) +-150 + j*(98) +303 + j*(147) +411 + j*(-9) +-298 + j*(103) +-185 + j*(-97) +-288 + j*(-369) +393 + j*(-370) +491 + j*(433) +412 + j*(146) +-167 + j*(-435) +199 + j*(-350) +316 + j*(-90) +204 + j*(-154) +-333 + j*(-12) +682 + j*(-197) +-139 + j*(439) +-306 + j*(49) +-281 + j*(-679) +454 + j*(-212) +444 + j*(508) +106 + j*(-67) +-122 + j*(-80) +268 + j*(196) +587 + j*(-342) +-275 + j*(379) +443 + j*(-190) +-606 + j*(199) +-108 + j*(524) +-202 + j*(201) +-395 + j*(-388) +511 + j*(-591) +-265 + j*(-98) +224 + j*(189) +231 + j*(-250) +45 + j*(-397) +-286 + j*(-167) +230 + j*(40) +346 + j*(395) +-400 + j*(635) +43 + j*(-228) +397 + j*(149) +-160 + j*(520) +204 + j*(213) +335 + j*(398) +344 + j*(504) +-11 + j*(-309) +59 + j*(-37) +-390 + j*(-374) +-361 + j*(518) +386 + j*(131) +233 + j*(-187) +356 + j*(23) +-157 + j*(-261) +-451 + j*(-523) +167 + j*(593) +209 + j*(119) +-730 + j*(-56) +-219 + j*(-598) +29 + j*(250) +79 + j*(392) +300 + j*(158) +276 + j*(-165) +72 + j*(-346) +-245 + j*(-170) +455 + j*(-394) +48 + j*(315) +33 + j*(-81) +201 + j*(127) +-37 + j*(51) +196 + j*(180) +-62 + j*(416) +267 + j*(252) +-242 + j*(-452) +-8 + j*(397) +124 + j*(40) +-264 + j*(-126) +42 + j*(404) +558 + j*(103) +-327 + j*(35) +-510 + j*(528) +-561 + j*(-597) +-349 + j*(-397) +41 + j*(214) +-334 + j*(462) +98 + j*(-105) +-75 + j*(229) +245 + j*(-116) +330 + j*(186) +-81 + j*(434) +488 + j*(200) +-124 + j*(-164) +-8 + j*(68) +-88 + j*(373) +-312 + j*(-402) +103 + j*(267) +683 + j*(217) +-341 + j*(67) +-280 + j*(350) +492 + j*(-231) +-211 + j*(-218) +240 + j*(316) +364 + j*(272) +370 + j*(453) +253 + j*(171) +184 + j*(663) +-333 + j*(-392) +-192 + j*(-409) +384 + j*(-292) +220 + j*(-143) +-284 + j*(242) +118 + j*(-272) +170 + j*(-47) +422 + j*(-353) +494 + j*(-685) +-88 + j*(95) +264 + j*(232) +153 + j*(175) +168 + j*(205) +-126 + j*(-213) +-51 + j*(390) +-283 + j*(40) +-361 + j*(689) +171 + j*(-141) +435 + j*(-318) +-141 + j*(-260) +220 + j*(-144) +286 + j*(155) +-310 + j*(299) +78 + j*(-204) +373 + j*(273) +-321 + j*(723) +707 + j*(-203) +324 + j*(102) +-177 + j*(-383) +245 + j*(-99) +-380 + j*(339) +235 + j*(-375) +-292 + j*(77) +23 + j*(-351) +330 + j*(-171) +211 + j*(167) +455 + j*(-540) +-448 + j*(-230) +215 + j*(263) +137 + j*(373) +-66 + j*(-47) +-300 + j*(-85) +302 + j*(177) +-442 + j*(197) +-46 + j*(132) +-419 + j*(214) +-166 + j*(92) +-184 + j*(447) +94 + j*(342) +-328 + j*(-42) +-552 + j*(-458) +374 + j*(-177) +300 + j*(404) +40 + j*(219) +-228 + j*(-505) +272 + j*(266) +-192 + j*(200) +213 + j*(-150) +274 + j*(-355) +492 + j*(54) +541 + j*(-602) +460 + j*(-52) +98 + j*(449) +382 + j*(-380) +-153 + j*(-241) +-250 + j*(-45) +-245 + j*(-315) +264 + j*(-289) +154 + j*(-177) +146 + j*(-441) +-336 + j*(285) +-102 + j*(388) +236 + j*(-18) +-115 + j*(335) +-532 + j*(421) +484 + j*(450) +354 + j*(738) +-416 + j*(523) +-293 + j*(-193) +115 + j*(-764) +-327 + j*(-238) +-425 + j*(-378) +-269 + j*(-413) +-642 + j*(-380) +-43 + j*(-7) +206 + j*(424) +244 + j*(-416) +453 + j*(-545) +-165 + j*(-64) +-138 + j*(-312) +-499 + j*(484) +-307 + j*(-119) +122 + j*(578) +-266 + j*(-390) +-218 + j*(395) +-188 + j*(-14) +373 + j*(-118) +86 + j*(629) +-435 + j*(-107) +390 + j*(-469) +197 + j*(-99) +343 + j*(-344) +-137 + j*(-218) +-252 + j*(354) +-261 + j*(329) +-214 + j*(393) +-247 + j*(274) +214 + j*(158) +74 + j*(315) +434 + j*(-211) +-228 + j*(-161) +-86 + j*(482) +41 + j*(197) +-110 + j*(217) +182 + j*(16) +437 + j*(-583) +446 + j*(-162) +-139 + j*(122) +117 + j*(368) +173 + j*(179) +245 + j*(-228) +78 + j*(450) +-484 + j*(-112) +-375 + j*(-177) +-265 + j*(-155) +185 + j*(-10) +635 + j*(-213) +-59 + j*(223) +306 + j*(-93) +8 + j*(-310) +201 + j*(333) +482 + j*(-70) +-78 + j*(115) +390 + j*(564) +433 + j*(280) +52 + j*(25) +185 + j*(328) +273 + j*(-367) +-156 + j*(255) +177 + j*(-170) +-181 + j*(207) +-466 + j*(-256) +-279 + j*(-97) +444 + j*(-466) +-105 + j*(308) +71 + j*(-127) +-1 + j*(6) +171 + j*(163) +-357 + j*(440) +346 + j*(97) +-366 + j*(-355) +-149 + j*(-342) +-72 + j*(-146) +120 + j*(185) +190 + j*(237) +-53 + j*(-444) +340 + j*(68) +103 + j*(7) +210 + j*(183) +282 + j*(-173) +240 + j*(373) +-112 + j*(463) +-187 + j*(262) +-260 + j*(-234) +-33 + j*(217) +-347 + j*(2) +229 + j*(-414) +163 + j*(284) +121 + j*(61) +-286 + j*(439) +403 + j*(112) +-290 + j*(122) +339 + j*(151) +339 + j*(-290) +349 + j*(-248) +-403 + j*(315) +-318 + j*(-601) +-293 + j*(-348) +279 + j*(-15) +79 + j*(-222) +-458 + j*(-433) +625 + j*(-496) +-81 + j*(204) +-222 + j*(-499) +-486 + j*(-186) +-113 + j*(-105) +-199 + j*(-497) +351 + j*(174) +347 + j*(-373) +233 + j*(49) +-64 + j*(-416) +264 + j*(-139) +33 + j*(494) +281 + j*(180) +-412 + j*(-375) +-318 + j*(502) +-265 + j*(274) +-260 + j*(175) +167 + j*(-491) +647 + j*(236) +-25 + j*(238) +-326 + j*(-495) +100 + j*(-313) +173 + j*(-786) +-98 + j*(231) +-238 + j*(409) +361 + j*(-446) +538 + j*(-350) +-127 + j*(-153) +-576 + j*(-199) +-72 + j*(-510) +363 + j*(-360) +-482 + j*(-238) +-352 + j*(-363) +-295 + j*(-104) +-119 + j*(212) +297 + j*(351) +-268 + j*(-371) +97 + j*(53) +235 + j*(90) +209 + j*(298) +-212 + j*(-276) +-309 + j*(551) +-54 + j*(-273) +225 + j*(457) +37 + j*(-149) +-81 + j*(202) +345 + j*(300) +-322 + j*(247) +202 + j*(425) +-215 + j*(-173) +-123 + j*(297) +-227 + j*(19) +-170 + j*(-366) +344 + j*(-305) +369 + j*(-191) +-318 + j*(525) +332 + j*(-325) +-337 + j*(-318) +-655 + j*(564) +595 + j*(-511) +436 + j*(384) +-515 + j*(40) +243 + j*(-459) +-21 + j*(156) +258 + j*(-438) +-357 + j*(-326) +-433 + j*(583) +-357 + j*(-489) +171 + j*(-34) +122 + j*(402) +-289 + j*(339) +160 + j*(189) +94 + j*(-71) +453 + j*(-301) +292 + j*(-117) +338 + j*(216) +363 + j*(400) +-43 + j*(-35) +217 + j*(85) +33 + j*(241) +173 + j*(-141) +-266 + j*(-306) +-264 + j*(-451) +226 + j*(-296) +350 + j*(-16) +30 + j*(312) +-566 + j*(-133) +-195 + j*(219) +478 + j*(-61) +-612 + j*(-527) +-189 + j*(-585) +-466 + j*(-600) +-288 + j*(445) +-460 + j*(245) +171 + j*(-448) +-258 + j*(520) +-379 + j*(-194) +369 + j*(-410) +-213 + j*(144) +128 + j*(-40) +308 + j*(277) +-37 + j*(-508) +226 + j*(-127) +290 + j*(285) +-506 + j*(-353) +-356 + j*(-194) +298 + j*(307) +161 + j*(499) +267 + j*(157) +117 + j*(-136) +494 + j*(-658) +103 + j*(-286) +415 + j*(465) +233 + j*(-156) +110 + j*(-371) +-428 + j*(196) +-377 + j*(269) +-234 + j*(127) +-321 + j*(-78) +282 + j*(-223) +-310 + j*(-246) +45 + j*(146) +5 + j*(38) +-182 + j*(239) +-430 + j*(453) +414 + j*(-105) +-527 + j*(147) +-12 + j*(554) +-296 + j*(-168) +-147 + j*(-170) +-504 + j*(-331) +-313 + j*(-380) +453 + j*(429) +-463 + j*(-119) +-175 + j*(-387) +251 + j*(403) +-143 + j*(187) +208 + j*(-498) +434 + j*(-214) +600 + j*(-360) +-251 + j*(28) +373 + j*(-204) +-305 + j*(-288) +-243 + j*(356) +53 + j*(-467) +127 + j*(226) +-412 + j*(-91) +325 + j*(371) +347 + j*(-487) +332 + j*(327) +-226 + j*(-306) +482 + j*(-47) +-62 + j*(397) +363 + j*(-184) +192 + j*(257) +-390 + j*(-347) +-15 + j*(-159) +434 + j*(-467) +347 + j*(-162) +374 + j*(-216) +-197 + j*(-21) +195 + j*(679) +317 + j*(451) +206 + j*(400) +420 + j*(421) +-190 + j*(-107) +-141 + j*(192) +452 + j*(364) +-550 + j*(44) +-141 + j*(-274) +-459 + j*(409) +466 + j*(-351) +-178 + j*(103) +-378 + j*(351) +-213 + j*(132) +-322 + j*(102) +-244 + j*(-537) +-252 + j*(-467) +-266 + j*(483) +433 + j*(-273) +-180 + j*(-474) +69 + j*(-356) +412 + j*(-295) +-36 + j*(-529) +-588 + j*(194) +-10 + j*(-25) +-446 + j*(-204) +-380 + j*(1) +-481 + j*(-128) +-271 + j*(151) +-303 + j*(-184) +272 + j*(-253) +102 + j*(284) +-153 + j*(66) +100 + j*(-302) +385 + j*(-581) +259 + j*(605) +205 + j*(-482) +-288 + j*(-276) +197 + j*(-288) +-398 + j*(325) +358 + j*(-357) +104 + j*(-474) +735 + j*(38) +306 + j*(-162) +121 + j*(-267) +-480 + j*(272) +-13 + j*(-94) +-146 + j*(131) +-484 + j*(-257) +-64 + j*(227) +178 + j*(19) +212 + j*(450) +17 + j*(-184) +-406 + j*(-301) +-424 + j*(252) +-194 + j*(444) +-550 + j*(-138) +361 + j*(424) +-308 + j*(-156) +-251 + j*(-183) +293 + j*(-98) +-271 + j*(249) +-317 + j*(-79) +-42 + j*(276) +-88 + j*(217) +1 + j*(327) +-53 + j*(250) +-42 + j*(-334) +154 + j*(70) +262 + j*(-33) +-1 + j*(-104) +35 + j*(-118) +57 + j*(455) +247 + j*(-148) +0 + j*(62) +-200 + j*(193) +62 + j*(-139) +95 + j*(111) +291 + j*(-154) +-135 + j*(118) +66 + j*(-148) +-337 + j*(192) +-247 + j*(-26) +-13 + j*(-40) +-412 + j*(-91) +-66 + j*(-206) +91 + j*(179) +-189 + j*(407) +-152 + j*(35) +187 + j*(28) +206 + j*(7) +242 + j*(-28) +-71 + j*(-75) +-187 + j*(-48) +240 + j*(-105) +-122 + j*(-187) +-156 + j*(163) +225 + j*(102) +52 + j*(198) +-62 + j*(3) +171 + j*(-147) +-84 + j*(-253) +-1 + j*(-402) +264 + j*(140) +-2 + j*(-152) +75 + j*(-168) +-134 + j*(-34) +45 + j*(155) +-164 + j*(135) +334 + j*(281) +-71 + j*(-170) +296 + j*(-413) +44 + j*(260) +197 + j*(204) +71 + j*(2) +119 + j*(-129) +169 + j*(68) +-196 + j*(198) +170 + j*(-124) +-120 + j*(-8) +102 + j*(-120) +-578 + j*(93) +71 + j*(239) +-218 + j*(91) +-206 + j*(9) +-287 + j*(-461) +-260 + j*(-65) +28 + j*(-45) +-26 + j*(132) +-86 + j*(-8) +0 + j*(-16) +-86 + j*(499) +-49 + j*(352) +14 + j*(108) +299 + j*(-55) +-255 + j*(-81) +-375 + j*(228) +-125 + j*(66) +-107 + j*(159) +-199 + j*(-283) +158 + j*(-206) +241 + j*(-91) +-44 + j*(4) +-288 + j*(127) +-19 + j*(-119) +83 + j*(-223) +76 + j*(-191) +-19 + j*(64) +205 + j*(-267) +209 + j*(100) +290 + j*(175) +96 + j*(12) +71 + j*(15) +231 + j*(70) +127 + j*(-37) +-153 + j*(195) +29 + j*(189) +-30 + j*(-94) +-55 + j*(-209) +338 + j*(-214) +122 + j*(-64) +-234 + j*(172) +160 + j*(-110) +142 + j*(114) +157 + j*(136) +-189 + j*(-197) +28 + j*(-45) +-42 + j*(-143) +171 + j*(-12) +-168 + j*(163) +-199 + j*(194) +-265 + j*(-212) +181 + j*(-21) +-267 + j*(-224) +-191 + j*(110) +-77 + j*(-215) +83 + j*(-106) +-52 + j*(451) +-60 + j*(92) +-171 + j*(-199) +233 + j*(-231) +-107 + j*(39) +151 + j*(42) +120 + j*(-6) +-257 + j*(-182) +110 + j*(-52) +-208 + j*(-26) +-130 + j*(-157) +153 + j*(267) +494 + j*(-45) +178 + j*(-91) +-59 + j*(-184) +137 + j*(318) +-315 + j*(254) +-264 + j*(-67) +42 + j*(-4) +102 + j*(62) +-43 + j*(-23) +-132 + j*(79) +-163 + j*(-138) +-132 + j*(-232) +106 + j*(50) +264 + j*(56) +-172 + j*(-100) +318 + j*(147) +84 + j*(-246) +274 + j*(-330) +177 + j*(19) +185 + j*(81) +201 + j*(18) +-306 + j*(110) +81 + j*(-6) +65 + j*(-186) +-278 + j*(-66) +175 + j*(55) +8 + j*(107) +-85 + j*(14) +300 + j*(395) +-65 + j*(-403) +293 + j*(-56) +-187 + j*(103) +66 + j*(-240) +66 + j*(-302) +-82 + j*(-214) +194 + j*(-47) +64 + j*(-235) +-372 + j*(-222) +119 + j*(-341) +-323 + j*(40) +-114 + j*(293) +-208 + j*(-158) +-95 + j*(183) +161 + j*(231) +47 + j*(-131) +102 + j*(-31) +205 + j*(-180) +-40 + j*(-127) +175 + j*(-288) +79 + j*(-272) +-245 + j*(3) +251 + j*(-3) +-119 + j*(243) +-123 + j*(-339) +-290 + j*(85) +-100 + j*(-175) +-205 + j*(477) +-24 + j*(-71) +342 + j*(-185) +66 + j*(13) +-56 + j*(78) +175 + j*(-124) +-228 + j*(117) +-122 + j*(-62) +72 + j*(308) +222 + j*(-223) +85 + j*(47) +-59 + j*(173) +-97 + j*(142) +141 + j*(-108) +-278 + j*(107) +-141 + j*(75) +211 + j*(74) +319 + j*(-107) +-98 + j*(209) +-350 + j*(45) +-468 + j*(-308) +332 + j*(-157) +-10 + j*(-57) +21 + j*(-37) +1 + j*(-71) +151 + j*(18) +-356 + j*(361) +7 + j*(-8) +-87 + j*(-148) +205 + j*(-86) +-9 + j*(85) +419 + j*(64) +80 + j*(60) +199 + j*(197) +-187 + j*(-205) +-119 + j*(228) +11 + j*(187) +-212 + j*(-21) +-160 + j*(121) +45 + j*(-420) +-158 + j*(-173) +49 + j*(286) +204 + j*(54) +158 + j*(206) +-1 + j*(-63) +119 + j*(9) +169 + j*(-116) +325 + j*(145) +-106 + j*(6) +-96 + j*(44) +-140 + j*(253) +138 + j*(23) +-431 + j*(-37) +-72 + j*(5) +-35 + j*(128) +-165 + j*(75) +-45 + j*(-158) +298 + j*(119) +105 + j*(119) +162 + j*(-16) +64 + j*(-173) +-269 + j*(37) +110 + j*(-21) +-16 + j*(30) +113 + j*(129) +-164 + j*(-238) +-189 + j*(62) +66 + j*(-142) +418 + j*(20) +-264 + j*(-245) +-251 + j*(76) +24 + j*(-4) +310 + j*(-84) +-112 + j*(-76) +-20 + j*(27) +270 + j*(-126) +-241 + j*(46) +-258 + j*(123) +-195 + j*(-302) +294 + j*(-168) +83 + j*(-46) +-121 + j*(-111) +-297 + j*(-122) +-269 + j*(32) +-171 + j*(-107) +-89 + j*(336) +-180 + j*(-263) +-163 + j*(-48) +265 + j*(-103) +33 + j*(22) +448 + j*(99) +-49 + j*(85) +259 + j*(-72) +13 + j*(7) +-156 + j*(11) +-112 + j*(186) +91 + j*(-44) +127 + j*(110) +190 + j*(-151) +26 + j*(-373) +115 + j*(177) +99 + j*(-327) +60 + j*(-87) +-42 + j*(-71) +80 + j*(132) +173 + j*(276) +6 + j*(177) +46 + j*(-154) +6 + j*(115) +132 + j*(156) +-303 + j*(257) +105 + j*(-506) +293 + j*(82) +23 + j*(62) +-563 + j*(397) +308 + j*(17) +-16 + j*(-53) +-22 + j*(-210) +256 + j*(190) +-40 + j*(308) +181 + j*(37) +-179 + j*(-71) +-42 + j*(37) +-258 + j*(375) +-81 + j*(115) +-59 + j*(287) +-66 + j*(122) +-1 + j*(-218) +258 + j*(-6) +78 + j*(-95) +97 + j*(-148) +-255 + j*(165) +226 + j*(0) +39 + j*(-141) +175 + j*(111) +21 + j*(110) +-93 + j*(288) +-240 + j*(-11) +-163 + j*(77) +25 + j*(110) +70 + j*(78) +51 + j*(425) +-74 + j*(-186) +121 + j*(-54) +270 + j*(64) +115 + j*(-173) +-143 + j*(281) +88 + j*(-247) +-20 + j*(-112) +156 + j*(-362) +33 + j*(-128) +97 + j*(-328) +28 + j*(-41) +58 + j*(47) +45 + j*(13) +206 + j*(560) +94 + j*(-16) +81 + j*(41) +270 + j*(13) +68 + j*(95) +-33 + j*(-120) +-173 + j*(-166) +-64 + j*(124) +17 + j*(-88) +99 + j*(13) +-380 + j*(6) +-65 + j*(219) +-16 + j*(-51) +35 + j*(146) +138 + j*(74) +453 + j*(-59) +337 + j*(-5) +-218 + j*(-105) +-360 + j*(-43) +99 + j*(-1) +-12 + j*(-76) +-183 + j*(221) +52 + j*(13) +86 + j*(-76) +-265 + j*(-12) +61 + j*(-264) +-29 + j*(91) +20 + j*(-177) +89 + j*(-281) +276 + j*(-13) +243 + j*(-251) +-140 + j*(-55) +173 + j*(23) +-14 + j*(-109) +59 + j*(57) +238 + j*(-78) +50 + j*(124) +132 + j*(70) +-358 + j*(21) +-228 + j*(51) +-16 + j*(-243) +-40 + j*(267) +49 + j*(231) +309 + j*(8) +32 + j*(-109) +-147 + j*(190) +232 + j*(-166) +-190 + j*(-117) +18 + j*(-43) +-54 + j*(129) +145 + j*(110) +-202 + j*(-232) +-16 + j*(64) +-320 + j*(354) +69 + j*(-96) +-233 + j*(165) +-93 + j*(-98) +-182 + j*(-310) +144 + j*(-146) +192 + j*(6) +112 + j*(146) +214 + j*(352) +-153 + j*(44) +-218 + j*(-5) +-76 + j*(110) +18 + j*(-194) +-23 + j*(-85) +-4 + j*(-256) +8 + j*(1) +49 + j*(111) +-108 + j*(-100) +-47 + j*(214) +-72 + j*(143) +-351 + j*(212) +-51 + j*(62) +-96 + j*(173) +-56 + j*(-223) +101 + j*(-143) +245 + j*(-344) +-74 + j*(103) +381 + j*(-153) +76 + j*(271) +-126 + j*(-9) +62 + j*(90) +72 + j*(459) +-132 + j*(-227) +-57 + j*(161) +-294 + j*(48) +-158 + j*(65) +-154 + j*(-49) +21 + j*(156) +-289 + j*(226) +45 + j*(79) +-156 + j*(61) +50 + j*(15) +-368 + j*(-200) +-202 + j*(64) +344 + j*(190) +31 + j*(139) +101 + j*(95) +-446 + j*(74) +254 + j*(-9) +175 + j*(28) +-158 + j*(115) +-173 + j*(-316) +-88 + j*(-179) +-18 + j*(-386) +112 + j*(144) +-368 + j*(250) +-233 + j*(-171) +-165 + j*(16) +-188 + j*(71) +-41 + j*(-57) +422 + j*(47) +62 + j*(-120) +18 + j*(4) +-103 + j*(-131) +-21 + j*(-190) +-205 + j*(-158) +268 + j*(151) +-250 + j*(156) +-142 + j*(-12) +99 + j*(237) +363 + j*(78) +108 + j*(-13) +291 + j*(-148) +-243 + j*(486) +177 + j*(33) +117 + j*(15) +-126 + j*(-1) +-185 + j*(-149) +115 + j*(108) +1 + j*(-47) +58 + j*(-262) +275 + j*(-234) +-83 + j*(155) +291 + j*(72) +-187 + j*(147) +57 + j*(14) +25 + j*(280) +318 + j*(23) +-229 + j*(223) +164 + j*(86) +293 + j*(100) +-52 + j*(-40) +87 + j*(118) +-8 + j*(4) +134 + j*(47) +250 + j*(376) +-73 + j*(64) +104 + j*(-39) +-305 + j*(-147) +-419 + j*(-16) +-41 + j*(8) +-83 + j*(-453) +-19 + j*(201) +-124 + j*(-91) +-175 + j*(-139) +25 + j*(144) +-28 + j*(303) +-339 + j*(57) +-139 + j*(319) +-141 + j*(11) +-109 + j*(-14) +-6 + j*(-254) +-8 + j*(80) +319 + j*(101) +94 + j*(-40) +-202 + j*(-161) +-329 + j*(-263) +-115 + j*(-208) +250 + j*(-221) +214 + j*(29) +297 + j*(-151) +21 + j*(-16) +3 + j*(204) +8 + j*(-18) +302 + j*(-215) +-216 + j*(-25) +-54 + j*(-63) +-113 + j*(-21) +-218 + j*(-19) +102 + j*(-134) +303 + j*(-272) +-199 + j*(-87) +-115 + j*(-137) +-52 + j*(16) +-153 + j*(-173) +228 + j*(428) +-43 + j*(-187) +149 + j*(-149) +-83 + j*(373) +-158 + j*(512) +-306 + j*(64) +-59 + j*(54) +-94 + j*(-110) +240 + j*(-116) +99 + j*(52) +262 + j*(-194) +-152 + j*(85) +-105 + j*(218) +-30 + j*(-55) +187 + j*(98) +308 + j*(-119) +54 + j*(-221) +103 + j*(175) +16 + j*(129) +149 + j*(-23) +95 + j*(7) +-267 + j*(-37) +2 + j*(283) +-237 + j*(30) +-28 + j*(-204) +18 + j*(10) +-25 + j*(-262) +-252 + j*(45) +-7 + j*(64) +139 + j*(325) +-44 + j*(-243) +-94 + j*(194) +132 + j*(192) +74 + j*(-332) +212 + j*(-189) +-20 + j*(83) +56 + j*(-45) +-371 + j*(-122) +10 + j*(134) +-163 + j*(69) +-305 + j*(35) +27 + j*(-186) +106 + j*(54) +226 + j*(8) +-185 + j*(50) +-3 + j*(-26) +11 + j*(136) +-360 + j*(-132) +192 + j*(-67) +189 + j*(-46) +-23 + j*(122) +-119 + j*(-45) +187 + j*(-186) +24 + j*(78) +21 + j*(-125) +433 + j*(-60) +180 + j*(-35) +-166 + j*(3) +44 + j*(134) +79 + j*(26) +-82 + j*(103) +-180 + j*(-40) +11 + j*(49) +147 + j*(132) +10 + j*(-36) +53 + j*(-157) +170 + j*(163) +71 + j*(213) +82 + j*(-135) +-56 + j*(-138) +41 + j*(-115) +-190 + j*(-4) +55 + j*(199) +-144 + j*(-113) +-397 + j*(-207) +-165 + j*(-22) +46 + j*(122) +-151 + j*(-102) +124 + j*(-79) +1 + j*(-262) +313 + j*(-66) +117 + j*(54) +110 + j*(-117) +-254 + j*(-152) +-2 + j*(-24) +-199 + j*(25) +-178 + j*(-133) +-164 + j*(88) +-18 + j*(-30) +-166 + j*(83) +18 + j*(-286) +230 + j*(100) +153 + j*(-115) +49 + j*(-59) +-39 + j*(-12) +-412 + j*(-168) +-151 + j*(293) +81 + j*(-356) +106 + j*(11) +101 + j*(-76) +-103 + j*(489) +60 + j*(327) +-254 + j*(-398) +-96 + j*(-74) +115 + j*(-133) +-114 + j*(91) +105 + j*(23) +-334 + j*(-8) +421 + j*(-191) +-281 + j*(-4) +49 + j*(-26) +83 + j*(-13) +102 + j*(202) +115 + j*(214) +-18 + j*(322) +201 + j*(161) +34 + j*(-37) +-204 + j*(181) +412 + j*(-41) +187 + j*(-15) +-11 + j*(95) +-8 + j*(-322) +-364 + j*(40) +-148 + j*(-52) +351 + j*(-114) +244 + j*(175) +-123 + j*(-182) +-59 + j*(-103) +-60 + j*(98) +-166 + j*(83) +-192 + j*(71) +-187 + j*(223) +-24 + j*(-272) +209 + j*(-320) +-45 + j*(-89) +438 + j*(-54) +-64 + j*(-235) +-346 + j*(-112) +-12 + j*(142) +-331 + j*(-138) +78 + j*(-123) +-274 + j*(28) +-6 + j*(-132) +-64 + j*(258) +159 + j*(-135) +146 + j*(-85) +-69 + j*(-122) +12 + j*(394) +-24 + j*(-233) +194 + j*(144) +105 + j*(-107) +47 + j*(33) +30 + j*(-122) +-27 + j*(-21) +-48 + j*(-248) +354 + j*(91) +-3 + j*(54) +-440 + j*(-37) +-127 + j*(198) +99 + j*(-142) +252 + j*(139) +-150 + j*(-184) +-355 + j*(-5) +192 + j*(243) +-107 + j*(259) +-95 + j*(81) +-345 + j*(40) +-207 + j*(-141) +47 + j*(76) +-118 + j*(66) +-161 + j*(128) +-1 + j*(186) +-45 + j*(-187) +106 + j*(224) +-48 + j*(-237) +35 + j*(-229) +-55 + j*(-293) +-54 + j*(-86) +-183 + j*(79) +-15 + j*(-41) +-122 + j*(231) +69 + j*(-17) +100 + j*(279) +320 + j*(76) +-68 + j*(-83) +107 + j*(-70) +-94 + j*(158) +-93 + j*(122) +-141 + j*(22) +65 + j*(91) +-390 + j*(-91) +-216 + j*(35) +37 + j*(-191) +-57 + j*(14) +57 + j*(-288) +378 + j*(344) +42 + j*(448) +38 + j*(66) +-76 + j*(-260) +298 + j*(-250) +13 + j*(-370) +156 + j*(-169) +72 + j*(-215) +173 + j*(289) +194 + j*(130) +-23 + j*(202) +-22 + j*(298) +148 + j*(-113) +-131 + j*(-168) +339 + j*(107) +172 + j*(245) +-136 + j*(-105) +-186 + j*(-156) +-67 + j*(221) +-139 + j*(-42) +151 + j*(247) +-13 + j*(24) +41 + j*(139) +-165 + j*(185) +-55 + j*(-143) +35 + j*(-252) +-148 + j*(349) +-147 + j*(-26) +36 + j*(-332) +-58 + j*(-306) +-152 + j*(107) +157 + j*(-163) +-195 + j*(68) +241 + j*(282) +18 + j*(-115) +211 + j*(-32) +185 + j*(309) +-76 + j*(122) +114 + j*(6) +-58 + j*(-52) +-161 + j*(-116) +6 + j*(159) +141 + j*(173) +-134 + j*(-146) +-243 + j*(250) +38 + j*(221) +-122 + j*(-24) +-37 + j*(454) +-119 + j*(-127) +122 + j*(-71) +52 + j*(-101) +63 + j*(-133) +8 + j*(-279) +214 + j*(-154) +-467 + j*(110) +78 + j*(6) +-216 + j*(-87) +-147 + j*(-160) +-38 + j*(161) +124 + j*(245) +-56 + j*(-250) +-70 + j*(-132) +-235 + j*(117) +-25 + j*(36) +67 + j*(-18) +115 + j*(-83) +88 + j*(278) +-175 + j*(-8) +285 + j*(-65) +29 + j*(-49) +-42 + j*(-153) +-23 + j*(-26) +153 + j*(-66) +-218 + j*(251) +-37 + j*(228) +-21 + j*(30) +101 + j*(-76) +-5 + j*(-206) +49 + j*(37) +-100 + j*(-129) +3 + j*(-216) +9 + j*(49) +247 + j*(13) +-20 + j*(99) +-19 + j*(134) +-2 + j*(144) +153 + j*(112) +362 + j*(91) +-74 + j*(-28) +211 + j*(-182) +105 + j*(226) +-100 + j*(130) +37 + j*(16) +130 + j*(167) +-88 + j*(-218) +143 + j*(84) +31 + j*(35) +212 + j*(390) +1 + j*(-293) +-12 + j*(-161) +-49 + j*(-143) +-91 + j*(-130) +6 + j*(-74) +-59 + j*(185) +-177 + j*(92) +-19 + j*(25) +-232 + j*(-138) +110 + j*(103) +-40 + j*(131) +3 + j*(-152) +-55 + j*(105) +260 + j*(-247) +286 + j*(-23) +98 + j*(-16) +54 + j*(33) +-358 + j*(-16) +-146 + j*(107) +-249 + j*(-199) +-158 + j*(87) +-72 + j*(-110) +133 + j*(-196) +-141 + j*(354) +71 + j*(-152) +159 + j*(192) +-162 + j*(62) +182 + j*(344) +-2 + j*(14) +-293 + j*(321) +-41 + j*(-82) +-24 + j*(225) +-17 + j*(-158) +-37 + j*(103) +42 + j*(-50) +-33 + j*(229) +-22 + j*(54) +-105 + j*(-125) +343 + j*(298) +-211 + j*(231) +75 + j*(-85) +181 + j*(-33) +194 + j*(205) +-36 + j*(103) +-325 + j*(-103) +-148 + j*(-293) +-143 + j*(-52) +-294 + j*(16) +-147 + j*(-192) +-132 + j*(64) +-75 + j*(-105) +-279 + j*(-113) +15 + j*(-10) +103 + j*(-361) +45 + j*(315) +-8 + j*(-119) +-352 + j*(-97) +-8 + j*(-74) +-363 + j*(112) +-196 + j*(67) +226 + j*(-40) +235 + j*(117) +-140 + j*(47) +33 + j*(161) +149 + j*(162) +-468 + j*(-17) +-270 + j*(-72) +-335 + j*(-178) +-23 + j*(184) +156 + j*(361) +184 + j*(177) +151 + j*(141) +-100 + j*(-231) +-2 + j*(71) +-3 + j*(103) +230 + j*(105) +50 + j*(306) +-194 + j*(216) +101 + j*(-252) +-187 + j*(88) +-114 + j*(43) +6 + j*(124) +-143 + j*(-50) +-237 + j*(33) +115 + j*(144) +-112 + j*(-465) +86 + j*(-54) +-125 + j*(-146) +127 + j*(-179) +175 + j*(-162) +146 + j*(-141) +-272 + j*(-158) +107 + j*(168) +48 + j*(143) +-42 + j*(-18) +33 + j*(83) +-213 + j*(269) +58 + j*(-211) +-140 + j*(100) +29 + j*(-171) +311 + j*(-104) +-13 + j*(127) +-55 + j*(110) +-191 + j*(4) +-16 + j*(93) +-338 + j*(255) +103 + j*(55) +-88 + j*(-111) +41 + j*(49) +191 + j*(124) +145 + j*(163) +18 + j*(-132) +-46 + j*(81) +-59 + j*(-154) +277 + j*(179) +199 + j*(104) +40 + j*(4) +-46 + j*(28) +-13 + j*(-26) +89 + j*(11) +-56 + j*(91) +-228 + j*(-152) +-7 + j*(64) +122 + j*(-274) +151 + j*(-303) +-273 + j*(-251) +-60 + j*(264) +49 + j*(-74) +-56 + j*(-255) +445 + j*(210) +33 + j*(-155) +-271 + j*(-182) +-36 + j*(-136) +8 + j*(-16) +-204 + j*(-123) +-124 + j*(33) +-139 + j*(32) +90 + j*(-192) +282 + j*(83) +48 + j*(-245) +129 + j*(98) +-54 + j*(344) +-18 + j*(252) +-279 + j*(-146) +-115 + j*(-52) +79 + j*(192) +132 + j*(22) +-103 + j*(-162) +-42 + j*(64) +9 + j*(-185) +-132 + j*(-54) +9 + j*(129) +211 + j*(50) +-164 + j*(-13) +258 + j*(-100) +194 + j*(145) +-420 + j*(-276) +27 + j*(-30) +-106 + j*(74) +-71 + j*(378) +-296 + j*(178) +190 + j*(175) +217 + j*(-64) +455 + j*(-68) +69 + j*(144) +216 + j*(6) +25 + j*(39) +39 + j*(78) +-31 + j*(134) +165 + j*(-6) +-160 + j*(-95) +185 + j*(-281) +71 + j*(402) +-155 + j*(414) +159 + j*(-88) +302 + j*(-307) +73 + j*(-36) +-81 + j*(215) +142 + j*(-110) +103 + j*(-156) +195 + j*(-28) +185 + j*(167) +-89 + j*(117) +-147 + j*(-75) +118 + j*(-332) +-7 + j*(104) +211 + j*(-114) +201 + j*(-291) +49 + j*(88) +159 + j*(-75) +-327 + j*(-508) +26 + j*(13) +-387 + j*(-252) +148 + j*(-234) +23 + j*(-49) +78 + j*(-138) +189 + j*(-103) +-20 + j*(117) +-33 + j*(6) +149 + j*(-153) +-85 + j*(-231) +-127 + j*(135) +-136 + j*(-206) +-73 + j*(69) +-134 + j*(7) +-264 + j*(-69) +-82 + j*(89) +-248 + j*(127) +30 + j*(-12) +-138 + j*(-164) +123 + j*(-185) +237 + j*(-33) +-187 + j*(-103) +-115 + j*(-215) +28 + j*(347) +220 + j*(131) +281 + j*(-134) +-107 + j*(110) +133 + j*(-53) +204 + j*(132) +-85 + j*(289) +235 + j*(-135) +-145 + j*(153) +-87 + j*(332) +-213 + j*(-73) +-153 + j*(-220) +-214 + j*(-223) +59 + j*(-12) +48 + j*(-79) +11 + j*(8) +-46 + j*(-181) +94 + j*(141) +39 + j*(-21) +70 + j*(-293) +145 + j*(13) +32 + j*(-18) +134 + j*(129) +-110 + j*(-243) +-127 + j*(292) +4 + j*(209) +-139 + j*(-44) +-21 + j*(-40) +35 + j*(-84) +-316 + j*(-268) +-195 + j*(166) +-95 + j*(-24) +233 + j*(-18) +240 + j*(-88) +-66 + j*(-143) +155 + j*(9) +266 + j*(235) +-94 + j*(-28) +117 + j*(35) +-189 + j*(9) +-205 + j*(40) +-74 + j*(252) +-141 + j*(150) +-29 + j*(-57) +49 + j*(103) +-57 + j*(251) +109 + j*(95) +284 + j*(-16) +11 + j*(-96) +-289 + j*(-351) +-6 + j*(-222) +355 + j*(118) +-139 + j*(179) +-143 + j*(137) +88 + j*(-86) +243 + j*(-131) +117 + j*(-6) +-489 + j*(70) +74 + j*(245) +93 + j*(88) +-62 + j*(54) +218 + j*(176) +-146 + j*(-126) +28 + j*(-53) +86 + j*(13) +203 + j*(153) +150 + j*(74) +200 + j*(320) +95 + j*(142) +58 + j*(156) +345 + j*(-52) +-59 + j*(462) +-22 + j*(-43) +-160 + j*(141) +313 + j*(-104) +-190 + j*(-67) +25 + j*(-103) +-305 + j*(17) +53 + j*(-52) +-36 + j*(-101) +-67 + j*(-47) +-198 + j*(202) +231 + j*(-218) +-62 + j*(146) +68 + j*(-172) +-148 + j*(-134) +-32 + j*(-184) +-378 + j*(88) +-248 + j*(12) +-37 + j*(-68) +11 + j*(44) +-19 + j*(-67) +215 + j*(262) +-190 + j*(229) +-277 + j*(62) +140 + j*(-204) +-219 + j*(-9) +78 + j*(-64) +249 + j*(16) +-1 + j*(-115) +58 + j*(276) +-94 + j*(-193) +80 + j*(-61) +333 + j*(77) +150 + j*(233) +-251 + j*(-255) +0 + j*(340) +-205 + j*(-45) +80 + j*(-305) +112 + j*(-45) +-28 + j*(-1) +-1 + j*(22) +125 + j*(-304) +-276 + j*(-24) +-28 + j*(-177) +117 + j*(197) +192 + j*(-29) +40 + j*(158) +-304 + j*(-122) +-84 + j*(-35) +160 + j*(-28) +36 + j*(110) +119 + j*(7) +-35 + j*(-127) +8 + j*(33) +161 + j*(48) +-65 + j*(158) +-237 + j*(-220) +-65 + j*(-294) +157 + j*(155) +-8 + j*(-296) +18 + j*(-273) +173 + j*(-16) +136 + j*(23) +85 + j*(156) +1 + j*(144) +147 + j*(-281) +-95 + j*(94) +-69 + j*(-103) +165 + j*(-25) +-196 + j*(257) +80 + j*(195) +31 + j*(-11) +-267 + j*(-69) +-208 + j*(-127) +-180 + j*(-87) +-90 + j*(48) +69 + j*(-47) +-163 + j*(-314) +-4 + j*(-166) +-45 + j*(460) +-5 + j*(-4) +105 + j*(-238) +-240 + j*(158) +-145 + j*(72) +95 + j*(-35) +-4 + j*(-213) +14 + j*(182) +-33 + j*(123) +-385 + j*(170) +32 + j*(-27) +-19 + j*(-164) +-245 + j*(68) +-16 + j*(-67) +226 + j*(88) +-130 + j*(-112) +4 + j*(-4) +-320 + j*(54) +-154 + j*(-131) +184 + j*(33) +137 + j*(-269) +148 + j*(-68) +-93 + j*(-13) +94 + j*(-280) +35 + j*(98) +-104 + j*(-165) +-71 + j*(-84) +293 + j*(-71) +247 + j*(159) +-91 + j*(-63) +-95 + j*(246) +-124 + j*(49) +-158 + j*(227) +-146 + j*(-84) +-185 + j*(-206) +101 + j*(129) +-45 + j*(-361) +-140 + j*(115) +8 + j*(-83) +-426 + j*(-45) +365 + j*(-120) +-115 + j*(98) +-247 + j*(192) +23 + j*(39) +-22 + j*(205) +30 + j*(40) +196 + j*(-71) +-74 + j*(193) +76 + j*(-51) +-123 + j*(-93) +-37 + j*(-251) +-26 + j*(170) +-263 + j*(43) +-42 + j*(-224) +214 + j*(153) +-33 + j*(86) +-137 + j*(158) +148 + j*(122) +68 + j*(26) +341 + j*(-75) +121 + j*(96) +74 + j*(-235) +25 + j*(-41) +50 + j*(141) +-183 + j*(69) +74 + j*(-94) +119 + j*(-129) +55 + j*(5) +-132 + j*(267) +-167 + j*(-24) +-273 + j*(139) +270 + j*(59) +-114 + j*(-62) +46 + j*(63) +-74 + j*(42) +378 + j*(-223) +27 + j*(122) +121 + j*(372) +278 + j*(116) +-33 + j*(-276) +9 + j*(-49) +-403 + j*(138) +-5 + j*(342) +-109 + j*(-95) +-31 + j*(-43) +62 + j*(-186) +163 + j*(-233) +-28 + j*(144) +194 + j*(93) +69 + j*(-206) +180 + j*(-120) +-72 + j*(-62) +-52 + j*(-166) +81 + j*(128) +239 + j*(-315) +30 + j*(-97) +194 + j*(-300) +26 + j*(197) +12 + j*(-54) +-13 + j*(146) +322 + j*(55) +-341 + j*(-282) +29 + j*(-225) +-91 + j*(7) +-160 + j*(64) +7 + j*(-127) +28 + j*(-158) +-97 + j*(283) +-276 + j*(62) +-53 + j*(-362) +59 + j*(18) +227 + j*(-390) +-86 + j*(132) +-105 + j*(-513) +-87 + j*(29) +35 + j*(-110) +18 + j*(47) +180 + j*(-45) +-112 + j*(5) +44 + j*(-31) +-144 + j*(66) +-284 + j*(187) +-373 + j*(183) +66 + j*(-160) +378 + j*(209) +-360 + j*(-33) +-181 + j*(-174) +31 + j*(-209) +66 + j*(-187) +-224 + j*(-27) +-118 + j*(-124) +16 + j*(156) +-29 + j*(163) +-112 + j*(69) +-10 + j*(191) +114 + j*(-103) +8 + j*(16) +-132 + j*(105) +-221 + j*(211) +-187 + j*(-11) +100 + j*(-49) +-27 + j*(52) +-62 + j*(1) +48 + j*(-86) +-243 + j*(296) +-307 + j*(-22) +47 + j*(-23) +-126 + j*(-111) +-93 + j*(-12) +-46 + j*(-265) +71 + j*(-1) +-52 + j*(42) +-180 + j*(344) +78 + j*(-95) +-167 + j*(-28) +-293 + j*(196) +247 + j*(63) +112 + j*(383) +225 + j*(-232) +97 + j*(-60) +-57 + j*(-233) +-180 + j*(-136) +130 + j*(-187) +-62 + j*(-65) +13 + j*(14) +-9 + j*(267) +-243 + j*(-458) +21 + j*(267) +-57 + j*(-45) +-148 + j*(130) +86 + j*(251) +-366 + j*(93) +-375 + j*(302) +107 + j*(-11) +-12 + j*(-207) +198 + j*(-397) +-346 + j*(15) +-19 + j*(177) +28 + j*(-23) +-87 + j*(-81) +-164 + j*(-117) +-184 + j*(42) +-43 + j*(231) +-49 + j*(-143) +-209 + j*(-252) +-344 + j*(171) +261 + j*(200) +210 + j*(2) +-78 + j*(18) +120 + j*(-31) +-46 + j*(37) +105 + j*(228) +252 + j*(-62) +76 + j*(190) +-200 + j*(-88) +112 + j*(31) +97 + j*(46) +-14 + j*(191) +122 + j*(70) +-110 + j*(132) +52 + j*(-151) +-161 + j*(69) +74 + j*(228) +-170 + j*(41) +-59 + j*(-354) +-98 + j*(325) +64 + j*(-64) +-235 + j*(175) +-230 + j*(-93) +83 + j*(-48) +-274 + j*(-86) +133 + j*(-92) +-118 + j*(190) +-192 + j*(232) +107 + j*(226) +-178 + j*(-91) +-45 + j*(35) +212 + j*(194) +38 + j*(-66) +2 + j*(142) +156 + j*(296) +-62 + j*(38) +34 + j*(-358) +-133 + j*(-114) +94 + j*(80) +-299 + j*(41) +23 + j*(264) +-223 + j*(515) +-82 + j*(-98) +-180 + j*(175) +-160 + j*(-163) +-42 + j*(81) +-110 + j*(-93) +-95 + j*(-186) +-182 + j*(-190) +29 + j*(-227) +36 + j*(107) +-25 + j*(-239) +-147 + j*(-128) +214 + j*(178) +-144 + j*(-26) +-162 + j*(210) +-1 + j*(-170) +-182 + j*(76) +-214 + j*(272) +209 + j*(112) +-335 + j*(199) +202 + j*(93) +192 + j*(-119) +-160 + j*(65) +231 + j*(-61) +-37 + j*(-151) +77 + j*(114) +293 + j*(34) +-203 + j*(-176) +-164 + j*(142) +-233 + j*(269) +-45 + j*(227) +313 + j*(74) +-52 + j*(210) +-396 + j*(-31) +-111 + j*(-95) +-11 + j*(83) +112 + j*(246) +-59 + j*(95) +196 + j*(121) +-364 + j*(-285) +139 + j*(284) +-301 + j*(-78) +-274 + j*(-334) +-413 + j*(-324) +25 + j*(-57) +-251 + j*(-60) +552 + j*(-140) +98 + j*(559) +452 + j*(-165) +334 + j*(-16) +-477 + j*(-221) +-273 + j*(82) +-170 + j*(127) +600 + j*(348) +412 + j*(187) +392 + j*(393) +356 + j*(-431) +-303 + j*(-270) +-383 + j*(388) +107 + j*(-441) +-371 + j*(155) +385 + j*(398) +-262 + j*(-58) +244 + j*(-265) +494 + j*(359) +-245 + j*(214) +141 + j*(-274) +281 + j*(-645) +252 + j*(222) +-252 + j*(-163) +-350 + j*(371) +143 + j*(-293) +-426 + j*(-419) +107 + j*(-83) +-183 + j*(-363) +431 + j*(-91) +-557 + j*(-171) +-7 + j*(576) +393 + j*(-195) +-415 + j*(387) +95 + j*(-383) +56 + j*(156) +223 + j*(433) +-670 + j*(232) +-78 + j*(192) +327 + j*(187) +-47 + j*(-198) +-47 + j*(379) +158 + j*(-204) +170 + j*(40) +120 + j*(-402) +-57 + j*(-609) +363 + j*(197) +572 + j*(240) +159 + j*(277) +51 + j*(594) +284 + j*(-165) +-221 + j*(406) +-83 + j*(-173) +248 + j*(-268) +-106 + j*(67) +-233 + j*(330) +-208 + j*(-184) +414 + j*(-62) +-170 + j*(609) +-309 + j*(177) +278 + j*(-119) +611 + j*(251) +-67 + j*(438) +354 + j*(87) +344 + j*(225) +388 + j*(190) +386 + j*(273) +-235 + j*(-399) +450 + j*(89) +-129 + j*(-380) +307 + j*(-317) +6 + j*(454) +-21 + j*(683) +382 + j*(607) +26 + j*(269) +397 + j*(394) +525 + j*(-202) +-373 + j*(-337) +607 + j*(363) +142 + j*(235) +320 + j*(-230) +276 + j*(223) +-82 + j*(-39) +-41 + j*(374) +298 + j*(313) +-453 + j*(136) +-487 + j*(-484) +-50 + j*(214) +-265 + j*(259) +-185 + j*(-32) +-268 + j*(6) +335 + j*(414) +-385 + j*(-177) +-438 + j*(-168) +-153 + j*(475) +-93 + j*(223) +-279 + j*(283) +481 + j*(-119) +2 + j*(-363) +571 + j*(346) +342 + j*(143) +-379 + j*(175) +-30 + j*(-334) +-431 + j*(237) +113 + j*(-408) +420 + j*(-398) +-101 + j*(-35) +-363 + j*(77) +-421 + j*(129) +378 + j*(166) +-316 + j*(-40) +402 + j*(-251) +22 + j*(-351) +223 + j*(-376) +273 + j*(599) +-213 + j*(30) +269 + j*(-317) +209 + j*(357) +-156 + j*(517) +97 + j*(504) +296 + j*(-239) +65 + j*(1) +278 + j*(342) +-175 + j*(-567) +325 + j*(-247) +-455 + j*(-64) +512 + j*(-163) +148 + j*(542) +183 + j*(273) +-224 + j*(53) +327 + j*(256) +124 + j*(-139) +63 + j*(124) +-57 + j*(-381) +112 + j*(-13) +269 + j*(-236) +-104 + j*(-487) +-227 + j*(-422) +434 + j*(-423) +387 + j*(-274) +-118 + j*(110) +197 + j*(342) +-96 + j*(300) +413 + j*(-33) +-184 + j*(-374) +451 + j*(68) +435 + j*(-132) +-244 + j*(-332) +482 + j*(296) +500 + j*(-520) +41 + j*(-66) +-137 + j*(678) +-433 + j*(361) +-573 + j*(576) +-350 + j*(255) +-185 + j*(-711) +491 + j*(403) +-203 + j*(-359) +36 + j*(-153) +-199 + j*(-299) +312 + j*(-607) +17 + j*(82) +-284 + j*(311) +-651 + j*(349) +-317 + j*(-525) +461 + j*(-175) +-272 + j*(-30) +-433 + j*(392) +-204 + j*(242) +-132 + j*(330) +37 + j*(-193) +461 + j*(-472) +-188 + j*(-404) +136 + j*(434) +489 + j*(-688) +-261 + j*(-331) +-79 + j*(323) +-181 + j*(-231) +236 + j*(483) +294 + j*(-152) +118 + j*(-52) +286 + j*(299) +353 + j*(-41) +-250 + j*(262) +-332 + j*(385) +-1 + j*(-199) +547 + j*(-29) +135 + j*(307) +150 + j*(348) +-211 + j*(386) +-124 + j*(-317) +197 + j*(289) +6 + j*(224) +-571 + j*(327) +-127 + j*(-331) +164 + j*(-490) +-211 + j*(428) +507 + j*(99) +1 + j*(-32) +-378 + j*(-261) +396 + j*(-520) +-180 + j*(332) +318 + j*(119) +-143 + j*(364) +-177 + j*(527) +-141 + j*(47) +180 + j*(104) +-38 + j*(-321) +185 + j*(353) +-414 + j*(250) +29 + j*(-441) +-202 + j*(247) +16 + j*(62) +432 + j*(467) +-206 + j*(175) +94 + j*(-132) +321 + j*(369) +705 + j*(170) +346 + j*(512) +-368 + j*(-420) +53 + j*(117) +98 + j*(-211) +-267 + j*(251) +366 + j*(144) +630 + j*(144) +-187 + j*(333) +-271 + j*(566) +-344 + j*(-87) +437 + j*(316) +-181 + j*(423) +-280 + j*(90) +497 + j*(226) +-191 + j*(-57) +334 + j*(122) +-228 + j*(309) +412 + j*(-351) +289 + j*(193) +194 + j*(124) +293 + j*(-198) +-175 + j*(343) +-222 + j*(-327) +40 + j*(-205) +357 + j*(-335) +-131 + j*(-187) +5 + j*(-491) +38 + j*(330) +6 + j*(274) +207 + j*(113) +-339 + j*(-238) +245 + j*(-246) +-46 + j*(-59) +-375 + j*(-393) +-231 + j*(515) +53 + j*(262) +-224 + j*(190) +-363 + j*(-43) +224 + j*(150) +122 + j*(-337) +-296 + j*(-264) +73 + j*(445) +-217 + j*(359) +-270 + j*(-305) +-342 + j*(526) +286 + j*(-655) +-216 + j*(410) +606 + j*(368) +540 + j*(347) +-66 + j*(-136) +149 + j*(342) +64 + j*(-315) +-483 + j*(-236) +-313 + j*(-325) +-150 + j*(238) +-175 + j*(-165) +-239 + j*(409) +166 + j*(-18) +282 + j*(-151) +-202 + j*(-446) +452 + j*(360) +-205 + j*(-263) +-283 + j*(320) +-358 + j*(266) +170 + j*(28) +-288 + j*(-393) +97 + j*(423) +122 + j*(425) +-6 + j*(146) +144 + j*(-282) +368 + j*(413) +-320 + j*(410) +-513 + j*(-503) +237 + j*(-528) +-398 + j*(254) +-237 + j*(474) +-128 + j*(499) +233 + j*(396) +262 + j*(404) +240 + j*(-390) +-372 + j*(245) +-313 + j*(-37) +-99 + j*(-187) +-301 + j*(-677) +-321 + j*(120) +294 + j*(-131) +276 + j*(-228) +-313 + j*(-604) +-140 + j*(-262) +-437 + j*(-173) +98 + j*(192) +235 + j*(394) +256 + j*(-503) +336 + j*(383) +138 + j*(277) +-56 + j*(260) +-305 + j*(-528) +206 + j*(59) +221 + j*(191) +552 + j*(-141) +15 + j*(434) +223 + j*(24) +56 + j*(325) +-49 + j*(238) +-410 + j*(270) +11 + j*(-322) +-91 + j*(-492) +-315 + j*(-44) +-165 + j*(-332) +242 + j*(108) +29 + j*(226) +95 + j*(-47) +-218 + j*(-109) +251 + j*(-426) +-332 + j*(213) +33 + j*(443) +207 + j*(-475) +148 + j*(-1) +-147 + j*(-504) +-158 + j*(1) +378 + j*(15) +-612 + j*(-174) +255 + j*(182) +240 + j*(-387) +-206 + j*(176) +523 + j*(-181) +241 + j*(-255) +-362 + j*(-265) +84 + j*(100) +-299 + j*(165) +291 + j*(192) +-109 + j*(-377) +-72 + j*(532) +-86 + j*(-276) +250 + j*(489) +-301 + j*(-421) +187 + j*(401) +-241 + j*(58) +-369 + j*(-199) +23 + j*(501) +-194 + j*(-318) +-278 + j*(578) +552 + j*(223) +-197 + j*(-253) +231 + j*(-304) +-33 + j*(-308) +296 + j*(437) +-462 + j*(445) +57 + j*(-146) +-127 + j*(94) +98 + j*(21) +392 + j*(-337) +-290 + j*(244) +-216 + j*(434) +112 + j*(-111) +1 + j*(-450) +294 + j*(115) +-486 + j*(-211) +-293 + j*(-436) +-181 + j*(315) +231 + j*(375) +192 + j*(-240) +200 + j*(-343) +-310 + j*(34) +-459 + j*(-279) +-173 + j*(-120) +391 + j*(-253) +-197 + j*(-226) +224 + j*(-334) +-604 + j*(325) +-18 + j*(-379) +269 + j*(-285) +454 + j*(483) +-172 + j*(-185) +-479 + j*(135) +319 + j*(275) +423 + j*(-495) +-319 + j*(315) +22 + j*(466) +-86 + j*(-120) +224 + j*(198) +210 + j*(-262) +106 + j*(170) +-293 + j*(220) +491 + j*(524) +128 + j*(525) +-318 + j*(419) +352 + j*(-143) +-196 + j*(130) +-222 + j*(317) +302 + j*(-421) +388 + j*(-199) +-243 + j*(395) +87 + j*(397) +-383 + j*(296) +99 + j*(-499) +-97 + j*(-214) +279 + j*(-408) +-428 + j*(-327) +250 + j*(-131) +260 + j*(110) +-346 + j*(323) +-204 + j*(341) +-344 + j*(-276) +266 + j*(-33) +-482 + j*(-466) +-284 + j*(10) +-331 + j*(236) +66 + j*(272) +-415 + j*(227) +16 + j*(81) +-647 + j*(671) +-20 + j*(93) +-130 + j*(-244) +-272 + j*(74) +-243 + j*(379) +168 + j*(-558) +-49 + j*(264) +-257 + j*(231) +-298 + j*(231) +235 + j*(496) +263 + j*(77) +-192 + j*(250) +110 + j*(87) +-301 + j*(49) +391 + j*(-658) +482 + j*(-317) +267 + j*(-197) +89 + j*(-107) +240 + j*(-375) +-354 + j*(-299) +-441 + j*(-1) +113 + j*(-134) +530 + j*(-79) +405 + j*(-101) +476 + j*(45) +460 + j*(145) +332 + j*(-77) +-86 + j*(-153) +74 + j*(-574) +-298 + j*(-58) +-220 + j*(-371) +438 + j*(192) +-325 + j*(175) +-132 + j*(-379) +225 + j*(96) +307 + j*(-55) +-137 + j*(303) +-112 + j*(423) +-327 + j*(-241) +-329 + j*(351) +62 + j*(-287) +372 + j*(-214) +426 + j*(-216) +176 + j*(-170) +-449 + j*(-296) +522 + j*(-1) +-66 + j*(396) +-223 + j*(92) +228 + j*(165) +-233 + j*(105) +-272 + j*(-164) +248 + j*(121) +-518 + j*(20) +-65 + j*(-497) +-272 + j*(118) +166 + j*(-117) +-279 + j*(-284) +426 + j*(-590) +-317 + j*(346) +197 + j*(421) +552 + j*(181) +-163 + j*(290) +253 + j*(-554) +60 + j*(16) +-336 + j*(-438) +-154 + j*(-322) +-202 + j*(188) +-177 + j*(-8) +-427 + j*(-361) +-353 + j*(27) +406 + j*(119) +-326 + j*(-155) +170 + j*(-190) +-235 + j*(59) +-67 + j*(287) +106 + j*(438) +192 + j*(-505) +173 + j*(-77) +-147 + j*(-275) +-683 + j*(342) +-411 + j*(433) +307 + j*(4) +-506 + j*(44) +322 + j*(-171) +337 + j*(-151) +276 + j*(332) +-269 + j*(293) +-8 + j*(151) +-552 + j*(216) +-168 + j*(-276) +195 + j*(-460) +287 + j*(645) +-132 + j*(-112) +681 + j*(355) +336 + j*(-137) +-539 + j*(-412) +82 + j*(433) +-363 + j*(-254) +-175 + j*(311) +-180 + j*(155) +759 + j*(222) +-756 + j*(387) +598 + j*(11) +-66 + j*(47) +354 + j*(-71) +-262 + j*(-247) +-397 + j*(14) +400 + j*(-116) +141 + j*(132) +387 + j*(38) +269 + j*(-296) +457 + j*(54) +-173 + j*(85) +-370 + j*(191) +53 + j*(-285) +-457 + j*(-389) +60 + j*(-470) +384 + j*(-293) +-405 + j*(139) +-138 + j*(168) +-107 + j*(-69) +334 + j*(-50) +210 + j*(-148) +268 + j*(-327) +-325 + j*(316) +-157 + j*(3) +-202 + j*(-96) +-214 + j*(244) +-336 + j*(-150) +495 + j*(-384) +380 + j*(283) +-184 + j*(-419) +293 + j*(339) +178 + j*(67) +-156 + j*(249) +-563 + j*(407) +-561 + j*(185) +-93 + j*(-275) +-299 + j*(363) +356 + j*(482) +301 + j*(163) +-518 + j*(-438) +-379 + j*(-109) +-474 + j*(438) +486 + j*(180) +204 + j*(648) +-122 + j*(190) +-387 + j*(-214) +10 + j*(238) +124 + j*(406) +420 + j*(-313) +-163 + j*(110) +-330 + j*(-315) +303 + j*(262) +371 + j*(189) +452 + j*(-500) +430 + j*(-48) +-10 + j*(129) +-278 + j*(136) +-366 + j*(420) +163 + j*(-250) +337 + j*(-217) +326 + j*(473) +-353 + j*(-308) +-11 + j*(-25) +106 + j*(-86) +237 + j*(325) +368 + j*(340) +53 + j*(-92) +116 + j*(-206) +163 + j*(206) +-122 + j*(185) +282 + j*(-407) +-41 + j*(35) +-279 + j*(110) +-204 + j*(4) +42 + j*(236) +-190 + j*(66) +2 + j*(-25) +-112 + j*(-47) +35 + j*(-76) +165 + j*(293) +-218 + j*(-17) +-69 + j*(-71) +-158 + j*(48) +88 + j*(-57) +-67 + j*(-9) +-144 + j*(-40) +-216 + j*(218) +-161 + j*(88) +100 + j*(89) +226 + j*(219) +-10 + j*(0) +96 + j*(-326) +79 + j*(-63) +-82 + j*(219) +345 + j*(69) +486 + j*(-264) +-37 + j*(11) +373 + j*(-105) +-292 + j*(-99) +214 + j*(-145) +-187 + j*(-156) +-96 + j*(-194) +-200 + j*(-57) +-134 + j*(-142) +152 + j*(-251) +-112 + j*(25) +-33 + j*(179) +-177 + j*(-7) +-245 + j*(1) +-114 + j*(122) +-9 + j*(-83) +-157 + j*(132) +-173 + j*(-385) +-25 + j*(308) +280 + j*(-180) +-240 + j*(-129) +-286 + j*(-115) +-184 + j*(161) +180 + j*(-82) +-2 + j*(383) +-139 + j*(192) +112 + j*(-71) +178 + j*(-163) +104 + j*(15) +-103 + j*(-185) +-207 + j*(197) +-78 + j*(108) +86 + j*(60) +52 + j*(296) +-240 + j*(-98) +-9 + j*(150) +107 + j*(-222) +281 + j*(223) +-79 + j*(-42) +49 + j*(-105) +-157 + j*(84) +42 + j*(-150) +80 + j*(-23) +178 + j*(-237) +269 + j*(119) +-438 + j*(-72) +-51 + j*(-114) +-279 + j*(-76) +130 + j*(97) +-125 + j*(138) +100 + j*(-168) +-332 + j*(155) +112 + j*(413) +175 + j*(-136) +-450 + j*(77) +34 + j*(51) +-140 + j*(257) +170 + j*(-117) +-275 + j*(-221) +30 + j*(361) +0 + j*(35) +-165 + j*(-214) +227 + j*(186) +326 + j*(363) +175 + j*(11) +-52 + j*(51) +153 + j*(-244) +0 + j*(-8) +-78 + j*(68) +25 + j*(-67) +88 + j*(7) +-204 + j*(216) +117 + j*(127) +-214 + j*(-161) +192 + j*(285) +-366 + j*(13) +185 + j*(92) +-117 + j*(-243) +132 + j*(0) +141 + j*(9) +-138 + j*(-232) +-107 + j*(147) +175 + j*(-41) +35 + j*(47) +175 + j*(-52) +109 + j*(-82) +-18 + j*(-75) +94 + j*(47) +76 + j*(111) +59 + j*(-148) +137 + j*(168) +-24 + j*(171) +-44 + j*(262) +-299 + j*(-66) +130 + j*(-274) +64 + j*(-99) +10 + j*(-214) +-251 + j*(330) +-77 + j*(-100) +-239 + j*(226) +-83 + j*(-61) +-240 + j*(162) +-475 + j*(173) +-32 + j*(-143) +112 + j*(238) +-8 + j*(-178) +-95 + j*(247) +-33 + j*(87) +-302 + j*(298) +202 + j*(69) +33 + j*(-87) +-184 + j*(-31) +234 + j*(220) +122 + j*(-123) +-64 + j*(155) +106 + j*(115) +161 + j*(56) +72 + j*(243) +-27 + j*(47) +-3 + j*(-138) +-302 + j*(-216) +156 + j*(-93) +-139 + j*(-104) +-316 + j*(45) +-161 + j*(345) +-354 + j*(110) +-79 + j*(155) +193 + j*(21) +31 + j*(-125) +-119 + j*(-205) +35 + j*(21) +-75 + j*(241) +23 + j*(-146) +224 + j*(-222) +-171 + j*(231) +-61 + j*(-42) +-372 + j*(102) +-19 + j*(-151) +368 + j*(89) +318 + j*(-52) +-327 + j*(-301) +47 + j*(57) +-243 + j*(-231) +-461 + j*(59) +118 + j*(-65) +67 + j*(202) +402 + j*(-226) +-123 + j*(-42) +-127 + j*(325) +-24 + j*(-166) +185 + j*(161) +111 + j*(-74) +-44 + j*(-95) +-290 + j*(137) +-125 + j*(-220) +54 + j*(-77) +70 + j*(46) +153 + j*(-112) +17 + j*(170) +-185 + j*(77) +193 + j*(140) +-388 + j*(150) +-381 + j*(-216) +-11 + j*(262) +-130 + j*(8) +149 + j*(-19) +240 + j*(134) +101 + j*(-161) +147 + j*(-86) +101 + j*(51) +110 + j*(-91) +67 + j*(126) +122 + j*(-72) +-100 + j*(-166) +146 + j*(-159) +-175 + j*(208) +-90 + j*(-16) +-288 + j*(-130) +-256 + j*(-168) +-29 + j*(62) +68 + j*(95) +18 + j*(95) +147 + j*(-91) +-11 + j*(162) +136 + j*(35) +98 + j*(33) +-180 + j*(308) +171 + j*(-5) +-114 + j*(25) +-30 + j*(-217) +-88 + j*(184) +45 + j*(91) +214 + j*(-21) +91 + j*(348) +-92 + j*(-296) +-58 + j*(96) +38 + j*(-119) +-202 + j*(135) +-28 + j*(-60) +-123 + j*(31) +102 + j*(12) +-132 + j*(217) +-28 + j*(245) +-267 + j*(5) +41 + j*(249) +-21 + j*(-147) +102 + j*(-320) +-274 + j*(-25) +156 + j*(-100) +100 + j*(-124) +-136 + j*(275) +320 + j*(-35) +-115 + j*(104) +-11 + j*(-205) +-254 + j*(-291) +-9 + j*(-318) +-97 + j*(195) +279 + j*(29) +269 + j*(227) +67 + j*(-39) +-136 + j*(241) +-96 + j*(-19) +250 + j*(-127) +84 + j*(-129) +228 + j*(90) +-98 + j*(23) +-46 + j*(-4) +42 + j*(47) +-15 + j*(-37) +-122 + j*(-230) +67 + j*(163) +176 + j*(-43) +82 + j*(-132) +115 + j*(157) +86 + j*(33) +-325 + j*(-20) +-115 + j*(77) +-33 + j*(-4) +197 + j*(161) +88 + j*(33) +-55 + j*(72) +113 + j*(-60) +135 + j*(132) +9 + j*(291) +-468 + j*(99) +122 + j*(-105) +95 + j*(-26) +29 + j*(-37) +40 + j*(-100) +-100 + j*(26) +-369 + j*(228) +86 + j*(-67) +-47 + j*(-98) +52 + j*(-129) +271 + j*(-58) +131 + j*(-315) +-78 + j*(361) +-2 + j*(-98) +143 + j*(-180) +78 + j*(123) +-77 + j*(-190) +-92 + j*(-76) +151 + j*(71) +-47 + j*(13) +246 + j*(-71) +-178 + j*(59) +134 + j*(-88) +243 + j*(-98) +-51 + j*(11) +244 + j*(45) +-66 + j*(127) +44 + j*(223) +145 + j*(-98) +-129 + j*(173) +-226 + j*(330) +264 + j*(168) +-93 + j*(27) +-146 + j*(-133) +-203 + j*(-310) +8 + j*(11) +378 + j*(112) +385 + j*(281) +182 + j*(-64) +35 + j*(158) +-199 + j*(-1) +-168 + j*(120) +192 + j*(-133) +-127 + j*(59) +-130 + j*(-279) +1 + j*(-224) +-70 + j*(-42) +61 + j*(80) +-13 + j*(-11) +-8 + j*(-95) +132 + j*(-240) +-215 + j*(-160) +191 + j*(133) +124 + j*(-373) +-161 + j*(-139) +110 + j*(-134) +-245 + j*(1) +-267 + j*(103) +-13 + j*(-384) +226 + j*(-58) +21 + j*(121) +-45 + j*(-400) +120 + j*(76) +69 + j*(35) +-111 + j*(40) +105 + j*(190) +164 + j*(161) +-268 + j*(-40) +177 + j*(-25) +-61 + j*(-80) +185 + j*(310) +-110 + j*(141) +20 + j*(187) +-299 + j*(-25) +-24 + j*(326) +-92 + j*(-335) +52 + j*(-324) +-342 + j*(-267) +-91 + j*(-10) +332 + j*(-119) +18 + j*(-219) +54 + j*(140) +333 + j*(237) +-201 + j*(207) +-99 + j*(294) +-49 + j*(-26) +306 + j*(-37) +-404 + j*(277) +22 + j*(-156) +348 + j*(-117) +62 + j*(197) +80 + j*(240) +-317 + j*(402) +226 + j*(-252) +-26 + j*(-31) +-107 + j*(65) +-45 + j*(7) +-237 + j*(-146) +-102 + j*(-73) +-199 + j*(63) +-196 + j*(-39) +68 + j*(50) +111 + j*(-71) +86 + j*(-13) +-69 + j*(44) +163 + j*(-116) +181 + j*(-127) +-115 + j*(527) +112 + j*(16) +-135 + j*(122) +124 + j*(28) +140 + j*(-145) +-149 + j*(-218) +51 + j*(-5) +66 + j*(315) +249 + j*(-198) +54 + j*(60) +283 + j*(227) +272 + j*(237) +228 + j*(53) +296 + j*(212) +-255 + j*(-52) +252 + j*(93) +49 + j*(-134) +279 + j*(54) +-21 + j*(-343) +-116 + j*(206) +-52 + j*(-47) +69 + j*(187) +21 + j*(93) +-28 + j*(-166) +-97 + j*(-161) +367 + j*(-90) +-39 + j*(53) +400 + j*(92) +381 + j*(-169) +-303 + j*(219) +2 + j*(58) +21 + j*(248) +-160 + j*(-125) +379 + j*(-387) +62 + j*(-31) +-126 + j*(-76) +-17 + j*(47) +29 + j*(45) +-286 + j*(-181) +21 + j*(103) +-117 + j*(29) +86 + j*(386) +-132 + j*(-129) +83 + j*(178) +243 + j*(-298) +144 + j*(-295) +111 + j*(-109) +-201 + j*(168) +55 + j*(-192) +-13 + j*(41) +-129 + j*(147) +-8 + j*(-37) +-39 + j*(32) +28 + j*(90) +323 + j*(-245) +107 + j*(-77) +-8 + j*(-421) +187 + j*(-118) +-54 + j*(-160) +-91 + j*(54) +215 + j*(267) +239 + j*(-159) +106 + j*(-174) +-106 + j*(349) +-153 + j*(33) +45 + j*(98) +-145 + j*(134) +-101 + j*(-190) +-331 + j*(40) +-167 + j*(-255) +129 + j*(-113) +112 + j*(250) +10 + j*(-317) +125 + j*(-106) +96 + j*(102) +238 + j*(-6) +-108 + j*(222) +-82 + j*(122) +-453 + j*(-377) +-97 + j*(139) +103 + j*(-56) +-425 + j*(28) +164 + j*(154) +152 + j*(-62) +74 + j*(320) +85 + j*(-80) +146 + j*(-23) +-291 + j*(-153) +-5 + j*(-3) +-155 + j*(23) +153 + j*(294) +59 + j*(-132) +5 + j*(153) +59 + j*(-105) +54 + j*(-325) +177 + j*(170) +-223 + j*(-124) +183 + j*(-128) +119 + j*(-180) +332 + j*(71) +-14 + j*(93) +199 + j*(81) +-101 + j*(-75) +7 + j*(-35) +-101 + j*(52) +219 + j*(-284) +-102 + j*(-143) +16 + j*(-176) +132 + j*(-16) +76 + j*(-266) +24 + j*(-6) +-81 + j*(8) +-240 + j*(362) +-54 + j*(-95) +490 + j*(-91) +201 + j*(-194) +-127 + j*(-102) +48 + j*(4) +250 + j*(-54) +146 + j*(-409) +260 + j*(-20) +-40 + j*(50) +-119 + j*(-64) +319 + j*(-222) +-88 + j*(-216) +157 + j*(191) +112 + j*(-34) +-222 + j*(-145) +-129 + j*(175) +71 + j*(134) +27 + j*(-133) +-87 + j*(-340) +-175 + j*(126) +76 + j*(54) +-261 + j*(172) +64 + j*(-37) +-10 + j*(-211) +30 + j*(169) +23 + j*(-247) +-204 + j*(-54) +67 + j*(63) +191 + j*(-223) +22 + j*(454) +-156 + j*(91) +-45 + j*(-122) +-23 + j*(-189) +-31 + j*(139) +138 + j*(-201) +-324 + j*(-299) +-88 + j*(158) +-8 + j*(-104) +93 + j*(-129) +112 + j*(-8) +75 + j*(-82) +279 + j*(182) +118 + j*(-400) +-162 + j*(89) +-398 + j*(58) +4 + j*(101) +-133 + j*(-206) +-42 + j*(-1) +-276 + j*(322) +-385 + j*(5) +56 + j*(43) +281 + j*(107) +-91 + j*(70) +31 + j*(33) +57 + j*(4) +71 + j*(-126) +129 + j*(175) +565 + j*(-270) +-211 + j*(40) +-54 + j*(216) +57 + j*(-281) +255 + j*(-197) +-21 + j*(190) +183 + j*(110) +-123 + j*(46) +111 + j*(45) +-381 + j*(100) +-296 + j*(153) +-214 + j*(-46) +-221 + j*(-68) +348 + j*(231) +247 + j*(24) +-38 + j*(263) +-146 + j*(-361) +51 + j*(271) +146 + j*(-119) +-86 + j*(-81) +-163 + j*(-21) +92 + j*(70) +159 + j*(139) +-301 + j*(54) +-13 + j*(-272) +-105 + j*(25) +-95 + j*(-56) +222 + j*(54) +250 + j*(-56) +354 + j*(-152) +139 + j*(59) +-126 + j*(-175) +332 + j*(-244) +-88 + j*(-8) +-214 + j*(-261) +-282 + j*(-13) +75 + j*(49) +-180 + j*(-13) +-69 + j*(66) +-161 + j*(-1) +51 + j*(-62) +26 + j*(-37) +-54 + j*(323) +264 + j*(-8) +-52 + j*(-44) +86 + j*(341) +-48 + j*(-54) +-469 + j*(167) +-436 + j*(-108) +-132 + j*(-14) +-134 + j*(74) +364 + j*(258) +22 + j*(156) +-40 + j*(293) +41 + j*(98) +-83 + j*(-12) +117 + j*(59) +89 + j*(216) +-9 + j*(146) +40 + j*(-132) +35 + j*(-151) +-178 + j*(-33) +-194 + j*(-57) +-85 + j*(206) +-134 + j*(256) +110 + j*(214) +204 + j*(-109) +236 + j*(-13) +113 + j*(-40) +-409 + j*(52) +-37 + j*(223) +139 + j*(61) +-145 + j*(212) +-97 + j*(161) +340 + j*(-211) +-184 + j*(13) +235 + j*(-4) +-237 + j*(-257) +81 + j*(49) +196 + j*(79) +84 + j*(131) +6 + j*(-95) +-291 + j*(426) +221 + j*(89) +-31 + j*(116) +74 + j*(260) +-156 + j*(47) +-261 + j*(-265) +-8 + j*(-291) +23 + j*(129) +89 + j*(87) +71 + j*(-16) +217 + j*(293) +-402 + j*(-98) +-1 + j*(4) +84 + j*(-253) +39 + j*(108) +175 + j*(301) +-257 + j*(81) +-289 + j*(-86) +-313 + j*(-76) +39 + j*(-79) +146 + j*(136) +218 + j*(33) +-217 + j*(31) +-11 + j*(237) +-117 + j*(56) +130 + j*(100) +178 + j*(416) +99 + j*(84) +165 + j*(-202) +61 + j*(-320) +-215 + j*(186) +-78 + j*(220) +-235 + j*(-151) +-60 + j*(107) +-40 + j*(45) +-119 + j*(-298) +250 + j*(-164) +-129 + j*(-186) +247 + j*(182) +52 + j*(238) +-23 + j*(165) +122 + j*(78) +161 + j*(-262) +-313 + j*(44) +1 + j*(-35) +1 + j*(-36) +13 + j*(-135) +-223 + j*(-115) +-320 + j*(303) +-268 + j*(-66) +-19 + j*(52) +-12 + j*(-124) +-28 + j*(42) +219 + j*(-94) +-272 + j*(-265) +-114 + j*(-81) +-107 + j*(28) +-129 + j*(-131) +-139 + j*(-63) +55 + j*(-259) +241 + j*(-81) +-159 + j*(43) +-125 + j*(221) +119 + j*(-114) +95 + j*(-36) +-213 + j*(-377) +109 + j*(-205) +332 + j*(69) +71 + j*(-182) +-28 + j*(-100) +95 + j*(-33) +134 + j*(201) +-81 + j*(245) +-41 + j*(-175) +-55 + j*(-212) +235 + j*(-14) +123 + j*(21) +-86 + j*(207) +-156 + j*(71) +-115 + j*(363) +339 + j*(-28) +-325 + j*(262) +188 + j*(-102) +112 + j*(189) +19 + j*(-39) +35 + j*(-77) +181 + j*(-13) +-77 + j*(-12) +202 + j*(66) +-254 + j*(-63) +150 + j*(131) +-136 + j*(42) +-238 + j*(-233) +467 + j*(-366) +-125 + j*(202) +-333 + j*(52) +-27 + j*(-125) +-224 + j*(4) +-52 + j*(246) +362 + j*(-105) +-151 + j*(-169) +175 + j*(36) +-5 + j*(-147) +-59 + j*(23) +222 + j*(86) +-9 + j*(-178) +95 + j*(-159) +-40 + j*(-3) +298 + j*(158) +-94 + j*(354) +48 + j*(33) +-42 + j*(-237) +120 + j*(115) +-9 + j*(-30) +172 + j*(42) +158 + j*(153) +-320 + j*(-88) +22 + j*(-382) +-199 + j*(-37) +234 + j*(-310) +-208 + j*(2) +40 + j*(16) +309 + j*(-85) +123 + j*(-172) +77 + j*(77) +-30 + j*(135) +-95 + j*(-40) +72 + j*(-25) +-43 + j*(37) +237 + j*(-185) +-68 + j*(-187) +-298 + j*(55) +105 + j*(-116) +82 + j*(81) +-107 + j*(-53) +18 + j*(156) +-170 + j*(257) +-93 + j*(128) +70 + j*(83) +-8 + j*(-257) +-46 + j*(-182) +-496 + j*(-38) +-16 + j*(-24) +-5 + j*(-170) +152 + j*(-168) +-338 + j*(-136) +-75 + j*(104) +265 + j*(119) +-146 + j*(231) +-310 + j*(0) +-7 + j*(-157) +-48 + j*(-255) +254 + j*(-21) +134 + j*(-4) +-101 + j*(146) +-236 + j*(-372) +-164 + j*(32) +122 + j*(177) +-180 + j*(108) +57 + j*(-165) +-6 + j*(255) +-75 + j*(123) +13 + j*(100) +-170 + j*(-28) +-135 + j*(173) +83 + j*(151) +-379 + j*(16) +-8 + j*(44) +-325 + j*(57) +186 + j*(129) +46 + j*(-37) +-185 + j*(39) +45 + j*(8) +-170 + j*(156) +95 + j*(231) +180 + j*(-313) +-371 + j*(-122) +-106 + j*(112) +23 + j*(303) +-59 + j*(-170) +45 + j*(84) +62 + j*(169) +-292 + j*(-88) +60 + j*(-78) +-204 + j*(-129) +-61 + j*(18) +-118 + j*(-74) +-98 + j*(227) +170 + j*(201) +86 + j*(254) +119 + j*(98) +-173 + j*(129) +-62 + j*(71) +7 + j*(-236) +216 + j*(161) +-129 + j*(-50) +-182 + j*(43) +-54 + j*(-159) +113 + j*(-342) +107 + j*(-122) +-175 + j*(-31) +30 + j*(112) +42 + j*(-136) +123 + j*(-122) +46 + j*(-36) +22 + j*(-10) +124 + j*(356) +297 + j*(-171) +-27 + j*(284) +317 + j*(-117) +-34 + j*(-349) +177 + j*(16) +-259 + j*(112) +-161 + j*(-250) +-232 + j*(43) +-240 + j*(-83) +-162 + j*(370) +-13 + j*(253) +-77 + j*(-49) +-6 + j*(-209) +-88 + j*(219) +-211 + j*(107) +147 + j*(25) +-273 + j*(36) +-139 + j*(-117) +-177 + j*(52) +223 + j*(170) +139 + j*(-26) +168 + j*(-164) +124 + j*(143) +23 + j*(-224) +-54 + j*(-113) +243 + j*(-158) +-97 + j*(42) +-169 + j*(-34) +-30 + j*(110) +317 + j*(6) +173 + j*(317) +-210 + j*(-268) +-126 + j*(11) +56 + j*(-126) +78 + j*(-158) +-82 + j*(133) +-133 + j*(-240) +-180 + j*(-79) +-80 + j*(115) +-25 + j*(-201) +371 + j*(11) +-68 + j*(202) +-231 + j*(-102) +-69 + j*(-87) +-294 + j*(327) +-95 + j*(-16) +-231 + j*(-69) +53 + j*(240) +-58 + j*(84) +-94 + j*(90) +141 + j*(176) +-90 + j*(-110) +-153 + j*(-4) +-58 + j*(126) +-67 + j*(13) +92 + j*(-43) +-13 + j*(-36) +-139 + j*(-202) +-228 + j*(-331) +180 + j*(34) +-257 + j*(458) +-211 + j*(111) +-337 + j*(83) +40 + j*(-76) +40 + j*(-325) +-4 + j*(-22) +-124 + j*(2) +112 + j*(-317) +204 + j*(82) +-4 + j*(-29) +112 + j*(-193) +-70 + j*(-98) +-99 + j*(144) +241 + j*(3) +-74 + j*(-40) +224 + j*(148) +216 + j*(69) +36 + j*(-23) +-28 + j*(-166) +40 + j*(157) +198 + j*(52) +-225 + j*(69) +77 + j*(-260) +-32 + j*(-78) +-313 + j*(-35) +138 + j*(28) +-10 + j*(102) +92 + j*(-91) +267 + j*(-384) +148 + j*(211) +-44 + j*(170) +-30 + j*(207) +125 + j*(51) +175 + j*(-47) +-23 + j*(-171) +-165 + j*(-109) +176 + j*(83) +-62 + j*(148) +124 + j*(-119) +-121 + j*(-276) +54 + j*(-243) +-163 + j*(-109) +1 + j*(-34) +-83 + j*(182) +35 + j*(146) +322 + j*(53) +-175 + j*(34) +-156 + j*(-173) +83 + j*(428) +195 + j*(-110) +70 + j*(-187) +259 + j*(107) +99 + j*(233) +-73 + j*(-90) +-73 + j*(52) +48 + j*(327) +108 + j*(-49) +218 + j*(-158) +-22 + j*(-165) +296 + j*(-61) +-22 + j*(91) +-109 + j*(92) +26 + j*(-6) +-75 + j*(41) +52 + j*(187) +82 + j*(184) +42 + j*(116) +-71 + j*(228) +-72 + j*(190) +-218 + j*(-179) +156 + j*(284) +-151 + j*(0) +191 + j*(-107) +-35 + j*(-240) +245 + j*(-145) +-96 + j*(-74) +146 + j*(168) +-59 + j*(-107) +-114 + j*(115) +60 + j*(-71) +93 + j*(5) +46 + j*(142) +-16 + j*(63) +-232 + j*(151) +-312 + j*(-18) +182 + j*(-24) +227 + j*(221) +-200 + j*(-145) +251 + j*(254) +25 + j*(-163) +-110 + j*(-184) +-256 + j*(173) +-83 + j*(56) +184 + j*(-23) +-12 + j*(-21) +-228 + j*(15) +35 + j*(-117) +-6 + j*(25) +77 + j*(-12) +-243 + j*(-4) +29 + j*(-12) +-221 + j*(71) +-30 + j*(40) +100 + j*(-631) +-146 + j*(-156) +310 + j*(94) +33 + j*(76) +-184 + j*(168) +-2 + j*(56) +-76 + j*(57) +-37 + j*(93) +266 + j*(3) +127 + j*(-191) +284 + j*(-4) +63 + j*(248) +327 + j*(-94) +-276 + j*(119) +-351 + j*(2) +379 + j*(6) +-80 + j*(163) +135 + j*(59) +-156 + j*(0) +228 + j*(-18) +566 + j*(-95) +375 + j*(-13) +-68 + j*(-289) +-250 + j*(-154) +98 + j*(79) +-4 + j*(0) +-165 + j*(153) +-36 + j*(285) +70 + j*(-14) +-155 + j*(74) +45 + j*(8) +123 + j*(14) +-197 + j*(232) +-250 + j*(58) +-124 + j*(319) +125 + j*(0) +10 + j*(-142) +137 + j*(-70) +-180 + j*(146) +280 + j*(77) +-252 + j*(-92) +35 + j*(13) +-135 + j*(366) +104 + j*(37) +-84 + j*(-117) +11 + j*(-238) +74 + j*(-181) +134 + j*(21) +-64 + j*(-122) +-344 + j*(-146) +194 + j*(-158) +-59 + j*(-111) +-286 + j*(-121) +-225 + j*(71) +-93 + j*(-153) +94 + j*(21) +1 + j*(323) +1 + j*(138) +-59 + j*(-13) +5 + j*(-44) +-55 + j*(47) +-45 + j*(126) +-136 + j*(105) +-420 + j*(-415) +-1 + j*(-133) +-259 + j*(-263) +-106 + j*(-181) +-112 + j*(-18) +18 + j*(318) +-173 + j*(162) +-166 + j*(7) +11 + j*(-161) +326 + j*(3) +90 + j*(301) +-198 + j*(-94) +151 + j*(-48) +-272 + j*(103) +97 + j*(15) +-125 + j*(52) +378 + j*(-346) +40 + j*(-30) +-98 + j*(-186) +207 + j*(339) +42 + j*(-130) +-16 + j*(13) +-33 + j*(49) +140 + j*(193) +-49 + j*(233) +-106 + j*(-242) +-207 + j*(-18) +177 + j*(-38) +-520 + j*(-117) +60 + j*(40) +-327 + j*(279) +342 + j*(-58) +-39 + j*(-69) +-127 + j*(-42) +235 + j*(-59) +-267 + j*(46) +71 + j*(130) +-88 + j*(45) +282 + j*(-4) +219 + j*(-82) +-122 + j*(-25) +-76 + j*(169) +284 + j*(124) +4 + j*(-43) +83 + j*(-349) +43 + j*(342) +31 + j*(-173) +345 + j*(250) +-18 + j*(177) +-81 + j*(155) +355 + j*(156) +-93 + j*(-11) +141 + j*(3) +-83 + j*(77) +340 + j*(-164) +-117 + j*(59) +94 + j*(189) +127 + j*(-243) +-284 + j*(-161) +-19 + j*(-133) +182 + j*(86) +-153 + j*(97) +-16 + j*(-69) +197 + j*(-16) +-18 + j*(29) +8 + j*(-72) +-95 + j*(312) +-76 + j*(-127) +93 + j*(-103) +-127 + j*(16) +78 + j*(329) +-69 + j*(111) +182 + j*(192) +43 + j*(-180) +-77 + j*(81) +-91 + j*(-274) +-136 + j*(57) +29 + j*(-122) +291 + j*(-81) +-227 + j*(127) +-165 + j*(227) +61 + j*(-100) +-80 + j*(-31) +-211 + j*(-145) +-168 + j*(-113) +-40 + j*(68) +259 + j*(121) +111 + j*(-69) +245 + j*(47) +11 + j*(-61) +-136 + j*(104) +3 + j*(-161) +-105 + j*(-15) +122 + j*(-453) +-36 + j*(-18) +-148 + j*(243) +78 + j*(-107) +181 + j*(276) +276 + j*(-42) +179 + j*(-117) +-103 + j*(397) +250 + j*(-53) +-25 + j*(184) +108 + j*(-56) +171 + j*(-1) +217 + j*(178) +-149 + j*(-189) +-134 + j*(-218) +76 + j*(402) +-10 + j*(139) +100 + j*(236) +61 + j*(-177) +27 + j*(9) +151 + j*(38) +-110 + j*(-92) +222 + j*(-115) +118 + j*(-158) +94 + j*(118) +494 + j*(197) +-16 + j*(-27) +-307 + j*(-13) +-81 + j*(262) +231 + j*(192) +278 + j*(21) +56 + j*(-35) +-328 + j*(316) +130 + j*(32) +-37 + j*(209) +306 + j*(51) +113 + j*(114) +-228 + j*(-101) +-45 + j*(22) +-106 + j*(-86) +-188 + j*(-74) +124 + j*(57) +-70 + j*(-83) +-216 + j*(-23) +-87 + j*(-109) +97 + j*(-263) +78 + j*(90) +-15 + j*(256) +-103 + j*(350) +21 + j*(-25) +32 + j*(115) +76 + j*(-270) +190 + j*(-41) +8 + j*(195) +127 + j*(-100) +-8 + j*(-132) +253 + j*(-117) +-100 + j*(5) +-57 + j*(-319) +-18 + j*(82) +163 + j*(231) +-127 + j*(-271) +-74 + j*(-243) +39 + j*(-278) +-88 + j*(179) +-100 + j*(-33) +-373 + j*(-333) +-182 + j*(-299) +-117 + j*(-78) +34 + j*(-185) +-117 + j*(155) +-28 + j*(56) +-161 + j*(-70) +-97 + j*(-310) +-30 + j*(13) +-254 + j*(33) +119 + j*(8) +333 + j*(46) +-383 + j*(27) +83 + j*(188) +73 + j*(-217) +59 + j*(60) +-166 + j*(266) +-177 + j*(123) +-356 + j*(-55) +-339 + j*(-30) +-143 + j*(49) +105 + j*(-224) +-173 + j*(305) +-35 + j*(202) +-185 + j*(-152) +-221 + j*(132) +-244 + j*(-58) +104 + j*(276) +-182 + j*(21) +117 + j*(-134) +285 + j*(-66) +33 + j*(-86) +91 + j*(-28) +6 + j*(50) +83 + j*(-8) +-185 + j*(60) +-32 + j*(-94) +-179 + j*(9) +-323 + j*(136) +15 + j*(-417) +197 + j*(-105) +-71 + j*(74) +6 + j*(-117) +184 + j*(407) +123 + j*(-37) +57 + j*(12) +-52 + j*(168) +-188 + j*(-119) +28 + j*(-129) +-78 + j*(-1) +-104 + j*(-83) +1 + j*(-223) +-468 + j*(42) +157 + j*(52) +-144 + j*(-72) +75 + j*(296) +45 + j*(-285) +-221 + j*(301) +-103 + j*(163) +-341 + j*(-457) +105 + j*(23) +-23 + j*(-88) +-264 + j*(-552) +81 + j*(4) +-274 + j*(-131) +214 + j*(-18) +151 + j*(-214) +-1 + j*(-205) +103 + j*(-49) +81 + j*(-8) +-80 + j*(16) +246 + j*(-183) +136 + j*(-100) +35 + j*(-69) +-217 + j*(254) +252 + j*(-156) +-47 + j*(-160) +-162 + j*(167) +-148 + j*(-201) +265 + j*(-240) +-141 + j*(-8) +35 + j*(33) +-99 + j*(-95) +-4 + j*(124) +65 + j*(-206) +-175 + j*(279) +-1 + j*(114) +-52 + j*(71) +-103 + j*(47) +-164 + j*(-41) +206 + j*(216) +-148 + j*(19) +-161 + j*(-187) +-200 + j*(223) +131 + j*(238) +18 + j*(101) +229 + j*(22) +71 + j*(53) +509 + j*(-293) +139 + j*(161) +-322 + j*(180) +119 + j*(196) +12 + j*(103) +10 + j*(-187) +104 + j*(-28) +82 + j*(50) +86 + j*(125) +117 + j*(59) +-225 + j*(129) +167 + j*(-177) +-125 + j*(-100) +-178 + j*(-124) +-144 + j*(-262) +457 + j*(-237) +-267 + j*(22) +240 + j*(22) +155 + j*(89) +-6 + j*(-361) +266 + j*(-358) +-180 + j*(110) +-73 + j*(69) +-42 + j*(93) +-257 + j*(-151) +3 + j*(141) +192 + j*(356) +26 + j*(-76) +103 + j*(340) +83 + j*(70) +75 + j*(-245) +206 + j*(340) +-144 + j*(360) +344 + j*(76) +-74 + j*(325) +-7 + j*(208) +-238 + j*(-206) +25 + j*(83) +57 + j*(-286) +-82 + j*(232) +251 + j*(-76) +-218 + j*(-234) +-170 + j*(-219) +-75 + j*(-252) +-112 + j*(259) +24 + j*(31) +-226 + j*(59) +-67 + j*(-4) +-344 + j*(-240) +-86 + j*(143) +37 + j*(-59) +54 + j*(-173) +-264 + j*(-52) +78 + j*(104) +-337 + j*(-103) +115 + j*(-144) +228 + j*(4) +93 + j*(-54) +15 + j*(-245) +118 + j*(-70) +-8 + j*(-69) +195 + j*(-202) +110 + j*(172) +-214 + j*(-326) +-74 + j*(199) +81 + j*(124) +59 + j*(141) +88 + j*(-178) +-28 + j*(22) +132 + j*(144) +71 + j*(-90) +101 + j*(-243) +-191 + j*(32) +-12 + j*(-52) +134 + j*(18) +-416 + j*(338) +98 + j*(-92) +-122 + j*(-18) +-123 + j*(-100) +-405 + j*(86) +59 + j*(260) +-272 + j*(201) +-129 + j*(320) +-214 + j*(35) +-24 + j*(9) +-137 + j*(88) +-46 + j*(-113) +-99 + j*(105) +-4 + j*(51) +-59 + j*(-19) +267 + j*(56) +77 + j*(-30) +66 + j*(61) +6 + j*(-23) +0 + j*(198) +-4 + j*(-117) +-58 + j*(5) +-141 + j*(143) +-4 + j*(100) +-150 + j*(-117) +88 + j*(-301) +-90 + j*(-31) +247 + j*(58) +-84 + j*(-112) +387 + j*(-145) +-50 + j*(-57) +-117 + j*(-25) +-103 + j*(102) +113 + j*(294) +248 + j*(142) +-61 + j*(-134) +-152 + j*(129) +106 + j*(-170) +-332 + j*(-23) +-168 + j*(206) +240 + j*(36) +-196 + j*(-146) +-400 + j*(67) +40 + j*(-26) +110 + j*(213) +-288 + j*(252) +53 + j*(206) +253 + j*(-489) +-428 + j*(390) +-426 + j*(339) +162 + j*(-463) +278 + j*(159) +-35 + j*(426) +-375 + j*(323) +-243 + j*(186) +230 + j*(325) +-340 + j*(-334) +-193 + j*(148) +-640 + j*(75) +-14 + j*(106) +-49 + j*(233) +93 + j*(225) +-23 + j*(-235) +-560 + j*(-476) +-494 + j*(412) +302 + j*(424) +122 + j*(255) +-317 + j*(320) +-47 + j*(-134) +-411 + j*(412) +-241 + j*(107) +-639 + j*(-566) +427 + j*(-136) +-165 + j*(-217) +515 + j*(471) +-91 + j*(-151) +405 + j*(221) +139 + j*(-260) +-82 + j*(151) +228 + j*(514) +-165 + j*(231) +425 + j*(-11) +-210 + j*(117) +-475 + j*(247) +-291 + j*(500) +18 + j*(-106) +443 + j*(57) +-283 + j*(348) +226 + j*(-305) +-211 + j*(-33) +412 + j*(-233) +-272 + j*(237) +-378 + j*(8) +299 + j*(-136) +182 + j*(-98) +-489 + j*(183) +41 + j*(286) +-64 + j*(226) +102 + j*(351) +375 + j*(471) +-121 + j*(252) +310 + j*(-366) +194 + j*(-442) +67 + j*(-332) +190 + j*(-188) +467 + j*(-81) +-313 + j*(-344) +-49 + j*(-161) +-589 + j*(85) +-91 + j*(187) +127 + j*(11) +-212 + j*(551) +350 + j*(7) +170 + j*(327) +-387 + j*(-363) +-190 + j*(-612) +207 + j*(319) +-121 + j*(315) +-401 + j*(161) +-432 + j*(209) +-467 + j*(-334) +276 + j*(90) +185 + j*(-222) +-506 + j*(490) +-455 + j*(-293) +-49 + j*(-448) +224 + j*(293) +427 + j*(-559) +-267 + j*(-164) +-23 + j*(-156) +-324 + j*(-267) +-215 + j*(-33) +98 + j*(-173) +-209 + j*(-255) +-197 + j*(431) +238 + j*(367) +47 + j*(-198) +-308 + j*(-1) +-173 + j*(119) +-134 + j*(-357) +-186 + j*(71) +198 + j*(-59) +66 + j*(298) +-412 + j*(45) +416 + j*(426) +127 + j*(231) +285 + j*(-231) +81 + j*(-380) +228 + j*(52) +-291 + j*(436) +-28 + j*(91) +331 + j*(-356) +-12 + j*(800) +-144 + j*(303) +-334 + j*(206) +316 + j*(250) +272 + j*(-503) +-192 + j*(-511) +298 + j*(-80) +23 + j*(-566) +480 + j*(-347) +222 + j*(-330) +148 + j*(256) +505 + j*(-419) +270 + j*(-203) +409 + j*(-450) +-115 + j*(325) +-101 + j*(-471) +-74 + j*(23) +-163 + j*(-351) +-3 + j*(354) +8 + j*(-183) +-196 + j*(132) +329 + j*(-443) +342 + j*(334) +-338 + j*(-366) +-143 + j*(-636) +464 + j*(-245) +-168 + j*(204) +216 + j*(252) +252 + j*(-243) +-81 + j*(342) +-196 + j*(233) +277 + j*(-301) +367 + j*(-276) +59 + j*(58) +163 + j*(398) +-68 + j*(144) +47 + j*(335) +504 + j*(-647) +-169 + j*(-404) +343 + j*(-343) +-452 + j*(90) +-189 + j*(175) +-70 + j*(322) +354 + j*(-152) +422 + j*(262) +-247 + j*(-209) +569 + j*(157) +75 + j*(-52) +-169 + j*(-175) +-334 + j*(16) +177 + j*(605) +434 + j*(-502) +-339 + j*(37) +57 + j*(-246) +437 + j*(249) +-235 + j*(-141) +-247 + j*(-356) +-54 + j*(-366) +-305 + j*(-142) +-237 + j*(164) +8 + j*(-373) +204 + j*(107) +-617 + j*(136) +429 + j*(-337) +-337 + j*(-326) +506 + j*(477) +161 + j*(-22) +149 + j*(231) +202 + j*(-274) +-176 + j*(-391) +-252 + j*(-400) +-28 + j*(167) +256 + j*(-452) +419 + j*(188) +-142 + j*(-805) +417 + j*(-392) +10 + j*(197) +-335 + j*(105) +-114 + j*(149) +-170 + j*(265) +-387 + j*(-233) +-444 + j*(-151) +119 + j*(451) +270 + j*(422) +591 + j*(-421) +-250 + j*(-196) +62 + j*(-338) +266 + j*(28) +-476 + j*(69) +71 + j*(-97) +-52 + j*(-268) +-136 + j*(-214) +223 + j*(633) +-518 + j*(220) +595 + j*(184) +160 + j*(124) +-304 + j*(-202) +246 + j*(187) +64 + j*(300) +368 + j*(108) +255 + j*(-130) +-220 + j*(-389) +-424 + j*(41) +508 + j*(16) +-334 + j*(-446) +-89 + j*(81) +-685 + j*(169) +273 + j*(-25) +110 + j*(374) +355 + j*(250) +-29 + j*(-200) +-298 + j*(-629) +-508 + j*(144) +319 + j*(-343) +103 + j*(-57) +-59 + j*(373) +282 + j*(-14) +-102 + j*(350) +147 + j*(14) +-185 + j*(35) +-260 + j*(220) +-337 + j*(-359) +357 + j*(182) +192 + j*(-279) +-293 + j*(-5) +257 + j*(217) +247 + j*(-105) +-5 + j*(-358) +252 + j*(-95) +69 + j*(-534) +-95 + j*(-283) +147 + j*(-37) +170 + j*(409) +394 + j*(452) +-110 + j*(-421) +-257 + j*(190) +-450 + j*(-209) +77 + j*(-546) +161 + j*(16) +337 + j*(-32) +543 + j*(145) +-306 + j*(-438) +-64 + j*(159) +-234 + j*(-197) +-445 + j*(-51) +-208 + j*(-62) +-275 + j*(228) +-445 + j*(-221) +524 + j*(-37) +204 + j*(516) +246 + j*(-404) +624 + j*(-243) +-118 + j*(264) +61 + j*(194) +-132 + j*(-127) +220 + j*(298) +-222 + j*(-282) +167 + j*(-286) +330 + j*(466) +501 + j*(0) +620 + j*(414) +134 + j*(-269) +-212 + j*(193) +373 + j*(-335) +-107 + j*(40) +342 + j*(-279) +-286 + j*(138) +190 + j*(238) +-321 + j*(-240) +-409 + j*(-247) +371 + j*(505) +247 + j*(272) +-223 + j*(-23) +111 + j*(349) +-177 + j*(306) +466 + j*(92) +-267 + j*(322) +301 + j*(231) +460 + j*(-168) +-155 + j*(-254) +-320 + j*(-181) +50 + j*(-330) +283 + j*(-357) +163 + j*(-354) +67 + j*(379) +-105 + j*(-199) +245 + j*(-296) +387 + j*(371) +56 + j*(57) +453 + j*(279) +-324 + j*(33) +-327 + j*(-474) +-238 + j*(308) +-28 + j*(-187) +-252 + j*(-229) +165 + j*(194) +509 + j*(434) +-337 + j*(518) +3 + j*(-243) +275 + j*(378) +237 + j*(-86) +245 + j*(192) +225 + j*(-257) +-325 + j*(-468) +-482 + j*(291) +-266 + j*(63) +-496 + j*(315) +408 + j*(-185) +-536 + j*(102) +-320 + j*(-224) +-404 + j*(16) +302 + j*(246) +-263 + j*(19) +308 + j*(-209) +8 + j*(363) +-605 + j*(-448) +266 + j*(347) +602 + j*(-82) +-276 + j*(-238) +296 + j*(111) +293 + j*(-229) +-233 + j*(-84) +186 + j*(-148) +193 + j*(365) +99 + j*(-303) +117 + j*(454) +-98 + j*(288) +-508 + j*(-424) +-370 + j*(650) +324 + j*(375) +415 + j*(-221) +-211 + j*(40) +258 + j*(-7) +-519 + j*(-225) +-303 + j*(112) +247 + j*(-286) +303 + j*(-456) +179 + j*(244) +29 + j*(-155) +321 + j*(458) +144 + j*(226) +-195 + j*(-434) +-52 + j*(-276) +-339 + j*(203) +-531 + j*(35) +-82 + j*(57) +-717 + j*(-362) +-407 + j*(227) +257 + j*(343) +140 + j*(-224) +403 + j*(195) +-177 + j*(469) +158 + j*(-312) +15 + j*(-269) +-363 + j*(262) +-36 + j*(-339) +342 + j*(-153) +-56 + j*(696) +298 + j*(197) +-93 + j*(134) +-14 + j*(501) +511 + j*(228) +-98 + j*(269) +235 + j*(417) +274 + j*(-367) +-327 + j*(228) +-27 + j*(148) +404 + j*(-207) +411 + j*(332) +449 + j*(276) +716 + j*(725) +42 + j*(429) +-163 + j*(527) +156 + j*(274) +-593 + j*(-375) +496 + j*(419) +277 + j*(-330) +513 + j*(-36) +175 + j*(-386) +134 + j*(-376) +-95 + j*(-299) +-179 + j*(57) +465 + j*(416) +342 + j*(317) +158 + j*(47) +-141 + j*(248) +-173 + j*(206) +-394 + j*(119) +392 + j*(136) +-315 + j*(195) +335 + j*(450) +176 + j*(8) +613 + j*(-317) +150 + j*(-186) +-403 + j*(-643) +133 + j*(-279) +41 + j*(-164) +276 + j*(-46) +298 + j*(396) +-260 + j*(-488) +-390 + j*(114) +32 + j*(375) +-470 + j*(216) +585 + j*(298) +-443 + j*(-373) +251 + j*(306) +-372 + j*(318) +-371 + j*(408) +-92 + j*(-80) +-286 + j*(14) +-351 + j*(59) +-21 + j*(366) +-197 + j*(-182) +-267 + j*(-47) +177 + j*(-265) +-443 + j*(-212) +470 + j*(0) +90 + j*(315) +-68 + j*(-222) +-506 + j*(-289) +-236 + j*(-293) +131 + j*(-98) +-257 + j*(174) +-37 + j*(-494) +-486 + j*(35) +195 + j*(-247) +325 + j*(-836) +-73 + j*(-497) +-91 + j*(531) +642 + j*(-362) +344 + j*(124) +-120 + j*(-199) +-50 + j*(-488) +1 + j*(-345) +285 + j*(103) +206 + j*(452) +176 + j*(433) +-323 + j*(427) +-442 + j*(340) +-362 + j*(-361) +417 + j*(-184) +-148 + j*(251) +-289 + j*(-111) +-426 + j*(-202) +-597 + j*(-365) +409 + j*(199) +227 + j*(339) +-284 + j*(-69) +282 + j*(-156) +40 + j*(473) +-271 + j*(-76) +-228 + j*(-424) +-44 + j*(-64) +28 + j*(371) +494 + j*(-400) +-192 + j*(368) +199 + j*(211) +-148 + j*(-41) +77 + j*(-412) +13 + j*(139) +350 + j*(-71) +40 + j*(117) +-59 + j*(320) +240 + j*(-369) +193 + j*(180) +25 + j*(-484) +416 + j*(-252) +323 + j*(-39) +201 + j*(-394) +-221 + j*(351) +375 + j*(-190) +249 + j*(562) +197 + j*(-238) +235 + j*(336) +296 + j*(-149) +-493 + j*(-477) +310 + j*(-543) +495 + j*(38) +-320 + j*(308) +-496 + j*(130) +-392 + j*(-78) +-478 + j*(103) +-346 + j*(-525) +-134 + j*(-368) +-247 + j*(-150) +-472 + j*(-18) +-354 + j*(40) +349 + j*(131) +-284 + j*(312) +308 + j*(189) +67 + j*(-427) +-1 + j*(-159) +362 + j*(-454) +219 + j*(262) +-53 + j*(-28) +-501 + j*(-225) +-359 + j*(547) +369 + j*(315) +-344 + j*(-361) +-492 + j*(403) +500 + j*(-291) +260 + j*(191) +194 + j*(-170) +324 + j*(280) +595 + j*(120) +185 + j*(123) +222 + j*(670) +-309 + j*(219) +-237 + j*(-138) +338 + j*(-388) +-223 + j*(100) +-140 + j*(-430) +685 + j*(115) +339 + j*(-9) +-100 + j*(-745) +-561 + j*(-101) +360 + j*(446) +191 + j*(-467) +-243 + j*(-378) +-107 + j*(-345) +21 + j*(620) +-223 + j*(-322) +409 + j*(-306) +-23 + j*(499) +-259 + j*(-576) +493 + j*(658) +180 + j*(118) +-378 + j*(198) +378 + j*(-53) +-554 + j*(-61) +-305 + j*(305) +95 + j*(415) +455 + j*(-305) +-275 + j*(-77) +390 + j*(-62) +-15 + j*(151) +-238 + j*(191) +-94 + j*(390) +369 + j*(262) +441 + j*(67) +439 + j*(-121) +315 + j*(66) +282 + j*(216) +-193 + j*(-280) +-194 + j*(625) +-240 + j*(231) +-228 + j*(68) +245 + j*(144) +-467 + j*(64) +23 + j*(523) +46 + j*(-216) +-248 + j*(390) +98 + j*(462) +-378 + j*(329) +410 + j*(211) +-81 + j*(277) +293 + j*(-16) +204 + j*(-506) +-78 + j*(151) +-88 + j*(455) +242 + j*(-62) +-426 + j*(-105) +-320 + j*(221) +84 + j*(-386) +398 + j*(565) +50 + j*(248) +-254 + j*(-37) +-179 + j*(479) +-59 + j*(30) +-225 + j*(253) +630 + j*(-185) +-76 + j*(-363) +136 + j*(-498) +289 + j*(-79) +315 + j*(-177) +367 + j*(60) +-131 + j*(-190) +-482 + j*(-127) +-68 + j*(220) +204 + j*(16) +-175 + j*(45) +421 + j*(180) +231 + j*(-324) +93 + j*(334) +-344 + j*(-599) +-257 + j*(-276) +-134 + j*(-98) +384 + j*(-203) +290 + j*(-177) +-82 + j*(-226) +-367 + j*(-1) +154 + j*(-307) +-155 + j*(576) +216 + j*(279) +229 + j*(196) +35 + j*(138) +-52 + j*(-210) +24 + j*(231) +153 + j*(-117) +-125 + j*(-174) +23 + j*(-64) +-96 + j*(-199) +-167 + j*(16) +158 + j*(93) +-180 + j*(-331) +-42 + j*(-5) +6 + j*(521) +-161 + j*(197) +-6 + j*(-6) +268 + j*(107) +-275 + j*(156) +245 + j*(-13) +-52 + j*(-217) +-221 + j*(355) +84 + j*(-42) +31 + j*(-204) +-117 + j*(523) +211 + j*(268) +-86 + j*(104) +-181 + j*(-62) +-45 + j*(-198) +141 + j*(82) +-373 + j*(122) +-151 + j*(5) +-33 + j*(-191) +69 + j*(21) +-124 + j*(30) +-153 + j*(-206) +-49 + j*(-235) +-246 + j*(-214) +-224 + j*(-144) +-77 + j*(-115) +-242 + j*(-233) +56 + j*(127) +-137 + j*(-156) +-108 + j*(-163) +-60 + j*(-140) +-91 + j*(73) +-85 + j*(-101) +-141 + j*(30) +-144 + j*(34) +82 + j*(-5) +52 + j*(187) +-285 + j*(-59) +62 + j*(271) +-29 + j*(-113) +-1 + j*(225) +101 + j*(-23) +-143 + j*(196) +-168 + j*(158) +-211 + j*(-158) +71 + j*(-28) +-115 + j*(-99) +-49 + j*(-183) +-58 + j*(8) +-187 + j*(303) +-6 + j*(-127) +188 + j*(-136) +-66 + j*(-156) +134 + j*(-123) +-78 + j*(41) +-134 + j*(-218) +-33 + j*(194) +-33 + j*(-91) +15 + j*(326) +187 + j*(336) +9 + j*(21) +143 + j*(-202) +64 + j*(388) +-179 + j*(-59) +149 + j*(-228) +62 + j*(255) +-161 + j*(-35) +-98 + j*(-286) +-282 + j*(243) +-2 + j*(112) +-168 + j*(-325) +-197 + j*(180) +182 + j*(-438) +-193 + j*(-105) +103 + j*(-26) +168 + j*(135) +-91 + j*(266) +-94 + j*(-79) +165 + j*(228) +215 + j*(-136) +-76 + j*(-318) +-177 + j*(-263) +-272 + j*(156) +337 + j*(-240) +310 + j*(95) +116 + j*(-1) +243 + j*(-195) +223 + j*(-48) +-231 + j*(-1) +16 + j*(21) +-153 + j*(66) +16 + j*(176) +-52 + j*(136) +144 + j*(-22) +89 + j*(-197) +161 + j*(252) +-122 + j*(-67) +-258 + j*(127) +-168 + j*(-146) +-155 + j*(-39) +101 + j*(303) +60 + j*(-25) +-305 + j*(67) +-253 + j*(-231) +91 + j*(-173) +71 + j*(81) +23 + j*(186) +-260 + j*(208) +-2 + j*(149) +-95 + j*(-175) +21 + j*(204) +402 + j*(-2) +-8 + j*(-16) +-175 + j*(150) +45 + j*(-235) +200 + j*(260) +-375 + j*(-325) +179 + j*(166) +152 + j*(246) +6 + j*(80) +212 + j*(-17) +-207 + j*(125) +-6 + j*(12) +119 + j*(61) +-115 + j*(320) +35 + j*(342) +-184 + j*(-132) +62 + j*(-43) +-151 + j*(125) +117 + j*(-96) +2 + j*(59) +-90 + j*(-66) +-18 + j*(239) +-175 + j*(-296) +112 + j*(-147) +68 + j*(92) +61 + j*(-134) +8 + j*(-170) +59 + j*(225) +150 + j*(135) +-108 + j*(-182) +120 + j*(340) +-10 + j*(-316) +54 + j*(4) +-40 + j*(29) +7 + j*(58) +-280 + j*(143) +-206 + j*(197) +-183 + j*(181) +-90 + j*(177) +-115 + j*(26) +-42 + j*(168) +-34 + j*(-195) +32 + j*(125) +272 + j*(-323) +-118 + j*(22) +125 + j*(-72) +-164 + j*(296) +260 + j*(37) +133 + j*(228) +30 + j*(-123) +90 + j*(167) +39 + j*(83) +63 + j*(445) +7 + j*(-14) +-21 + j*(83) +-139 + j*(302) +-600 + j*(137) +-149 + j*(-34) +305 + j*(-392) +208 + j*(151) +26 + j*(16) +135 + j*(-170) +-183 + j*(215) +-78 + j*(1) +-131 + j*(206) +202 + j*(356) +187 + j*(-204) +147 + j*(-86) +283 + j*(107) +30 + j*(-57) +182 + j*(36) +-154 + j*(-84) +24 + j*(36) +124 + j*(52) +-237 + j*(114) +-218 + j*(39) +-40 + j*(-302) +-456 + j*(4) +136 + j*(63) +-20 + j*(33) +81 + j*(-118) +-52 + j*(140) +46 + j*(56) +146 + j*(-45) +-85 + j*(-44) +33 + j*(-86) +-76 + j*(-269) +143 + j*(91) +-121 + j*(23) +12 + j*(93) +-57 + j*(-215) +47 + j*(-370) +317 + j*(22) +-103 + j*(16) +179 + j*(-135) +57 + j*(0) +-30 + j*(88) +131 + j*(-74) +207 + j*(-72) +-234 + j*(179) +-226 + j*(-16) +226 + j*(161) +143 + j*(108) +-95 + j*(-100) +-24 + j*(-88) +380 + j*(102) +187 + j*(57) +-23 + j*(188) +174 + j*(-252) +93 + j*(498) +194 + j*(196) +72 + j*(-33) +-112 + j*(20) +-106 + j*(-163) +-93 + j*(-49) +98 + j*(100) +-79 + j*(-144) +-322 + j*(-298) +-160 + j*(-301) +144 + j*(-13) +262 + j*(-20) +-250 + j*(-38) +59 + j*(-44) +-1 + j*(219) +234 + j*(-99) +-3 + j*(-152) +160 + j*(-97) +359 + j*(152) +-6 + j*(-20) +-209 + j*(183) +-36 + j*(192) +-5 + j*(74) +-171 + j*(-285) +11 + j*(49) +-6 + j*(103) +18 + j*(147) +-27 + j*(161) +4 + j*(-77) +193 + j*(-27) +81 + j*(89) +-20 + j*(140) +-253 + j*(-40) +246 + j*(104) +83 + j*(87) +160 + j*(-54) +277 + j*(4) +129 + j*(-228) +89 + j*(-37) +222 + j*(-259) +4 + j*(-252) +-135 + j*(-66) +-7 + j*(228) +190 + j*(133) +-67 + j*(-235) +157 + j*(-184) +126 + j*(-25) +-321 + j*(46) +-291 + j*(-25) +-365 + j*(-303) +83 + j*(-93) +-286 + j*(77) +-1 + j*(-198) +-246 + j*(-414) +64 + j*(-129) +142 + j*(105) +188 + j*(-168) +-139 + j*(-209) +-58 + j*(330) +-16 + j*(-140) +-33 + j*(157) +-77 + j*(-275) +-151 + j*(-147) +-37 + j*(-271) +206 + j*(254) +419 + j*(39) +156 + j*(-215) +-33 + j*(86) +164 + j*(-355) +-202 + j*(231) +-162 + j*(-66) +-112 + j*(-197) +-72 + j*(-170) +-66 + j*(-123) +70 + j*(245) +-182 + j*(-83) +173 + j*(-288) +148 + j*(158) +38 + j*(324) +67 + j*(-69) +18 + j*(-21) +49 + j*(-88) +54 + j*(-108) +-49 + j*(200) +-228 + j*(-81) +-436 + j*(-100) +-21 + j*(-150) +-58 + j*(-40) +368 + j*(-151) +-32 + j*(-195) +30 + j*(-35) +190 + j*(21) +191 + j*(-153) +-322 + j*(95) +-42 + j*(-115) +103 + j*(-181) +-110 + j*(183) +76 + j*(-199) +-103 + j*(285) +81 + j*(271) +214 + j*(81) +10 + j*(6) +19 + j*(7) +149 + j*(42) +-22 + j*(10) +211 + j*(-118) +126 + j*(-46) +276 + j*(163) +86 + j*(155) +-108 + j*(19) +-16 + j*(-174) +104 + j*(-542) +70 + j*(125) +168 + j*(128) +-215 + j*(305) +-2 + j*(35) +-87 + j*(150) +50 + j*(-389) +111 + j*(136) +-211 + j*(-159) +-20 + j*(-172) +240 + j*(-195) +205 + j*(57) +-98 + j*(43) +194 + j*(-65) +-37 + j*(153) +30 + j*(123) +-52 + j*(29) +-266 + j*(8) +-146 + j*(-105) +158 + j*(15) +69 + j*(-259) +304 + j*(176) +96 + j*(160) +-39 + j*(-62) +5 + j*(80) +-24 + j*(214) +152 + j*(61) +119 + j*(-291) +-44 + j*(168) +48 + j*(431) +-17 + j*(66) +-4 + j*(264) +-88 + j*(33) +-160 + j*(-226) +-238 + j*(-113) +42 + j*(-112) +75 + j*(30) +130 + j*(-27) +100 + j*(175) +106 + j*(-87) +-320 + j*(-256) +122 + j*(-37) +-141 + j*(-22) +80 + j*(-106) +301 + j*(-71) +117 + j*(-21) +93 + j*(419) +46 + j*(-291) +-59 + j*(-177) +-76 + j*(47) +-64 + j*(-56) +-12 + j*(74) +-79 + j*(-18) +214 + j*(-89) +122 + j*(-144) +-142 + j*(-150) +-199 + j*(-298) +13 + j*(-134) +-366 + j*(21) +-2 + j*(-26) +-30 + j*(139) +-328 + j*(-211) +-141 + j*(235) +253 + j*(-21) +-219 + j*(-209) +-71 + j*(-62) +82 + j*(-146) +-127 + j*(261) +-319 + j*(-255) +-121 + j*(86) +585 + j*(32) +-54 + j*(-60) +282 + j*(58) +-122 + j*(221) +84 + j*(110) +-153 + j*(1) +44 + j*(209) +229 + j*(110) +313 + j*(69) +202 + j*(-211) +39 + j*(21) +194 + j*(177) +209 + j*(69) +-30 + j*(-167) +127 + j*(38) +-177 + j*(11) +-41 + j*(86) +-15 + j*(243) +78 + j*(11) +-79 + j*(-228) +-116 + j*(-86) +23 + j*(47) +383 + j*(73) +203 + j*(-68) +111 + j*(140) +-63 + j*(68) +-82 + j*(-229) +-157 + j*(-313) +-190 + j*(279) +-104 + j*(61) +-180 + j*(-204) +265 + j*(-153) +-42 + j*(-48) +100 + j*(172) +-147 + j*(-308) +267 + j*(54) +-112 + j*(272) +-264 + j*(-36) +29 + j*(-332) +140 + j*(-86) +400 + j*(-38) +-121 + j*(-231) +-42 + j*(344) +129 + j*(-81) +-111 + j*(226) +3 + j*(150) +-37 + j*(18) +0 + j*(-82) +153 + j*(151) +81 + j*(91) +-136 + j*(184) +503 + j*(-113) +-49 + j*(319) +70 + j*(77) +197 + j*(-66) +-62 + j*(149) +254 + j*(-122) +45 + j*(-32) +3 + j*(9) +25 + j*(89) +6 + j*(-45) +-22 + j*(161) +-40 + j*(83) +103 + j*(23) +110 + j*(278) +8 + j*(-61) +-57 + j*(37) +-99 + j*(86) +-64 + j*(339) +-37 + j*(214) +-84 + j*(6) +303 + j*(-178) +205 + j*(97) +11 + j*(194) +129 + j*(11) +687 + j*(-100) +187 + j*(-238) +40 + j*(-74) +332 + j*(-25) +-94 + j*(165) +64 + j*(246) +-291 + j*(-108) +-121 + j*(-284) +216 + j*(-104) +159 + j*(23) +75 + j*(-47) +70 + j*(4) +-10 + j*(-34) +-155 + j*(34) +-35 + j*(89) +-13 + j*(-134) +-99 + j*(40) +-463 + j*(-13) +-252 + j*(172) +-22 + j*(-351) +-69 + j*(88) +-284 + j*(-21) +13 + j*(-6) +-35 + j*(-71) +-40 + j*(317) +405 + j*(-60) +-358 + j*(104) +56 + j*(-119) +-135 + j*(-156) +-66 + j*(-23) +168 + j*(59) +148 + j*(-76) +-213 + j*(-190) +-190 + j*(-27) +103 + j*(392) +52 + j*(110) +211 + j*(-61) +-165 + j*(218) +3 + j*(-231) +69 + j*(-161) +-263 + j*(54) +98 + j*(-191) +30 + j*(167) +45 + j*(9) +-373 + j*(181) +69 + j*(105) +-23 + j*(-100) +-127 + j*(-9) +-64 + j*(287) +202 + j*(290) +115 + j*(-109) +-72 + j*(-205) +166 + j*(238) +151 + j*(-25) +186 + j*(290) +-108 + j*(33) +-163 + j*(-180) +148 + j*(124) +94 + j*(-270) +-52 + j*(27) +161 + j*(134) +-61 + j*(-25) +-23 + j*(-233) +93 + j*(-245) +57 + j*(162) +-172 + j*(-354) +133 + j*(129) +339 + j*(107) +12 + j*(65) +6 + j*(-80) +-51 + j*(-17) +-13 + j*(-37) +-18 + j*(-258) +-54 + j*(-141) +295 + j*(6) +-215 + j*(-192) +-109 + j*(-73) +105 + j*(43) +-277 + j*(-251) +57 + j*(188) +-38 + j*(390) +-117 + j*(-390) +107 + j*(233) +131 + j*(98) +366 + j*(-215) +-136 + j*(-154) +45 + j*(-112) +-10 + j*(-6) +27 + j*(-114) +-119 + j*(8) +-163 + j*(-4) +78 + j*(261) +221 + j*(-37) +-92 + j*(-23) +4 + j*(221) +-2 + j*(-153) +-76 + j*(-158) +66 + j*(141) +-182 + j*(136) +-446 + j*(-88) +71 + j*(-145) +-75 + j*(-87) +101 + j*(-97) +-177 + j*(146) +93 + j*(21) +324 + j*(397) +281 + j*(-229) +-138 + j*(117) +-188 + j*(112) +39 + j*(-66) +163 + j*(-98) +71 + j*(57) +-65 + j*(187) +125 + j*(197) +-135 + j*(141) +-105 + j*(47) +19 + j*(-86) +66 + j*(-235) +-480 + j*(225) +76 + j*(28) +342 + j*(47) +0 + j*(-366) +-140 + j*(74) +193 + j*(144) +-126 + j*(-43) +-191 + j*(158) +-180 + j*(-55) +63 + j*(-255) +-98 + j*(-2) +-13 + j*(308) +-183 + j*(207) +144 + j*(37) +-51 + j*(-175) +28 + j*(-29) +-211 + j*(356) +-132 + j*(173) +-173 + j*(199) +36 + j*(329) +-139 + j*(228) +-311 + j*(177) +65 + j*(-343) +-217 + j*(-20) +119 + j*(18) +29 + j*(-58) +156 + j*(129) +-41 + j*(23) +202 + j*(-163) +224 + j*(196) +-47 + j*(25) +15 + j*(-122) +-182 + j*(280) +-170 + j*(21) +8 + j*(-144) +20 + j*(246) +-148 + j*(143) +91 + j*(93) +168 + j*(44) +-100 + j*(270) +-51 + j*(-167) +-285 + j*(125) +-93 + j*(63) +-1 + j*(-290) +-214 + j*(-47) +-78 + j*(243) +-156 + j*(-314) +152 + j*(57) +163 + j*(267) +8 + j*(-167) +-262 + j*(114) +132 + j*(49) +199 + j*(-85) +3 + j*(228) +57 + j*(-151) +104 + j*(-98) +-45 + j*(-381) +238 + j*(-59) +-62 + j*(-158) +-96 + j*(-87) +8 + j*(279) +-84 + j*(260) +276 + j*(127) +-142 + j*(-42) +-119 + j*(-185) +67 + j*(134) +-20 + j*(129) +-47 + j*(-30) +-250 + j*(156) +200 + j*(108) +-450 + j*(49) +-30 + j*(87) +205 + j*(-137) +-165 + j*(217) +100 + j*(-165) +-52 + j*(-71) +-232 + j*(-131) +-289 + j*(-36) +310 + j*(-194) +-88 + j*(127) +17 + j*(-71) +50 + j*(232) +181 + j*(21) +-65 + j*(-333) +158 + j*(-238) +176 + j*(-210) +-279 + j*(173) +-21 + j*(-192) +-363 + j*(-361) +6 + j*(185) +-25 + j*(-4) +62 + j*(-21) +33 + j*(-59) +2 + j*(-121) +-192 + j*(-84) +32 + j*(204) +23 + j*(57) +-186 + j*(341) +1 + j*(-191) +-262 + j*(-313) +121 + j*(13) +-211 + j*(-185) +-470 + j*(23) +-221 + j*(94) +50 + j*(25) +-277 + j*(53) +174 + j*(29) +-26 + j*(-297) +-1 + j*(-285) +90 + j*(-249) +50 + j*(214) +72 + j*(-9) +-107 + j*(-288) +-98 + j*(-368) +-146 + j*(-28) +-135 + j*(-53) +-245 + j*(240) +-88 + j*(134) +211 + j*(-91) +-175 + j*(42) +117 + j*(212) +179 + j*(-4) +-96 + j*(202) +-119 + j*(-134) +22 + j*(291) +-515 + j*(119) +36 + j*(-319) +190 + j*(-428) +128 + j*(-48) +458 + j*(-10) +-104 + j*(-23) +-51 + j*(173) +93 + j*(95) +-222 + j*(47) +-141 + j*(-39) +-175 + j*(-116) +35 + j*(-10) +56 + j*(-146) +275 + j*(14) +14 + j*(31) +-105 + j*(-30) +105 + j*(64) +21 + j*(-163) +-33 + j*(-29) +-56 + j*(-397) +-235 + j*(-142) +-91 + j*(-166) +-112 + j*(-132) +342 + j*(116) +76 + j*(-300) +-118 + j*(71) +-137 + j*(196) +83 + j*(204) +89 + j*(-214) +78 + j*(-142) +-82 + j*(-71) +-301 + j*(-57) +141 + j*(111) +-74 + j*(4) +-76 + j*(179) +-545 + j*(209) +121 + j*(-37) +303 + j*(121) +-182 + j*(47) +83 + j*(-137) +251 + j*(118) +60 + j*(36) +134 + j*(221) +257 + j*(245) +30 + j*(-115) +192 + j*(-68) +-280 + j*(-52) +-197 + j*(255) +-106 + j*(23) +-2 + j*(-309) +175 + j*(305) +78 + j*(31) +86 + j*(-110) +-37 + j*(-164) +-28 + j*(135) +29 + j*(-107) +161 + j*(228) +269 + j*(167) +-46 + j*(-32) +-175 + j*(-12) +244 + j*(-436) +-118 + j*(276) +-151 + j*(-311) +-127 + j*(91) +27 + j*(182) +71 + j*(-19) +170 + j*(-5) +-67 + j*(75) +196 + j*(233) +253 + j*(47) +-23 + j*(-124) +10 + j*(-184) +-90 + j*(-4) +-13 + j*(-43) +-248 + j*(-177) +-4 + j*(-153) +192 + j*(-52) +-232 + j*(-206) +238 + j*(138) +-165 + j*(55) +-158 + j*(-70) +77 + j*(55) +-6 + j*(47) +227 + j*(-101) +7 + j*(281) +-52 + j*(156) +137 + j*(-203) +56 + j*(64) +71 + j*(16) +-171 + j*(-17) +-127 + j*(325) +8 + j*(91) +-107 + j*(197) +-25 + j*(22) +-203 + j*(-243) +120 + j*(57) +205 + j*(-311) +117 + j*(30) +-167 + j*(149) +202 + j*(27) +-257 + j*(177) +-293 + j*(76) +-211 + j*(-262) +-106 + j*(-71) +-43 + j*(-121) +-140 + j*(-146) +-118 + j*(138) +114 + j*(-126) +114 + j*(35) +-208 + j*(59) +177 + j*(34) +-18 + j*(-115) +60 + j*(9) +-24 + j*(-62) +288 + j*(66) +-176 + j*(-223) +94 + j*(69) +334 + j*(-168) +281 + j*(-23) +-40 + j*(139) +-59 + j*(-4) +-45 + j*(-16) +100 + j*(-16) +216 + j*(-39) +30 + j*(-128) +-351 + j*(161) +67 + j*(-194) +-213 + j*(-55) +102 + j*(-107) +236 + j*(-30) +317 + j*(-180) +66 + j*(-140) +-4 + j*(157) +-191 + j*(-49) +-101 + j*(-248) +-21 + j*(-175) +-9 + j*(-108) +-268 + j*(-51) +158 + j*(168) +11 + j*(117) +-4 + j*(78) +77 + j*(186) +72 + j*(-84) +-88 + j*(-228) +-66 + j*(-83) +-272 + j*(-322) +-123 + j*(-65) +-105 + j*(25) +368 + j*(-404) +0 + j*(-161) +162 + j*(-31) +96 + j*(232) +236 + j*(-275) +40 + j*(-96) +250 + j*(-218) +-234 + j*(-142) +-10 + j*(63) +-264 + j*(210) +40 + j*(-186) +-290 + j*(4) +176 + j*(-90) +109 + j*(282) +13 + j*(465) +40 + j*(7) +129 + j*(-70) +-30 + j*(7) +-151 + j*(71) +-240 + j*(152) +-238 + j*(-159) +50 + j*(-19) +-81 + j*(76) +132 + j*(-339) +7 + j*(190) +68 + j*(-272) +-231 + j*(199) +-6 + j*(-153) +-71 + j*(224) +-362 + j*(203) +122 + j*(-11) +125 + j*(-11) +40 + j*(-13) +69 + j*(370) +128 + j*(-18) +-73 + j*(77) +-194 + j*(-13) +144 + j*(33) +168 + j*(331) +-224 + j*(-53) +18 + j*(-140) +-47 + j*(232) +20 + j*(-175) +235 + j*(-91) +241 + j*(-113) +-290 + j*(-156) +-180 + j*(-276) +-187 + j*(69) +-25 + j*(-264) +-29 + j*(-21) +-70 + j*(-210) +-301 + j*(-95) +-34 + j*(-162) +-252 + j*(10) +80 + j*(-33) +-62 + j*(-161) +14 + j*(29) +83 + j*(170) +154 + j*(-146) +50 + j*(-245) +112 + j*(82) +-60 + j*(132) +257 + j*(174) +-10 + j*(-168) +147 + j*(-98) +-224 + j*(-255) +-240 + j*(-171) +155 + j*(-137) +-81 + j*(138) +-325 + j*(-52) +247 + j*(141) +-365 + j*(16) +385 + j*(-28) +165 + j*(-25) +-62 + j*(60) +-140 + j*(-218) +426 + j*(178) +-83 + j*(156) +163 + j*(-32) +263 + j*(13) +-159 + j*(45) +-7 + j*(-478) +-43 + j*(221) +37 + j*(-121) +57 + j*(-92) +4 + j*(207) +-91 + j*(-10) +-173 + j*(31) +182 + j*(-86) +153 + j*(59) +-259 + j*(-192) +185 + j*(-95) +155 + j*(169) +136 + j*(-41) +-330 + j*(-250) +-178 + j*(-422) +218 + j*(307) +264 + j*(-365) +317 + j*(-4) +424 + j*(-73) +-162 + j*(-162) +-238 + j*(-79) +-28 + j*(270) +-309 + j*(224) +230 + j*(42) +168 + j*(66) +243 + j*(-93) +-57 + j*(248) +-28 + j*(131) +-1 + j*(173) +-61 + j*(-118) +-35 + j*(104) +156 + j*(-25) +20 + j*(182) +-57 + j*(-141) +-115 + j*(-38) +68 + j*(-209) +97 + j*(-191) +170 + j*(226) +70 + j*(42) +-115 + j*(105) +-105 + j*(167) +-153 + j*(-176) +1 + j*(214) +144 + j*(404) +76 + j*(303) +220 + j*(2) +-428 + j*(-21) +-53 + j*(49) +-35 + j*(262) +29 + j*(-51) +104 + j*(-71) +161 + j*(-219) +57 + j*(-207) +-167 + j*(200) +-170 + j*(174) +-46 + j*(-60) +4 + j*(-160) +117 + j*(50) +390 + j*(21) +-37 + j*(16) +3 + j*(-183) +-27 + j*(194) +93 + j*(42) +-457 + j*(214) +310 + j*(-107) +-8 + j*(-76) +282 + j*(183) +-30 + j*(56) +201 + j*(322) +421 + j*(227) +230 + j*(-49) +156 + j*(-142) +-208 + j*(-272) +-81 + j*(-156) +-293 + j*(-89) +-108 + j*(-82) +225 + j*(73) +-69 + j*(91) +-227 + j*(-105) +350 + j*(-50) +8 + j*(-212) +-149 + j*(234) +-61 + j*(139) +134 + j*(-105) +177 + j*(-169) +-113 + j*(113) +178 + j*(44) +120 + j*(62) +-1 + j*(253) +-45 + j*(-24) +240 + j*(-194) +23 + j*(90) +237 + j*(68) +-13 + j*(83) +-148 + j*(-37) +136 + j*(-278) +-175 + j*(334) +160 + j*(-148) +153 + j*(-133) +60 + j*(124) +-221 + j*(-114) +96 + j*(116) +-43 + j*(30) +38 + j*(-186) +-302 + j*(-27) +93 + j*(-78) +-64 + j*(274) +-75 + j*(-1) +66 + j*(232) +199 + j*(22) +-64 + j*(40) +-199 + j*(66) +168 + j*(-209) +122 + j*(-142) +305 + j*(71) +-11 + j*(-146) +-418 + j*(5) +24 + j*(133) +203 + j*(-218) +394 + j*(165) +-156 + j*(-112) +93 + j*(-129) +-204 + j*(59) +95 + j*(317) +-151 + j*(-274) +-122 + j*(-175) +-115 + j*(-29) +-50 + j*(-112) +224 + j*(-140) +47 + j*(-1) +-80 + j*(-177) +-244 + j*(-238) +-102 + j*(45) +-117 + j*(-63) +62 + j*(8) +-85 + j*(20) +-209 + j*(-100) +-118 + j*(-187) +-158 + j*(57) +-174 + j*(-190) +-23 + j*(389) +-24 + j*(110) +-163 + j*(-100) +45 + j*(234) +-49 + j*(76) +-349 + j*(193) +-40 + j*(-93) +162 + j*(120) +-119 + j*(-11) +-126 + j*(322) +42 + j*(240) +49 + j*(-10) +445 + j*(175) +-243 + j*(78) +95 + j*(-86) +237 + j*(66) +148 + j*(-190) +-105 + j*(37) +112 + j*(40) +-134 + j*(-176) +241 + j*(-241) +-398 + j*(185) +-57 + j*(36) +323 + j*(36) +206 + j*(-162) +-100 + j*(231) +-121 + j*(192) +52 + j*(68) +113 + j*(-16) +-312 + j*(-42) +185 + j*(-37) +-140 + j*(124) +252 + j*(-82) +74 + j*(-66) +-182 + j*(-21) +-168 + j*(-48) +-198 + j*(-36) +-100 + j*(-97) +108 + j*(-23) +16 + j*(-69) +-303 + j*(-143) +-182 + j*(-119) +149 + j*(-485) +279 + j*(110) +-151 + j*(-129) +263 + j*(-245) +166 + j*(28) +216 + j*(74) +25 + j*(96) +-122 + j*(146) +81 + j*(103) +129 + j*(-6) +-167 + j*(-17) +-351 + j*(-259) +3 + j*(-125) +-163 + j*(68) +279 + j*(91) +-49 + j*(-257) +195 + j*(-93) +47 + j*(118) +-197 + j*(-392) +-125 + j*(-238) +284 + j*(48) +218 + j*(-397) +72 + j*(-14) +-46 + j*(223) +-140 + j*(-227) +182 + j*(-205) +-218 + j*(-226) +-57 + j*(-305) +-48 + j*(-37) +-199 + j*(-303) +16 + j*(-168) +38 + j*(-11) +-73 + j*(-53) +-142 + j*(-253) +-83 + j*(246) +77 + j*(-91) +-128 + j*(-83) +-315 + j*(-84) +-229 + j*(-173) +-238 + j*(-5) +118 + j*(-53) +-119 + j*(124) +57 + j*(-78) +33 + j*(-105) +-52 + j*(-35) +-11 + j*(87) +-172 + j*(18) +-40 + j*(-88) +-42 + j*(188) +3 + j*(-257) +-205 + j*(97) +244 + j*(337) +-30 + j*(35) +52 + j*(-91) +-379 + j*(-11) +-187 + j*(-46) +-99 + j*(-209) +-197 + j*(-16) +-168 + j*(-129) +-429 + j*(34) +-54 + j*(-23) +-110 + j*(-78) +328 + j*(98) +-142 + j*(139) +-204 + j*(124) +-123 + j*(-131) +-110 + j*(-260) +47 + j*(-187) +138 + j*(121) +-160 + j*(91) +-414 + j*(-91) +-73 + j*(169) +-91 + j*(-195) +-343 + j*(-139) +-105 + j*(-62) +127 + j*(308) +43 + j*(147) +-381 + j*(40) +-107 + j*(197) +264 + j*(-93) +-170 + j*(122) +156 + j*(-71) +-37 + j*(233) +77 + j*(51) +152 + j*(14) +-35 + j*(76) +-259 + j*(124) +-253 + j*(10) +234 + j*(-71) +562 + j*(-276) +0 + j*(88) +45 + j*(115) +-56 + j*(-43) +262 + j*(25) +-69 + j*(119) +-143 + j*(-172) +176 + j*(-386) +-144 + j*(38) +-18 + j*(170) +259 + j*(-262) +-8 + j*(88) +-113 + j*(-90) +139 + j*(74) +141 + j*(-67) +208 + j*(-146) +118 + j*(46) +-156 + j*(-5) +-69 + j*(-154) +-252 + j*(115) +93 + j*(6) +55 + j*(257) +19 + j*(62) +211 + j*(129) +-421 + j*(107) +120 + j*(77) +-86 + j*(-219) +-292 + j*(-37) +-13 + j*(-209) +-185 + j*(-60) +-71 + j*(163) +-301 + j*(-11) +-138 + j*(188) +110 + j*(6) +310 + j*(356) +101 + j*(-104) +-11 + j*(125) +107 + j*(81) +157 + j*(-269) +-98 + j*(-77) +427 + j*(-223) +-159 + j*(154) +11 + j*(148) +-168 + j*(-61) +19 + j*(-80) +-69 + j*(276) +-376 + j*(283) +23 + j*(91) +-237 + j*(41) +-194 + j*(11) +-209 + j*(-356) +-21 + j*(170) +-204 + j*(92) +180 + j*(89) +-72 + j*(52) +-102 + j*(128) +155 + j*(-105) +-308 + j*(215) +-206 + j*(187) +-31 + j*(27) +-264 + j*(33) +192 + j*(50) +-184 + j*(-98) +-213 + j*(-190) +-296 + j*(-141) +42 + j*(-74) +59 + j*(153) +-2 + j*(-122) +124 + j*(-98) +37 + j*(-61) +-5 + j*(-226) +-327 + j*(-73) +187 + j*(238) +-193 + j*(145) +-49 + j*(199) +12 + j*(-103) +254 + j*(-51) +138 + j*(-86) +166 + j*(-317) +61 + j*(-37) +-264 + j*(37) +-108 + j*(-327) +-274 + j*(312) +-293 + j*(146) +-120 + j*(-36) +153 + j*(-57) +91 + j*(205) +-26 + j*(432) +-310 + j*(168) +137 + j*(171) +-57 + j*(11) +233 + j*(-103) +-19 + j*(-187) +-33 + j*(-207) +-239 + j*(153) +250 + j*(-412) +23 + j*(-238) +218 + j*(-332) +284 + j*(-149) +68 + j*(37) +-3 + j*(303) +145 + j*(90) +7 + j*(-6) +93 + j*(-117) +218 + j*(-139) +-204 + j*(30) +-51 + j*(-193) +-52 + j*(-139) +-104 + j*(-123) +-164 + j*(55) +169 + j*(12) +-155 + j*(-104) +230 + j*(26) +-1 + j*(93) +-243 + j*(-438) +-313 + j*(98) +22 + j*(-40) +-18 + j*(166) +116 + j*(-16) +-221 + j*(156) +10 + j*(-282) +-21 + j*(41) +-111 + j*(-107) +78 + j*(68) +-165 + j*(14) +-99 + j*(16) +315 + j*(66) +11 + j*(-98) +65 + j*(97) +-82 + j*(227) +35 + j*(-300) +-29 + j*(30) +222 + j*(-175) +89 + j*(91) +133 + j*(-55) +-165 + j*(26) +294 + j*(-19) +-134 + j*(173) +-6 + j*(-123) +265 + j*(316) +-37 + j*(-37) +37 + j*(-9) +-28 + j*(54) +66 + j*(52) +-2 + j*(-216) +111 + j*(-18) +144 + j*(153) +46 + j*(17) +-18 + j*(184) +-277 + j*(-111) +136 + j*(-34) +181 + j*(-19) +-358 + j*(42) +112 + j*(24) +-58 + j*(-71) +21 + j*(89) +250 + j*(2) +-151 + j*(7) +-45 + j*(29) +-100 + j*(-1) +-96 + j*(148) +197 + j*(52) +-18 + j*(-540) +7 + j*(-98) +-18 + j*(27) +74 + j*(166) +-16 + j*(-130) +62 + j*(108) +37 + j*(88) +-97 + j*(-153) +-11 + j*(36) +-204 + j*(48) +70 + j*(115) +-161 + j*(142) +-72 + j*(-76) +156 + j*(112) +149 + j*(317) +-163 + j*(193) +353 + j*(-178) +160 + j*(-74) +67 + j*(201) +-218 + j*(146) +111 + j*(42) +-27 + j*(28) +-207 + j*(-126) +115 + j*(68) +178 + j*(95) +110 + j*(-12) +74 + j*(-181) +-38 + j*(-50) +147 + j*(321) +132 + j*(110) +297 + j*(158) +-107 + j*(59) +100 + j*(142) +-35 + j*(252) +122 + j*(69) +105 + j*(-229) +34 + j*(-2) +479 + j*(-9) +-16 + j*(96) +201 + j*(-258) +-104 + j*(133) +129 + j*(-23) +194 + j*(134) +-106 + j*(-35) +-281 + j*(-300) +36 + j*(-212) +-175 + j*(21) +-287 + j*(86) +79 + j*(-139) +173 + j*(133) +16 + j*(-117) +-152 + j*(33) +201 + j*(-59) +-149 + j*(150) +-75 + j*(-175) +-416 + j*(-181) +-64 + j*(-284) +0 + j*(401) +-170 + j*(425) +-214 + j*(-47) +-211 + j*(247) +-98 + j*(8) +-129 + j*(447) +271 + j*(272) +9 + j*(-279) +-64 + j*(-25) +176 + j*(240) +-462 + j*(-388) +-25 + j*(391) +132 + j*(-235) +173 + j*(-240) +371 + j*(-346) +230 + j*(-164) +-228 + j*(18) +-81 + j*(323) +150 + j*(89) +197 + j*(-226) +387 + j*(-117) +170 + j*(-281) +-300 + j*(-19) +-4 + j*(-175) +428 + j*(-17) +523 + j*(419) +168 + j*(455) +-202 + j*(-57) +-372 + j*(-344) +-133 + j*(-50) +87 + j*(-18) +-21 + j*(347) +237 + j*(446) +-267 + j*(-60) +-407 + j*(-203) +-99 + j*(-204) +259 + j*(247) +-342 + j*(342) +273 + j*(330) +-400 + j*(238) +365 + j*(-625) +400 + j*(-322) +5 + j*(168) +371 + j*(329) +148 + j*(443) +134 + j*(-100) +-497 + j*(272) +-395 + j*(400) +-403 + j*(267) +411 + j*(-407) +-341 + j*(-416) +155 + j*(-460) +332 + j*(-323) +-194 + j*(42) +-268 + j*(133) +224 + j*(-124) +535 + j*(478) +143 + j*(-390) +368 + j*(-152) +-110 + j*(-284) +-693 + j*(-241) +-386 + j*(450) +-215 + j*(373) +-156 + j*(189) +349 + j*(-105) +390 + j*(61) +269 + j*(-430) +183 + j*(-207) +-150 + j*(-489) +518 + j*(531) +186 + j*(692) +395 + j*(-305) +166 + j*(249) +243 + j*(-417) +-135 + j*(-226) +103 + j*(46) +281 + j*(125) +182 + j*(351) +-250 + j*(40) +-157 + j*(-467) +-240 + j*(178) +170 + j*(-20) +-379 + j*(-303) +-149 + j*(295) +444 + j*(-149) +595 + j*(231) +-92 + j*(-199) +-362 + j*(-141) +-561 + j*(33) +588 + j*(-375) +-267 + j*(-479) +327 + j*(100) +-598 + j*(-174) +-42 + j*(406) +342 + j*(-147) +336 + j*(-131) +140 + j*(115) +438 + j*(119) +-50 + j*(100) +277 + j*(402) +-230 + j*(-449) +202 + j*(367) +388 + j*(-771) +288 + j*(-619) +204 + j*(-395) +-47 + j*(-322) +-293 + j*(322) +-315 + j*(-171) +-141 + j*(127) +-414 + j*(-54) +36 + j*(366) +-325 + j*(466) +471 + j*(-397) +-284 + j*(-148) +-380 + j*(111) +277 + j*(-126) +252 + j*(220) +81 + j*(-233) +241 + j*(-114) +-260 + j*(417) +462 + j*(-177) +-95 + j*(398) +-182 + j*(-351) +-76 + j*(-392) +-268 + j*(-288) +351 + j*(-228) +501 + j*(62) +51 + j*(273) +-418 + j*(-262) +385 + j*(198) +-156 + j*(497) +185 + j*(-89) +-111 + j*(-339) +-297 + j*(260) +141 + j*(-395) +202 + j*(-265) +291 + j*(-190) +344 + j*(83) +-349 + j*(64) +-132 + j*(284) +361 + j*(363) +212 + j*(241) +527 + j*(514) +69 + j*(530) +403 + j*(281) +-375 + j*(-121) +-355 + j*(-482) +177 + j*(158) +187 + j*(-8) +696 + j*(-346) +132 + j*(-311) +1 + j*(213) +395 + j*(-237) +303 + j*(246) +320 + j*(-262) +308 + j*(187) +527 + j*(18) +-641 + j*(192) +-265 + j*(-494) +703 + j*(446) +412 + j*(116) +-544 + j*(392) +219 + j*(387) +-129 + j*(351) +-192 + j*(187) +-379 + j*(-465) +322 + j*(-293) +192 + j*(-500) +22 + j*(351) +-387 + j*(-301) +-67 + j*(456) +194 + j*(450) +218 + j*(-581) +-276 + j*(-107) +187 + j*(198) +28 + j*(-418) +-85 + j*(292) +-156 + j*(-344) +-214 + j*(-260) +-151 + j*(-267) +41 + j*(-289) +347 + j*(329) +-33 + j*(-435) +76 + j*(298) +202 + j*(222) +-78 + j*(284) +575 + j*(-494) +291 + j*(204) +197 + j*(523) +-494 + j*(-342) +86 + j*(328) +257 + j*(600) +236 + j*(-177) +-128 + j*(-152) +-214 + j*(-280) +251 + j*(352) +-202 + j*(17) +74 + j*(424) +-280 + j*(276) +-160 + j*(293) +337 + j*(310) +-448 + j*(-120) +-243 + j*(-566) +-279 + j*(-2) +298 + j*(483) +-263 + j*(459) +-253 + j*(-158) +-312 + j*(-397) +-192 + j*(228) +-249 + j*(-423) +51 + j*(-308) +526 + j*(-261) +74 + j*(446) +-124 + j*(-276) +-95 + j*(444) +16 + j*(163) +-301 + j*(110) +457 + j*(-303) +-216 + j*(-169) +429 + j*(-260) +-603 + j*(436) +57 + j*(324) +-115 + j*(-294) +313 + j*(295) +470 + j*(-225) +518 + j*(129) +-504 + j*(-204) +-540 + j*(-33) +-177 + j*(-329) +253 + j*(-247) +-467 + j*(-372) +185 + j*(-238) +267 + j*(186) +-384 + j*(141) +250 + j*(-291) +-3 + j*(-309) +-214 + j*(-30) +118 + j*(635) +-256 + j*(327) +312 + j*(-137) +197 + j*(-70) +18 + j*(-503) +317 + j*(367) +181 + j*(-424) +-344 + j*(-240) +57 + j*(-547) +-364 + j*(13) +-27 + j*(-107) +-59 + j*(80) +369 + j*(51) +-217 + j*(-81) +-407 + j*(509) +291 + j*(182) +-293 + j*(334) +28 + j*(-156) +-438 + j*(400) +343 + j*(-96) +477 + j*(371) +-287 + j*(-291) +482 + j*(328) +-282 + j*(-414) +61 + j*(179) +-224 + j*(-69) +-153 + j*(331) +188 + j*(-46) +41 + j*(-78) +-571 + j*(556) +-293 + j*(91) +-260 + j*(90) +239 + j*(-81) +-174 + j*(-201) +262 + j*(189) +-197 + j*(-334) +368 + j*(311) +-501 + j*(88) +-48 + j*(-481) +325 + j*(389) +-238 + j*(86) +-356 + j*(-254) +-293 + j*(-133) +287 + j*(380) +527 + j*(33) +497 + j*(-288) +432 + j*(-242) +409 + j*(-207) +28 + j*(-156) +-240 + j*(181) +-320 + j*(-711) +-104 + j*(-373) +341 + j*(-32) +-406 + j*(-363) +155 + j*(57) +-262 + j*(190) +210 + j*(742) +65 + j*(-220) +-291 + j*(-206) +-197 + j*(352) +-100 + j*(-406) +356 + j*(320) +-412 + j*(217) +-3 + j*(602) +382 + j*(-284) +-122 + j*(93) +-682 + j*(-298) +276 + j*(62) +-551 + j*(75) +607 + j*(474) +26 + j*(235) +252 + j*(-453) +-262 + j*(-438) +-40 + j*(-168) +-53 + j*(71) +192 + j*(431) +435 + j*(-244) +380 + j*(358) +-403 + j*(-416) +-105 + j*(-338) +58 + j*(-154) +-199 + j*(-422) +-193 + j*(391) +281 + j*(-103) +298 + j*(-147) +426 + j*(-414) +398 + j*(100) +165 + j*(140) +126 + j*(-89) +122 + j*(300) +-155 + j*(-434) +-440 + j*(69) +391 + j*(-152) +-307 + j*(-64) +285 + j*(-441) +-154 + j*(-491) +-419 + j*(-529) +-31 + j*(-330) +60 + j*(81) +-173 + j*(132) +488 + j*(338) +-42 + j*(-450) +-159 + j*(-192) +-74 + j*(-560) +235 + j*(-305) +-415 + j*(-184) +-165 + j*(-223) +158 + j*(383) +27 + j*(-197) +-255 + j*(-47) +438 + j*(315) +138 + j*(-294) +-40 + j*(-127) +337 + j*(-310) +257 + j*(239) +25 + j*(385) +-507 + j*(55) +-337 + j*(185) +355 + j*(501) +-223 + j*(258) +161 + j*(-298) +-408 + j*(-71) +-342 + j*(351) +256 + j*(-382) +-455 + j*(194) +-324 + j*(457) +-124 + j*(509) +-184 + j*(209) +51 + j*(-226) +-337 + j*(-282) +-38 + j*(-43) +95 + j*(110) +163 + j*(-158) +-318 + j*(-346) +160 + j*(321) +-257 + j*(310) +305 + j*(-486) +258 + j*(214) +-281 + j*(-214) +293 + j*(9) +-225 + j*(-240) +207 + j*(-445) +-308 + j*(185) +-59 + j*(-70) +-493 + j*(-380) +655 + j*(-197) +-268 + j*(-100) +315 + j*(-30) +382 + j*(-180) +45 + j*(-370) +396 + j*(391) +-488 + j*(-400) +-333 + j*(-64) +-162 + j*(456) +-315 + j*(-665) +229 + j*(205) +-97 + j*(441) +278 + j*(227) +-42 + j*(-278) +-182 + j*(413) +286 + j*(69) +-286 + j*(530) +86 + j*(326) +196 + j*(257) +-218 + j*(161) +444 + j*(-151) +-243 + j*(11) +-325 + j*(329) +648 + j*(55) +546 + j*(632) +-120 + j*(370) +127 + j*(-274) +341 + j*(356) +605 + j*(-571) +129 + j*(441) +-491 + j*(-367) +427 + j*(-232) +-573 + j*(33) +99 + j*(240) +-359 + j*(-138) +229 + j*(165) +309 + j*(119) +242 + j*(284) +-192 + j*(27) +621 + j*(-439) +-198 + j*(181) +-245 + j*(275) +-130 + j*(-330) +286 + j*(187) +295 + j*(-190) +665 + j*(218) +266 + j*(-188) +-49 + j*(-291) +-264 + j*(-29) +156 + j*(-284) +106 + j*(200) +342 + j*(250) +456 + j*(8) +-72 + j*(-268) +132 + j*(385) +190 + j*(-104) +125 + j*(-565) +233 + j*(103) +260 + j*(9) +6 + j*(-413) +358 + j*(-296) +-222 + j*(-221) +-90 + j*(335) +361 + j*(-165) +440 + j*(344) +-477 + j*(81) +-384 + j*(-272) +366 + j*(144) +482 + j*(268) +368 + j*(-361) +270 + j*(-76) +238 + j*(-549) +-412 + j*(-489) +-165 + j*(28) +-234 + j*(303) +53 + j*(263) +-335 + j*(463) +435 + j*(-43) +402 + j*(-403) +573 + j*(438) +-498 + j*(-515) +-197 + j*(243) +456 + j*(28) +-546 + j*(409) +-193 + j*(-208) +66 + j*(417) +-84 + j*(330) +-218 + j*(-150) +378 + j*(202) +177 + j*(-46) +472 + j*(106) +-259 + j*(-188) +291 + j*(-82) +251 + j*(423) +187 + j*(-513) +385 + j*(206) +-281 + j*(-349) +105 + j*(202) +-230 + j*(448) +-470 + j*(-348) +13 + j*(-522) +-318 + j*(-141) +-642 + j*(-298) +82 + j*(-451) +-448 + j*(419) +349 + j*(435) +-437 + j*(618) +-74 + j*(-261) +207 + j*(-99) +-386 + j*(292) +290 + j*(-264) +431 + j*(-342) +346 + j*(-221) +240 + j*(151) +-209 + j*(-525) +-188 + j*(-429) +-590 + j*(-514) +409 + j*(-223) +-315 + j*(285) +-521 + j*(-451) +202 + j*(458) +-221 + j*(-139) +236 + j*(378) +-672 + j*(421) +1 + j*(315) +-83 + j*(-494) +-306 + j*(396) +185 + j*(-515) +-528 + j*(120) +-441 + j*(96) +-17 + j*(-30) +213 + j*(271) +631 + j*(-5) +364 + j*(26) +289 + j*(-235) +-78 + j*(269) +-317 + j*(-59) +-365 + j*(-119) +-433 + j*(439) +524 + j*(208) +-506 + j*(479) +144 + j*(-102) +218 + j*(486) +166 + j*(308) +340 + j*(-202) +195 + j*(376) +-243 + j*(18) +666 + j*(-218) +-438 + j*(-264) +-342 + j*(328) +-4 + j*(-325) +266 + j*(344) +-282 + j*(80) +-177 + j*(581) +-470 + j*(-49) +173 + j*(-510) +-232 + j*(204) +192 + j*(-291) +-95 + j*(-459) +-422 + j*(420) +-381 + j*(442) +-5 + j*(-301) +23 + j*(-64) +-246 + j*(-320) +86 + j*(22) +227 + j*(153) +523 + j*(-78) +-17 + j*(234) +152 + j*(221) +361 + j*(127) +477 + j*(-136) +-260 + j*(-223) +-452 + j*(-424) +-38 + j*(316) +7 + j*(41) +314 + j*(-93) +-199 + j*(-49) +373 + j*(27) +138 + j*(-133) +670 + j*(440) +279 + j*(-281) +651 + j*(-272) +-327 + j*(352) +-197 + j*(-193) +50 + j*(-195) +-464 + j*(169) +91 + j*(299) +-268 + j*(-354) +-175 + j*(243) +209 + j*(-299) +246 + j*(-74) +-211 + j*(32) +-590 + j*(-237) +-349 + j*(-13) +493 + j*(91) +163 + j*(-473) +-229 + j*(-415) +341 + j*(-74) +-523 + j*(-462) +233 + j*(354) +476 + j*(-384) +-311 + j*(429) +-110 + j*(129) +316 + j*(-384) +-472 + j*(187) +276 + j*(-151) +-118 + j*(-93) +290 + j*(212) +427 + j*(168) +-263 + j*(495) +173 + j*(170) +-376 + j*(113) +-264 + j*(252) +-285 + j*(-351) +477 + j*(-281) +-305 + j*(39) +-271 + j*(75) +-76 + j*(113) +-59 + j*(45) +64 + j*(-188) +131 + j*(244) +23 + j*(242) +6 + j*(-276) +34 + j*(-119) +-132 + j*(123) +158 + j*(-139) +-154 + j*(-136) +-228 + j*(-295) +-5 + j*(-81) +-198 + j*(-13) +-163 + j*(-329) +123 + j*(-270) +-20 + j*(-197) +-28 + j*(-51) +145 + j*(-162) +157 + j*(24) +-126 + j*(54) +371 + j*(-254) +-260 + j*(-204) +-182 + j*(-146) +156 + j*(264) +168 + j*(-101) +11 + j*(-81) +-284 + j*(-288) +-79 + j*(-81) +76 + j*(137) +-160 + j*(-287) +165 + j*(-95) +83 + j*(7) +83 + j*(-138) +-11 + j*(134) +-58 + j*(281) +11 + j*(-214) +-231 + j*(-128) +124 + j*(-11) +-13 + j*(-123) +-122 + j*(154) +286 + j*(-387) +-153 + j*(59) +-168 + j*(-157) +-93 + j*(204) +143 + j*(237) +164 + j*(47) +-13 + j*(170) +-236 + j*(-96) +57 + j*(395) +71 + j*(-207) +-18 + j*(-145) +-165 + j*(-25) +-185 + j*(-54) +144 + j*(6) +-3 + j*(202) +-39 + j*(137) +75 + j*(64) +65 + j*(-144) +57 + j*(-88) +130 + j*(-175) +86 + j*(268) +-220 + j*(99) +-303 + j*(-27) +-86 + j*(-230) +0 + j*(-168) +-86 + j*(-19) +-112 + j*(-159) +-46 + j*(-31) +-248 + j*(334) +47 + j*(23) +109 + j*(130) +-86 + j*(-11) +48 + j*(-79) +-115 + j*(35) +-107 + j*(139) +-181 + j*(244) +33 + j*(-192) +72 + j*(235) +13 + j*(-37) +-188 + j*(-218) +-122 + j*(139) +83 + j*(211) +11 + j*(-64) +-1 + j*(80) +6 + j*(296) +-327 + j*(32) +51 + j*(-163) +5 + j*(-147) +89 + j*(-125) +72 + j*(-122) +163 + j*(119) +45 + j*(-27) +-14 + j*(194) +67 + j*(35) +-115 + j*(138) +-69 + j*(352) +-124 + j*(264) +358 + j*(-136) +16 + j*(-250) +-62 + j*(148) +-21 + j*(-112) +100 + j*(-281) +-192 + j*(256) +-50 + j*(113) +83 + j*(-140) +-53 + j*(-184) +26 + j*(226) +-146 + j*(-12) +59 + j*(323) +92 + j*(-313) +74 + j*(182) +-87 + j*(371) +-54 + j*(388) +102 + j*(-137) +-317 + j*(235) +113 + j*(-13) +-125 + j*(-184) +-296 + j*(-134) +-24 + j*(-75) +211 + j*(-616) +-286 + j*(-27) +153 + j*(129) +-287 + j*(221) +139 + j*(-23) +211 + j*(-58) +34 + j*(-3) +68 + j*(58) +-232 + j*(52) +-57 + j*(-89) +30 + j*(-63) +412 + j*(81) +44 + j*(65) +-155 + j*(248) +-379 + j*(57) +226 + j*(-62) +40 + j*(-147) +50 + j*(-100) +223 + j*(-29) +-38 + j*(-45) +-107 + j*(103) +-33 + j*(-237) +-35 + j*(5) +49 + j*(-75) +230 + j*(-153) +36 + j*(-48) +-76 + j*(64) +17 + j*(-260) +-31 + j*(134) +-52 + j*(-53) +-49 + j*(-129) +-400 + j*(531) +103 + j*(29) +-274 + j*(317) +-204 + j*(297) +33 + j*(2) +-34 + j*(27) +-18 + j*(-21) +118 + j*(49) +-165 + j*(-112) +20 + j*(48) +112 + j*(-151) +-61 + j*(-64) +-165 + j*(-1) +-86 + j*(205) +-132 + j*(-49) +227 + j*(115) +-112 + j*(-151) +-229 + j*(208) +-18 + j*(288) +-11 + j*(-17) +-87 + j*(-221) +59 + j*(-103) +178 + j*(34) +-68 + j*(78) +-331 + j*(236) +-50 + j*(202) +-406 + j*(300) +168 + j*(360) +66 + j*(135) +210 + j*(-129) +261 + j*(-44) +-182 + j*(100) +-231 + j*(-123) +-11 + j*(49) +-225 + j*(-245) +299 + j*(-52) +57 + j*(-13) +-121 + j*(342) +-224 + j*(191) +13 + j*(-150) +-9 + j*(-26) +146 + j*(-146) +192 + j*(-49) +-19 + j*(-104) +92 + j*(-254) +214 + j*(-313) +-219 + j*(19) +-65 + j*(-359) +-255 + j*(-38) +65 + j*(177) +-96 + j*(-128) +-78 + j*(6) +16 + j*(-17) +-260 + j*(-66) +-95 + j*(-110) +193 + j*(87) +77 + j*(-107) +-19 + j*(-52) +-70 + j*(-187) +547 + j*(262) +-59 + j*(-39) +126 + j*(46) +-47 + j*(-180) +18 + j*(-137) +18 + j*(-50) +110 + j*(354) +273 + j*(18) +-44 + j*(-349) +97 + j*(-141) +112 + j*(173) +42 + j*(204) +-33 + j*(-132) +157 + j*(-131) +62 + j*(-146) +84 + j*(-30) +-169 + j*(163) +90 + j*(-85) +-211 + j*(215) +-147 + j*(-100) +-325 + j*(17) +11 + j*(132) +-309 + j*(99) +-291 + j*(-136) +183 + j*(32) +25 + j*(-317) +-243 + j*(-312) +115 + j*(129) +-78 + j*(79) +249 + j*(-482) +160 + j*(-260) +-12 + j*(130) +-395 + j*(1) +330 + j*(-161) +21 + j*(9) +-133 + j*(-103) +361 + j*(-362) +222 + j*(204) +-265 + j*(88) +-35 + j*(197) +-187 + j*(123) +-22 + j*(101) +-37 + j*(12) +-42 + j*(-145) +112 + j*(-66) +-208 + j*(-199) +-221 + j*(181) +2 + j*(-8) +-106 + j*(-108) +238 + j*(28) +113 + j*(-265) +-43 + j*(-2) +-194 + j*(151) +485 + j*(0) +-87 + j*(-110) +-52 + j*(-28) +-11 + j*(144) +63 + j*(-206) +75 + j*(292) +-385 + j*(157) +-62 + j*(223) +-265 + j*(-31) +153 + j*(-35) +-298 + j*(-184) +78 + j*(26) +-50 + j*(192) +42 + j*(150) +27 + j*(-25) +310 + j*(175) +48 + j*(-118) +100 + j*(55) +120 + j*(175) +327 + j*(-191) +65 + j*(-161) +-13 + j*(94) +60 + j*(62) +-109 + j*(-181) +-36 + j*(-14) +-128 + j*(-132) +-124 + j*(-5) +88 + j*(-116) +233 + j*(-172) +124 + j*(-318) +93 + j*(-222) +-46 + j*(-119) +25 + j*(115) +-62 + j*(-232) +182 + j*(-144) +115 + j*(-137) +209 + j*(-123) +-194 + j*(156) +141 + j*(-25) +54 + j*(-33) +228 + j*(151) +161 + j*(-208) +-235 + j*(-128) +77 + j*(433) +-103 + j*(186) +-173 + j*(105) +-28 + j*(-249) +199 + j*(255) +-308 + j*(-40) +72 + j*(-93) +-238 + j*(-285) +549 + j*(58) +-267 + j*(-106) +-11 + j*(-100) +95 + j*(41) +112 + j*(185) +17 + j*(-157) +-20 + j*(163) +-278 + j*(8) +-92 + j*(-59) +-197 + j*(37) +-441 + j*(-72) +-11 + j*(68) +4 + j*(-237) +166 + j*(-2) +15 + j*(-119) +-309 + j*(-29) +-144 + j*(-14) +-230 + j*(-114) +-5 + j*(151) +-181 + j*(-371) +18 + j*(-228) +163 + j*(-178) +13 + j*(248) +-243 + j*(-315) +-116 + j*(101) +146 + j*(206) +88 + j*(60) +111 + j*(-144) +0 + j*(281) +10 + j*(-163) +-59 + j*(127) +517 + j*(11) +73 + j*(35) +172 + j*(12) +47 + j*(4) +-83 + j*(-124) +53 + j*(50) +-148 + j*(-124) +-141 + j*(238) +-54 + j*(41) +-139 + j*(-158) +-196 + j*(374) +-301 + j*(265) +-39 + j*(2) +97 + j*(-139) +-106 + j*(133) +-305 + j*(62) +114 + j*(90) +-55 + j*(-114) +-122 + j*(-102) +8 + j*(-168) +-252 + j*(-70) +-70 + j*(42) +-141 + j*(-4) +-69 + j*(226) +56 + j*(244) +49 + j*(2) +-57 + j*(57) +-194 + j*(122) +-329 + j*(-75) +167 + j*(-91) +-197 + j*(279) +117 + j*(-48) +30 + j*(-26) +-132 + j*(159) +332 + j*(76) +36 + j*(230) +-37 + j*(-238) +-40 + j*(-260) +151 + j*(91) +-77 + j*(60) +98 + j*(27) +251 + j*(-101) +-18 + j*(120) +-93 + j*(-235) +-76 + j*(8) +404 + j*(191) +-8 + j*(-64) +30 + j*(58) +-175 + j*(281) +-102 + j*(-7) +-254 + j*(144) +-15 + j*(13) +393 + j*(-165) +-185 + j*(-293) +-86 + j*(59) +-87 + j*(-224) +-60 + j*(-87) +177 + j*(-240) +455 + j*(64) +78 + j*(-25) +41 + j*(-100) +-71 + j*(-47) +8 + j*(138) +18 + j*(-21) +-141 + j*(195) +127 + j*(185) +-158 + j*(-86) +-62 + j*(5) +206 + j*(103) +156 + j*(-23) +46 + j*(0) +83 + j*(119) +-12 + j*(-33) +-260 + j*(-20) +-59 + j*(-342) +159 + j*(52) +112 + j*(228) +137 + j*(212) +-153 + j*(-200) +-134 + j*(-71) +262 + j*(312) +-369 + j*(-21) +129 + j*(-147) +-73 + j*(-161) +-117 + j*(110) +110 + j*(113) +-8 + j*(49) +52 + j*(296) +-158 + j*(-57) +-72 + j*(94) +-134 + j*(-95) +41 + j*(-303) +177 + j*(-135) +-338 + j*(182) +-182 + j*(33) +-183 + j*(97) +144 + j*(-33) +-47 + j*(-262) +139 + j*(95) +-286 + j*(88) +318 + j*(-64) +119 + j*(252) +-46 + j*(-5) +372 + j*(201) +-144 + j*(103) +-52 + j*(165) +59 + j*(214) +232 + j*(-100) +-237 + j*(85) +-396 + j*(-92) +-230 + j*(126) +-81 + j*(-54) +205 + j*(71) +-80 + j*(-67) +322 + j*(-10) +-101 + j*(-81) +-22 + j*(110) +280 + j*(-179) +26 + j*(-250) +49 + j*(143) +-253 + j*(16) +-140 + j*(70) +238 + j*(177) +165 + j*(27) +-12 + j*(233) +281 + j*(147) +49 + j*(-413) +190 + j*(-138) +-115 + j*(280) +184 + j*(-147) +174 + j*(4) +-112 + j*(56) +-163 + j*(-38) +-260 + j*(201) +257 + j*(-362) +344 + j*(141) +-185 + j*(-252) +257 + j*(135) +-119 + j*(-91) +-13 + j*(-37) +133 + j*(21) +72 + j*(58) +71 + j*(368) +276 + j*(279) +-87 + j*(293) +46 + j*(-38) +-127 + j*(-140) +-55 + j*(40) +180 + j*(-16) +-54 + j*(267) +59 + j*(213) +24 + j*(-54) +-160 + j*(-71) +-115 + j*(-206) +0 + j*(-27) +30 + j*(63) +175 + j*(48) +250 + j*(107) +141 + j*(-119) +-46 + j*(-228) +141 + j*(55) +-11 + j*(-161) +71 + j*(-49) +132 + j*(-453) +-171 + j*(134) +-240 + j*(-64) +-238 + j*(-89) +215 + j*(143) +95 + j*(-177) +-115 + j*(12) +-98 + j*(-80) +168 + j*(-66) +83 + j*(33) +-310 + j*(256) +108 + j*(-310) +206 + j*(83) +103 + j*(61) +-42 + j*(-98) +117 + j*(-24) +12 + j*(66) +-107 + j*(-325) +-97 + j*(-29) +279 + j*(-264) +-112 + j*(-161) +-330 + j*(88) +-315 + j*(-161) +-74 + j*(-153) +102 + j*(235) +-49 + j*(358) +298 + j*(-292) +170 + j*(292) +139 + j*(254) +-199 + j*(-175) +238 + j*(181) +-100 + j*(77) +-125 + j*(382) +69 + j*(40) +-155 + j*(-226) +-220 + j*(-99) +-39 + j*(-467) +-185 + j*(-52) +-100 + j*(-15) +-55 + j*(84) +80 + j*(278) +52 + j*(-245) +-37 + j*(-181) +194 + j*(358) +180 + j*(25) +215 + j*(-21) +-254 + j*(128) +208 + j*(43) +148 + j*(-43) +80 + j*(168) +168 + j*(-79) +-107 + j*(-41) +98 + j*(250) +-51 + j*(-281) +81 + j*(-32) +-45 + j*(-207) +95 + j*(31) +29 + j*(60) +-104 + j*(-112) +16 + j*(175) +64 + j*(-142) +-16 + j*(-264) +90 + j*(-200) +106 + j*(-193) +-76 + j*(-26) +-81 + j*(226) +4 + j*(-62) +-105 + j*(-92) +-64 + j*(-13) +-118 + j*(-20) +-76 + j*(-79) +153 + j*(52) +-29 + j*(216) +-237 + j*(305) +-57 + j*(43) +251 + j*(-64) +65 + j*(-22) +-66 + j*(-105) +-46 + j*(30) +-124 + j*(-200) +186 + j*(108) +-303 + j*(98) +127 + j*(-165) +35 + j*(-56) +-58 + j*(30) +150 + j*(155) +-151 + j*(-247) +-194 + j*(-41) +-150 + j*(6) +-230 + j*(92) +-91 + j*(37) +219 + j*(-158) +-185 + j*(44) +97 + j*(-40) +-209 + j*(43) +-160 + j*(44) +111 + j*(-115) +-206 + j*(2) +-380 + j*(-145) +-291 + j*(185) +-16 + j*(211) +65 + j*(73) +-13 + j*(137) +14 + j*(68) +19 + j*(24) +-10 + j*(235) +21 + j*(-56) +36 + j*(-182) +-54 + j*(25) +209 + j*(-83) +-146 + j*(305) +138 + j*(-47) +-152 + j*(-73) +218 + j*(23) +56 + j*(-35) +267 + j*(17) +214 + j*(-84) +-240 + j*(309) +98 + j*(45) +211 + j*(-54) +133 + j*(-213) +1 + j*(87) +-165 + j*(78) +-58 + j*(-218) +10 + j*(-103) +-237 + j*(82) +-180 + j*(17) +-169 + j*(-69) +-100 + j*(-223) +339 + j*(34) +288 + j*(-133) +-148 + j*(-80) +124 + j*(-6) +278 + j*(115) +88 + j*(39) +-99 + j*(-206) +54 + j*(198) +-30 + j*(92) +-75 + j*(-107) +237 + j*(185) +-15 + j*(-160) +141 + j*(182) +129 + j*(169) +72 + j*(9) +-214 + j*(236) +133 + j*(21) +-25 + j*(74) +-122 + j*(-70) +-260 + j*(163) +-24 + j*(-200) +-235 + j*(45) +185 + j*(207) +-279 + j*(54) +-241 + j*(-18) +-153 + j*(-87) +-255 + j*(40) +-113 + j*(-238) +369 + j*(24) +218 + j*(57) +205 + j*(637) +19 + j*(61) +66 + j*(25) +-217 + j*(-431) +62 + j*(208) +269 + j*(-142) +16 + j*(122) +56 + j*(-24) +-279 + j*(-170) +-141 + j*(233) +339 + j*(-234) +-99 + j*(-257) +-145 + j*(263) +57 + j*(-175) +36 + j*(250) +-94 + j*(-114) +-196 + j*(13) +57 + j*(242) +18 + j*(216) +-37 + j*(291) +264 + j*(-162) +-219 + j*(178) +349 + j*(211) +204 + j*(-43) +21 + j*(93) +21 + j*(-221) +41 + j*(-16) +-98 + j*(-230) +-264 + j*(-47) +126 + j*(-108) +268 + j*(-69) +41 + j*(65) +76 + j*(301) +-84 + j*(-194) +-156 + j*(-68) +-6 + j*(-103) +-9 + j*(-292) +-274 + j*(-38) +-128 + j*(-166) +57 + j*(127) +-155 + j*(-173) +-35 + j*(-301) +-120 + j*(390) +-71 + j*(-32) +-16 + j*(-83) +-28 + j*(-132) +146 + j*(-89) +-233 + j*(134) +-136 + j*(-153) +-62 + j*(-111) +0 + j*(-173) +240 + j*(314) +-331 + j*(-113) +215 + j*(99) +-129 + j*(92) +81 + j*(183) +103 + j*(-28) +-305 + j*(25) +64 + j*(165) +31 + j*(-141) +503 + j*(144) +-18 + j*(-52) +-139 + j*(9) +-247 + j*(102) +-14 + j*(-35) +139 + j*(-177) +-218 + j*(1) +-123 + j*(-48) +-13 + j*(152) +164 + j*(342) +-188 + j*(-28) +102 + j*(-18) +-275 + j*(-183) +-140 + j*(105) +-89 + j*(-166) +150 + j*(-127) +153 + j*(202) +-160 + j*(98) +-30 + j*(-16) +136 + j*(36) +164 + j*(165) +-61 + j*(-130) +232 + j*(-411) +-65 + j*(129) +184 + j*(-213) +-237 + j*(134) +-322 + j*(240) +-18 + j*(45) +52 + j*(-71) +202 + j*(-8) +-103 + j*(-185) +-91 + j*(56) +-245 + j*(-260) +-168 + j*(260) +-35 + j*(30) +57 + j*(-226) +57 + j*(49) +199 + j*(-151) +43 + j*(28) +-358 + j*(64) +-94 + j*(-109) +270 + j*(-82) +132 + j*(7) +206 + j*(10) +506 + j*(-12) +-49 + j*(-83) +-315 + j*(-318) +-15 + j*(277) +-157 + j*(-344) +379 + j*(221) +377 + j*(59) +308 + j*(-408) +-211 + j*(228) +16 + j*(-142) +-260 + j*(-234) +-285 + j*(-187) +272 + j*(170) +-99 + j*(209) +-125 + j*(86) +-326 + j*(-369) +-164 + j*(-24) +-109 + j*(388) +-103 + j*(-238) +-169 + j*(-40) +10 + j*(-123) +190 + j*(-354) +-339 + j*(141) +176 + j*(-11) +-105 + j*(4) +-83 + j*(-327) +-14 + j*(-84) +86 + j*(65) +206 + j*(100) +279 + j*(-349) +-328 + j*(191) +21 + j*(-1) +77 + j*(174) +49 + j*(-45) +32 + j*(-206) +-141 + j*(75) +-64 + j*(33) +174 + j*(88) +328 + j*(-105) +222 + j*(400) +-209 + j*(493) +-165 + j*(-93) +-6 + j*(126) +30 + j*(-97) +-117 + j*(-136) +-81 + j*(-33) +12 + j*(2) +261 + j*(93) +11 + j*(-62) +10 + j*(98) +-125 + j*(-16) +141 + j*(226) +182 + j*(-117) +94 + j*(283) +-136 + j*(-20) +455 + j*(-54) +-87 + j*(75) +-151 + j*(226) +-253 + j*(54) +-8 + j*(-204) +-62 + j*(-136) +-182 + j*(148) +-16 + j*(74) +-17 + j*(-224) +-67 + j*(-27) +138 + j*(30) +81 + j*(71) +-7 + j*(-83) +127 + j*(98) +22 + j*(-260) +312 + j*(-258) +-189 + j*(31) +159 + j*(158) +240 + j*(-91) +-32 + j*(-305) +78 + j*(26) +48 + j*(242) +-66 + j*(117) +176 + j*(-287) +-78 + j*(0) +300 + j*(119) +128 + j*(-288) +22 + j*(161) +373 + j*(192) +272 + j*(70) +-50 + j*(84) +3 + j*(54) +26 + j*(86) +49 + j*(182) +46 + j*(-55) +-124 + j*(188) +-196 + j*(277) +37 + j*(26) +-77 + j*(-10) +130 + j*(-244) +-35 + j*(421) +9 + j*(219) +177 + j*(49) +48 + j*(-383) +-43 + j*(141) +-102 + j*(76) +132 + j*(47) +-154 + j*(56) +-26 + j*(-116) +-93 + j*(30) +-99 + j*(-182) +-301 + j*(-375) +47 + j*(-53) +196 + j*(-124) +-271 + j*(-64) +-61 + j*(-177) +-325 + j*(-323) +8 + j*(147) +32 + j*(67) +-158 + j*(-103) +97 + j*(-142) +193 + j*(-113) +168 + j*(-134) +12 + j*(122) +-45 + j*(172) +153 + j*(59) +271 + j*(-115) +296 + j*(-90) +-117 + j*(-60) +-380 + j*(-109) +-173 + j*(-264) +25 + j*(-51) +484 + j*(32) +-175 + j*(52) +-358 + j*(212) +81 + j*(-68) +10 + j*(128) +-103 + j*(-35) +44 + j*(351) +202 + j*(36) +-97 + j*(279) +87 + j*(103) +-70 + j*(27) +133 + j*(235) +109 + j*(199) +146 + j*(88) +-90 + j*(-188) +-433 + j*(-84) +-101 + j*(-179) +202 + j*(-115) +209 + j*(-90) +28 + j*(103) +-146 + j*(168) +128 + j*(134) +273 + j*(158) +-272 + j*(169) +-179 + j*(-197) +-387 + j*(-228) +-86 + j*(-306) +161 + j*(-260) +-61 + j*(-40) +-128 + j*(-26) +-1 + j*(188) +133 + j*(-36) +-50 + j*(41) +-20 + j*(-163) +163 + j*(68) +134 + j*(183) +-278 + j*(-277) +168 + j*(294) +-473 + j*(-18) +25 + j*(364) +61 + j*(-151) +83 + j*(59) +45 + j*(-225) +76 + j*(105) +162 + j*(-346) +101 + j*(94) +-37 + j*(-292) +-23 + j*(-143) +170 + j*(49) +-14 + j*(-16) +22 + j*(71) +-111 + j*(-79) +188 + j*(-58) +-122 + j*(-239) +252 + j*(161) +-45 + j*(-11) +25 + j*(-204) +279 + j*(-64) +-137 + j*(-185) +-114 + j*(23) +133 + j*(185) +188 + j*(212) +-41 + j*(51) +141 + j*(-110) +-96 + j*(-378) +58 + j*(-146) +152 + j*(-47) +35 + j*(30) +144 + j*(-59) +-202 + j*(64) +-265 + j*(-29) +69 + j*(-327) +-15 + j*(54) +13 + j*(-119) +-33 + j*(273) +-203 + j*(81) +-108 + j*(275) +-109 + j*(119) +-165 + j*(-93) +-108 + j*(309) +-100 + j*(-303) +269 + j*(-175) +-293 + j*(95) +-129 + j*(183) +187 + j*(-76) +317 + j*(-244) +131 + j*(30) +-293 + j*(-280) +-96 + j*(170) +11 + j*(219) +-88 + j*(-159) +-386 + j*(-183) +-385 + j*(141) +13 + j*(252) +-184 + j*(-351) +473 + j*(213) +6 + j*(-129) +13 + j*(216) +66 + j*(1) +257 + j*(-221) +332 + j*(164) +-60 + j*(74) +-113 + j*(-6) +-59 + j*(264) +-11 + j*(37) +-74 + j*(263) +80 + j*(-193) +-12 + j*(-102) +74 + j*(-3) +-25 + j*(-152) +358 + j*(121) +134 + j*(69) +-374 + j*(77) +323 + j*(-186) +47 + j*(72) +-14 + j*(-469) +-23 + j*(-97) +-92 + j*(264) +100 + j*(-27) +158 + j*(-268) +32 + j*(55) +291 + j*(-216) +-260 + j*(194) +97 + j*(159) +-21 + j*(-142) +-152 + j*(-19) +-64 + j*(358) +162 + j*(18) +-225 + j*(90) +-127 + j*(234) +64 + j*(43) +141 + j*(45) +-250 + j*(9) +52 + j*(-197) +202 + j*(114) +-103 + j*(90) +306 + j*(-103) +385 + j*(21) +-66 + j*(-288) +-187 + j*(-74) +-9 + j*(-46) +420 + j*(146) +-13 + j*(166) +-168 + j*(81) +-267 + j*(-56) +98 + j*(-157) +-362 + j*(155) +339 + j*(76) +190 + j*(25) +-40 + j*(324) +-40 + j*(135) +-176 + j*(-10) +-62 + j*(-112) +42 + j*(201) +-52 + j*(-45) +290 + j*(-97) +190 + j*(98) +134 + j*(-165) +-162 + j*(-31) +-290 + j*(92) +-80 + j*(-121) +-72 + j*(217) +-151 + j*(-44) +42 + j*(140) +185 + j*(-230) +144 + j*(9) +188 + j*(107) +-9 + j*(174) +32 + j*(-89) +387 + j*(107) +185 + j*(232) +-91 + j*(40) +-83 + j*(137) +114 + j*(14) +180 + j*(12) +-35 + j*(318) +-139 + j*(-17) +-3 + j*(-109) +163 + j*(-286) +-211 + j*(-83) +29 + j*(21) +401 + j*(-445) +-81 + j*(-83) +-98 + j*(-218) +-121 + j*(-2) +115 + j*(17) +78 + j*(-435) +98 + j*(40) +304 + j*(139) +53 + j*(166) +185 + j*(130) +-115 + j*(-383) +-170 + j*(-74) +-49 + j*(-89) +7 + j*(77) +229 + j*(-230) +91 + j*(-82) +19 + j*(60) +-278 + j*(-250) +-127 + j*(25) +229 + j*(-180) +-57 + j*(36) +-25 + j*(163) +84 + j*(-128) +59 + j*(88) +-171 + j*(-7) +114 + j*(255) +35 + j*(109) +-44 + j*(409) +-210 + j*(-250) +-69 + j*(66) +-121 + j*(48) +125 + j*(-195) +107 + j*(55) +-1 + j*(-103) +264 + j*(24) +35 + j*(-345) +-250 + j*(-409) +195 + j*(6) +-60 + j*(-27) +-64 + j*(147) +-33 + j*(92) +-25 + j*(-93) +-228 + j*(-18) +-37 + j*(-191) +78 + j*(-4) +-69 + j*(-494) +-152 + j*(261) +-6 + j*(146) +-361 + j*(-142) +-65 + j*(176) +244 + j*(78) +-58 + j*(-261) +-58 + j*(-259) +-66 + j*(-286) +-186 + j*(181) +-257 + j*(-41) +194 + j*(354) +47 + j*(93) +-121 + j*(31) +136 + j*(-87) +10 + j*(190) +-272 + j*(-148) +-107 + j*(-56) +115 + j*(-47) +-53 + j*(-172) +45 + j*(-48) +347 + j*(-141) +66 + j*(-78) +-156 + j*(122) +50 + j*(-180) +217 + j*(-42) +-210 + j*(-83) +228 + j*(189) +583 + j*(-493) +196 + j*(153) +40 + j*(-85) +105 + j*(8) +-49 + j*(-282) +164 + j*(-246) +-35 + j*(-301) +129 + j*(252) +-268 + j*(125) +-144 + j*(116) +-309 + j*(112) +40 + j*(-140) +42 + j*(-145) +39 + j*(161) +-340 + j*(243) +-55 + j*(-122) +167 + j*(135) +-185 + j*(122) +66 + j*(-51) +200 + j*(46) +67 + j*(-173) +-50 + j*(126) +536 + j*(-277) +66 + j*(-58) +-182 + j*(208) +-59 + j*(-201) +253 + j*(46) +-20 + j*(-202) +66 + j*(269) +395 + j*(128) +-171 + j*(263) +-45 + j*(-102) +-135 + j*(13) +-194 + j*(109) +-115 + j*(313) +21 + j*(310) +-22 + j*(-176) +-59 + j*(-142) +274 + j*(33) +50 + j*(-194) +-39 + j*(210) +-163 + j*(-13) +-247 + j*(316) +163 + j*(-173) +54 + j*(-386) +49 + j*(293) +-6 + j*(286) +-254 + j*(-59) +-308 + j*(-129) +141 + j*(-104) +-262 + j*(-76) +-92 + j*(346) +318 + j*(-88) +134 + j*(248) +-27 + j*(-118) +119 + j*(145) +-185 + j*(-234) +-141 + j*(-91) +-95 + j*(-129) +151 + j*(-233) +-91 + j*(-215) +-105 + j*(-1) +-32 + j*(-80) +133 + j*(-57) +-52 + j*(-29) +-103 + j*(-84) +-65 + j*(-89) +-83 + j*(38) +-42 + j*(-209) +-243 + j*(-137) +-74 + j*(-73) +-167 + j*(33) +-197 + j*(-66) +12 + j*(-21) +88 + j*(-200) +129 + j*(108) +335 + j*(71) +54 + j*(-274) +-129 + j*(-361) +338 + j*(-28) +35 + j*(-118) +-44 + j*(-242) +-66 + j*(-45) +-290 + j*(-136) +-23 + j*(180) +176 + j*(86) +63 + j*(-119) +68 + j*(-148) +-366 + j*(-110) +138 + j*(86) +-22 + j*(80) +72 + j*(28) +-49 + j*(-218) +64 + j*(14) +364 + j*(-48) +221 + j*(-61) +212 + j*(175) +-34 + j*(199) +-25 + j*(135) +239 + j*(-129) +-253 + j*(-223) +103 + j*(148) +100 + j*(199) +331 + j*(103) +256 + j*(-104) +194 + j*(78) +170 + j*(-54) +-51 + j*(83) +-112 + j*(288) +298 + j*(88) +-196 + j*(-251) +-5 + j*(33) +104 + j*(-231) +-233 + j*(-22) +115 + j*(-112) +15 + j*(7) +147 + j*(-501) +223 + j*(60) +-243 + j*(-366) +-35 + j*(100) +-64 + j*(-82) +-236 + j*(-47) +137 + j*(-5) +31 + j*(-117) +401 + j*(436) +-192 + j*(-45) +78 + j*(-392) +-258 + j*(263) +-303 + j*(-162) +119 + j*(169) +211 + j*(58) +-53 + j*(117) +-28 + j*(-269) +107 + j*(-180) +107 + j*(-92) +-80 + j*(22) +356 + j*(127) +-168 + j*(91) +-199 + j*(-310) +-117 + j*(-108) +-193 + j*(-369) +60 + j*(156) +62 + j*(77) +-21 + j*(-73) +-219 + j*(-141) +-418 + j*(11) +-44 + j*(-158) +297 + j*(-14) +183 + j*(285) +-77 + j*(-115) +-92 + j*(-203) +302 + j*(-100) +234 + j*(-197) +275 + j*(88) +57 + j*(-214) +52 + j*(-255) +164 + j*(214) +119 + j*(-187) +117 + j*(86) +-3 + j*(340) +95 + j*(-66) +32 + j*(-25) +-200 + j*(105) +-76 + j*(126) +91 + j*(37) +-245 + j*(-36) +-120 + j*(77) +120 + j*(-119) +-99 + j*(-166) +-4 + j*(137) +41 + j*(151) +-182 + j*(35) +-151 + j*(-89) +-63 + j*(-212) +269 + j*(164) +284 + j*(163) +123 + j*(87) +-55 + j*(-116) +68 + j*(-134) +-62 + j*(-74) +57 + j*(100) +204 + j*(159) +255 + j*(182) +40 + j*(-157) +-81 + j*(118) +-11 + j*(-113) +168 + j*(-326) +158 + j*(8) +-139 + j*(-2) +103 + j*(-64) +54 + j*(606) +202 + j*(32) +-240 + j*(-212) +-236 + j*(-55) +25 + j*(-208) +124 + j*(-163) +127 + j*(-118) +-194 + j*(50) +23 + j*(106) +178 + j*(-280) +92 + j*(-33) +-42 + j*(126) +208 + j*(159) +-103 + j*(-33) +247 + j*(70) +-337 + j*(253) +-83 + j*(-166) +-199 + j*(12) +-92 + j*(542) +178 + j*(-195) +-115 + j*(-338) +146 + j*(82) +-163 + j*(-86) +-88 + j*(-90) +19 + j*(-390) +-59 + j*(-48) +81 + j*(165) +103 + j*(-173) +47 + j*(-240) +-453 + j*(-52) +-102 + j*(234) +-272 + j*(161) +81 + j*(-75) +-143 + j*(-223) +-126 + j*(-250) +134 + j*(-209) +45 + j*(-143) +-290 + j*(-23) +-88 + j*(14) +382 + j*(-177) +-407 + j*(-16) +-9 + j*(-69) +401 + j*(-166) +127 + j*(-6) +149 + j*(-99) +-124 + j*(-21) +17 + j*(-229) +-5 + j*(23) +-173 + j*(34) +34 + j*(59) +204 + j*(-1) +48 + j*(253) +247 + j*(154) +-158 + j*(172) +-81 + j*(340) +-23 + j*(-86) +-18 + j*(26) +6 + j*(-112) +-252 + j*(-152) +186 + j*(148) +-199 + j*(76) +330 + j*(6) +13 + j*(-215) +-279 + j*(-163) +52 + j*(-40) +-167 + j*(-231) +-236 + j*(129) +78 + j*(-25) +147 + j*(-44) +119 + j*(125) +-149 + j*(-324) +1 + j*(-77) +-201 + j*(-49) +250 + j*(-146) +15 + j*(-36) +56 + j*(-78) +-35 + j*(-8) +-110 + j*(14) +170 + j*(-251) +-460 + j*(-7) +-32 + j*(-224) +-18 + j*(86) +-17 + j*(-165) +417 + j*(-276) +-87 + j*(72) +-205 + j*(-112) +0 + j*(-154) +-8 + j*(-245) +147 + j*(27) +89 + j*(-115) +-16 + j*(-88) +-187 + j*(-146) +-93 + j*(8) +-11 + j*(181) +-159 + j*(4) +-132 + j*(92) +-23 + j*(-123) +223 + j*(69) +-5 + j*(249) +-127 + j*(291) +95 + j*(4) +59 + j*(228) +75 + j*(-275) +-171 + j*(11) +-136 + j*(-105) +-198 + j*(204) +-57 + j*(5) +3 + j*(-324) +-538 + j*(-66) +74 + j*(-358) +467 + j*(20) +-421 + j*(-13) +46 + j*(-384) +-553 + j*(-285) +178 + j*(18) +-197 + j*(97) +333 + j*(-331) +-301 + j*(-172) +50 + j*(-204) +291 + j*(331) +-132 + j*(-193) +-199 + j*(382) +-44 + j*(-281) +33 + j*(177) +18 + j*(624) +291 + j*(-469) +-192 + j*(71) +-414 + j*(254) +-331 + j*(-499) +281 + j*(-560) +-112 + j*(-367) +-390 + j*(-414) +274 + j*(-482) +373 + j*(-433) +320 + j*(128) +250 + j*(-570) +-4 + j*(364) +345 + j*(329) +-415 + j*(450) +384 + j*(-269) +-269 + j*(337) +-714 + j*(-90) +-144 + j*(-327) +92 + j*(-220) +-202 + j*(-617) +368 + j*(187) +-391 + j*(445) +-446 + j*(485) +606 + j*(-561) +-156 + j*(266) +346 + j*(262) +44 + j*(288) +6 + j*(132) +199 + j*(107) +517 + j*(165) +59 + j*(218) +371 + j*(-624) +278 + j*(0) +-479 + j*(-395) +390 + j*(-21) +233 + j*(52) +-342 + j*(371) +-434 + j*(473) +-187 + j*(-260) +-327 + j*(412) +-393 + j*(179) +-523 + j*(-187) +-343 + j*(-66) +295 + j*(193) +132 + j*(-379) +298 + j*(-465) +-434 + j*(26) +-532 + j*(284) +-207 + j*(-152) +-286 + j*(412) +-233 + j*(-143) +49 + j*(185) +11 + j*(10) +-176 + j*(527) +395 + j*(203) +-45 + j*(356) +264 + j*(-517) +189 + j*(-214) +325 + j*(-169) +-23 + j*(114) +-362 + j*(190) +-424 + j*(-215) +442 + j*(496) +-311 + j*(-489) +347 + j*(19) +-66 + j*(-206) +-299 + j*(-675) +-133 + j*(-135) +369 + j*(312) +-94 + j*(467) +222 + j*(-23) +177 + j*(240) +-163 + j*(-114) +278 + j*(-13) +168 + j*(523) +-314 + j*(127) +-484 + j*(119) +298 + j*(522) +-288 + j*(-101) +-369 + j*(448) +62 + j*(138) +74 + j*(176) +-442 + j*(-165) +25 + j*(-23) +540 + j*(622) +92 + j*(82) +-477 + j*(187) +134 + j*(-74) +308 + j*(176) +213 + j*(-274) +-223 + j*(-270) +-400 + j*(393) +544 + j*(-454) +337 + j*(-287) +-313 + j*(466) +304 + j*(397) +118 + j*(-298) +-496 + j*(358) +58 + j*(-314) +-18 + j*(56) +-37 + j*(-183) +85 + j*(-219) +470 + j*(-586) +-557 + j*(-581) +425 + j*(194) +-148 + j*(-387) +111 + j*(66) +433 + j*(412) +330 + j*(-301) +284 + j*(-236) +-71 + j*(156) +243 + j*(-194) +323 + j*(692) +49 + j*(547) +-98 + j*(232) +-141 + j*(-212) +57 + j*(250) +313 + j*(-370) +-641 + j*(-368) +-259 + j*(-291) +-16 + j*(-18) +-689 + j*(241) +-308 + j*(-279) +392 + j*(-391) +271 + j*(-156) +40 + j*(334) +84 + j*(-208) +-247 + j*(123) +122 + j*(-320) +293 + j*(-576) +-299 + j*(446) +-459 + j*(-285) +-474 + j*(-351) +119 + j*(129) +-264 + j*(110) +-203 + j*(411) +245 + j*(52) +215 + j*(-194) +-147 + j*(333) +-242 + j*(-580) +255 + j*(140) +107 + j*(-214) +223 + j*(139) +-246 + j*(-601) +219 + j*(-79) +232 + j*(-344) +250 + j*(-248) +76 + j*(64) +380 + j*(-157) +125 + j*(325) +-306 + j*(257) +317 + j*(199) +-364 + j*(435) +-135 + j*(-126) +47 + j*(-95) +-303 + j*(-332) +-411 + j*(416) +-205 + j*(-384) +341 + j*(-59) +-47 + j*(-214) +-64 + j*(-122) +284 + j*(352) +-300 + j*(270) +419 + j*(175) +201 + j*(-445) +269 + j*(409) +381 + j*(225) +262 + j*(487) +-52 + j*(-374) +33 + j*(-332) +-221 + j*(-178) +57 + j*(-252) +-325 + j*(325) +218 + j*(546) +-151 + j*(0) +262 + j*(-284) +240 + j*(428) +144 + j*(123) +254 + j*(-41) +-361 + j*(365) +-5 + j*(288) +392 + j*(-202) +316 + j*(238) +296 + j*(165) +16 + j*(468) +36 + j*(290) +-267 + j*(-337) +119 + j*(396) +-428 + j*(401) +-301 + j*(-145) +288 + j*(-189) +506 + j*(-230) +-116 + j*(-116) +-217 + j*(-225) +171 + j*(-210) +444 + j*(-202) +223 + j*(124) +-432 + j*(522) +133 + j*(235) +-234 + j*(-372) +-84 + j*(-268) +-142 + j*(-271) +189 + j*(148) +67 + j*(16) +342 + j*(278) +355 + j*(319) +115 + j*(-101) +631 + j*(-556) +267 + j*(344) +-472 + j*(-622) +-483 + j*(433) +327 + j*(373) +-462 + j*(457) +-331 + j*(139) +-59 + j*(-136) +276 + j*(-262) +-57 + j*(182) +-319 + j*(168) +-277 + j*(132) +351 + j*(-30) +-111 + j*(260) +-291 + j*(560) +425 + j*(622) +221 + j*(-26) +121 + j*(54) +-103 + j*(271) +-273 + j*(-501) +608 + j*(-200) +-373 + j*(-40) +103 + j*(-91) +33 + j*(107) +-253 + j*(302) +208 + j*(-200) +-401 + j*(78) +-143 + j*(-327) +354 + j*(-397) +-85 + j*(-421) +280 + j*(-222) +320 + j*(-242) +283 + j*(-122) +-399 + j*(407) +-46 + j*(9) +244 + j*(171) +462 + j*(-53) +-617 + j*(-304) +-309 + j*(115) +493 + j*(-261) +-403 + j*(140) +-300 + j*(86) +643 + j*(4) +339 + j*(-296) +-363 + j*(-57) +-72 + j*(472) +199 + j*(-41) +-198 + j*(212) +369 + j*(185) +228 + j*(-564) +-215 + j*(-262) +-423 + j*(-37) +-159 + j*(371) +-373 + j*(-308) +-371 + j*(241) +-204 + j*(-335) +68 + j*(182) +-284 + j*(-345) +-332 + j*(-184) +418 + j*(255) +3 + j*(-298) +437 + j*(219) +66 + j*(-67) +98 + j*(-235) +-384 + j*(288) +-322 + j*(271) +-377 + j*(-383) +517 + j*(-313) +53 + j*(211) +356 + j*(158) +131 + j*(23) +-161 + j*(-13) +284 + j*(-383) +414 + j*(50) +295 + j*(-61) +239 + j*(-342) +289 + j*(-161) +458 + j*(-262) +-348 + j*(-588) +-573 + j*(215) +266 + j*(463) +344 + j*(-51) +4 + j*(383) +226 + j*(-94) +306 + j*(-347) +206 + j*(11) +347 + j*(151) +-305 + j*(337) +433 + j*(302) +-28 + j*(527) +-534 + j*(-516) +248 + j*(206) +33 + j*(70) +-18 + j*(-231) +231 + j*(-226) +-456 + j*(-378) +112 + j*(-158) +-90 + j*(-523) +52 + j*(-177) +-156 + j*(-113) +46 + j*(268) +22 + j*(422) +-191 + j*(-325) +-315 + j*(-511) +-562 + j*(-180) +-69 + j*(-325) +591 + j*(288) +-554 + j*(337) +-305 + j*(358) +-340 + j*(-383) +-443 + j*(412) +98 + j*(-349) +-403 + j*(219) +401 + j*(-107) +209 + j*(-242) +-416 + j*(307) +470 + j*(-292) +249 + j*(344) +84 + j*(520) +-99 + j*(-9) +-381 + j*(240) +52 + j*(-255) +-315 + j*(228) +165 + j*(-340) +-385 + j*(-367) +378 + j*(11) +486 + j*(-447) +574 + j*(-212) +-550 + j*(-66) +296 + j*(443) +-421 + j*(-38) +-15 + j*(334) +156 + j*(-60) +291 + j*(184) +-148 + j*(-100) +-99 + j*(294) +214 + j*(76) +349 + j*(-234) +291 + j*(263) +-121 + j*(-279) +-119 + j*(-69) +187 + j*(204) +340 + j*(-244) +-297 + j*(244) +-8 + j*(-47) +-105 + j*(-7) +-196 + j*(-63) +-105 + j*(35) +405 + j*(69) +423 + j*(219) +-462 + j*(-112) +-197 + j*(-422) +224 + j*(81) +-612 + j*(71) +363 + j*(209) +133 + j*(-302) +235 + j*(418) +-315 + j*(479) +-166 + j*(-6) +-97 + j*(140) +278 + j*(451) +-301 + j*(212) +-412 + j*(-291) +446 + j*(224) +108 + j*(-417) +487 + j*(269) +-527 + j*(156) +-550 + j*(-249) +543 + j*(424) +-126 + j*(57) +-230 + j*(-80) +-40 + j*(-153) +-22 + j*(-342) +-75 + j*(-334) +339 + j*(-45) +-105 + j*(36) +151 + j*(81) +-457 + j*(499) +207 + j*(-512) +-276 + j*(462) +-246 + j*(-299) +-155 + j*(-314) +-18 + j*(-281) +233 + j*(-358) +564 + j*(-344) +-448 + j*(-518) +477 + j*(84) +-371 + j*(-276) +453 + j*(187) +-252 + j*(-148) +459 + j*(370) +-31 + j*(-509) +-215 + j*(-175) +-177 + j*(-291) +-182 + j*(-204) +298 + j*(47) +200 + j*(-255) +-353 + j*(-530) +182 + j*(-202) +-296 + j*(-480) +370 + j*(-175) +-250 + j*(-131) +-74 + j*(-313) +-115 + j*(-626) +326 + j*(274) +-16 + j*(-218) +-151 + j*(-180) +-474 + j*(374) +378 + j*(-107) +141 + j*(245) +113 + j*(-241) +-526 + j*(1) +-300 + j*(-199) +550 + j*(-174) +392 + j*(166) +110 + j*(-38) +301 + j*(-351) +284 + j*(-59) +223 + j*(-526) +-282 + j*(608) +317 + j*(332) +-503 + j*(-453) +-366 + j*(518) +349 + j*(1) +310 + j*(279) +-163 + j*(-223) +-21 + j*(-283) +443 + j*(-171) +262 + j*(-201) +317 + j*(441) +75 + j*(-129) +-223 + j*(223) +296 + j*(91) +-455 + j*(-91) +-651 + j*(175) +359 + j*(-354) +-51 + j*(512) +540 + j*(-234) +-161 + j*(-114) +349 + j*(-91) +-20 + j*(290) +-208 + j*(-203) +-25 + j*(161) +-315 + j*(373) +286 + j*(-8) +125 + j*(395) +-95 + j*(53) +332 + j*(-238) +-211 + j*(-252) +-69 + j*(-207) +-617 + j*(268) +-103 + j*(356) +-131 + j*(393) +-310 + j*(-280) +-245 + j*(-274) +-2 + j*(-759) +-375 + j*(-166) +-215 + j*(182) +315 + j*(230) +-190 + j*(158) +-446 + j*(333) +226 + j*(355) +344 + j*(-258) +16 + j*(-428) +-372 + j*(301) +393 + j*(189) +293 + j*(-177) +455 + j*(-136) +-35 + j*(-170) +16 + j*(-351) +-16 + j*(-304) +-127 + j*(205) +-550 + j*(-288) +-10 + j*(-56) +-173 + j*(-178) +-307 + j*(164) +-329 + j*(175) +-215 + j*(-426) +397 + j*(211) +289 + j*(-257) +-272 + j*(23) +-107 + j*(-281) +179 + j*(168) +26 + j*(-535) +23 + j*(234) +302 + j*(392) +-164 + j*(-396) +52 + j*(231) +194 + j*(-21) +-352 + j*(-203) +-338 + j*(146) +-677 + j*(-162) +-191 + j*(-365) +-387 + j*(493) +-414 + j*(242) +-103 + j*(243) +-315 + j*(-6) +-612 + j*(210) +41 + j*(-360) +-133 + j*(-148) +-368 + j*(241) +54 + j*(-62) +398 + j*(-445) +-71 + j*(-591) +98 + j*(273) +-729 + j*(338) +-323 + j*(-267) +355 + j*(-348) +163 + j*(510) +508 + j*(-466) +-651 + j*(-209) +189 + j*(168) +487 + j*(150) +364 + j*(111) +267 + j*(-54) +427 + j*(211) +-412 + j*(594) +-238 + j*(-31) +-233 + j*(328) +192 + j*(115) +305 + j*(297) +484 + j*(436) +-35 + j*(180) +-129 + j*(-513) +-51 + j*(-513) +-398 + j*(-67) +162 + j*(373) +638 + j*(376) +641 + j*(-561) +-204 + j*(-426) +551 + j*(-218) +-161 + j*(556) +474 + j*(226) +-243 + j*(-293) +16 + j*(-136) +-474 + j*(-295) +-490 + j*(-260) +252 + j*(-169) +-363 + j*(209) +-151 + j*(457) +-361 + j*(-232) +-168 + j*(460) +32 + j*(-496) +-92 + j*(-243) +-503 + j*(-238) +367 + j*(148) +-56 + j*(258) +-156 + j*(98) +-250 + j*(-78) +-107 + j*(-18) +298 + j*(257) +-404 + j*(-225) +-339 + j*(-220) +-61 + j*(-391) +-600 + j*(-141) +304 + j*(-457) +-280 + j*(146) +206 + j*(421) +355 + j*(709) +153 + j*(225) +124 + j*(-206) +373 + j*(-447) +-442 + j*(88) +269 + j*(-115) +-335 + j*(-300) +-158 + j*(-78) +-320 + j*(-414) +491 + j*(-345) +559 + j*(252) +-67 + j*(-332) +-394 + j*(-370) +242 + j*(-639) +-349 + j*(286) +98 + j*(57) +506 + j*(286) +117 + j*(-76) +-506 + j*(47) +-100 + j*(156) +-59 + j*(-168) +162 + j*(363) +-142 + j*(298) +110 + j*(139) +163 + j*(184) +-107 + j*(-296) +40 + j*(231) +-26 + j*(-117) +-184 + j*(8) +156 + j*(-24) +-98 + j*(-288) +192 + j*(-55) +-138 + j*(-66) +161 + j*(276) +337 + j*(-55) +122 + j*(-122) +233 + j*(-233) +-29 + j*(-118) +-36 + j*(0) +-259 + j*(5) +63 + j*(18) +-158 + j*(-301) +-95 + j*(-240) +549 + j*(309) +184 + j*(53) +-141 + j*(328) +-11 + j*(258) +-41 + j*(237) +-107 + j*(35) +-265 + j*(-267) +205 + j*(-198) +-274 + j*(284) +-211 + j*(-33) +-326 + j*(-124) +-64 + j*(-79) +-161 + j*(-294) +122 + j*(32) +-248 + j*(-27) +-3 + j*(-115) +-145 + j*(-153) +-308 + j*(35) +138 + j*(-127) +-254 + j*(-220) +-139 + j*(49) +-33 + j*(-45) +41 + j*(23) +4 + j*(-356) +-192 + j*(50) +-81 + j*(200) +157 + j*(266) +110 + j*(252) +51 + j*(-231) +-297 + j*(-110) +-142 + j*(-7) +-208 + j*(13) +-236 + j*(-299) +-43 + j*(190) +312 + j*(-10) +157 + j*(-322) +171 + j*(-177) +-15 + j*(-80) +-320 + j*(103) +-58 + j*(208) +192 + j*(-77) +424 + j*(-43) +83 + j*(56) +218 + j*(83) +46 + j*(-98) +-73 + j*(74) +-149 + j*(35) +-199 + j*(47) +-54 + j*(-18) +-68 + j*(136) +327 + j*(240) +-45 + j*(337) +-107 + j*(-88) +-52 + j*(224) +238 + j*(58) +-213 + j*(-77) +105 + j*(56) +163 + j*(-331) +119 + j*(-413) +-66 + j*(-121) +-112 + j*(176) +93 + j*(35) +199 + j*(98) +177 + j*(-56) +-216 + j*(-6) +-44 + j*(-34) +-244 + j*(-201) +53 + j*(-68) +133 + j*(149) +85 + j*(179) +-88 + j*(-4) +-91 + j*(28) +-173 + j*(16) +-13 + j*(135) +-147 + j*(120) +-85 + j*(-152) +24 + j*(-194) +-226 + j*(-117) +-8 + j*(120) +301 + j*(350) +110 + j*(-192) +-210 + j*(-33) +-57 + j*(-59) +-57 + j*(-199) +71 + j*(-110) +6 + j*(-235) +-84 + j*(100) +38 + j*(-43) +-40 + j*(151) +-187 + j*(224) +-156 + j*(138) +148 + j*(-41) +204 + j*(-564) +144 + j*(-85) +16 + j*(-325) +-55 + j*(78) +-21 + j*(-2) +77 + j*(152) +-99 + j*(-4) +-256 + j*(228) +221 + j*(0) +-71 + j*(226) +-83 + j*(-78) +-5 + j*(173) +-42 + j*(-68) +116 + j*(-40) +44 + j*(-258) +-39 + j*(-39) +-7 + j*(-173) +-223 + j*(-71) +40 + j*(89) +-86 + j*(-344) +-243 + j*(190) +286 + j*(48) +-284 + j*(227) +156 + j*(98) +180 + j*(-112) +-327 + j*(-141) +180 + j*(11) +-76 + j*(-96) +-55 + j*(-71) +-104 + j*(-48) +276 + j*(-40) +-4 + j*(-30) +281 + j*(-175) +425 + j*(192) +33 + j*(-87) +279 + j*(42) +-97 + j*(-129) +76 + j*(-5) +26 + j*(69) +48 + j*(-472) +-218 + j*(-209) +-143 + j*(-159) +-59 + j*(1) +221 + j*(25) +-95 + j*(32) +-69 + j*(79) +95 + j*(-206) +159 + j*(-54) +-121 + j*(107) +-23 + j*(33) +-68 + j*(-163) +40 + j*(-171) +190 + j*(-384) +-162 + j*(-95) +23 + j*(-211) +-136 + j*(0) +-46 + j*(-2) +381 + j*(-231) +128 + j*(-233) +-30 + j*(-272) +-98 + j*(86) +-109 + j*(-287) +-30 + j*(-47) +-94 + j*(235) +-144 + j*(0) +257 + j*(210) +-68 + j*(-23) +195 + j*(123) +-221 + j*(122) +244 + j*(110) +-126 + j*(-84) +59 + j*(-195) +-64 + j*(305) +186 + j*(74) +85 + j*(-304) +-126 + j*(96) +245 + j*(165) +23 + j*(-156) +267 + j*(-207) +-306 + j*(-105) +-195 + j*(131) +-52 + j*(-120) +13 + j*(-123) +-27 + j*(-401) +51 + j*(-105) +-214 + j*(121) +-68 + j*(-316) +64 + j*(83) +-260 + j*(-67) +-200 + j*(66) +-270 + j*(108) +-496 + j*(-64) +-40 + j*(-259) +-36 + j*(365) +29 + j*(61) +271 + j*(139) +-46 + j*(-204) +112 + j*(301) +73 + j*(-66) +211 + j*(-33) +24 + j*(161) +-153 + j*(-43) +4 + j*(-89) +107 + j*(202) +-52 + j*(-315) +23 + j*(59) +-80 + j*(-99) +115 + j*(-133) +127 + j*(-4) +56 + j*(278) +-90 + j*(17) +-215 + j*(176) +39 + j*(-146) +-180 + j*(21) +-135 + j*(146) +297 + j*(-195) +-173 + j*(13) +227 + j*(153) +107 + j*(-227) +-42 + j*(94) +-177 + j*(176) +157 + j*(40) +-243 + j*(30) +-65 + j*(-271) +-162 + j*(218) +574 + j*(-124) +64 + j*(-87) +-106 + j*(21) +-64 + j*(-85) +105 + j*(78) +170 + j*(252) +171 + j*(-236) +301 + j*(157) +257 + j*(-142) +-198 + j*(127) +8 + j*(402) +-31 + j*(137) +-168 + j*(-62) +331 + j*(-171) +95 + j*(-11) +260 + j*(-33) +358 + j*(-293) +-36 + j*(63) +-6 + j*(151) +177 + j*(-247) +60 + j*(-130) +199 + j*(49) +-54 + j*(83) +0 + j*(27) +-158 + j*(-120) +190 + j*(-147) +-168 + j*(138) +161 + j*(-16) +-5 + j*(14) +-260 + j*(-122) +-65 + j*(118) +-136 + j*(-20) +97 + j*(0) +-78 + j*(0) +89 + j*(-169) +141 + j*(-215) +-119 + j*(191) +114 + j*(-15) +-366 + j*(300) +-267 + j*(373) +-71 + j*(211) +220 + j*(136) +3 + j*(91) +170 + j*(275) +159 + j*(-59) +-163 + j*(-139) +-148 + j*(-9) +161 + j*(321) +167 + j*(26) +-87 + j*(-114) +-143 + j*(33) +47 + j*(145) +30 + j*(-80) +64 + j*(-204) +70 + j*(-93) +-183 + j*(37) +-71 + j*(-274) +-81 + j*(-93) +243 + j*(197) +-277 + j*(-307) +-103 + j*(-231) +32 + j*(168) +18 + j*(-4) +320 + j*(267) +-28 + j*(-4) +64 + j*(195) +-165 + j*(-17) +-72 + j*(-80) +-83 + j*(236) +-95 + j*(-298) +-310 + j*(4) +43 + j*(-100) +219 + j*(-225) +99 + j*(184) +-158 + j*(-57) +-32 + j*(-35) +-405 + j*(-144) +329 + j*(9) +191 + j*(47) +-65 + j*(98) +-28 + j*(-207) +-56 + j*(103) +-9 + j*(30) +-59 + j*(249) +-161 + j*(-89) +105 + j*(-37) +-136 + j*(-25) +-461 + j*(-19) +238 + j*(-184) +-49 + j*(-118) +-171 + j*(-199) +208 + j*(-146) +-117 + j*(-15) +-72 + j*(192) +351 + j*(-381) +-117 + j*(-57) +-37 + j*(-335) +-4 + j*(-30) +-269 + j*(-141) +351 + j*(107) +-214 + j*(-186) +154 + j*(-385) +-10 + j*(-100) +-200 + j*(-194) +120 + j*(-171) +16 + j*(-36) +-6 + j*(64) +53 + j*(-182) +-21 + j*(66) +-244 + j*(-162) +-187 + j*(107) +257 + j*(6) +254 + j*(183) +21 + j*(-123) +-260 + j*(-235) +-198 + j*(208) +67 + j*(-178) +-156 + j*(171) +23 + j*(-328) +50 + j*(-82) +273 + j*(91) +-465 + j*(11) +-252 + j*(-271) +66 + j*(159) +-349 + j*(-22) +-38 + j*(-395) +63 + j*(-30) +-83 + j*(-186) +-167 + j*(-312) +231 + j*(17) +168 + j*(-475) +216 + j*(-16) +-141 + j*(-285) +-185 + j*(72) +88 + j*(-3) +-132 + j*(-122) +63 + j*(245) +158 + j*(-104) +-301 + j*(-276) +-28 + j*(226) +129 + j*(40) +-146 + j*(-64) +-306 + j*(-209) +35 + j*(50) +390 + j*(30) +-264 + j*(-94) +-201 + j*(30) +4 + j*(21) +-325 + j*(-134) +-270 + j*(-317) +402 + j*(4) +-135 + j*(181) +221 + j*(69) +-272 + j*(-63) +-79 + j*(169) +-31 + j*(249) +25 + j*(238) +69 + j*(39) +38 + j*(119) +-13 + j*(54) +218 + j*(-204) +-118 + j*(-271) +-123 + j*(-87) +-215 + j*(-211) +8 + j*(-20) +-113 + j*(-134) +118 + j*(330) +184 + j*(52) +-52 + j*(8) +170 + j*(-322) +59 + j*(-35) +-247 + j*(372) +-42 + j*(-73) +119 + j*(111) +-25 + j*(-49) +-2 + j*(-87) +-310 + j*(-179) +250 + j*(70) +-49 + j*(18) +100 + j*(-186) +-135 + j*(28) +-71 + j*(153) +45 + j*(428) +3 + j*(-249) +-119 + j*(111) +321 + j*(223) +25 + j*(-214) +199 + j*(-301) +36 + j*(-147) +182 + j*(-100) +138 + j*(-7) +-115 + j*(-452) +147 + j*(52) +31 + j*(-32) +-359 + j*(243) +-57 + j*(-26) +288 + j*(-342) +-114 + j*(362) +-314 + j*(-102) +-130 + j*(-46) +90 + j*(184) +46 + j*(-83) +-231 + j*(151) +-25 + j*(-37) +-51 + j*(-51) +-491 + j*(88) +-45 + j*(141) +62 + j*(-93) +-115 + j*(189) +-167 + j*(556) +-111 + j*(-173) +-148 + j*(-122) +-70 + j*(-202) +226 + j*(315) +47 + j*(82) +107 + j*(92) +-71 + j*(159) +-201 + j*(96) +-279 + j*(312) +178 + j*(-182) +21 + j*(30) +93 + j*(-142) +330 + j*(-162) +88 + j*(49) +91 + j*(118) +-88 + j*(186) +157 + j*(76) +-174 + j*(79) +172 + j*(-34) +175 + j*(-133) +-195 + j*(-25) +100 + j*(-73) +237 + j*(213) +-206 + j*(-190) +209 + j*(-362) +-407 + j*(407) +-188 + j*(88) +-54 + j*(264) +-172 + j*(-100) +127 + j*(-121) +-132 + j*(-37) +-45 + j*(96) +221 + j*(111) +167 + j*(-11) +57 + j*(19) +119 + j*(-85) +-74 + j*(69) +12 + j*(-302) +-69 + j*(-177) +-21 + j*(181) +-117 + j*(157) +82 + j*(328) +393 + j*(29) +186 + j*(77) +371 + j*(-147) +93 + j*(-47) +-169 + j*(-63) +-48 + j*(215) +9 + j*(-59) +73 + j*(-226) +-295 + j*(-11) +-247 + j*(158) +-114 + j*(-120) +-83 + j*(-57) +53 + j*(-2) +-151 + j*(-27) +-251 + j*(-245) +-193 + j*(-12) +31 + j*(-63) +235 + j*(208) +53 + j*(-342) +138 + j*(-112) +93 + j*(-262) +5 + j*(65) +-266 + j*(-119) +-149 + j*(-166) +-25 + j*(38) +184 + j*(7) +-290 + j*(-71) +157 + j*(293) +-90 + j*(-56) +458 + j*(-84) +-99 + j*(-19) +164 + j*(153) +224 + j*(174) +-101 + j*(-18) +-81 + j*(154) +158 + j*(154) +-127 + j*(-254) +175 + j*(-91) +292 + j*(21) +-170 + j*(0) +148 + j*(-99) +-146 + j*(133) +136 + j*(121) +114 + j*(-186) +-29 + j*(60) +39 + j*(108) +-83 + j*(-29) +25 + j*(254) +-4 + j*(-291) +28 + j*(199) +-47 + j*(-40) +-95 + j*(203) +-223 + j*(18) +109 + j*(-144) +-82 + j*(-18) +148 + j*(302) +42 + j*(58) +291 + j*(205) +69 + j*(25) +-135 + j*(-63) +73 + j*(-18) +-325 + j*(-216) +-100 + j*(62) +-17 + j*(-175) +-198 + j*(93) +-25 + j*(216) +92 + j*(-165) +122 + j*(-248) +165 + j*(166) +121 + j*(85) +81 + j*(-57) +105 + j*(167) +211 + j*(-134) +18 + j*(-106) +-33 + j*(-170) +73 + j*(-61) +286 + j*(-19) +2 + j*(286) +-436 + j*(426) +-118 + j*(-88) +-47 + j*(-100) +-127 + j*(266) +58 + j*(-47) +-15 + j*(210) +117 + j*(130) +-325 + j*(146) +91 + j*(108) +127 + j*(-89) +41 + j*(-191) +-69 + j*(283) +-24 + j*(-206) +-237 + j*(-129) +24 + j*(1) +-15 + j*(188) +159 + j*(-438) +-153 + j*(177) +91 + j*(84) +196 + j*(99) +-199 + j*(-139) +-26 + j*(161) +-98 + j*(-145) +139 + j*(208) +8 + j*(-177) +106 + j*(83) +107 + j*(-57) +-309 + j*(-213) +-96 + j*(16) +88 + j*(-123) +-114 + j*(145) +238 + j*(-22) +46 + j*(-329) +156 + j*(-65) +-183 + j*(112) +61 + j*(-93) +11 + j*(154) +47 + j*(8) +-110 + j*(-246) +-185 + j*(-25) +383 + j*(-152) +6 + j*(-38) +162 + j*(-64) +-345 + j*(178) +-4 + j*(-176) +-76 + j*(49) +50 + j*(-157) +-230 + j*(-141) +-103 + j*(-71) +286 + j*(134) +-431 + j*(-79) +153 + j*(34) +-320 + j*(-55) +178 + j*(292) +-25 + j*(-117) +189 + j*(57) +158 + j*(105) +-108 + j*(-551) +170 + j*(-34) +-298 + j*(-87) +187 + j*(-165) +69 + j*(59) +-166 + j*(453) +111 + j*(-119) +172 + j*(-110) +-185 + j*(158) +-131 + j*(-267) +-54 + j*(-285) +-57 + j*(65) +94 + j*(-38) +382 + j*(-139) +-119 + j*(-199) +-252 + j*(48) +-190 + j*(421) +-119 + j*(30) +165 + j*(236) +77 + j*(42) +14 + j*(210) +-52 + j*(-196) +144 + j*(-216) +28 + j*(99) +-242 + j*(151) +-19 + j*(-17) +62 + j*(-230) +146 + j*(130) +-67 + j*(-202) +158 + j*(-134) +-318 + j*(192) +48 + j*(-28) +-322 + j*(180) +-263 + j*(187) +58 + j*(226) +-1 + j*(96) +8 + j*(304) +-31 + j*(-8) +214 + j*(-35) +-35 + j*(-71) +-22 + j*(-124) +-321 + j*(-234) +305 + j*(-367) +-170 + j*(-57) +-206 + j*(124) +-64 + j*(-117) +35 + j*(-8) +-74 + j*(-139) +-81 + j*(200) +355 + j*(189) +115 + j*(158) +-22 + j*(1) +-117 + j*(319) +48 + j*(193) +-66 + j*(-28) +-78 + j*(-221) +77 + j*(204) +-308 + j*(187) +-373 + j*(223) +-246 + j*(224) +277 + j*(147) +64 + j*(-37) +-13 + j*(-129) +6 + j*(-28) +80 + j*(15) +173 + j*(60) +-112 + j*(98) +-279 + j*(-98) +103 + j*(29) +115 + j*(13) +49 + j*(-102) +233 + j*(81) +189 + j*(-76) +192 + j*(52) +-54 + j*(-86) +-33 + j*(-18) +-248 + j*(105) +76 + j*(177) +433 + j*(-158) +-190 + j*(-6) +-139 + j*(93) +-57 + j*(-262) +165 + j*(-156) +305 + j*(-173) +-5 + j*(323) +33 + j*(335) +-156 + j*(-53) +-235 + j*(111) +-19 + j*(78) +-34 + j*(-106) +254 + j*(62) +-130 + j*(185) +5 + j*(-9) +53 + j*(-91) +-107 + j*(357) +-16 + j*(-24) +41 + j*(-177) +-18 + j*(135) +102 + j*(223) +-88 + j*(87) +173 + j*(251) +-35 + j*(-85) +-260 + j*(-141) +13 + j*(35) +235 + j*(136) +45 + j*(109) +57 + j*(-5) +59 + j*(-38) +148 + j*(78) +134 + j*(-247) +-215 + j*(40) +243 + j*(-28) +42 + j*(-71) +-59 + j*(-18) +63 + j*(-50) +-286 + j*(-103) +-140 + j*(-54) +43 + j*(-92) +117 + j*(-78) +58 + j*(-70) +-2 + j*(-187) +33 + j*(1) +-328 + j*(189) +-151 + j*(-17) +70 + j*(56) +-33 + j*(110) +-56 + j*(-232) +139 + j*(211) +68 + j*(-8) +-23 + j*(-332) +-84 + j*(-69) +-124 + j*(-66) +238 + j*(-9) +165 + j*(-138) +117 + j*(153) +-3 + j*(-95) +252 + j*(-83) +-146 + j*(81) +-163 + j*(-2) +231 + j*(206) +103 + j*(-237) +14 + j*(-40) +187 + j*(175) +-88 + j*(171) +66 + j*(202) +71 + j*(-172) +-182 + j*(-47) +-193 + j*(96) +158 + j*(197) +-11 + j*(-202) +-110 + j*(86) +-76 + j*(-20) +23 + j*(-204) +-110 + j*(228) +30 + j*(-39) +182 + j*(-27) +104 + j*(30) +-421 + j*(55) +-124 + j*(-89) +275 + j*(140) +-114 + j*(65) +188 + j*(221) +-515 + j*(152) +-315 + j*(-170) +1 + j*(-225) +294 + j*(14) +202 + j*(6) +255 + j*(-163) +-30 + j*(-192) +-179 + j*(141) +148 + j*(-154) +-74 + j*(-300) +-235 + j*(18) +247 + j*(-79) +177 + j*(-129) +-186 + j*(182) +-50 + j*(-11) +356 + j*(-52) +148 + j*(-117) +136 + j*(99) +93 + j*(-328) +-4 + j*(26) +7 + j*(-222) +-58 + j*(-41) +236 + j*(106) +-535 + j*(89) +356 + j*(320) +-111 + j*(38) +58 + j*(-325) +-165 + j*(103) +-176 + j*(-89) +-93 + j*(-48) +-6 + j*(69) +110 + j*(-194) +-19 + j*(1) +18 + j*(-311) +407 + j*(-1) +64 + j*(161) +142 + j*(-227) +-356 + j*(-335) +195 + j*(366) +-200 + j*(-170) +160 + j*(194) +-43 + j*(-305) +168 + j*(-30) +221 + j*(146) +-13 + j*(194) +366 + j*(-336) +-265 + j*(107) +-216 + j*(133) +-73 + j*(124) +-288 + j*(-79) +-6 + j*(78) +359 + j*(126) +-62 + j*(180) +205 + j*(-325) +-21 + j*(-49) +54 + j*(-180) +77 + j*(-340) +-77 + j*(-49) +-87 + j*(166) +129 + j*(115) +-167 + j*(25) +192 + j*(-13) +395 + j*(-304) +358 + j*(-41) +8 + j*(135) +-91 + j*(-146) +-103 + j*(-84) +136 + j*(98) +-123 + j*(-60) +298 + j*(-141) +-117 + j*(-283) +335 + j*(-21) +143 + j*(-44) +-249 + j*(-75) +11 + j*(47) +-146 + j*(-163) +185 + j*(232) +313 + j*(59) +-227 + j*(-141) +-214 + j*(-50) +-64 + j*(143) +73 + j*(-165) +185 + j*(-30) +55 + j*(48) +-152 + j*(-82) +-35 + j*(-16) +49 + j*(-21) +4 + j*(313) +279 + j*(42) +48 + j*(-219) +40 + j*(37) +-71 + j*(99) +-75 + j*(-37) +11 + j*(-197) +118 + j*(40) +-59 + j*(45) +-106 + j*(79) +84 + j*(-100) +-6 + j*(-39) +-144 + j*(418) +52 + j*(351) +187 + j*(264) +-26 + j*(25) +-1 + j*(-44) +-93 + j*(515) +63 + j*(-93) +296 + j*(78) +-311 + j*(363) +4 + j*(-178) +63 + j*(265) +-204 + j*(-132) +59 + j*(-104) +-294 + j*(8) +-167 + j*(76) +-74 + j*(288) +105 + j*(-91) +105 + j*(21) +19 + j*(-169) +132 + j*(-124) +83 + j*(43) +-302 + j*(-35) +155 + j*(206) +151 + j*(100) +-242 + j*(188) +1 + j*(269) +-30 + j*(-129) +387 + j*(-134) +135 + j*(89) +15 + j*(-282) +130 + j*(-124) +387 + j*(10) +136 + j*(74) +-83 + j*(-74) +-450 + j*(-119) +-84 + j*(-28) +-62 + j*(161) +-76 + j*(-78) +75 + j*(-597) +273 + j*(80) +-9 + j*(109) +4 + j*(62) +106 + j*(62) +105 + j*(199) +-132 + j*(158) +-21 + j*(5) +-142 + j*(98) +-282 + j*(170) +180 + j*(131) +211 + j*(-172) +-155 + j*(192) +-393 + j*(-5) +-84 + j*(-328) +-30 + j*(-112) +-71 + j*(-198) +120 + j*(-38) +-223 + j*(-73) +-11 + j*(196) +170 + j*(76) +-129 + j*(67) +-121 + j*(-35) +-66 + j*(103) +-183 + j*(148) +-215 + j*(-71) +-158 + j*(-179) +-211 + j*(13) +-78 + j*(201) +245 + j*(132) +-139 + j*(-11) +-58 + j*(204) +-103 + j*(-175) +-12 + j*(73) +-52 + j*(-126) +29 + j*(40) +67 + j*(-36) +18 + j*(-4) +15 + j*(-45) +268 + j*(-138) +62 + j*(25) +-344 + j*(-20) +16 + j*(93) +-122 + j*(119) +-44 + j*(-205) +137 + j*(-150) +197 + j*(-11) +56 + j*(-64) +25 + j*(-168) +112 + j*(141) +-144 + j*(29) +-170 + j*(-252) +-190 + j*(-37) +-8 + j*(-127) +-10 + j*(247) +193 + j*(-303) +-122 + j*(-218) +165 + j*(-90) +28 + j*(-100) +31 + j*(19) +-96 + j*(-121) +-98 + j*(30) +-281 + j*(-203) +250 + j*(-42) +-244 + j*(109) +-47 + j*(-231) +16 + j*(-291) +40 + j*(-218) +-300 + j*(34) +-152 + j*(173) +-74 + j*(73) +-23 + j*(-93) +-45 + j*(-342) +24 + j*(-52) +-193 + j*(183) +-151 + j*(-307) +-26 + j*(24) +207 + j*(-115) +-58 + j*(139) +-33 + j*(-112) +-409 + j*(149) +-1 + j*(-136) +-288 + j*(-105) +-30 + j*(-198) +187 + j*(39) +71 + j*(33) +-371 + j*(64) +-27 + j*(-169) +40 + j*(4) +-234 + j*(72) +-243 + j*(-18) +29 + j*(71) +189 + j*(-243) +-201 + j*(-335) +-214 + j*(-97) +-161 + j*(185) +-247 + j*(45) +-260 + j*(-303) +-206 + j*(245) +-127 + j*(12) +49 + j*(156) +-52 + j*(-3) +193 + j*(69) +203 + j*(62) +111 + j*(-100) +-105 + j*(-18) +25 + j*(-121) +-134 + j*(104) +-275 + j*(233) +100 + j*(-326) +-230 + j*(-73) +139 + j*(-256) +300 + j*(23) +-189 + j*(-491) +137 + j*(-88) +133 + j*(-263) +-106 + j*(-373) +-18 + j*(-103) +-98 + j*(223) +-4 + j*(-18) +6 + j*(266) +60 + j*(-30) +-188 + j*(-150) +-118 + j*(40) +-140 + j*(-16) +88 + j*(59) +-22 + j*(-28) +110 + j*(-66) +160 + j*(-157) +139 + j*(31) +19 + j*(-97) +69 + j*(101) +-49 + j*(172) +245 + j*(-80) +14 + j*(274) +-71 + j*(1) +-33 + j*(29) +-208 + j*(66) +184 + j*(227) +-239 + j*(-216) +127 + j*(-18) +469 + j*(177) +-91 + j*(263) +4 + j*(46) +-212 + j*(102) +25 + j*(-23) +153 + j*(10) +-97 + j*(-8) +-236 + j*(-30) +-46 + j*(-418) +-104 + j*(288) +78 + j*(-39) +136 + j*(1) +43 + j*(-76) +34 + j*(-223) +110 + j*(-4) +146 + j*(-64) +-5 + j*(45) +89 + j*(44) +-12 + j*(-76) +-5 + j*(-25) +20 + j*(243) +47 + j*(-218) +-81 + j*(71) +-73 + j*(187) +314 + j*(94) +-119 + j*(-69) +136 + j*(88) +158 + j*(75) +-196 + j*(-190) +-5 + j*(-135) +134 + j*(228) +-108 + j*(-257) +-16 + j*(414) +-16 + j*(96) +151 + j*(163) +93 + j*(4) +-204 + j*(-71) +-107 + j*(213) +187 + j*(26) +-30 + j*(242) +89 + j*(-8) +4 + j*(-206) +-54 + j*(-242) +110 + j*(-37) +-175 + j*(-238) +-148 + j*(15) +208 + j*(-152) +-28 + j*(-235) +-183 + j*(-280) +189 + j*(-124) +-19 + j*(8) +-250 + j*(-168) +-24 + j*(-89) +-247 + j*(140) +216 + j*(385) +88 + j*(-119) +356 + j*(-173) +4 + j*(145) +-193 + j*(-115) +109 + j*(-45) +203 + j*(172) +-103 + j*(337) +-80 + j*(187) +-129 + j*(179) +158 + j*(-235) +-52 + j*(-272) +-91 + j*(327) +-25 + j*(117) +-143 + j*(-141) +92 + j*(310) +129 + j*(33) +-202 + j*(159) +86 + j*(43) +-43 + j*(69) +-130 + j*(-140) +-139 + j*(371) +-1 + j*(92) +-301 + j*(-141) +170 + j*(83) +6 + j*(-224) +-183 + j*(132) +-187 + j*(74) +141 + j*(-238) +-102 + j*(346) +-230 + j*(298) +71 + j*(280) +-360 + j*(311) +-85 + j*(173) +117 + j*(-69) +23 + j*(314) +-179 + j*(234) +95 + j*(8) +18 + j*(-133) +-137 + j*(-108) +115 + j*(122) +-23 + j*(-101) +18 + j*(2) +96 + j*(-134) +21 + j*(3) +373 + j*(-148) +162 + j*(41) +240 + j*(244) +-114 + j*(192) +86 + j*(-23) +-55 + j*(67) +-188 + j*(163) +-23 + j*(10) +18 + j*(-76) +-27 + j*(21) +163 + j*(198) +-44 + j*(33) +70 + j*(66) +-132 + j*(356) +-43 + j*(-99) +-134 + j*(165) +225 + j*(-81) +-55 + j*(-30) +143 + j*(88) +64 + j*(-105) +-44 + j*(-93) +-69 + j*(-28) +-184 + j*(-154) +-315 + j*(184) +49 + j*(-148) +-220 + j*(91) +-91 + j*(-29) +-177 + j*(-166) +35 + j*(86) +-190 + j*(-197) +-281 + j*(-106) +-211 + j*(-90) +-185 + j*(27) +50 + j*(298) +71 + j*(-78) +268 + j*(-33) +79 + j*(-139) +218 + j*(125) +400 + j*(190) +-83 + j*(17) +-129 + j*(385) +-5 + j*(-299) +-202 + j*(-363) +233 + j*(24) +13 + j*(-80) +-256 + j*(-156) +194 + j*(-125) +233 + j*(104) +-206 + j*(145) +-181 + j*(137) +-342 + j*(253) +91 + j*(13) +-117 + j*(164) +-138 + j*(58) +227 + j*(-179) +-38 + j*(42) +-46 + j*(-65) +98 + j*(302) +-18 + j*(167) +135 + j*(136) +111 + j*(16) +-107 + j*(-140) +69 + j*(-180) +69 + j*(-49) +-100 + j*(190) +-161 + j*(302) +-57 + j*(261) +78 + j*(-50) +62 + j*(45) +298 + j*(24) +65 + j*(288) +-132 + j*(4) +186 + j*(4) +53 + j*(84) +-94 + j*(177) +258 + j*(-5) +82 + j*(-281) +282 + j*(295) +119 + j*(-278) +-65 + j*(-95) +-216 + j*(-46) +116 + j*(105) +13 + j*(287) +105 + j*(165) +221 + j*(-129) +27 + j*(115) +-284 + j*(5) +-20 + j*(190) +39 + j*(128) +-301 + j*(-53) +-198 + j*(-95) +-39 + j*(129) +-34 + j*(-30) +-25 + j*(280) +134 + j*(176) +-54 + j*(-99) +64 + j*(-139) +-147 + j*(191) +77 + j*(-8) +-140 + j*(1) +29 + j*(6) +-252 + j*(-90) +66 + j*(-373) +-273 + j*(177) +-53 + j*(-73) +426 + j*(209) +303 + j*(-223) +230 + j*(78) +-146 + j*(-151) +32 + j*(169) +408 + j*(48) +149 + j*(54) +-18 + j*(-1) +320 + j*(122) +-23 + j*(28) +89 + j*(-202) +33 + j*(-117) +274 + j*(-25) +23 + j*(-18) +-88 + j*(-291) +-51 + j*(407) +-50 + j*(18) +-4 + j*(-36) +115 + j*(124) +-13 + j*(150) +223 + j*(-66) +-48 + j*(108) +-82 + j*(-92) +40 + j*(219) +-216 + j*(148) +-187 + j*(-291) +-45 + j*(56) +185 + j*(47) +94 + j*(-248) +-107 + j*(-1) +-199 + j*(-47) +20 + j*(60) +117 + j*(141) +-151 + j*(-326) +51 + j*(-210) +121 + j*(-66) +-40 + j*(-173) +-83 + j*(-199) +-54 + j*(-74) +83 + j*(-98) +243 + j*(170) +217 + j*(-255) +242 + j*(-443) +-148 + j*(-34) +42 + j*(201) +29 + j*(-47) +-98 + j*(-1) +45 + j*(141) +-148 + j*(-74) +161 + j*(-137) +116 + j*(169) +49 + j*(-519) +9 + j*(-118) +144 + j*(169) +-106 + j*(77) +-124 + j*(-10) +-298 + j*(303) +268 + j*(-8) +44 + j*(-12) +165 + j*(-390) +-98 + j*(-107) +199 + j*(197) +194 + j*(49) +-206 + j*(412) +68 + j*(-216) +274 + j*(139) +-237 + j*(60) +85 + j*(285) +4 + j*(-130) +168 + j*(-20) +284 + j*(175) +316 + j*(-301) +62 + j*(148) +54 + j*(-270) +95 + j*(266) +-95 + j*(-28) +-46 + j*(29) +-254 + j*(-30) +-159 + j*(117) +-9 + j*(-117) +-64 + j*(-76) +59 + j*(19) +-45 + j*(-144) +-358 + j*(-110) +-302 + j*(218) +140 + j*(335) +233 + j*(12) +386 + j*(96) +-37 + j*(-218) +-187 + j*(-46) +16 + j*(290) +59 + j*(18) +158 + j*(-102) +104 + j*(-3) +-23 + j*(204) +131 + j*(161) +105 + j*(339) +-226 + j*(-220) +-144 + j*(202) +-95 + j*(-191) +-44 + j*(49) +69 + j*(-114) +-105 + j*(221) +12 + j*(58) +264 + j*(-68) +-21 + j*(88) +-357 + j*(15) +-122 + j*(-136) +-35 + j*(129) +139 + j*(-16) +-175 + j*(-110) +24 + j*(67) +17 + j*(56) +-100 + j*(-48) +-75 + j*(-260) +-28 + j*(-51) +52 + j*(-117) +445 + j*(41) +35 + j*(159) +-68 + j*(112) +-208 + j*(158) +-182 + j*(-253) +-3 + j*(-115) +-30 + j*(371) +8 + j*(30) +-223 + j*(-93) +274 + j*(57) +-313 + j*(-148) +244 + j*(195) +10 + j*(-305) +296 + j*(88) +7 + j*(87) +-40 + j*(91) +-315 + j*(-76) +-16 + j*(88) +-83 + j*(-124) +-98 + j*(-20) +-94 + j*(-92) +-143 + j*(-262) +-87 + j*(49) +252 + j*(-49) +-119 + j*(354) +134 + j*(46) +-167 + j*(-270) +-130 + j*(-144) +103 + j*(151) +-87 + j*(243) +70 + j*(132) +-128 + j*(2) +58 + j*(114) +215 + j*(14) +-81 + j*(183) +37 + j*(65) +-151 + j*(38) +-92 + j*(75) +-240 + j*(-64) +-23 + j*(-105) +-359 + j*(-221) +-107 + j*(18) +88 + j*(-301) +-308 + j*(542) +-77 + j*(-313) +221 + j*(-117) +-18 + j*(-79) +118 + j*(-240) +-389 + j*(-11) +57 + j*(0) +-142 + j*(-67) +-115 + j*(-76) +39 + j*(-61) +182 + j*(0) +-65 + j*(46) +57 + j*(-47) +-304 + j*(33) +-430 + j*(489) +-425 + j*(47) +261 + j*(597) +-67 + j*(314) +-337 + j*(167) +-143 + j*(-90) +-353 + j*(-21) +-335 + j*(162) +605 + j*(390) +-31 + j*(-196) +-340 + j*(-206) +-275 + j*(-161) +-332 + j*(120) +422 + j*(202) +316 + j*(192) +-141 + j*(535) +-296 + j*(-251) +209 + j*(-497) +-286 + j*(-75) +165 + j*(470) +-82 + j*(273) +99 + j*(267) +-262 + j*(188) +-15 + j*(172) +-30 + j*(403) +212 + j*(272) +-204 + j*(-431) +-351 + j*(-269) +589 + j*(204) +311 + j*(-122) +391 + j*(-222) +-371 + j*(286) +-566 + j*(-589) +202 + j*(-261) +-151 + j*(-124) +474 + j*(-434) +272 + j*(-49) +359 + j*(75) +129 + j*(-83) +-320 + j*(-96) +140 + j*(-76) +-211 + j*(-550) +305 + j*(417) +-412 + j*(64) +226 + j*(-547) +407 + j*(-380) +-83 + j*(-97) +396 + j*(-173) +255 + j*(-368) +213 + j*(-57) +313 + j*(110) +42 + j*(158) +-93 + j*(-151) +-267 + j*(12) +-50 + j*(119) +-161 + j*(-238) +-6 + j*(-322) +-392 + j*(-337) +472 + j*(-371) +142 + j*(421) +-317 + j*(400) +447 + j*(-417) +487 + j*(-246) +-265 + j*(420) +-237 + j*(279) +-163 + j*(188) +-423 + j*(341) +-38 + j*(-321) +492 + j*(101) +-297 + j*(-282) +-43 + j*(210) +247 + j*(262) +219 + j*(253) +446 + j*(250) +-492 + j*(-336) +272 + j*(-373) +289 + j*(241) +-71 + j*(-12) +-334 + j*(684) +-156 + j*(294) +219 + j*(168) +222 + j*(391) +-127 + j*(585) +458 + j*(-467) +400 + j*(-296) +-229 + j*(1) +-195 + j*(130) +-42 + j*(-72) +-548 + j*(46) +168 + j*(17) +-109 + j*(307) +274 + j*(-205) +181 + j*(-606) +23 + j*(216) +-359 + j*(13) +91 + j*(288) +-216 + j*(141) +-315 + j*(-303) +165 + j*(450) +-474 + j*(64) +450 + j*(-318) +-443 + j*(348) +131 + j*(450) +259 + j*(401) +-464 + j*(-486) +74 + j*(-565) +-122 + j*(-119) +512 + j*(-184) +-305 + j*(201) +199 + j*(-392) +158 + j*(-424) +156 + j*(43) +-610 + j*(289) +172 + j*(-296) +47 + j*(297) +-458 + j*(-441) +222 + j*(-376) +-399 + j*(8) +-208 + j*(371) +-65 + j*(-204) +-322 + j*(663) +-438 + j*(-144) +144 + j*(123) +97 + j*(363) +164 + j*(-170) +-237 + j*(167) +117 + j*(55) +342 + j*(-199) +-254 + j*(226) +-356 + j*(474) +-164 + j*(171) +393 + j*(-431) +-197 + j*(-47) +192 + j*(179) +183 + j*(-356) +377 + j*(-268) +465 + j*(407) +-193 + j*(-66) +-267 + j*(-235) +607 + j*(416) +-198 + j*(310) +403 + j*(542) +182 + j*(-26) +-594 + j*(-251) +-167 + j*(-284) +-265 + j*(667) +171 + j*(-404) +122 + j*(-467) +-266 + j*(57) +-361 + j*(-285) +348 + j*(23) +-206 + j*(-553) +-160 + j*(309) +491 + j*(283) +-422 + j*(-171) +-202 + j*(-250) +-229 + j*(99) +183 + j*(95) +134 + j*(-175) +172 + j*(-517) +147 + j*(385) +-446 + j*(392) +228 + j*(106) +90 + j*(-122) +-284 + j*(-69) +-255 + j*(-495) +99 + j*(-112) +-347 + j*(-191) +355 + j*(173) +-342 + j*(175) +407 + j*(-28) +223 + j*(-71) +-313 + j*(26) +156 + j*(-120) +392 + j*(-379) +-321 + j*(-26) +-399 + j*(160) +187 + j*(228) +-249 + j*(-415) +404 + j*(399) +198 + j*(253) +438 + j*(82) +479 + j*(237) +363 + j*(318) +576 + j*(-229) +-667 + j*(-161) +300 + j*(-527) +92 + j*(596) +-7 + j*(-363) +-397 + j*(414) +142 + j*(220) +535 + j*(395) +306 + j*(418) +-162 + j*(-406) +354 + j*(-330) +-219 + j*(162) +-331 + j*(-506) +496 + j*(225) +133 + j*(115) +214 + j*(218) +197 + j*(-316) +587 + j*(9) +-30 + j*(397) +-547 + j*(-593) +352 + j*(-108) +-219 + j*(142) +-383 + j*(286) +-216 + j*(-329) +390 + j*(276) +-157 + j*(-122) +236 + j*(122) +31 + j*(-37) +174 + j*(-285) +253 + j*(-253) +427 + j*(-403) +-315 + j*(345) +-428 + j*(-682) +15 + j*(-400) +-339 + j*(496) +-588 + j*(91) +229 + j*(-165) +529 + j*(296) +553 + j*(346) +-144 + j*(66) +-397 + j*(452) +445 + j*(406) +-112 + j*(-163) +301 + j*(253) +296 + j*(274) +354 + j*(-94) +-457 + j*(-530) +-373 + j*(-168) +-270 + j*(-178) +-407 + j*(-224) +3 + j*(-22) +177 + j*(288) +-476 + j*(31) +-296 + j*(232) +-331 + j*(-110) +429 + j*(-240) +385 + j*(-395) +-89 + j*(326) +369 + j*(243) +-419 + j*(30) +117 + j*(-298) +-83 + j*(388) +427 + j*(119) +-233 + j*(-222) +-437 + j*(509) +-329 + j*(-51) +184 + j*(238) +383 + j*(-150) +398 + j*(204) +-277 + j*(-255) +-166 + j*(105) +409 + j*(-567) +-312 + j*(-180) +85 + j*(-119) +-353 + j*(52) +-416 + j*(-530) +-59 + j*(-94) +-454 + j*(-723) +321 + j*(148) +-545 + j*(-355) +-286 + j*(-40) +398 + j*(-600) +144 + j*(-344) +199 + j*(-606) +-42 + j*(290) +-328 + j*(-112) +-199 + j*(-245) +303 + j*(-335) +-484 + j*(-413) +-314 + j*(98) +-100 + j*(-88) +-328 + j*(383) +-117 + j*(33) +491 + j*(-299) +320 + j*(426) +124 + j*(320) +-184 + j*(223) +-165 + j*(-230) +280 + j*(-183) +67 + j*(-808) +104 + j*(177) +260 + j*(-230) +454 + j*(-49) +145 + j*(-433) +-284 + j*(-306) +336 + j*(-199) +-338 + j*(-395) +168 + j*(-86) +-537 + j*(-232) +-396 + j*(-558) +587 + j*(-207) +155 + j*(-412) +-122 + j*(185) +-648 + j*(-65) +-167 + j*(-233) +-371 + j*(308) +-449 + j*(-25) +156 + j*(233) +-207 + j*(243) +-474 + j*(313) +325 + j*(6) +-183 + j*(269) +-344 + j*(-54) +-98 + j*(325) +382 + j*(197) +-304 + j*(-89) +100 + j*(-390) +-471 + j*(-12) +237 + j*(255) +247 + j*(-138) +-98 + j*(-78) +63 + j*(199) +-258 + j*(-231) +-470 + j*(-422) +-224 + j*(378) +629 + j*(1) +-255 + j*(-604) +-100 + j*(478) +-19 + j*(430) +663 + j*(213) +222 + j*(181) +-127 + j*(270) +351 + j*(-373) +308 + j*(192) +-149 + j*(240) +80 + j*(-377) +120 + j*(-112) +-96 + j*(-182) +-8 + j*(-73) +477 + j*(-154) +-419 + j*(274) +-496 + j*(256) +-240 + j*(410) +150 + j*(-351) +-243 + j*(-137) +-11 + j*(-345) +100 + j*(197) +67 + j*(52) +247 + j*(276) +106 + j*(404) +-426 + j*(-358) +161 + j*(-528) +211 + j*(233) +-408 + j*(180) +334 + j*(464) +469 + j*(-114) +278 + j*(178) +86 + j*(-257) +78 + j*(-322) +457 + j*(-159) +-275 + j*(328) +-508 + j*(-10) +209 + j*(89) +-301 + j*(291) +-247 + j*(-146) +259 + j*(177) +83 + j*(-61) +-369 + j*(-315) +-206 + j*(-272) +-194 + j*(53) +344 + j*(291) +242 + j*(-343) +433 + j*(-74) +424 + j*(423) +-332 + j*(160) +-345 + j*(675) +209 + j*(-36) +-152 + j*(-247) +-177 + j*(434) +312 + j*(317) +197 + j*(-103) +-355 + j*(112) +-69 + j*(-194) +400 + j*(118) +151 + j*(506) +386 + j*(-337) +451 + j*(228) +40 + j*(-25) +48 + j*(-194) +-218 + j*(-320) +207 + j*(-124) +-117 + j*(-141) +343 + j*(-224) +308 + j*(291) +-247 + j*(-361) +511 + j*(32) +228 + j*(91) +380 + j*(302) +324 + j*(-119) +-413 + j*(463) +292 + j*(281) +-201 + j*(-165) +-303 + j*(-211) +-471 + j*(418) +-69 + j*(-121) +-607 + j*(274) +141 + j*(342) +-339 + j*(-220) +-51 + j*(-165) +229 + j*(-407) +-151 + j*(263) +-238 + j*(-291) +316 + j*(-284) +279 + j*(-5) +530 + j*(231) +362 + j*(-301) +-351 + j*(88) +-110 + j*(-561) +112 + j*(460) +-511 + j*(-83) +465 + j*(-271) +302 + j*(-204) +164 + j*(355) +-293 + j*(-134) +190 + j*(-144) +306 + j*(343) +368 + j*(298) +53 + j*(-6) +-45 + j*(180) +-273 + j*(359) +-361 + j*(58) +-361 + j*(-168) +-212 + j*(-321) +-178 + j*(13) +186 + j*(-363) +-138 + j*(276) +149 + j*(-330) +-303 + j*(291) +427 + j*(-233) +410 + j*(147) +-484 + j*(243) +57 + j*(-330) +357 + j*(-601) +107 + j*(86) +402 + j*(-378) +-295 + j*(-273) +-211 + j*(-189) +264 + j*(360) +525 + j*(78) +414 + j*(161) +-354 + j*(-292) +457 + j*(262) +-247 + j*(284) +316 + j*(-690) +285 + j*(-289) +109 + j*(-199) +-414 + j*(-325) +-316 + j*(151) +-11 + j*(278) +296 + j*(57) +403 + j*(187) +196 + j*(129) +-380 + j*(-382) +-358 + j*(432) +311 + j*(-158) +-141 + j*(-752) +-210 + j*(223) +181 + j*(-170) +-144 + j*(479) +42 + j*(337) +-118 + j*(-448) +222 + j*(-74) +631 + j*(-293) +339 + j*(-683) +-165 + j*(141) +388 + j*(-554) +-211 + j*(358) +-309 + j*(110) +-313 + j*(130) +223 + j*(560) +415 + j*(496) +11 + j*(344) +634 + j*(-202) +226 + j*(-28) +-185 + j*(363) +-289 + j*(107) +43 + j*(301) +91 + j*(-283) +76 + j*(-579) +-298 + j*(95) +31 + j*(84) +-288 + j*(252) +194 + j*(413) +264 + j*(-355) +165 + j*(-302) +-120 + j*(101) +344 + j*(-684) +-288 + j*(52) +-290 + j*(-463) +-135 + j*(286) +-445 + j*(-125) +-263 + j*(97) +-277 + j*(-421) +302 + j*(-375) +455 + j*(412) +-128 + j*(63) +118 + j*(107) +-360 + j*(407) +54 + j*(366) +-74 + j*(-502) +234 + j*(242) +572 + j*(-114) +197 + j*(-351) +518 + j*(128) +477 + j*(462) +-64 + j*(393) +-113 + j*(-435) +303 + j*(-301) +-221 + j*(146) +-116 + j*(-151) +-352 + j*(-286) +-298 + j*(-105) +153 + j*(-247) +539 + j*(7) +360 + j*(144) +110 + j*(74) +328 + j*(28) +-337 + j*(424) +129 + j*(-260) +549 + j*(41) +-368 + j*(378) +-253 + j*(-668) +263 + j*(180) +253 + j*(-273) +-412 + j*(212) +-180 + j*(207) +-329 + j*(-180) +154 + j*(-82) +-102 + j*(197) +-356 + j*(107) +-89 + j*(-513) +-393 + j*(41) +344 + j*(403) +245 + j*(286) +-390 + j*(146) +184 + j*(-487) +132 + j*(-408) +-330 + j*(441) +-28 + j*(579) +197 + j*(-210) +-52 + j*(-171) +317 + j*(201) +-162 + j*(-148) +111 + j*(-285) +-148 + j*(177) +-291 + j*(210) +-358 + j*(-169) +421 + j*(-378) +-173 + j*(52) +19 + j*(-194) +211 + j*(62) +-416 + j*(202) +-296 + j*(194) +-357 + j*(72) +-214 + j*(49) +289 + j*(400) +-182 + j*(349) +-583 + j*(-578) +-322 + j*(232) +-136 + j*(179) +276 + j*(397) +-436 + j*(24) +-224 + j*(-35) +74 + j*(110) +-414 + j*(-103) +-369 + j*(513) +-141 + j*(-160) +309 + j*(346) +276 + j*(763) +-186 + j*(401) +137 + j*(202) +179 + j*(272) +-358 + j*(217) +109 + j*(330) +-497 + j*(70) +-352 + j*(288) +957 + j*(428) +136 + j*(149) +-426 + j*(-522) +91 + j*(52) +-378 + j*(150) +-367 + j*(416) +130 + j*(123) +-260 + j*(361) +-31 + j*(-247) +346 + j*(-375) +166 + j*(-52) +158 + j*(-178) +-497 + j*(201) +376 + j*(-266) +-416 + j*(258) +-198 + j*(175) +-107 + j*(-139) +-255 + j*(77) +-380 + j*(267) +-342 + j*(277) +-279 + j*(-194) +217 + j*(9) +65 + j*(-134) +-23 + j*(-395) +195 + j*(262) +86 + j*(-10) +-37 + j*(278) +-40 + j*(-135) +6 + j*(-1) +144 + j*(163) +-16 + j*(-21) +-5 + j*(147) +-47 + j*(-260) +-321 + j*(172) +238 + j*(-30) +216 + j*(81) +11 + j*(-53) +-47 + j*(-23) +93 + j*(-51) +-1 + j*(-8) +-76 + j*(-121) +-240 + j*(0) +-38 + j*(-183) +0 + j*(163) +234 + j*(-31) +-15 + j*(244) +76 + j*(-4) +-153 + j*(257) +173 + j*(26) +-37 + j*(-276) +-131 + j*(206) +65 + j*(192) +278 + j*(-243) +-161 + j*(-1) +44 + j*(-173) +167 + j*(245) +-102 + j*(122) +-47 + j*(-253) +-21 + j*(-165) +-1 + j*(57) +10 + j*(-13) +48 + j*(188) +-45 + j*(-52) +-17 + j*(-233) +32 + j*(-101) +-295 + j*(-116) +388 + j*(128) +-134 + j*(-117) +-81 + j*(-160) +-45 + j*(-393) +72 + j*(-60) +-24 + j*(-247) +208 + j*(-424) +280 + j*(-19) +-87 + j*(276) +23 + j*(70) +88 + j*(-285) +1 + j*(-189) +121 + j*(-41) +-55 + j*(-153) +-192 + j*(147) +98 + j*(-22) +0 + j*(218) +-347 + j*(138) +-95 + j*(-165) +214 + j*(-88) +-113 + j*(-315) +-131 + j*(390) +-264 + j*(144) +114 + j*(-233) +-54 + j*(-50) +-342 + j*(124) +-173 + j*(-27) +140 + j*(-115) +48 + j*(361) +-327 + j*(187) +-40 + j*(-163) +-104 + j*(229) +144 + j*(-105) +-83 + j*(-214) +183 + j*(117) +-150 + j*(75) +160 + j*(-52) +-6 + j*(-65) +209 + j*(132) +-195 + j*(275) +75 + j*(-323) +-33 + j*(-221) +92 + j*(-206) +8 + j*(-38) +-83 + j*(-167) +68 + j*(198) +31 + j*(13) +-310 + j*(318) +105 + j*(175) +5 + j*(-67) +42 + j*(-11) +107 + j*(29) +79 + j*(-83) +-68 + j*(-226) +366 + j*(92) +-146 + j*(172) +74 + j*(386) +160 + j*(-37) +327 + j*(-145) +-189 + j*(208) +-25 + j*(-168) +93 + j*(-51) +15 + j*(202) +4 + j*(2) +37 + j*(152) +-97 + j*(-64) +276 + j*(257) +-67 + j*(-88) +-58 + j*(-4) +-297 + j*(242) +-194 + j*(-285) +-26 + j*(139) +-220 + j*(271) +27 + j*(-36) +-277 + j*(98) +182 + j*(-327) +314 + j*(211) +-52 + j*(-117) +-92 + j*(64) +-197 + j*(-198) +-291 + j*(16) +45 + j*(100) +7 + j*(-226) +-6 + j*(-90) +-440 + j*(110) +-20 + j*(144) +296 + j*(-84) +-49 + j*(29) +-97 + j*(416) +-202 + j*(-2) +31 + j*(-51) +-156 + j*(-209) +-198 + j*(-40) +66 + j*(82) +-215 + j*(378) +414 + j*(23) +-291 + j*(122) +221 + j*(-47) +-374 + j*(33) +348 + j*(-216) +187 + j*(70) +129 + j*(-145) +-108 + j*(-35) +-100 + j*(-327) +228 + j*(-83) +334 + j*(107) +-380 + j*(-332) +-64 + j*(93) +177 + j*(-193) +-50 + j*(-9) +-325 + j*(152) +-71 + j*(111) +291 + j*(-116) +-158 + j*(229) +-150 + j*(-164) +36 + j*(126) +8 + j*(-73) +190 + j*(-161) +-25 + j*(-20) +130 + j*(99) +35 + j*(276) +242 + j*(171) +-145 + j*(-106) +103 + j*(-179) +127 + j*(-1) +-112 + j*(-151) +-141 + j*(308) +199 + j*(-22) +23 + j*(156) +-23 + j*(-225) +-168 + j*(37) +-245 + j*(83) +145 + j*(40) +-308 + j*(-13) +39 + j*(7) +16 + j*(-214) +87 + j*(-40) +-126 + j*(-33) +371 + j*(313) +80 + j*(-34) +8 + j*(175) +-110 + j*(368) +-66 + j*(130) +124 + j*(-55) +-166 + j*(-139) +119 + j*(126) +-124 + j*(245) +-150 + j*(110) +161 + j*(-21) +52 + j*(-105) +-98 + j*(27) +-139 + j*(125) +38 + j*(76) +-90 + j*(259) +-3 + j*(23) +31 + j*(84) +292 + j*(-22) +-146 + j*(505) +293 + j*(71) +-9 + j*(198) +9 + j*(15) +-60 + j*(-96) +-231 + j*(241) +-232 + j*(-240) +211 + j*(-120) +-145 + j*(54) +3 + j*(16) +-204 + j*(-413) +-373 + j*(-87) +-5 + j*(128) +-222 + j*(-5) +-42 + j*(-223) +-224 + j*(33) +-10 + j*(-8) +-134 + j*(25) +-187 + j*(351) +109 + j*(-105) +114 + j*(-36) +-226 + j*(84) +-168 + j*(-105) +-91 + j*(-60) +55 + j*(-227) +-25 + j*(-95) +-35 + j*(325) +59 + j*(-122) +81 + j*(-134) +-172 + j*(117) +-4 + j*(141) +30 + j*(-124) +-381 + j*(-111) +-119 + j*(-175) +103 + j*(-36) +-96 + j*(-64) +197 + j*(-59) +52 + j*(-100) +-151 + j*(125) +-132 + j*(-57) +-35 + j*(-74) +52 + j*(-267) +139 + j*(4) +-177 + j*(177) +-141 + j*(-110) +-64 + j*(372) +-204 + j*(-33) +113 + j*(187) +-123 + j*(91) +177 + j*(-75) +56 + j*(-164) +-342 + j*(178) +-83 + j*(124) +71 + j*(-26) +-179 + j*(76) +-7 + j*(-199) +-92 + j*(94) +67 + j*(-88) +62 + j*(197) +144 + j*(223) +-164 + j*(25) +148 + j*(-99) +176 + j*(-33) +96 + j*(-22) +4 + j*(-28) +8 + j*(-88) +-38 + j*(69) +20 + j*(27) +-151 + j*(-105) +46 + j*(279) +-182 + j*(-129) +187 + j*(-45) +125 + j*(41) +-105 + j*(260) +139 + j*(-175) +197 + j*(62) +-47 + j*(-6) +8 + j*(-264) +145 + j*(-122) +-71 + j*(-253) +-63 + j*(233) +121 + j*(-4) +-58 + j*(111) +358 + j*(151) +-23 + j*(-28) +11 + j*(-8) +11 + j*(26) +-92 + j*(-46) +-100 + j*(336) +-50 + j*(31) +-165 + j*(-91) +116 + j*(-206) +65 + j*(272) +-177 + j*(163) +-134 + j*(44) +194 + j*(84) +214 + j*(-51) +-225 + j*(210) +88 + j*(158) +120 + j*(-69) +111 + j*(115) +139 + j*(205) +329 + j*(-174) +47 + j*(82) +-327 + j*(-317) +37 + j*(154) +84 + j*(14) +84 + j*(-11) +221 + j*(155) +-364 + j*(194) +113 + j*(43) +4 + j*(21) +-107 + j*(-91) +-89 + j*(26) +-249 + j*(-27) +23 + j*(132) +127 + j*(-84) +-12 + j*(-115) +-71 + j*(-11) +-30 + j*(-1) +-172 + j*(138) +335 + j*(131) +-389 + j*(-301) +-227 + j*(-21) +31 + j*(-216) +-5 + j*(-132) +-144 + j*(-299) +-165 + j*(228) +3 + j*(-140) +-32 + j*(64) +-133 + j*(62) +-59 + j*(-167) +-209 + j*(-176) +313 + j*(-33) +-28 + j*(137) +184 + j*(219) +-16 + j*(294) +-196 + j*(-70) +-86 + j*(38) +-75 + j*(-91) +356 + j*(226) +-60 + j*(390) +22 + j*(-121) +90 + j*(76) +-141 + j*(-10) +87 + j*(57) +-245 + j*(-4) +88 + j*(-81) +-40 + j*(148) +-1 + j*(209) +216 + j*(24) +26 + j*(13) +-249 + j*(45) +251 + j*(-110) +-366 + j*(-232) +13 + j*(130) +17 + j*(271) +-126 + j*(-201) +-52 + j*(-122) +102 + j*(-264) +74 + j*(206) +317 + j*(-79) +122 + j*(13) +186 + j*(132) +-86 + j*(-180) +-253 + j*(-194) +86 + j*(-68) +-88 + j*(-161) +159 + j*(-275) +146 + j*(-74) +-85 + j*(-33) +-16 + j*(-133) +-136 + j*(-61) +-112 + j*(-103) +-156 + j*(57) +43 + j*(-80) +58 + j*(193) +-187 + j*(-203) +197 + j*(191) +277 + j*(26) +4 + j*(-117) +-81 + j*(182) +-8 + j*(-11) +54 + j*(-61) +-351 + j*(64) +-178 + j*(-216) +-4 + j*(-388) +-141 + j*(91) +-140 + j*(-93) +33 + j*(197) +63 + j*(-147) +17 + j*(132) +10 + j*(127) +-253 + j*(192) +-36 + j*(107) +125 + j*(-66) +-131 + j*(-82) +-250 + j*(-14) +-285 + j*(5) +119 + j*(-23) +28 + j*(253) +-49 + j*(330) +73 + j*(24) +82 + j*(40) +4 + j*(179) +44 + j*(-324) +-77 + j*(64) +-16 + j*(-161) +181 + j*(-55) +-248 + j*(-226) +-185 + j*(130) +108 + j*(110) +-337 + j*(-95) +117 + j*(-192) +-18 + j*(104) +185 + j*(204) +-106 + j*(28) +-400 + j*(57) +-91 + j*(47) +-243 + j*(-143) +-141 + j*(37) +216 + j*(79) +-63 + j*(23) +1 + j*(-54) +-258 + j*(254) +-26 + j*(-60) +203 + j*(132) +260 + j*(57) +-13 + j*(209) +46 + j*(-156) +55 + j*(294) +-322 + j*(-226) +101 + j*(118) +163 + j*(-56) +189 + j*(-47) +209 + j*(-12) +140 + j*(146) +-81 + j*(282) +-238 + j*(20) +-152 + j*(180) +-140 + j*(-190) +146 + j*(-109) +-63 + j*(-105) +49 + j*(6) +-37 + j*(-4) +25 + j*(-124) +21 + j*(-45) +214 + j*(209) +6 + j*(-68) +-174 + j*(189) +79 + j*(-70) +103 + j*(167) +-227 + j*(171) +-139 + j*(-351) +245 + j*(-18) +-17 + j*(325) +-490 + j*(-99) +301 + j*(81) +218 + j*(-4) +32 + j*(-16) +274 + j*(-51) +-122 + j*(21) +95 + j*(7) +295 + j*(-64) +-18 + j*(245) +-122 + j*(47) +86 + j*(7) +122 + j*(-269) +35 + j*(-125) +29 + j*(34) +187 + j*(53) +-205 + j*(-129) +-29 + j*(264) +93 + j*(-149) +-36 + j*(-107) +-225 + j*(255) +371 + j*(-177) +-142 + j*(11) +-230 + j*(217) +-100 + j*(-18) +40 + j*(163) +-57 + j*(-83) +-293 + j*(316) +-86 + j*(-52) +111 + j*(21) +-91 + j*(-33) +-121 + j*(-47) +-133 + j*(-12) +-7 + j*(124) +-154 + j*(-30) +-74 + j*(-225) +14 + j*(-54) +-176 + j*(252) +-217 + j*(-202) +65 + j*(-130) +144 + j*(192) +209 + j*(-108) +11 + j*(264) +-10 + j*(-170) +-9 + j*(-129) +-90 + j*(-147) +108 + j*(44) +-19 + j*(99) +-256 + j*(53) +301 + j*(-249) +-164 + j*(124) +-231 + j*(-234) +-64 + j*(-274) +-40 + j*(28) +54 + j*(-162) +99 + j*(72) +78 + j*(135) +-120 + j*(165) +123 + j*(-209) +-23 + j*(306) +-133 + j*(-216) +-35 + j*(121) +260 + j*(264) +134 + j*(25) +-32 + j*(255) +-245 + j*(-106) +-35 + j*(-74) +192 + j*(-317) +-175 + j*(286) +-25 + j*(-154) +-146 + j*(29) +40 + j*(181) +-10 + j*(119) +-47 + j*(-151) +161 + j*(105) +205 + j*(-194) +-270 + j*(28) +-18 + j*(1) +-131 + j*(125) +176 + j*(-149) +21 + j*(80) +13 + j*(-211) +-273 + j*(123) +-182 + j*(176) +-247 + j*(87) +72 + j*(141) +-78 + j*(-149) +-96 + j*(158) +-235 + j*(-231) +-2 + j*(194) +44 + j*(192) +-6 + j*(-80) +37 + j*(-110) +-148 + j*(-328) +-267 + j*(251) +168 + j*(175) +97 + j*(30) +-54 + j*(-40) +-168 + j*(89) +-72 + j*(-33) +-68 + j*(-249) +-100 + j*(48) +64 + j*(-49) +-161 + j*(150) +31 + j*(137) +27 + j*(-29) +243 + j*(28) +-22 + j*(-22) +94 + j*(22) +-238 + j*(-66) +-6 + j*(-87) +-109 + j*(99) +184 + j*(204) +-250 + j*(-3) +263 + j*(-223) +-428 + j*(-54) +155 + j*(-169) +43 + j*(-285) +-182 + j*(-257) +71 + j*(-199) +37 + j*(-130) +51 + j*(41) +-75 + j*(-66) +-95 + j*(105) +33 + j*(-125) +-195 + j*(-38) +281 + j*(-226) +-16 + j*(-185) +85 + j*(64) +-13 + j*(-259) +25 + j*(-330) +342 + j*(218) +91 + j*(331) +-245 + j*(-42) +-240 + j*(224) +-66 + j*(-228) +-37 + j*(182) +128 + j*(214) +109 + j*(129) +-244 + j*(135) +237 + j*(178) +-14 + j*(-62) +-26 + j*(11) +-275 + j*(-257) +99 + j*(-284) +97 + j*(501) +-361 + j*(-166) +-69 + j*(96) +-25 + j*(-182) +227 + j*(94) +157 + j*(445) +-29 + j*(-144) +368 + j*(-150) +40 + j*(-45) +-46 + j*(143) +56 + j*(-343) +-4 + j*(62) +272 + j*(-117) +-291 + j*(83) +-387 + j*(111) +-93 + j*(-18) +250 + j*(-13) +-193 + j*(48) +59 + j*(706) +264 + j*(228) +33 + j*(-315) +404 + j*(-147) +-79 + j*(1) +-296 + j*(-135) +-250 + j*(-423) +36 + j*(27) +64 + j*(-75) +-195 + j*(-198) +-51 + j*(-132) +-103 + j*(204) +261 + j*(-173) +44 + j*(-41) +-77 + j*(55) +-18 + j*(-163) +-241 + j*(106) +76 + j*(-120) +346 + j*(323) +-168 + j*(-142) +83 + j*(-60) +30 + j*(262) +250 + j*(-2) +-146 + j*(-236) +-66 + j*(-267) +-28 + j*(-10) +-58 + j*(-90) +139 + j*(-92) +143 + j*(105) +-192 + j*(525) +119 + j*(158) +15 + j*(-111) +25 + j*(-11) +-103 + j*(144) +-283 + j*(-173) +356 + j*(-98) +-53 + j*(274) +-1 + j*(94) +204 + j*(91) +127 + j*(-239) +-121 + j*(62) +-2 + j*(145) +134 + j*(-30) +-77 + j*(320) +148 + j*(27) +-372 + j*(-130) +274 + j*(8) +71 + j*(-80) +333 + j*(-121) +-292 + j*(-135) +205 + j*(479) +-37 + j*(-227) +62 + j*(61) +83 + j*(-158) +279 + j*(-41) +31 + j*(132) +-54 + j*(472) +-214 + j*(261) +148 + j*(-199) +73 + j*(499) +78 + j*(-23) +108 + j*(-213) +25 + j*(-210) +12 + j*(315) +-42 + j*(63) +-86 + j*(119) +76 + j*(246) +211 + j*(-351) +-42 + j*(-95) +-47 + j*(156) +37 + j*(144) +-249 + j*(-69) +-274 + j*(-139) +110 + j*(-13) +-269 + j*(21) +173 + j*(-42) +55 + j*(110) +-130 + j*(-165) +-187 + j*(-255) +-53 + j*(-127) +262 + j*(-6) +16 + j*(28) +-292 + j*(-63) +-219 + j*(-310) +-93 + j*(404) +-34 + j*(60) +78 + j*(-91) +-74 + j*(146) +-162 + j*(-143) +-127 + j*(64) +400 + j*(-46) +-81 + j*(373) +408 + j*(-136) +-45 + j*(13) +-161 + j*(-119) +39 + j*(310) +50 + j*(-281) +-64 + j*(4) +305 + j*(69) +-59 + j*(45) +-137 + j*(416) +56 + j*(-198) +273 + j*(-237) +141 + j*(173) +18 + j*(-60) +-41 + j*(225) +236 + j*(297) +80 + j*(18) +-388 + j*(277) +180 + j*(-110) +-67 + j*(-74) +-215 + j*(-148) +8 + j*(242) +-293 + j*(-219) +-88 + j*(81) +117 + j*(-18) +78 + j*(-66) +-80 + j*(-532) +141 + j*(21) +-211 + j*(-342) +-204 + j*(-96) +-131 + j*(-108) +124 + j*(-298) +43 + j*(-57) +13 + j*(220) +206 + j*(33) +43 + j*(-93) +-8 + j*(-59) +300 + j*(-127) +-181 + j*(218) +110 + j*(-66) +148 + j*(372) +-188 + j*(66) +28 + j*(-363) +-211 + j*(37) +110 + j*(22) +-132 + j*(110) +-122 + j*(-109) +-124 + j*(241) +-132 + j*(8) +-109 + j*(-1) +-186 + j*(-119) +-202 + j*(-288) +-29 + j*(143) +115 + j*(-307) +-51 + j*(-297) +-89 + j*(-169) +26 + j*(299) +66 + j*(76) +-62 + j*(133) +-110 + j*(-276) +410 + j*(-174) +-315 + j*(-66) +-5 + j*(165) +175 + j*(-115) +-167 + j*(-226) +-148 + j*(273) +197 + j*(-184) +-124 + j*(159) +285 + j*(-25) +221 + j*(13) +102 + j*(-86) +56 + j*(183) +-1 + j*(-25) +71 + j*(-21) +-281 + j*(156) +-62 + j*(40) +-3 + j*(153) +159 + j*(323) +-15 + j*(173) +-105 + j*(-136) +1 + j*(25) +7 + j*(154) +-380 + j*(-333) +-211 + j*(293) +11 + j*(-76) +-137 + j*(-161) +44 + j*(-180) +378 + j*(-2) +322 + j*(-284) +217 + j*(34) +107 + j*(161) +-20 + j*(156) +36 + j*(-98) +-142 + j*(11) +117 + j*(105) +51 + j*(-16) +253 + j*(-144) +-33 + j*(-183) +-190 + j*(-316) +-55 + j*(207) +-121 + j*(440) +-301 + j*(-78) +-73 + j*(-63) +95 + j*(-9) +-110 + j*(196) +329 + j*(-70) +-90 + j*(34) +-246 + j*(177) +-52 + j*(-62) +40 + j*(-156) +13 + j*(67) +-311 + j*(129) +101 + j*(88) +-107 + j*(107) +-245 + j*(-196) +-18 + j*(216) +126 + j*(161) +-21 + j*(194) +-64 + j*(-221) +40 + j*(-85) +107 + j*(168) +24 + j*(84) +-122 + j*(15) +-183 + j*(-73) +133 + j*(-38) +-105 + j*(37) +-154 + j*(35) +100 + j*(150) +500 + j*(-12) +115 + j*(4) +290 + j*(41) +243 + j*(-122) +-17 + j*(-80) +49 + j*(-163) +-144 + j*(-378) +-375 + j*(-136) +35 + j*(-108) +-19 + j*(-320) +-138 + j*(-10) +169 + j*(-57) +-212 + j*(114) +375 + j*(-63) +-171 + j*(117) +205 + j*(-184) +-233 + j*(77) +74 + j*(-168) +-19 + j*(142) +-77 + j*(124) +-53 + j*(-18) +51 + j*(-360) +-148 + j*(-2) +226 + j*(-23) +61 + j*(-165) +-67 + j*(-58) +278 + j*(-44) +412 + j*(-89) +-74 + j*(-80) +-32 + j*(151) +-106 + j*(226) +190 + j*(-121) +-247 + j*(-198) +36 + j*(-45) +-82 + j*(311) +115 + j*(1) +-379 + j*(4) +172 + j*(38) +-187 + j*(134) +-156 + j*(-50) +-126 + j*(-186) +-20 + j*(-57) +312 + j*(-151) +-218 + j*(180) +-42 + j*(-283) +-98 + j*(112) +145 + j*(57) +21 + j*(-140) +223 + j*(119) +71 + j*(-245) +134 + j*(243) +-80 + j*(252) +-33 + j*(-303) +-5 + j*(84) +-161 + j*(-120) +-268 + j*(-303) +-62 + j*(-187) +-151 + j*(-25) +164 + j*(-359) +-130 + j*(293) +-35 + j*(-424) +-359 + j*(368) +79 + j*(235) +344 + j*(-23) +-98 + j*(-108) +157 + j*(221) +-342 + j*(-91) +35 + j*(-46) +-111 + j*(-6) +119 + j*(-21) +-146 + j*(144) +167 + j*(36) +-347 + j*(-155) +238 + j*(4) +37 + j*(249) +-159 + j*(-104) +-79 + j*(348) +58 + j*(199) +-2 + j*(-211) +347 + j*(73) +28 + j*(-163) +-150 + j*(143) +-34 + j*(-91) +-53 + j*(390) +-163 + j*(135) +-274 + j*(-153) +69 + j*(194) +131 + j*(-263) +-412 + j*(177) +-86 + j*(-347) +52 + j*(-134) +264 + j*(84) +91 + j*(161) +-64 + j*(-158) +-34 + j*(-561) +-90 + j*(-67) +-67 + j*(-100) +117 + j*(-13) +16 + j*(-20) +144 + j*(128) +378 + j*(86) +96 + j*(-165) +-218 + j*(-17) +78 + j*(281) +221 + j*(-293) +161 + j*(257) +170 + j*(98) +-197 + j*(82) +-374 + j*(211) +331 + j*(-194) +166 + j*(-191) +233 + j*(-141) +21 + j*(-85) +-260 + j*(20) +-378 + j*(212) +54 + j*(337) +217 + j*(342) +85 + j*(87) +-145 + j*(105) +310 + j*(152) +-69 + j*(137) +138 + j*(-73) +-54 + j*(-25) +-87 + j*(-16) +133 + j*(-134) +137 + j*(-126) +133 + j*(34) +-137 + j*(7) +325 + j*(0) +-141 + j*(185) +89 + j*(-3) +-195 + j*(-91) +137 + j*(121) +-211 + j*(-122) +-57 + j*(88) +-246 + j*(-217) +130 + j*(-260) +-226 + j*(-54) +-120 + j*(-135) +332 + j*(-94) +-28 + j*(-57) +274 + j*(91) +49 + j*(-37) +173 + j*(119) +141 + j*(46) +-79 + j*(-44) +95 + j*(-190) +-48 + j*(-25) +-94 + j*(-227) +-261 + j*(-165) +-60 + j*(87) +-52 + j*(93) +-146 + j*(-202) +24 + j*(-27) +110 + j*(-47) +-88 + j*(-157) +-37 + j*(305) +-108 + j*(11) +-304 + j*(-94) +0 + j*(86) +308 + j*(91) +-243 + j*(121) +156 + j*(-95) +59 + j*(-81) +-126 + j*(138) +177 + j*(32) +-28 + j*(-145) +140 + j*(306) +44 + j*(-207) +4 + j*(-25) +69 + j*(91) +-279 + j*(-240) +-209 + j*(-70) +-236 + j*(-49) +-266 + j*(119) +-29 + j*(40) +246 + j*(-281) +-91 + j*(170) +-66 + j*(-84) +257 + j*(-77) +169 + j*(205) +-49 + j*(-64) +129 + j*(235) +153 + j*(-272) +25 + j*(167) +45 + j*(-199) +160 + j*(-20) +-114 + j*(139) +-255 + j*(-46) +276 + j*(-267) +145 + j*(72) +52 + j*(-160) +-346 + j*(13) +-107 + j*(203) +-278 + j*(286) +-279 + j*(300) +-83 + j*(-110) +40 + j*(69) +77 + j*(-233) +177 + j*(55) +135 + j*(-241) +25 + j*(30) +100 + j*(81) +293 + j*(-232) +-99 + j*(206) +-428 + j*(232) +135 + j*(-12) +227 + j*(-14) +64 + j*(-328) +45 + j*(-37) +-197 + j*(-253) +126 + j*(103) +113 + j*(4) +-6 + j*(-86) +11 + j*(130) +45 + j*(-115) +3 + j*(141) +-295 + j*(228) +-132 + j*(-34) +328 + j*(7) +-10 + j*(-414) +174 + j*(145) +108 + j*(-86) +-244 + j*(10) +-16 + j*(-123) +-77 + j*(-84) +98 + j*(-405) +131 + j*(-130) +-358 + j*(276) +-59 + j*(-46) +-523 + j*(75) +-109 + j*(-81) +-3 + j*(47) +197 + j*(207) +180 + j*(-38) +286 + j*(20) +-299 + j*(-468) +107 + j*(-59) +-273 + j*(-121) +-14 + j*(-8) +-58 + j*(-18) +123 + j*(266) +82 + j*(91) +-117 + j*(70) +328 + j*(213) +165 + j*(-51) +234 + j*(-64) +192 + j*(-102) +25 + j*(81) +-20 + j*(30) +54 + j*(-132) +-57 + j*(91) +6 + j*(101) +-6 + j*(66) +101 + j*(-100) +95 + j*(49) +160 + j*(272) +173 + j*(-262) +134 + j*(106) +-59 + j*(9) +287 + j*(259) +-105 + j*(-248) +-156 + j*(-380) +-287 + j*(141) +-98 + j*(-66) +16 + j*(52) +63 + j*(103) +35 + j*(128) +-104 + j*(-173) +86 + j*(226) +33 + j*(92) +149 + j*(49) +77 + j*(-76) +-126 + j*(23) +-417 + j*(13) +-241 + j*(152) +-30 + j*(-218) +-176 + j*(-159) +93 + j*(105) +150 + j*(79) +163 + j*(66) +209 + j*(27) +21 + j*(-233) +-144 + j*(16) +130 + j*(16) +322 + j*(192) +-192 + j*(50) +230 + j*(-177) +98 + j*(-100) +-127 + j*(-187) +-153 + j*(33) +246 + j*(-37) +147 + j*(-141) +-211 + j*(202) +265 + j*(177) +137 + j*(43) +538 + j*(218) +-583 + j*(125) +52 + j*(42) +165 + j*(-288) +-336 + j*(368) +175 + j*(-170) +-441 + j*(240) +149 + j*(129) +-235 + j*(148) +-38 + j*(-30) +-76 + j*(-467) +213 + j*(-158) +16 + j*(-30) +-51 + j*(-43) +-37 + j*(202) +16 + j*(-47) +199 + j*(-107) +-161 + j*(105) +-114 + j*(175) +-57 + j*(-124) +13 + j*(-55) +148 + j*(-185) +-76 + j*(-110) +-127 + j*(95) +629 + j*(323) +75 + j*(-234) +-103 + j*(-122) +88 + j*(-91) +-88 + j*(-165) +-19 + j*(47) +-55 + j*(197) +-31 + j*(-1) +-206 + j*(52) +-128 + j*(108) +218 + j*(58) +-254 + j*(-185) +-171 + j*(-105) +54 + j*(161) +31 + j*(41) +-173 + j*(210) +-4 + j*(45) +-276 + j*(33) +-270 + j*(92) +136 + j*(-105) +71 + j*(-156) +21 + j*(298) +-134 + j*(284) +138 + j*(8) +-62 + j*(483) +-495 + j*(62) +-231 + j*(-243) +-231 + j*(139) +117 + j*(56) +-121 + j*(-21) +-205 + j*(-68) +46 + j*(-148) +272 + j*(-71) +22 + j*(-134) +-88 + j*(170) +227 + j*(-7) +194 + j*(-216) +-105 + j*(-83) +35 + j*(-38) +-62 + j*(-11) +-25 + j*(-57) +-165 + j*(334) +59 + j*(-33) +-66 + j*(54) +40 + j*(-2) +-113 + j*(87) +61 + j*(-245) +47 + j*(-117) +71 + j*(-265) +177 + j*(298) +28 + j*(-226) +255 + j*(-117) +91 + j*(-88) +-136 + j*(-4) +122 + j*(162) +-66 + j*(156) +-35 + j*(190) +112 + j*(233) +37 + j*(-218) +-210 + j*(136) +-117 + j*(199) +-121 + j*(21) +21 + j*(42) +-133 + j*(-1) +261 + j*(67) +274 + j*(-211) +117 + j*(109) +-59 + j*(-67) +-262 + j*(-350) +49 + j*(29) +-164 + j*(-71) +-7 + j*(148) +-145 + j*(-25) +110 + j*(66) +-63 + j*(-243) +45 + j*(371) +70 + j*(111) +-69 + j*(-186) +170 + j*(-42) +7 + j*(18) +-207 + j*(-57) +52 + j*(-413) +198 + j*(303) +42 + j*(-6) +162 + j*(131) +-103 + j*(-41) +-161 + j*(75) +-18 + j*(137) +63 + j*(192) +317 + j*(201) +-246 + j*(-300) +81 + j*(194) +410 + j*(-223) +168 + j*(109) +-35 + j*(-319) +-192 + j*(-197) +-59 + j*(293) +-138 + j*(-165) +-124 + j*(-127) +161 + j*(-1) +-225 + j*(252) +1 + j*(6) +66 + j*(-69) +-95 + j*(33) +33 + j*(-151) +-37 + j*(332) +38 + j*(-76) +113 + j*(-186) +-132 + j*(-240) +-67 + j*(125) +-87 + j*(-121) +-51 + j*(11) +436 + j*(-5) +5 + j*(4) +319 + j*(-137) +26 + j*(-105) +-58 + j*(251) +49 + j*(-78) +-159 + j*(-67) +82 + j*(177) +-57 + j*(-229) +150 + j*(54) +39 + j*(-21) +23 + j*(-116) +83 + j*(154) +-116 + j*(-146) +35 + j*(35) +129 + j*(66) +-139 + j*(-21) +-247 + j*(-43) +66 + j*(201) +-48 + j*(-122) +115 + j*(-10) +59 + j*(-78) +-135 + j*(325) +186 + j*(94) +321 + j*(64) +-243 + j*(-163) +-21 + j*(219) +92 + j*(18) +-138 + j*(-308) +116 + j*(-98) +-293 + j*(-9) +-483 + j*(-84) +-51 + j*(99) +-34 + j*(-354) +44 + j*(124) +-294 + j*(-137) +-216 + j*(-135) +122 + j*(-151) +-213 + j*(-472) +-165 + j*(134) +184 + j*(-23) +-178 + j*(-216) +71 + j*(-120) +35 + j*(107) +-88 + j*(115) +394 + j*(-350) +261 + j*(-11) +18 + j*(69) +94 + j*(-419) +57 + j*(-196) +-62 + j*(-337) +-86 + j*(-111) +-284 + j*(-116) +-260 + j*(-87) +-50 + j*(-44) +266 + j*(117) +37 + j*(-122) +-249 + j*(80) +59 + j*(108) +151 + j*(-60) +-13 + j*(60) +44 + j*(18) +233 + j*(108) +305 + j*(-136) +-246 + j*(-6) +-122 + j*(-25) +-132 + j*(-170) +-2 + j*(34) +93 + j*(-3) +-87 + j*(93) +190 + j*(16) +192 + j*(314) +122 + j*(184) +185 + j*(272) +-151 + j*(-226) +58 + j*(181) +-39 + j*(-141) +-36 + j*(-188) +-96 + j*(158) +-15 + j*(-67) +-89 + j*(-180) +225 + j*(-103) +233 + j*(-173) +169 + j*(-23) +-7 + j*(-106) +165 + j*(-170) +-112 + j*(-73) +-428 + j*(-307) +-46 + j*(458) +235 + j*(-32) +255 + j*(268) +117 + j*(-291) +45 + j*(99) +-194 + j*(-226) +103 + j*(-133) +107 + j*(-172) +-18 + j*(-30) +-3 + j*(-140) +-146 + j*(-248) +127 + j*(12) +-25 + j*(158) +199 + j*(170) +334 + j*(103) +38 + j*(218) +-57 + j*(270) +-229 + j*(6) +-359 + j*(288) +100 + j*(107) +168 + j*(-62) +127 + j*(-205) +-25 + j*(-194) +60 + j*(-344) +-257 + j*(-204) +205 + j*(47) +63 + j*(6) +286 + j*(-307) +190 + j*(46) +-404 + j*(24) +117 + j*(74) +17 + j*(-186) +-358 + j*(70) +-447 + j*(50) +317 + j*(-105) +-300 + j*(-24) +-170 + j*(-203) +-18 + j*(-217) +401 + j*(59) +-368 + j*(74) +227 + j*(-190) +150 + j*(6) +431 + j*(-158) +251 + j*(-187) +-59 + j*(-158) +-281 + j*(-172) +-202 + j*(-277) +226 + j*(-39) +-74 + j*(-202) +32 + j*(257) +-249 + j*(-104) +-342 + j*(18) +-42 + j*(276) +20 + j*(-174) +-58 + j*(55) +107 + j*(13) +62 + j*(110) +-88 + j*(-8) +-53 + j*(105) +-98 + j*(-82) +40 + j*(-269) +-168 + j*(146) +-91 + j*(-114) +-34 + j*(-367) +-131 + j*(29) +-137 + j*(58) +-79 + j*(-44) +-255 + j*(-166) +-56 + j*(-137) +-202 + j*(-279) +63 + j*(21) +383 + j*(-27) +19 + j*(252) +28 + j*(-19) +-69 + j*(16) +-136 + j*(275) +395 + j*(-137) +107 + j*(351) +-59 + j*(279) +-196 + j*(-284) +165 + j*(45) +68 + j*(-99) +404 + j*(303) +-238 + j*(-18) +245 + j*(-265) +59 + j*(303) +-35 + j*(-162) +-453 + j*(-248) +-334 + j*(163) +-344 + j*(474) +6 + j*(-3) +-201 + j*(269) +134 + j*(-625) +441 + j*(165) +89 + j*(-500) +170 + j*(475) +499 + j*(38) +-637 + j*(-19) +-191 + j*(444) +-91 + j*(369) +129 + j*(270) +103 + j*(112) +-11 + j*(255) +452 + j*(323) +-325 + j*(-290) +485 + j*(-310) +238 + j*(-470) +-148 + j*(-462) +-323 + j*(-13) +175 + j*(-445) +381 + j*(-290) +-479 + j*(-116) +-348 + j*(245) +274 + j*(356) +54 + j*(233) +29 + j*(-153) +556 + j*(420) +88 + j*(27) +-383 + j*(83) +-45 + j*(606) +44 + j*(245) +-272 + j*(-347) +-452 + j*(-182) +35 + j*(165) +179 + j*(-366) +-275 + j*(280) +294 + j*(-340) +-371 + j*(200) +-260 + j*(410) +210 + j*(-378) +-54 + j*(371) +276 + j*(352) +524 + j*(361) +228 + j*(-63) +-296 + j*(-247) +590 + j*(-115) +-23 + j*(234) +71 + j*(255) +-517 + j*(-235) +75 + j*(450) +89 + j*(-307) +180 + j*(313) +247 + j*(448) +197 + j*(98) +163 + j*(160) +-272 + j*(182) +177 + j*(35) +-397 + j*(201) +-122 + j*(-438) +-453 + j*(-634) +-269 + j*(-228) +-167 + j*(-662) +262 + j*(-260) +95 + j*(225) +477 + j*(356) +-121 + j*(216) +77 + j*(161) +-372 + j*(-286) +-375 + j*(-124) +-553 + j*(269) +-320 + j*(-297) +158 + j*(-262) +456 + j*(-231) +-440 + j*(-190) +-234 + j*(182) +47 + j*(269) +122 + j*(54) +-106 + j*(409) +-245 + j*(228) +-1 + j*(196) +-120 + j*(-257) +-173 + j*(80) +-477 + j*(-206) +83 + j*(472) +-611 + j*(176) +47 + j*(239) +-474 + j*(89) +606 + j*(251) +-338 + j*(451) +176 + j*(-199) +-354 + j*(-397) +-89 + j*(-178) +124 + j*(-152) +172 + j*(199) +-367 + j*(-373) +461 + j*(-211) +341 + j*(63) +8 + j*(172) +-398 + j*(109) +6 + j*(132) +422 + j*(139) +-229 + j*(-193) +-118 + j*(163) +-74 + j*(105) +-80 + j*(199) +622 + j*(-87) +206 + j*(-106) +62 + j*(117) +-354 + j*(235) +-129 + j*(-91) +413 + j*(430) +-419 + j*(107) +236 + j*(187) +-494 + j*(-507) +-118 + j*(340) +-25 + j*(335) +528 + j*(-308) +-499 + j*(-47) +-11 + j*(95) +-275 + j*(259) +-395 + j*(128) +35 + j*(264) +-16 + j*(-187) +127 + j*(-355) +358 + j*(323) +517 + j*(13) +-177 + j*(7) +-335 + j*(-337) +-570 + j*(210) +290 + j*(183) +-529 + j*(-514) +-87 + j*(272) +-121 + j*(298) +-682 + j*(-194) +-99 + j*(228) +-216 + j*(-336) +433 + j*(-46) +-585 + j*(-307) +-225 + j*(136) +-92 + j*(-79) +-38 + j*(413) +-22 + j*(201) +272 + j*(311) +258 + j*(67) +19 + j*(-434) +417 + j*(343) +-291 + j*(145) +-197 + j*(173) +539 + j*(430) +-530 + j*(-280) +-69 + j*(276) +-442 + j*(71) +-363 + j*(-136) +-390 + j*(245) +-186 + j*(326) +426 + j*(217) +83 + j*(467) +-613 + j*(281) +146 + j*(-255) +37 + j*(-203) +-504 + j*(49) +-48 + j*(-541) +165 + j*(33) +-302 + j*(296) +-528 + j*(73) +-281 + j*(-112) +455 + j*(547) +245 + j*(-219) +-552 + j*(-479) +-163 + j*(-419) +235 + j*(424) +-527 + j*(240) +25 + j*(-750) +-203 + j*(-203) +-205 + j*(-281) +-88 + j*(88) +353 + j*(597) +362 + j*(287) +-308 + j*(175) +569 + j*(180) +421 + j*(-441) +-382 + j*(76) +-40 + j*(180) +-81 + j*(235) +-308 + j*(169) +364 + j*(-674) +-218 + j*(49) +437 + j*(369) +251 + j*(-216) +395 + j*(-381) +-255 + j*(113) +-411 + j*(300) +-109 + j*(83) +-132 + j*(512) +194 + j*(336) +-83 + j*(283) +340 + j*(-88) +47 + j*(156) +-71 + j*(293) +467 + j*(389) +269 + j*(-11) +-188 + j*(-217) +-266 + j*(220) +-368 + j*(402) +-394 + j*(153) +-148 + j*(-221) +132 + j*(-19) +284 + j*(-238) +-255 + j*(-104) +-399 + j*(-474) +-693 + j*(211) +-318 + j*(97) +-568 + j*(-313) +206 + j*(10) +339 + j*(-526) +-535 + j*(-288) +-4 + j*(-254) +537 + j*(140) +-313 + j*(377) +59 + j*(164) +257 + j*(258) +387 + j*(-396) +252 + j*(650) +144 + j*(-562) +-56 + j*(-597) +-163 + j*(377) +-89 + j*(488) +-245 + j*(-170) +-94 + j*(-573) +-248 + j*(374) +327 + j*(-499) +-438 + j*(89) +228 + j*(-331) +40 + j*(-243) +205 + j*(320) +-280 + j*(-1) +380 + j*(-342) +-539 + j*(176) +37 + j*(-398) +-567 + j*(474) +-322 + j*(319) +118 + j*(222) +-317 + j*(-47) +304 + j*(-267) +355 + j*(-300) +146 + j*(256) +-330 + j*(-215) +23 + j*(435) +354 + j*(83) +231 + j*(90) +152 + j*(-227) +-246 + j*(262) +-451 + j*(341) +-208 + j*(-239) +256 + j*(-187) +-474 + j*(-392) +293 + j*(-143) +397 + j*(273) +349 + j*(150) +211 + j*(62) +-249 + j*(-354) +76 + j*(213) +-129 + j*(-209) +-555 + j*(-134) +264 + j*(-363) +457 + j*(-358) +-165 + j*(-33) +149 + j*(-256) +190 + j*(136) +182 + j*(190) +371 + j*(287) +252 + j*(56) +395 + j*(391) +308 + j*(-521) +45 + j*(-256) +-9 + j*(-543) +323 + j*(407) +486 + j*(-177) +-363 + j*(29) +206 + j*(-639) +-333 + j*(-112) +71 + j*(-152) +21 + j*(-375) +154 + j*(39) +-103 + j*(-450) +-281 + j*(-57) +-215 + j*(428) +-332 + j*(-16) +349 + j*(-7) +-145 + j*(-528) +226 + j*(295) +472 + j*(-151) +56 + j*(241) +144 + j*(75) +-641 + j*(-214) +316 + j*(303) +-523 + j*(-491) +504 + j*(373) +170 + j*(419) +-469 + j*(-817) +76 + j*(163) +204 + j*(-40) +-467 + j*(-346) +-181 + j*(93) +-25 + j*(-513) +204 + j*(446) +525 + j*(229) +-499 + j*(383) +-91 + j*(288) +33 + j*(-115) +8 + j*(-433) +-238 + j*(-446) +156 + j*(496) +207 + j*(17) +-271 + j*(-318) +287 + j*(-330) +-212 + j*(-262) +-62 + j*(-20) +617 + j*(157) +-40 + j*(-72) +-256 + j*(-126) +313 + j*(-422) +-209 + j*(23) +433 + j*(-441) +175 + j*(-378) +-223 + j*(16) +-1 + j*(-623) +441 + j*(-211) +-243 + j*(-511) +-370 + j*(-292) +-114 + j*(-321) +-347 + j*(-197) +-501 + j*(-327) +57 + j*(-296) +-231 + j*(241) +148 + j*(68) +-516 + j*(391) +250 + j*(-153) +-300 + j*(-183) +-9 + j*(-402) +332 + j*(197) +209 + j*(280) +115 + j*(-447) +-167 + j*(66) +455 + j*(105) +307 + j*(98) +409 + j*(-368) +37 + j*(-124) +137 + j*(238) +-402 + j*(-307) +-319 + j*(-198) +37 + j*(-339) +223 + j*(199) +-354 + j*(-160) +-3 + j*(401) +-11 + j*(30) +377 + j*(-197) +-639 + j*(-83) +-15 + j*(296) +79 + j*(-421) +-197 + j*(-234) +-47 + j*(-387) +629 + j*(30) +293 + j*(170) +595 + j*(486) +-391 + j*(256) +-44 + j*(25) +-497 + j*(364) +-74 + j*(198) +127 + j*(322) +-373 + j*(161) +-200 + j*(67) +503 + j*(301) +319 + j*(209) +276 + j*(-260) +-539 + j*(-240) +-53 + j*(356) +340 + j*(-97) +28 + j*(321) +45 + j*(-135) +1 + j*(-404) +319 + j*(-499) +457 + j*(-78) +178 + j*(-281) +-399 + j*(-112) +124 + j*(-13) +-195 + j*(-286) +132 + j*(354) +677 + j*(-21) +-69 + j*(-286) +571 + j*(197) +141 + j*(17) +126 + j*(282) +176 + j*(611) +419 + j*(-260) +202 + j*(-305) +196 + j*(-390) +-696 + j*(547) +226 + j*(-73) +187 + j*(537) +-245 + j*(276) +-508 + j*(139) +364 + j*(235) +438 + j*(-310) +284 + j*(-198) +-246 + j*(616) +346 + j*(-528) +190 + j*(365) +279 + j*(310) +-286 + j*(287) +-128 + j*(-385) +-150 + j*(461) +305 + j*(81) +-167 + j*(305) +177 + j*(310) +-1 + j*(-93) +-322 + j*(450) +-278 + j*(-342) +549 + j*(328) +-168 + j*(540) +351 + j*(-178) +217 + j*(314) +-275 + j*(300) +163 + j*(-137) +-153 + j*(-810) +-314 + j*(457) +279 + j*(-263) +157 + j*(-163) +622 + j*(-212) +70 + j*(-303) +275 + j*(-532) +321 + j*(409) +134 + j*(293) +-91 + j*(-387) +272 + j*(127) +-312 + j*(-547) +-226 + j*(-198) +-518 + j*(583) +117 + j*(218) +658 + j*(19) +317 + j*(691) +-420 + j*(193) +62 + j*(-383) +-79 + j*(-174) +74 + j*(348) +354 + j*(-148) +-478 + j*(-88) +393 + j*(-581) +282 + j*(16) +214 + j*(416) +-163 + j*(-387) +226 + j*(-209) +44 + j*(-400) +345 + j*(-215) +-203 + j*(-110) +269 + j*(301) +-269 + j*(75) +199 + j*(471) +-320 + j*(1) +-648 + j*(-421) +245 + j*(-436) +-57 + j*(183) +-571 + j*(21) +-403 + j*(158) +427 + j*(218) +-327 + j*(-246) +529 + j*(459) +150 + j*(127) +-418 + j*(-54) +412 + j*(369) +116 + j*(-91) +395 + j*(296) +301 + j*(276) +566 + j*(285) +15 + j*(-486) +267 + j*(511) +-98 + j*(-312) +-190 + j*(-24) +-30 + j*(-380) +-484 + j*(-349) +-109 + j*(85) +-43 + j*(-262) +320 + j*(355) +-552 + j*(-317) +-95 + j*(250) +358 + j*(277) +-62 + j*(-587) +128 + j*(-55) +-302 + j*(127) +-338 + j*(-502) +-90 + j*(-230) +-271 + j*(-47) +638 + j*(-255) +330 + j*(-83) +-233 + j*(421) +-182 + j*(-139) +-32 + j*(405) +296 + j*(157) +28 + j*(216) +129 + j*(1) +-267 + j*(-117) +-310 + j*(-152) +-390 + j*(-285) +389 + j*(371) +199 + j*(165) +120 + j*(45) +530 + j*(354) +-42 + j*(-301) +368 + j*(-213) +-28 + j*(-317) +-89 + j*(-516) +-32 + j*(213) +218 + j*(105) +-168 + j*(293) +-261 + j*(225) +158 + j*(221) +-180 + j*(-234) +236 + j*(383) +-63 + j*(-86) +319 + j*(-243) +265 + j*(60) +-63 + j*(149) +191 + j*(-45) +-172 + j*(202) +-212 + j*(616) +-405 + j*(387) +-325 + j*(19) +-18 + j*(149) +-594 + j*(-148) +-387 + j*(460) +-368 + j*(469) +407 + j*(310) +-475 + j*(6) +-474 + j*(30) +-553 + j*(331) +-99 + j*(-116) +265 + j*(-308) +188 + j*(-201) +64 + j*(-253) +-30 + j*(-274) +-364 + j*(322) +309 + j*(-317) +-293 + j*(223) +197 + j*(-407) +433 + j*(-237) +-73 + j*(37) +392 + j*(373) +-235 + j*(-14) +425 + j*(-168) +-192 + j*(49) +15 + j*(-447) +61 + j*(202) +374 + j*(-368) +393 + j*(-243) +383 + j*(-417) +214 + j*(-48) +-228 + j*(148) +-298 + j*(-249) +55 + j*(-243) +269 + j*(-70) +230 + j*(85) +402 + j*(-211) +-491 + j*(-202) +-465 + j*(-66) +556 + j*(352) +105 + j*(473) +358 + j*(-113) +-377 + j*(244) +-344 + j*(-247) +-160 + j*(233) +437 + j*(-361) +288 + j*(184) +94 + j*(-404) +-11 + j*(205) +-216 + j*(-250) +-11 + j*(-221) +-1 + j*(-287) +269 + j*(-443) +244 + j*(-533) +-298 + j*(-8) +-180 + j*(109) +248 + j*(479) +213 + j*(124) +358 + j*(541) +-181 + j*(-170) +-250 + j*(187) +117 + j*(-116) +-319 + j*(226) +206 + j*(124) +-320 + j*(-134) +241 + j*(518) +-218 + j*(6) +-407 + j*(-465) +93 + j*(479) +-550 + j*(275) +112 + j*(623) +-153 + j*(102) +-38 + j*(-216) +125 + j*(-53) +243 + j*(-223) +-298 + j*(-80) +358 + j*(153) +-172 + j*(99) +-166 + j*(-334) +-24 + j*(136) +-269 + j*(83) +-16 + j*(141) +-81 + j*(-37) +288 + j*(-160) +76 + j*(-252) +15 + j*(-38) +52 + j*(-147) +-139 + j*(-18) +-134 + j*(163) +-214 + j*(-61) +-187 + j*(259) +317 + j*(-68) +-102 + j*(-43) +-310 + j*(-237) +28 + j*(-4) +-106 + j*(21) +106 + j*(-231) +-339 + j*(50) +30 + j*(-218) +-42 + j*(-162) +-235 + j*(-288) +-110 + j*(-78) +95 + j*(413) +-305 + j*(67) +238 + j*(279) +124 + j*(196) +-105 + j*(-66) +-495 + j*(-67) +190 + j*(62) +-241 + j*(-206) +99 + j*(3) +-175 + j*(-147) +78 + j*(-20) +-103 + j*(-211) +-167 + j*(-285) +54 + j*(-207) +88 + j*(11) +21 + j*(35) +-62 + j*(13) +317 + j*(199) +113 + j*(122) +-373 + j*(252) +94 + j*(-60) +35 + j*(117) +-180 + j*(194) +-21 + j*(81) +21 + j*(87) +-96 + j*(-382) +-185 + j*(100) +-463 + j*(392) +-78 + j*(-193) +312 + j*(-53) +-126 + j*(-49) +217 + j*(52) +-62 + j*(187) +-66 + j*(76) +-37 + j*(-108) +82 + j*(-197) +37 + j*(-62) +45 + j*(-120) +83 + j*(-103) +-91 + j*(165) +-77 + j*(90) +-224 + j*(160) +-145 + j*(67) +230 + j*(-203) +143 + j*(54) +223 + j*(163) +42 + j*(-2) +39 + j*(-60) +2 + j*(235) +216 + j*(274) +34 + j*(-177) +138 + j*(-175) +-220 + j*(-211) +-15 + j*(36) +-23 + j*(300) +91 + j*(282) +-3 + j*(166) +-193 + j*(-123) +-103 + j*(27) +-5 + j*(28) +-121 + j*(60) +243 + j*(-2) +145 + j*(-293) +-127 + j*(415) +-83 + j*(267) +-95 + j*(47) +35 + j*(96) +-53 + j*(-190) +18 + j*(-146) +-76 + j*(165) +131 + j*(-103) +5 + j*(-44) +57 + j*(-155) +-339 + j*(-77) +8 + j*(-175) +157 + j*(16) +119 + j*(149) +-276 + j*(-163) +23 + j*(107) +69 + j*(-146) +135 + j*(-267) +94 + j*(103) +27 + j*(57) +29 + j*(164) +24 + j*(-66) +-98 + j*(-193) +-9 + j*(51) +-144 + j*(-103) +346 + j*(59) +377 + j*(262) +82 + j*(-277) +60 + j*(143) +88 + j*(107) +192 + j*(-120) +-146 + j*(-35) +-455 + j*(107) +91 + j*(236) +181 + j*(45) +90 + j*(64) +-56 + j*(-392) +-73 + j*(-43) +99 + j*(9) +-270 + j*(-105) +-62 + j*(-435) +-349 + j*(-218) +-298 + j*(-86) +-137 + j*(-90) +76 + j*(28) +235 + j*(-12) +-63 + j*(-119) +-180 + j*(71) +-165 + j*(218) +-96 + j*(-2) +1 + j*(-390) +-1 + j*(5) +59 + j*(-162) +33 + j*(171) +9 + j*(-5) +387 + j*(-101) +-89 + j*(94) +-168 + j*(-165) +-230 + j*(-2) +446 + j*(198) +209 + j*(161) +172 + j*(153) +34 + j*(153) +80 + j*(3) +-238 + j*(245) +-28 + j*(-286) +261 + j*(202) +-277 + j*(139) +76 + j*(148) +321 + j*(-148) +5 + j*(-124) +175 + j*(286) +-22 + j*(95) +14 + j*(-212) +-30 + j*(-224) +-52 + j*(-112) +240 + j*(-124) +-21 + j*(292) +-39 + j*(-235) +81 + j*(262) +3 + j*(-186) +74 + j*(-12) +178 + j*(84) +86 + j*(-62) +238 + j*(-4) +4 + j*(13) +265 + j*(-82) +37 + j*(218) +-187 + j*(71) +-288 + j*(330) +-112 + j*(340) +71 + j*(-57) +-62 + j*(81) +18 + j*(96) +-84 + j*(132) +10 + j*(162) +97 + j*(4) +50 + j*(308) +-25 + j*(442) +-136 + j*(187) +-161 + j*(109) +-50 + j*(54) +210 + j*(-192) +59 + j*(174) +-51 + j*(-252) +139 + j*(-155) +280 + j*(156) +32 + j*(-54) +211 + j*(24) +-198 + j*(-298) +165 + j*(206) +122 + j*(-144) +30 + j*(119) +-21 + j*(281) +74 + j*(-119) +-54 + j*(-23) +-25 + j*(332) +78 + j*(-199) +-125 + j*(-74) +232 + j*(11) +-199 + j*(154) +311 + j*(31) +76 + j*(307) +39 + j*(-23) +-165 + j*(397) +310 + j*(42) +255 + j*(-36) +276 + j*(-68) +-192 + j*(20) +-98 + j*(166) +3 + j*(-489) +41 + j*(177) +-72 + j*(305) +-52 + j*(-67) +66 + j*(-297) +20 + j*(-185) +-270 + j*(-66) +15 + j*(-18) +-71 + j*(-7) +40 + j*(-203) +199 + j*(-431) +316 + j*(-88) +46 + j*(90) +-196 + j*(38) +91 + j*(-21) +-1 + j*(169) +96 + j*(36) +-76 + j*(-205) +289 + j*(76) +-132 + j*(-141) +-145 + j*(-97) +-1 + j*(171) +-51 + j*(182) +19 + j*(-129) +40 + j*(50) +-175 + j*(-300) +21 + j*(74) +51 + j*(142) +-128 + j*(-64) +-43 + j*(-92) +247 + j*(109) +-53 + j*(-28) +-20 + j*(-168) +47 + j*(331) +8 + j*(-158) +-7 + j*(-202) +-51 + j*(-9) +49 + j*(66) +26 + j*(67) +-157 + j*(-441) +82 + j*(-47) +-124 + j*(165) +-134 + j*(201) +-74 + j*(184) +201 + j*(-29) +85 + j*(-272) +68 + j*(-132) +138 + j*(-243) +-44 + j*(170) +-154 + j*(-1) +-93 + j*(79) +132 + j*(-134) +-168 + j*(132) +147 + j*(144) +-113 + j*(-10) +88 + j*(124) +-267 + j*(25) +63 + j*(-53) +156 + j*(-330) +75 + j*(167) +238 + j*(0) +189 + j*(29) +-175 + j*(-159) +110 + j*(-90) +-68 + j*(-70) +36 + j*(-15) +6 + j*(-356) +138 + j*(315) +17 + j*(-114) +-239 + j*(129) +279 + j*(21) +-151 + j*(-25) +103 + j*(-17) +213 + j*(8) +-81 + j*(148) +-171 + j*(24) +-63 + j*(6) +178 + j*(-13) +115 + j*(115) +187 + j*(148) +-191 + j*(-442) +-9 + j*(218) +-60 + j*(101) +-64 + j*(191) +-21 + j*(-170) +78 + j*(110) +-395 + j*(216) +122 + j*(186) +-81 + j*(2) +-324 + j*(237) +26 + j*(-274) +60 + j*(-154) +-54 + j*(-83) +9 + j*(240) +-117 + j*(63) +-10 + j*(3) +109 + j*(124) +55 + j*(-28) +51 + j*(-1) +293 + j*(-194) +-88 + j*(-208) +-58 + j*(-27) +48 + j*(117) +-287 + j*(97) +-105 + j*(-250) +-2 + j*(-269) +-204 + j*(-248) +-189 + j*(-123) +-134 + j*(206) +-114 + j*(-123) +-180 + j*(-58) +-320 + j*(-144) +-265 + j*(-50) +243 + j*(-311) +48 + j*(25) +-69 + j*(-78) +-98 + j*(25) +-3 + j*(-18) +63 + j*(-254) +-182 + j*(-132) +122 + j*(-55) +-43 + j*(161) +-257 + j*(219) +1 + j*(-32) +417 + j*(64) +-131 + j*(199) +-215 + j*(-242) +308 + j*(153) +157 + j*(-10) +-199 + j*(164) +-77 + j*(-54) +-68 + j*(76) +-22 + j*(-71) +101 + j*(95) +-223 + j*(-192) +-94 + j*(113) +-256 + j*(-165) +420 + j*(131) +62 + j*(0) +-168 + j*(95) +-69 + j*(-202) +137 + j*(1) +226 + j*(439) +153 + j*(-33) +-76 + j*(81) +-264 + j*(30) +400 + j*(62) +175 + j*(-37) +343 + j*(-157) +-302 + j*(59) +246 + j*(114) +148 + j*(-61) +112 + j*(74) +-134 + j*(-46) +-243 + j*(41) +255 + j*(-355) +-85 + j*(-38) +-110 + j*(183) +132 + j*(95) +-566 + j*(169) +313 + j*(162) +-31 + j*(-28) +-245 + j*(442) +-64 + j*(-252) +334 + j*(-138) +105 + j*(-85) +-135 + j*(16) +123 + j*(-224) +62 + j*(-48) +-78 + j*(-16) +-272 + j*(74) +66 + j*(222) +49 + j*(269) +-255 + j*(-76) +-192 + j*(-3) +11 + j*(-50) +168 + j*(293) +76 + j*(110) +-43 + j*(99) +187 + j*(61) +-340 + j*(-91) +-110 + j*(-132) +-156 + j*(-99) +149 + j*(103) +203 + j*(-56) +37 + j*(261) +-232 + j*(78) +44 + j*(13) +139 + j*(-14) +-58 + j*(-137) +-52 + j*(-281) +-231 + j*(35) +211 + j*(-35) +42 + j*(65) +-177 + j*(223) +127 + j*(61) +148 + j*(-34) +101 + j*(224) +-8 + j*(91) +-49 + j*(157) +-174 + j*(-173) +-47 + j*(-56) +-55 + j*(115) +-108 + j*(-19) +-147 + j*(-96) +-132 + j*(-86) +-23 + j*(23) +183 + j*(-191) +265 + j*(107) +-83 + j*(306) +50 + j*(239) +137 + j*(-273) +330 + j*(52) +-153 + j*(45) +-191 + j*(306) +171 + j*(-64) +-16 + j*(78) +-298 + j*(-16) +94 + j*(410) +-125 + j*(65) +-154 + j*(112) +81 + j*(69) +-151 + j*(-175) +294 + j*(-264) +-119 + j*(286) +-35 + j*(-293) +49 + j*(221) +-77 + j*(-30) +-170 + j*(407) +-198 + j*(14) +-5 + j*(6) +315 + j*(-35) +41 + j*(282) +241 + j*(25) +148 + j*(168) +34 + j*(196) +-248 + j*(161) +129 + j*(-66) +296 + j*(-42) +-45 + j*(119) +-87 + j*(141) +86 + j*(90) +66 + j*(-45) +-13 + j*(-129) +273 + j*(-148) +-6 + j*(-82) +227 + j*(-168) +32 + j*(-130) +59 + j*(-64) +11 + j*(99) +-91 + j*(-40) +208 + j*(-91) +218 + j*(69) +48 + j*(-325) +6 + j*(47) +6 + j*(-215) +-250 + j*(-271) +-98 + j*(36) +-180 + j*(-23) +-371 + j*(-30) +-242 + j*(-11) +191 + j*(6) +70 + j*(-28) +-90 + j*(171) +208 + j*(-58) +3 + j*(101) +122 + j*(-214) +13 + j*(99) +-80 + j*(217) +-315 + j*(182) +124 + j*(-228) +192 + j*(177) +330 + j*(61) +-270 + j*(-122) +-5 + j*(-162) +182 + j*(31) +-197 + j*(-168) +11 + j*(123) +86 + j*(277) +-37 + j*(-84) +164 + j*(-81) +148 + j*(24) +355 + j*(-25) +149 + j*(54) +-36 + j*(158) +189 + j*(-11) +127 + j*(141) +76 + j*(130) +-32 + j*(33) +-189 + j*(-19) +-35 + j*(-350) +-133 + j*(252) +-139 + j*(-38) +71 + j*(-33) +-42 + j*(-138) +-252 + j*(121) +283 + j*(140) +-50 + j*(135) +-124 + j*(-32) +124 + j*(289) +-84 + j*(153) +197 + j*(134) +-80 + j*(434) +-41 + j*(71) +159 + j*(-46) +30 + j*(321) +165 + j*(-438) +-47 + j*(98) +180 + j*(125) +-144 + j*(-28) +292 + j*(-85) +-129 + j*(168) +-117 + j*(54) +100 + j*(-224) +25 + j*(-146) +397 + j*(-4) +81 + j*(37) +-47 + j*(8) +20 + j*(-333) +110 + j*(-108) +-198 + j*(236) +-209 + j*(-77) +35 + j*(-111) +-82 + j*(78) +-46 + j*(-170) +150 + j*(153) +210 + j*(37) +-378 + j*(-346) +122 + j*(105) +-48 + j*(128) +4 + j*(250) +-42 + j*(233) +-59 + j*(46) +132 + j*(-116) +-69 + j*(51) +-296 + j*(228) +-81 + j*(40) +121 + j*(-190) +111 + j*(60) +-33 + j*(-152) +-71 + j*(145) +-310 + j*(-11) +-144 + j*(-107) +91 + j*(134) +-54 + j*(134) +15 + j*(154) +110 + j*(191) +-214 + j*(-2) +504 + j*(-209) +-42 + j*(-76) +284 + j*(75) +-138 + j*(-303) +-53 + j*(110) +120 + j*(74) +240 + j*(131) +272 + j*(-115) +3 + j*(69) +-32 + j*(18) +259 + j*(-187) +127 + j*(179) +-197 + j*(187) +337 + j*(-229) +-2 + j*(-35) +188 + j*(25) +-348 + j*(177) +138 + j*(-299) +-150 + j*(169) +140 + j*(231) +-232 + j*(92) +-8 + j*(131) +-88 + j*(144) +54 + j*(-169) +-54 + j*(95) +46 + j*(-153) +74 + j*(112) +-187 + j*(-75) +-163 + j*(-105) +-109 + j*(95) +-149 + j*(-81) +-320 + j*(128) +245 + j*(117) +-284 + j*(93) +-26 + j*(-222) +-240 + j*(144) +30 + j*(-30) +-11 + j*(327) +148 + j*(68) +149 + j*(37) +-110 + j*(-209) +348 + j*(7) +-69 + j*(-78) +207 + j*(13) +-160 + j*(-16) +-59 + j*(-75) +70 + j*(7) +203 + j*(220) +301 + j*(210) +-206 + j*(-198) +24 + j*(115) +-163 + j*(-298) +115 + j*(104) +222 + j*(290) +-147 + j*(-90) +-254 + j*(-416) +123 + j*(-111) +11 + j*(-310) +-179 + j*(-358) +334 + j*(-325) +-4 + j*(-132) +35 + j*(134) +5 + j*(-226) +243 + j*(-151) +28 + j*(15) +-40 + j*(62) +37 + j*(179) +308 + j*(-266) +-185 + j*(-283) +116 + j*(107) +374 + j*(-155) +270 + j*(137) +-241 + j*(292) +170 + j*(-226) +55 + j*(-2) +40 + j*(-28) +-175 + j*(8) +-221 + j*(-73) +-51 + j*(-106) +-148 + j*(-103) +109 + j*(143) +6 + j*(203) +149 + j*(239) +-368 + j*(-54) +95 + j*(249) +210 + j*(64) +13 + j*(-30) +302 + j*(80) +409 + j*(-78) +76 + j*(-308) +-71 + j*(-169) +-23 + j*(-222) +33 + j*(80) +-338 + j*(-320) +45 + j*(-105) +-66 + j*(-274) +70 + j*(-21) +48 + j*(27) +189 + j*(257) +-64 + j*(7) +-117 + j*(-42) +-28 + j*(-128) +-148 + j*(-406) +-174 + j*(-208) +198 + j*(-69) +147 + j*(-133) +257 + j*(-138) +-231 + j*(17) +127 + j*(-88) +88 + j*(42) +-126 + j*(36) +-63 + j*(-175) +123 + j*(-173) +-252 + j*(-136) +-198 + j*(122) +-290 + j*(237) +22 + j*(-23) +171 + j*(89) +239 + j*(-141) +11 + j*(-109) +301 + j*(-88) +-216 + j*(1) +14 + j*(-177) +47 + j*(6) +-161 + j*(20) +-186 + j*(-78) +173 + j*(-47) +-289 + j*(-68) +-81 + j*(83) +-77 + j*(164) +220 + j*(-20) +-106 + j*(177) +-292 + j*(-216) +74 + j*(-34) +245 + j*(1) +4 + j*(383) +-30 + j*(-119) +221 + j*(180) +139 + j*(-260) +-160 + j*(95) +58 + j*(361) +-223 + j*(57) +-59 + j*(-59) +-82 + j*(-51) +105 + j*(35) +59 + j*(146) +-158 + j*(-41) +-64 + j*(197) +-202 + j*(-83) +191 + j*(-335) +129 + j*(-421) +-30 + j*(-118) +69 + j*(129) +-116 + j*(-67) +-366 + j*(-18) +279 + j*(235) +-279 + j*(1) +45 + j*(-96) +-13 + j*(-238) +382 + j*(-21) +207 + j*(351) +192 + j*(-107) +-103 + j*(-137) +-90 + j*(110) +-262 + j*(-211) +-127 + j*(162) +109 + j*(40) +-238 + j*(127) +81 + j*(5) +-30 + j*(109) +118 + j*(71) +-12 + j*(26) +40 + j*(-161) +23 + j*(124) +-23 + j*(25) +-374 + j*(-62) +154 + j*(448) +-66 + j*(-63) +152 + j*(-354) +409 + j*(-129) +-469 + j*(96) +-4 + j*(-141) +-13 + j*(142) +276 + j*(12) +-135 + j*(-289) +-50 + j*(181) +-205 + j*(-146) +196 + j*(255) +-200 + j*(23) +279 + j*(52) +-76 + j*(196) +40 + j*(98) +-62 + j*(211) +74 + j*(73) +-161 + j*(-179) +-134 + j*(-2) +-18 + j*(-132) +444 + j*(21) +-194 + j*(69) +-92 + j*(25) +-119 + j*(-431) +121 + j*(136) +-100 + j*(63) +14 + j*(-67) +66 + j*(234) +-35 + j*(288) +356 + j*(-111) +-74 + j*(-60) +215 + j*(206) +-46 + j*(8) +-4 + j*(-153) +-135 + j*(-165) +274 + j*(-99) +-218 + j*(-60) +-7 + j*(145) +-282 + j*(-132) +-21 + j*(-270) +35 + j*(-186) +59 + j*(161) +-148 + j*(-212) +-452 + j*(-222) +203 + j*(-168) +16 + j*(142) +177 + j*(448) +56 + j*(-74) +-37 + j*(119) +-47 + j*(48) +192 + j*(30) +-243 + j*(67) +-199 + j*(78) +197 + j*(103) +164 + j*(-210) +-33 + j*(185) +-55 + j*(35) +-388 + j*(21) +-49 + j*(-101) +-27 + j*(-276) +-197 + j*(-151) +-236 + j*(-178) +-32 + j*(-162) +-78 + j*(257) +-75 + j*(85) +157 + j*(-10) +-147 + j*(-3) +21 + j*(-8) +120 + j*(120) +132 + j*(98) +-140 + j*(-98) +194 + j*(-322) +113 + j*(-51) +177 + j*(-63) +41 + j*(204) +146 + j*(45) +-145 + j*(62) +17 + j*(74) +257 + j*(-247) +-16 + j*(-193) +-33 + j*(-364) +-297 + j*(100) +18 + j*(-268) +-79 + j*(-70) +49 + j*(17) +-61 + j*(-52) +296 + j*(-32) +37 + j*(168) +-117 + j*(-164) +-74 + j*(-211) +-87 + j*(66) +-165 + j*(-38) +18 + j*(136) +14 + j*(74) +187 + j*(172) +99 + j*(22) +95 + j*(-151) +88 + j*(-236) +-201 + j*(92) +91 + j*(214) +280 + j*(200) +254 + j*(-28) +82 + j*(199) +-333 + j*(294) +-64 + j*(-255) +228 + j*(375) +-1 + j*(94) +211 + j*(-207) +299 + j*(-447) +-104 + j*(-17) +-30 + j*(-28) +-164 + j*(-211) +-87 + j*(-76) +-124 + j*(264) +176 + j*(-222) +221 + j*(-322) +158 + j*(148) +-307 + j*(-128) +86 + j*(9) +-10 + j*(-23) +131 + j*(25) +-108 + j*(186) +-144 + j*(132) +67 + j*(121) +11 + j*(-222) +1 + j*(93) +182 + j*(93) +-114 + j*(200) +87 + j*(163) +88 + j*(86) +-73 + j*(-90) +123 + j*(-30) +-16 + j*(-27) +214 + j*(-188) +-36 + j*(25) +-286 + j*(310) +-202 + j*(-54) +-223 + j*(238) +-161 + j*(54) +-62 + j*(170) +-214 + j*(-35) +110 + j*(264) +262 + j*(265) +100 + j*(37) +-488 + j*(305) +-148 + j*(254) +-253 + j*(123) +146 + j*(182) +-332 + j*(-199) +55 + j*(-65) +204 + j*(83) +-1 + j*(-51) +32 + j*(-314) +43 + j*(23) +68 + j*(-412) +78 + j*(-180) +-197 + j*(146) +-76 + j*(-66) +136 + j*(-226) +40 + j*(241) +27 + j*(-177) +-144 + j*(66) +112 + j*(-258) +163 + j*(-74) +-1 + j*(-81) +52 + j*(469) +3 + j*(-276) +148 + j*(107) +-93 + j*(-173) +64 + j*(37) +-231 + j*(124) +61 + j*(-131) +-88 + j*(114) +107 + j*(-32) +-170 + j*(240) +226 + j*(-173) +58 + j*(-247) +22 + j*(47) +168 + j*(181) +16 + j*(158) +-120 + j*(-66) +-81 + j*(296) +-209 + j*(-192) +-75 + j*(-115) +95 + j*(86) +32 + j*(125) +57 + j*(64) +6 + j*(-11) +-367 + j*(-47) +180 + j*(-28) +-443 + j*(-35) +-174 + j*(67) +-83 + j*(-21) +64 + j*(-84) +206 + j*(-67) +25 + j*(-205) +-205 + j*(139) +16 + j*(-135) +-233 + j*(-43) +158 + j*(-4) +-18 + j*(-106) +-87 + j*(129) +-112 + j*(-28) +159 + j*(144) +98 + j*(-110) +-11 + j*(28) +-41 + j*(192) +21 + j*(-199) +-26 + j*(233) +6 + j*(-337) +412 + j*(7) +-136 + j*(-25) +83 + j*(103) +-45 + j*(62) +79 + j*(20) +86 + j*(20) +142 + j*(284) +-45 + j*(-91) +100 + j*(67) +-142 + j*(100) +-223 + j*(248) +-3 + j*(120) +311 + j*(-245) +62 + j*(-47) +91 + j*(-78) +-141 + j*(-132) +4 + j*(-133) +81 + j*(-179) +-13 + j*(166) +20 + j*(180) +182 + j*(-139) +230 + j*(83) +387 + j*(67) +-6 + j*(-113) +63 + j*(161) +-198 + j*(104) +-36 + j*(-129) +-30 + j*(-63) +112 + j*(-41) +127 + j*(189) +156 + j*(62) +-110 + j*(-12) +52 + j*(-182) +-110 + j*(-298) +-151 + j*(180) +234 + j*(-178) +14 + j*(69) +75 + j*(-57) +236 + j*(-168) +-54 + j*(-212) +-194 + j*(15) +80 + j*(347) +190 + j*(412) +11 + j*(-153) +59 + j*(28) +-182 + j*(-11) +54 + j*(145) +69 + j*(78) +166 + j*(-189) +204 + j*(-157) +83 + j*(-216) +87 + j*(-35) +-200 + j*(-156) +455 + j*(141) +7 + j*(-114) +91 + j*(305) +-95 + j*(62) +-254 + j*(-61) +-80 + j*(117) +-30 + j*(-195) +-146 + j*(105) +21 + j*(-25) +305 + j*(23) +-81 + j*(-15) +192 + j*(395) +141 + j*(303) +-52 + j*(-129) +54 + j*(-149) +63 + j*(64) +98 + j*(-260) +132 + j*(19) +-59 + j*(-57) +116 + j*(170) +251 + j*(-284) +42 + j*(208) +51 + j*(-195) +-98 + j*(-44) +-57 + j*(55) +106 + j*(-38) +-243 + j*(16) +153 + j*(-65) +7 + j*(-110) +88 + j*(-73) +-279 + j*(77) +-173 + j*(40) +-112 + j*(0) +-154 + j*(-228) +2 + j*(-147) +-166 + j*(126) +119 + j*(148) +-215 + j*(114) +-155 + j*(23) +-41 + j*(-34) +40 + j*(-300) +-328 + j*(202) +-206 + j*(-212) +59 + j*(-325) +25 + j*(-100) +-208 + j*(-235) +-233 + j*(167) +-243 + j*(20) +-203 + j*(0) +-168 + j*(-173) +-310 + j*(-146) +-148 + j*(398) +-72 + j*(-93) +62 + j*(-152) +28 + j*(128) +-217 + j*(-27) +-222 + j*(-188) +168 + j*(16) +-100 + j*(140) +99 + j*(8) +76 + j*(-57) +139 + j*(-150) +-192 + j*(-49) +-18 + j*(-206) +-16 + j*(-327) +78 + j*(35) +11 + j*(42) +-107 + j*(-82) +-274 + j*(235) +81 + j*(-11) +281 + j*(-61) +-148 + j*(78) +-279 + j*(-51) +-252 + j*(186) +31 + j*(-99) +292 + j*(-155) +-188 + j*(192) +258 + j*(-96) +21 + j*(-92) +-28 + j*(165) +146 + j*(59) +0 + j*(-21) +30 + j*(-192) +82 + j*(14) +-294 + j*(-13) +-150 + j*(137) +-71 + j*(68) +-233 + j*(45) +12 + j*(-62) +-177 + j*(44) +-175 + j*(337) +-41 + j*(1) +363 + j*(-244) +231 + j*(181) +191 + j*(-130) +287 + j*(115) +-69 + j*(221) +-236 + j*(-50) +-393 + j*(-47) +71 + j*(13) +447 + j*(-110) +-76 + j*(316) +42 + j*(71) +-20 + j*(-75) +-17 + j*(82) +-231 + j*(-258) +156 + j*(-174) +-85 + j*(-142) +-165 + j*(-173) +-185 + j*(-25) +173 + j*(137) +303 + j*(-119) +-86 + j*(-105) +-253 + j*(-318) +-68 + j*(142) +-213 + j*(259) +179 + j*(-58) +-93 + j*(122) +135 + j*(-185) +-1 + j*(-180) +261 + j*(-385) +-207 + j*(-315) +6 + j*(-70) +216 + j*(339) +-137 + j*(-129) +35 + j*(15) +16 + j*(127) +71 + j*(-29) +-254 + j*(-211) +-325 + j*(103) +-222 + j*(6) +159 + j*(91) +25 + j*(106) +-139 + j*(101) +-133 + j*(-289) +-124 + j*(-40) +-238 + j*(-183) +-144 + j*(-1) +111 + j*(-64) +63 + j*(-308) +-78 + j*(-153) +324 + j*(-243) +209 + j*(11) +64 + j*(232) +71 + j*(62) +203 + j*(-52) +-161 + j*(129) +-339 + j*(144) +78 + j*(86) +66 + j*(-263) +-78 + j*(-190) +247 + j*(293) +-25 + j*(19) +-267 + j*(-15) +89 + j*(-206) +-64 + j*(120) +83 + j*(165) +-195 + j*(249) +-55 + j*(-379) +-194 + j*(19) +-139 + j*(49) +316 + j*(-139) +-190 + j*(170) +-33 + j*(34) +14 + j*(-44) +-363 + j*(50) +39 + j*(77) +296 + j*(-133) +-183 + j*(289) +-96 + j*(-81) +-74 + j*(-333) +92 + j*(-183) +-99 + j*(167) +-63 + j*(21) +339 + j*(-39) +-175 + j*(-257) +72 + j*(117) +-192 + j*(105) +17 + j*(-17) +-84 + j*(166) +49 + j*(188) +-156 + j*(153) +74 + j*(-169) +-35 + j*(280) +-81 + j*(101) +9 + j*(112) +214 + j*(-38) +254 + j*(-35) +78 + j*(263) +125 + j*(-71) +100 + j*(68) +339 + j*(111) +-10 + j*(134) +-4 + j*(-69) +-98 + j*(74) +-41 + j*(106) +-28 + j*(330) +325 + j*(88) +-59 + j*(41) +-110 + j*(-247) +154 + j*(16) +463 + j*(363) +-112 + j*(-29) +133 + j*(-1) +315 + j*(208) +-102 + j*(-248) +135 + j*(23) +328 + j*(11) +201 + j*(46) +163 + j*(134) +224 + j*(-62) +178 + j*(-89) +136 + j*(107) +69 + j*(-224) +140 + j*(-87) +-112 + j*(254) +-65 + j*(120) +-239 + j*(-35) +80 + j*(30) +-331 + j*(-125) +-71 + j*(45) +31 + j*(417) +-17 + j*(-139) +-54 + j*(49) +246 + j*(-253) +-6 + j*(101) +110 + j*(-138) +-88 + j*(56) +66 + j*(264) +-255 + j*(-18) +-155 + j*(95) +-332 + j*(88) +-103 + j*(25) +-618 + j*(214) +213 + j*(-211) +260 + j*(-49) +-94 + j*(-75) +-9 + j*(12) +97 + j*(171) +74 + j*(219) +-18 + j*(-54) +101 + j*(-135) +-159 + j*(82) +-48 + j*(-196) +408 + j*(275) +-194 + j*(-74) +111 + j*(337) +-13 + j*(409) +-106 + j*(-51) +-178 + j*(-203) +-228 + j*(-69) +-243 + j*(-10) +1 + j*(-8) +177 + j*(-189) +85 + j*(16) +131 + j*(270) +-96 + j*(226) +-4 + j*(336) +-217 + j*(42) +-99 + j*(-82) +-206 + j*(-93) +18 + j*(295) +99 + j*(-189) +-350 + j*(129) +-8 + j*(91) +59 + j*(-274) +-83 + j*(173) +48 + j*(29) +207 + j*(-75) +49 + j*(78) +-65 + j*(-382) +193 + j*(100) +-70 + j*(42) +33 + j*(-206) +228 + j*(49) +53 + j*(208) +-76 + j*(-93) +102 + j*(-103) +-256 + j*(-43) +86 + j*(-13) +-111 + j*(40) +186 + j*(-48) +-2 + j*(498) +-182 + j*(52) +-127 + j*(81) +74 + j*(-54) +38 + j*(-88) +35 + j*(-194) +-173 + j*(112) +-129 + j*(224) +-54 + j*(-2) +191 + j*(113) +-88 + j*(72) +-69 + j*(-259) +84 + j*(240) +-187 + j*(70) +-79 + j*(-11) +259 + j*(206) +123 + j*(365) +92 + j*(103) +-187 + j*(76) +54 + j*(232) +40 + j*(-158) +-212 + j*(-424) +-91 + j*(215) +-112 + j*(138) +-110 + j*(243) +-110 + j*(145) +72 + j*(80) +30 + j*(-110) +180 + j*(26) +63 + j*(5) +232 + j*(238) +199 + j*(-119) +438 + j*(64) +-40 + j*(-139) +-146 + j*(-31) +85 + j*(167) +139 + j*(-206) +45 + j*(66) +98 + j*(-75) +23 + j*(131) +131 + j*(15) +-84 + j*(126) +-64 + j*(-182) +28 + j*(141) +17 + j*(37) +194 + j*(6) +-4 + j*(336) +160 + j*(205) +-259 + j*(113) +-52 + j*(4) +-104 + j*(-249) +-11 + j*(-245) +-66 + j*(86) +30 + j*(-138) +90 + j*(-182) +47 + j*(122) +281 + j*(166) +-230 + j*(13) +-165 + j*(380) +222 + j*(-15) +-247 + j*(113) +-91 + j*(-12) +-88 + j*(200) +-69 + j*(240) +-165 + j*(-6) +-124 + j*(-184) +-327 + j*(296) +-209 + j*(37) +-114 + j*(-329) +238 + j*(-267) +-122 + j*(-149) +-104 + j*(-238) +339 + j*(264) +347 + j*(76) +184 + j*(-87) +272 + j*(-118) +10 + j*(169) +23 + j*(74) +-53 + j*(377) +-180 + j*(-162) +-35 + j*(-269) +73 + j*(280) +-176 + j*(-9) +69 + j*(172) +-14 + j*(101) +-124 + j*(-119) +-54 + j*(-187) +-47 + j*(158) +352 + j*(147) +167 + j*(312) +-187 + j*(-197) +101 + j*(202) +-170 + j*(-168) +140 + j*(39) +132 + j*(40) +29 + j*(-33) +-226 + j*(204) +-341 + j*(-25) +-21 + j*(235) +110 + j*(25) +-176 + j*(40) +-35 + j*(105) +-175 + j*(13) +-85 + j*(-78) +-216 + j*(-102) +147 + j*(43) +370 + j*(-45) +-330 + j*(-246) +-337 + j*(179) +-133 + j*(67) +110 + j*(-80) +92 + j*(-27) +199 + j*(-197) +150 + j*(98) +-129 + j*(79) +-209 + j*(-61) +-128 + j*(406) +472 + j*(301) +-19 + j*(146) +-18 + j*(-83) +-54 + j*(-16) +121 + j*(76) +-417 + j*(77) +-192 + j*(-91) +35 + j*(232) +240 + j*(161) +-132 + j*(-16) +-149 + j*(72) +-26 + j*(-36) +-112 + j*(-83) +-86 + j*(-100) +83 + j*(-132) +-123 + j*(53) +-269 + j*(-47) +-93 + j*(180) +129 + j*(200) +-218 + j*(105) +116 + j*(98) +-157 + j*(-165) +-252 + j*(-54) +87 + j*(91) +309 + j*(-156) +72 + j*(-159) +-16 + j*(-136) +-54 + j*(16) +-103 + j*(170) +76 + j*(182) +-231 + j*(-148) +47 + j*(169) +21 + j*(163) +84 + j*(261) +198 + j*(223) +-277 + j*(100) +-166 + j*(-125) +125 + j*(-30) +-276 + j*(266) +159 + j*(26) +311 + j*(171) +-404 + j*(289) +-104 + j*(-370) +172 + j*(-347) +59 + j*(-465) +-428 + j*(43) +26 + j*(-619) +-139 + j*(192) +213 + j*(469) +395 + j*(104) +146 + j*(-270) +77 + j*(257) +-204 + j*(245) +61 + j*(264) +317 + j*(351) +395 + j*(379) +-250 + j*(-278) +547 + j*(-360) +-296 + j*(-69) +71 + j*(260) +456 + j*(-113) +316 + j*(214) +107 + j*(-390) +313 + j*(228) +-105 + j*(486) +120 + j*(275) +541 + j*(-306) +-351 + j*(-19) +-144 + j*(-456) +103 + j*(-197) +-262 + j*(-299) +305 + j*(62) +-245 + j*(-17) +-219 + j*(472) +200 + j*(-195) +-155 + j*(-257) +-211 + j*(341) +146 + j*(262) +-86 + j*(229) +-245 + j*(-318) +368 + j*(-296) +-375 + j*(305) +-582 + j*(149) +412 + j*(-397) +421 + j*(-441) +434 + j*(-191) +141 + j*(325) +-331 + j*(88) +610 + j*(43) +-328 + j*(305) +351 + j*(-415) +161 + j*(428) +530 + j*(142) +-705 + j*(-324) +-76 + j*(132) +-316 + j*(-183) +-307 + j*(187) +148 + j*(361) +183 + j*(94) +-168 + j*(360) +-266 + j*(129) +-301 + j*(-244) +-252 + j*(232) +-546 + j*(216) +-227 + j*(121) +-35 + j*(-342) +-190 + j*(-325) +-59 + j*(523) +-171 + j*(-315) +297 + j*(183) +194 + j*(148) +-443 + j*(281) +-512 + j*(-66) +532 + j*(250) +-276 + j*(306) +-358 + j*(187) +-477 + j*(518) +-310 + j*(-158) +167 + j*(-405) +66 + j*(-134) +96 + j*(379) +-23 + j*(-460) +-404 + j*(-227) +-14 + j*(-501) +-691 + j*(-200) +-339 + j*(30) +648 + j*(317) +347 + j*(-322) +-260 + j*(597) +-610 + j*(216) +443 + j*(205) +249 + j*(-314) +486 + j*(-170) +-298 + j*(87) +141 + j*(238) +-60 + j*(-71) +67 + j*(-124) +-291 + j*(-540) +174 + j*(-324) +-161 + j*(-228) +193 + j*(-37) +-153 + j*(-331) +235 + j*(293) +-141 + j*(-504) +339 + j*(49) +373 + j*(21) +473 + j*(355) +-270 + j*(268) +-26 + j*(-260) +379 + j*(-419) +178 + j*(-35) +307 + j*(680) +564 + j*(-397) +-474 + j*(-527) +482 + j*(207) +374 + j*(51) +3 + j*(123) +5 + j*(586) +267 + j*(491) +185 + j*(225) +312 + j*(556) +4 + j*(-366) +166 + j*(405) +-346 + j*(422) +-438 + j*(-416) +390 + j*(-59) +30 + j*(-288) +274 + j*(-242) +-114 + j*(-100) +-177 + j*(-375) +-455 + j*(-292) +-272 + j*(301) +-218 + j*(-479) +447 + j*(-296) +-335 + j*(-378) +-427 + j*(-16) +308 + j*(-300) +479 + j*(322) +-170 + j*(82) +-366 + j*(-153) +-701 + j*(-477) +-350 + j*(282) +-327 + j*(344) +-389 + j*(-333) +-450 + j*(-218) +-3 + j*(682) +260 + j*(-402) +70 + j*(305) +588 + j*(520) +-1 + j*(-161) +-292 + j*(-104) +-267 + j*(434) +-195 + j*(404) +-435 + j*(542) +-376 + j*(-235) +-187 + j*(42) +61 + j*(550) +-125 + j*(93) +-262 + j*(217) +512 + j*(234) +405 + j*(358) +52 + j*(-291) +1 + j*(395) +450 + j*(-216) +-172 + j*(432) +-180 + j*(-247) +15 + j*(-400) +-78 + j*(363) +227 + j*(123) +403 + j*(-133) +-124 + j*(258) +-400 + j*(-366) +72 + j*(-175) +-140 + j*(-51) +90 + j*(-166) +-484 + j*(148) +-404 + j*(-392) +-197 + j*(133) +241 + j*(-45) +122 + j*(-306) +-136 + j*(296) +-194 + j*(264) +516 + j*(-226) +-168 + j*(-320) +-14 + j*(-386) +231 + j*(440) +146 + j*(346) +268 + j*(451) +184 + j*(-27) +310 + j*(214) +409 + j*(-258) +-361 + j*(-303) +153 + j*(-127) +-217 + j*(-438) +107 + j*(476) +-204 + j*(403) +-313 + j*(315) +-328 + j*(-307) +-351 + j*(97) +185 + j*(-211) +122 + j*(233) +-445 + j*(-503) +-212 + j*(-397) +-420 + j*(196) +64 + j*(-252) +407 + j*(-336) +-265 + j*(280) +281 + j*(-268) +218 + j*(-292) +-138 + j*(484) +-16 + j*(192) +474 + j*(362) +-399 + j*(-2) +73 + j*(-350) +264 + j*(158) +365 + j*(-137) +71 + j*(-62) +-389 + j*(-485) +-74 + j*(-57) +-281 + j*(252) +299 + j*(258) +1 + j*(200) +252 + j*(44) +95 + j*(-210) +180 + j*(-445) +-356 + j*(228) +90 + j*(-321) +-198 + j*(-281) +441 + j*(-279) +-417 + j*(428) +-317 + j*(-210) +156 + j*(-520) +-59 + j*(-228) +238 + j*(-274) +-299 + j*(-308) +-270 + j*(-294) +-181 + j*(-165) +180 + j*(-48) +-172 + j*(-289) +395 + j*(77) +212 + j*(-88) +361 + j*(378) +-260 + j*(-753) +205 + j*(-86) +-151 + j*(127) +416 + j*(-146) +121 + j*(-566) +65 + j*(-477) +119 + j*(281) +43 + j*(-42) +-172 + j*(182) +-340 + j*(396) +51 + j*(286) +235 + j*(-410) +296 + j*(-146) +-86 + j*(-184) +-59 + j*(-322) +-381 + j*(236) +98 + j*(-173) +-176 + j*(218) +-682 + j*(-62) +-41 + j*(-211) +-525 + j*(-330) +36 + j*(-36) +-578 + j*(-367) +-245 + j*(380) +-305 + j*(301) +333 + j*(-141) +-127 + j*(-254) +308 + j*(-378) +-358 + j*(177) +231 + j*(216) +-112 + j*(459) +-436 + j*(-497) +296 + j*(231) +-276 + j*(-409) +299 + j*(144) +310 + j*(-267) +-309 + j*(-237) +-204 + j*(104) +158 + j*(194) +325 + j*(-127) +140 + j*(260) +52 + j*(131) +29 + j*(-135) +-162 + j*(345) +-5 + j*(132) +69 + j*(-456) +302 + j*(149) +211 + j*(-262) +-506 + j*(-175) +292 + j*(182) +52 + j*(-322) +365 + j*(-232) +312 + j*(-269) +-319 + j*(21) +-315 + j*(-581) +-138 + j*(167) +-43 + j*(197) +-42 + j*(450) +-296 + j*(155) +-540 + j*(358) +-307 + j*(87) +-446 + j*(-250) +97 + j*(116) +140 + j*(-486) +300 + j*(-278) +-419 + j*(163) +-211 + j*(-185) +-194 + j*(367) +291 + j*(250) +312 + j*(-236) +195 + j*(81) +-465 + j*(-375) +482 + j*(115) +116 + j*(120) +122 + j*(320) +-55 + j*(-224) +-280 + j*(177) +542 + j*(-264) +416 + j*(103) +-152 + j*(-113) +-116 + j*(-58) +-139 + j*(-262) +-165 + j*(-510) +-57 + j*(-504) +168 + j*(-228) +474 + j*(-120) +-119 + j*(10) +313 + j*(-328) +-291 + j*(209) +271 + j*(-57) +358 + j*(-245) +419 + j*(-226) +-45 + j*(-529) +344 + j*(-443) +147 + j*(-416) +-105 + j*(-279) +40 + j*(4) +-409 + j*(212) +-322 + j*(-257) +-169 + j*(-639) +-194 + j*(-323) +311 + j*(-214) +-356 + j*(559) +318 + j*(-374) +157 + j*(112) +-339 + j*(76) +-456 + j*(153) +-328 + j*(-325) +504 + j*(113) +-447 + j*(219) +173 + j*(284) +194 + j*(-21) +-136 + j*(-310) +-91 + j*(351) +-112 + j*(-317) +474 + j*(227) +-348 + j*(124) +368 + j*(-102) +395 + j*(-190) +-172 + j*(202) +-148 + j*(-287) +393 + j*(-330) +144 + j*(411) +-259 + j*(238) +371 + j*(-130) +40 + j*(-457) +129 + j*(-453) +-451 + j*(-215) +-333 + j*(242) +353 + j*(334) +-604 + j*(356) +209 + j*(-318) +-358 + j*(-76) +-118 + j*(-313) +439 + j*(-315) +60 + j*(-572) +-457 + j*(282) +-834 + j*(-7) +428 + j*(-140) +325 + j*(215) +42 + j*(263) +301 + j*(151) +140 + j*(-72) +489 + j*(-438) +323 + j*(-402) +194 + j*(-13) +257 + j*(-322) +-334 + j*(267) +231 + j*(409) +-231 + j*(-271) +-265 + j*(394) +-324 + j*(-305) +-588 + j*(-325) +84 + j*(-489) +366 + j*(43) +-291 + j*(108) +533 + j*(-455) +-100 + j*(352) +181 + j*(-187) +287 + j*(-428) +-322 + j*(17) +90 + j*(-332) +413 + j*(-171) +-474 + j*(-153) +-167 + j*(-209) +76 + j*(-141) +395 + j*(201) +-330 + j*(212) +127 + j*(-255) +120 + j*(-15) +-132 + j*(190) +-436 + j*(-209) +-281 + j*(425) +300 + j*(-408) +-162 + j*(-301) +-316 + j*(-458) +166 + j*(-491) +-384 + j*(-423) +568 + j*(-527) +-212 + j*(296) +-204 + j*(-298) +-229 + j*(117) +-159 + j*(-412) +365 + j*(358) +260 + j*(-245) +247 + j*(33) +162 + j*(139) +-332 + j*(284) +-489 + j*(-540) +-221 + j*(-39) +-55 + j*(-142) +-129 + j*(360) +235 + j*(-252) +513 + j*(104) +-58 + j*(-313) +419 + j*(284) +-267 + j*(316) +588 + j*(-197) +-193 + j*(-361) +370 + j*(556) +-269 + j*(106) +153 + j*(-44) +-167 + j*(-265) +-21 + j*(240) +324 + j*(-368) +-233 + j*(-361) +-260 + j*(-260) +-504 + j*(245) +-684 + j*(316) +-13 + j*(-153) +89 + j*(-546) +268 + j*(-261) +392 + j*(448) +359 + j*(397) +448 + j*(-398) +-400 + j*(-225) +-547 + j*(-383) +399 + j*(429) +-360 + j*(-187) +36 + j*(-126) +-384 + j*(291) +158 + j*(-358) +337 + j*(569) +431 + j*(-49) +581 + j*(30) +158 + j*(-206) +361 + j*(-217) +-216 + j*(-233) +309 + j*(-486) +258 + j*(-265) +363 + j*(199) +-440 + j*(309) +-134 + j*(-397) +441 + j*(298) +356 + j*(285) +148 + j*(-550) +207 + j*(86) +537 + j*(395) +-137 + j*(297) +-80 + j*(409) +696 + j*(23) +25 + j*(-275) +402 + j*(129) +334 + j*(219) +79 + j*(271) +-461 + j*(-98) +21 + j*(-23) +-138 + j*(354) +487 + j*(-36) +373 + j*(-1) +-540 + j*(-255) +108 + j*(-153) +232 + j*(249) +262 + j*(136) +-284 + j*(-388) +254 + j*(-303) +4 + j*(-573) +-71 + j*(327) +-25 + j*(-76) +-33 + j*(-450) +248 + j*(362) +61 + j*(-260) +288 + j*(272) +245 + j*(-42) +-204 + j*(277) +-479 + j*(-407) +-165 + j*(451) +409 + j*(445) +-143 + j*(566) +-254 + j*(-428) +-61 + j*(408) +-203 + j*(-141) +-38 + j*(893) +-53 + j*(235) +170 + j*(-614) +217 + j*(180) +499 + j*(-375) +-339 + j*(232) +-112 + j*(-235) +290 + j*(233) +-400 + j*(214) +470 + j*(363) +-634 + j*(-109) +-344 + j*(45) +308 + j*(-479) +-330 + j*(-6) +-141 + j*(-100) +-275 + j*(195) +474 + j*(139) +23 + j*(482) +-501 + j*(-599) +-23 + j*(105) +204 + j*(-323) +220 + j*(119) +471 + j*(-33) +-176 + j*(-472) +-64 + j*(-11) +-98 + j*(158) +94 + j*(-177) +-395 + j*(-368) +106 + j*(106) +-556 + j*(-269) +404 + j*(389) +-13 + j*(-54) +-25 + j*(455) +2 + j*(366) +418 + j*(-81) +390 + j*(-341) +-173 + j*(-397) +364 + j*(-233) +17 + j*(-495) +-489 + j*(86) +-287 + j*(419) +93 + j*(431) +-31 + j*(212) +-218 + j*(-117) +-233 + j*(244) +1 + j*(130) +-180 + j*(-312) +-434 + j*(57) +501 + j*(22) +324 + j*(-359) +-497 + j*(-63) +453 + j*(-11) +225 + j*(-460) +-413 + j*(-100) +-16 + j*(440) +500 + j*(130) +-414 + j*(161) +469 + j*(326) +211 + j*(175) +332 + j*(-65) +407 + j*(13) +207 + j*(467) +-366 + j*(372) +200 + j*(-223) +-301 + j*(-318) +-198 + j*(-273) +-209 + j*(221) +-148 + j*(5) +102 + j*(433) +-107 + j*(-116) +303 + j*(337) +356 + j*(98) +-203 + j*(369) +452 + j*(281) +-542 + j*(421) +54 + j*(371) +222 + j*(-46) +559 + j*(544) +100 + j*(-298) +68 + j*(204) +-264 + j*(-267) +-97 + j*(-311) +-738 + j*(203) +282 + j*(342) +-310 + j*(778) +-209 + j*(102) +154 + j*(-2) +11 + j*(-8) +153 + j*(222) +4 + j*(-33) +309 + j*(283) +-8 + j*(117) +-136 + j*(-322) +35 + j*(33) +-11 + j*(176) +119 + j*(237) +186 + j*(45) +77 + j*(124) +288 + j*(35) +-57 + j*(216) +101 + j*(-8) +119 + j*(-40) +102 + j*(-182) +15 + j*(83) +-88 + j*(74) +187 + j*(388) +-7 + j*(-26) +284 + j*(-194) +235 + j*(-341) +-86 + j*(-122) +-98 + j*(-227) +-177 + j*(-59) +-202 + j*(-35) +-58 + j*(-23) +-12 + j*(-45) +83 + j*(33) +-135 + j*(-110) +-112 + j*(-204) +-404 + j*(-49) +-187 + j*(-67) +-158 + j*(168) +-105 + j*(-175) +13 + j*(-358) +4 + j*(-224) +35 + j*(-62) +120 + j*(-361) +-274 + j*(-179) +-63 + j*(23) +-110 + j*(-18) +-194 + j*(-4) +-61 + j*(-28) +138 + j*(-290) +100 + j*(-38) +-128 + j*(-204) +-246 + j*(-176) +397 + j*(33) +180 + j*(80) +-214 + j*(-113) +-52 + j*(244) +-95 + j*(-3) +-87 + j*(-13) +15 + j*(73) +71 + j*(-78) +110 + j*(-1) +4 + j*(-154) +65 + j*(-86) +-14 + j*(100) +-88 + j*(21) +-117 + j*(120) +-478 + j*(-64) +-50 + j*(-23) +217 + j*(10) +-46 + j*(-238) +60 + j*(-23) +235 + j*(-35) +-79 + j*(339) +-192 + j*(-21) +-89 + j*(135) +-107 + j*(126) +-221 + j*(42) +211 + j*(184) +66 + j*(-160) +-168 + j*(-4) +-105 + j*(85) +132 + j*(-27) +124 + j*(-130) +174 + j*(-112) +151 + j*(76) +249 + j*(-163) +72 + j*(233) +-243 + j*(-77) +-294 + j*(-25) +-281 + j*(61) +112 + j*(67) +-37 + j*(13) +74 + j*(-144) +-168 + j*(-35) +-13 + j*(-313) +-386 + j*(10) +-311 + j*(-79) +-11 + j*(90) +185 + j*(405) +186 + j*(-17) +-127 + j*(-137) +10 + j*(136) +-59 + j*(110) +1 + j*(-83) +-20 + j*(-180) +214 + j*(361) +231 + j*(62) +-104 + j*(-86) +-192 + j*(185) +-108 + j*(170) +-169 + j*(-192) +-104 + j*(-171) +-28 + j*(-57) +-208 + j*(126) +185 + j*(-78) +105 + j*(159) +-228 + j*(-110) +340 + j*(82) +235 + j*(214) +-80 + j*(-14) +234 + j*(-162) +-131 + j*(63) +-43 + j*(60) +-157 + j*(68) +-207 + j*(144) +-77 + j*(53) +214 + j*(147) +-150 + j*(-83) +-100 + j*(90) +-43 + j*(90) +97 + j*(129) +-34 + j*(-44) +14 + j*(86) +-258 + j*(47) +161 + j*(38) +286 + j*(-1) +113 + j*(178) +-124 + j*(-255) +-3 + j*(347) +136 + j*(-137) +62 + j*(-89) +36 + j*(267) +-74 + j*(-311) +-1 + j*(109) +96 + j*(-269) +223 + j*(-111) +298 + j*(-105) +-149 + j*(9) +-303 + j*(36) +-265 + j*(276) +-324 + j*(-81) +-176 + j*(-8) +243 + j*(311) +-18 + j*(-35) +-212 + j*(177) +-35 + j*(158) +20 + j*(121) +70 + j*(64) +-201 + j*(-1) +-76 + j*(258) +-252 + j*(101) +2 + j*(225) +92 + j*(-81) +123 + j*(-123) +-125 + j*(78) +146 + j*(-37) +184 + j*(375) +62 + j*(102) +-294 + j*(196) +-3 + j*(217) +-214 + j*(322) +559 + j*(98) +-136 + j*(173) +47 + j*(-37) +98 + j*(-22) +234 + j*(-21) +36 + j*(-142) +239 + j*(-272) +-58 + j*(198) +390 + j*(37) +-132 + j*(-216) +-95 + j*(-52) +27 + j*(-119) +-8 + j*(143) +122 + j*(110) +145 + j*(-146) +210 + j*(-166) +-73 + j*(-25) +136 + j*(45) +150 + j*(-169) +45 + j*(-17) +122 + j*(-30) +110 + j*(-110) +63 + j*(-232) +330 + j*(312) +-204 + j*(-26) +204 + j*(129) +-87 + j*(88) +240 + j*(73) +129 + j*(-101) +-68 + j*(92) +115 + j*(122) +273 + j*(103) +-320 + j*(-144) +79 + j*(93) +-335 + j*(242) +308 + j*(1) +52 + j*(119) +206 + j*(-37) +106 + j*(-74) +-288 + j*(-274) +-131 + j*(194) +-107 + j*(-123) +-418 + j*(120) +165 + j*(74) +209 + j*(27) +143 + j*(-276) +12 + j*(-70) +33 + j*(-74) +-44 + j*(-145) +1 + j*(-385) +7 + j*(45) +460 + j*(-204) +53 + j*(266) +-216 + j*(-86) +28 + j*(92) +118 + j*(61) +168 + j*(-52) +110 + j*(198) +121 + j*(-107) +98 + j*(75) +-211 + j*(338) +16 + j*(-6) +-261 + j*(346) +101 + j*(-113) +-151 + j*(104) +-111 + j*(-175) +38 + j*(172) +83 + j*(-206) +173 + j*(199) +-34 + j*(66) +-12 + j*(-31) +40 + j*(47) +30 + j*(336) +276 + j*(16) +238 + j*(76) +439 + j*(259) +120 + j*(-16) +125 + j*(37) +139 + j*(104) +-79 + j*(-187) +-431 + j*(219) +-304 + j*(-148) +-4 + j*(-105) +-141 + j*(-92) +194 + j*(-172) +-30 + j*(-248) +-45 + j*(157) +-4 + j*(109) +170 + j*(193) +153 + j*(-243) +-304 + j*(-82) +92 + j*(64) +76 + j*(16) +68 + j*(46) +-146 + j*(144) +219 + j*(222) +-216 + j*(68) +-88 + j*(-248) +-170 + j*(42) +79 + j*(-355) +43 + j*(67) +69 + j*(33) +-137 + j*(-228) +72 + j*(132) +-40 + j*(-29) +-1 + j*(107) +-73 + j*(333) +285 + j*(-302) +252 + j*(-49) +74 + j*(-91) +-83 + j*(156) +-304 + j*(321) +100 + j*(-276) +-182 + j*(-174) +-49 + j*(-325) +78 + j*(-262) +-262 + j*(-26) +134 + j*(83) +-112 + j*(83) +7 + j*(65) +-11 + j*(110) +115 + j*(47) +-45 + j*(-115) +1 + j*(-168) +-112 + j*(-49) +-293 + j*(28) +-351 + j*(-62) +-10 + j*(27) +226 + j*(-30) +-57 + j*(176) +37 + j*(-181) +172 + j*(143) +187 + j*(248) +-205 + j*(1) +187 + j*(-23) +-280 + j*(-25) +200 + j*(-519) +-30 + j*(218) +-90 + j*(220) +-58 + j*(22) +110 + j*(-327) +-165 + j*(30) +-2 + j*(-261) +222 + j*(-47) +-115 + j*(-274) +284 + j*(65) +166 + j*(339) +-2 + j*(192) +-54 + j*(-168) +139 + j*(-147) +202 + j*(-148) +-88 + j*(-42) +-88 + j*(87) +-16 + j*(-157) +-116 + j*(-215) +254 + j*(57) +-135 + j*(-27) +82 + j*(223) +-165 + j*(206) +29 + j*(-119) +-112 + j*(-28) +241 + j*(330) +-164 + j*(-91) +-162 + j*(-92) +39 + j*(57) +-105 + j*(240) +-96 + j*(-112) +266 + j*(274) +272 + j*(-71) +-81 + j*(79) +100 + j*(-11) +-52 + j*(-24) +325 + j*(-252) +-24 + j*(363) +170 + j*(-103) +-224 + j*(263) +229 + j*(123) +62 + j*(-281) +-139 + j*(-92) +-103 + j*(124) +387 + j*(-151) +103 + j*(252) +-52 + j*(-88) +150 + j*(-183) +-508 + j*(47) +16 + j*(-13) +40 + j*(104) +-18 + j*(-61) +436 + j*(25) +-60 + j*(-131) +165 + j*(101) +220 + j*(191) +-254 + j*(-140) +21 + j*(-212) +-81 + j*(-122) +-252 + j*(-175) +11 + j*(124) +-47 + j*(38) +163 + j*(227) +-525 + j*(30) +117 + j*(453) +-137 + j*(-71) +136 + j*(34) +127 + j*(26) +-360 + j*(-185) +247 + j*(-28) +-350 + j*(317) +-262 + j*(151) +58 + j*(-221) +-10 + j*(156) +-387 + j*(64) +-25 + j*(223) +-42 + j*(110) +33 + j*(378) +35 + j*(90) +-264 + j*(78) +-112 + j*(109) +123 + j*(68) +276 + j*(-239) +-11 + j*(-231) +416 + j*(23) +276 + j*(196) +-52 + j*(-30) +-125 + j*(6) +297 + j*(47) +186 + j*(-114) +75 + j*(-99) +379 + j*(1) +-25 + j*(330) +-81 + j*(-228) +-118 + j*(-213) +-45 + j*(-100) +-372 + j*(84) +-93 + j*(-155) +-169 + j*(-9) +245 + j*(-222) +-134 + j*(-5) +-188 + j*(303) +-162 + j*(-185) +132 + j*(-141) +-325 + j*(301) +-42 + j*(-164) +256 + j*(151) +52 + j*(69) +-128 + j*(325) +-165 + j*(134) +-162 + j*(-32) +-117 + j*(-190) +17 + j*(-82) +173 + j*(-173) +298 + j*(-11) +-151 + j*(141) +-327 + j*(147) +-62 + j*(72) +-21 + j*(-19) +-10 + j*(-189) +-36 + j*(50) +95 + j*(-60) +122 + j*(141) +125 + j*(23) +18 + j*(218) +-36 + j*(288) +-127 + j*(81) +21 + j*(-100) +-216 + j*(-237) +85 + j*(-117) +4 + j*(-219) +260 + j*(-119) +154 + j*(132) +-110 + j*(312) +-231 + j*(91) +269 + j*(65) +-62 + j*(-256) +-133 + j*(-183) +84 + j*(-89) +143 + j*(-9) +-245 + j*(11) +-196 + j*(-218) +85 + j*(-211) +-146 + j*(91) +-179 + j*(-57) +-122 + j*(-66) +-112 + j*(45) +-354 + j*(-65) +101 + j*(-99) +362 + j*(243) +-141 + j*(-321) +210 + j*(114) +127 + j*(223) +257 + j*(-35) +-298 + j*(63) +-88 + j*(397) +-272 + j*(72) +44 + j*(387) +-170 + j*(-21) +60 + j*(104) +-310 + j*(-85) +-327 + j*(213) +326 + j*(-179) +-96 + j*(-5) +15 + j*(-286) +-76 + j*(27) +103 + j*(124) +5 + j*(-456) +-133 + j*(-173) +-7 + j*(-293) +-62 + j*(-57) +93 + j*(-42) +282 + j*(-146) +133 + j*(252) +-98 + j*(63) +14 + j*(138) +-192 + j*(108) +100 + j*(216) +-214 + j*(-267) +287 + j*(-177) +138 + j*(-223) +-74 + j*(92) +210 + j*(134) +-143 + j*(40) +119 + j*(-45) +115 + j*(30) +344 + j*(-255) +175 + j*(116) +-238 + j*(98) +-122 + j*(-103) +-223 + j*(378) +213 + j*(103) +23 + j*(163) +-150 + j*(130) +116 + j*(257) +-257 + j*(-51) +-151 + j*(-144) +98 + j*(-243) +-285 + j*(-140) +171 + j*(347) +66 + j*(-49) +294 + j*(-273) +-100 + j*(-174) +-237 + j*(-134) +-459 + j*(320) +-73 + j*(2) +162 + j*(180) +64 + j*(-307) +263 + j*(-46) +-95 + j*(-274) +-50 + j*(103) +191 + j*(170) +-107 + j*(60) +42 + j*(-159) +-35 + j*(-46) +-72 + j*(91) +341 + j*(-216) +112 + j*(249) +-114 + j*(-213) +11 + j*(71) +-42 + j*(-106) +-70 + j*(-117) +-204 + j*(-8) +-30 + j*(59) +-257 + j*(263) +190 + j*(-417) +-6 + j*(152) +-127 + j*(97) +-64 + j*(99) +-428 + j*(144) +-178 + j*(-112) +539 + j*(-2) +338 + j*(-120) +108 + j*(-235) +-324 + j*(-28) +16 + j*(160) +70 + j*(188) +11 + j*(73) +-49 + j*(-291) +206 + j*(197) +237 + j*(136) +83 + j*(216) +54 + j*(-149) +-28 + j*(-105) +-37 + j*(-55) +132 + j*(-138) +138 + j*(-161) +55 + j*(-45) +-99 + j*(168) +173 + j*(175) +7 + j*(49) +-8 + j*(55) +93 + j*(248) +16 + j*(-199) +-104 + j*(324) +-163 + j*(122) +66 + j*(112) +134 + j*(-49) +25 + j*(-253) +-76 + j*(-95) +42 + j*(245) +151 + j*(-187) +-153 + j*(-282) +39 + j*(-135) +4 + j*(-163) +75 + j*(190) +-126 + j*(-10) +171 + j*(55) +-3 + j*(-19) +-59 + j*(76) +-189 + j*(-52) +125 + j*(-81) +254 + j*(-258) +25 + j*(-116) +-359 + j*(333) +-127 + j*(110) +-243 + j*(156) +184 + j*(33) +-265 + j*(5) +-120 + j*(4) +-265 + j*(-8) +168 + j*(-161) +65 + j*(125) +-62 + j*(-164) +-208 + j*(-21) +-142 + j*(-322) +-378 + j*(19) +-73 + j*(76) +-61 + j*(151) +-141 + j*(-202) +132 + j*(133) +228 + j*(-25) +458 + j*(-65) +-133 + j*(-45) +-233 + j*(85) +126 + j*(-35) +81 + j*(-158) +239 + j*(64) +169 + j*(179) +23 + j*(318) +-153 + j*(-144) +92 + j*(-21) +3 + j*(197) +31 + j*(52) +74 + j*(-50) +117 + j*(-38) +-108 + j*(-49) +129 + j*(-19) +-218 + j*(-81) +123 + j*(-25) +326 + j*(-124) +-146 + j*(-104) +-19 + j*(-156) +-30 + j*(-185) +52 + j*(86) +-529 + j*(6) +194 + j*(-97) +109 + j*(278) +-315 + j*(-296) +241 + j*(168) +107 + j*(228) +-103 + j*(219) +79 + j*(238) +91 + j*(-158) +343 + j*(-144) +-165 + j*(-165) +-375 + j*(49) +257 + j*(-81) +223 + j*(160) +-144 + j*(-144) +-11 + j*(252) +70 + j*(-40) +40 + j*(79) +400 + j*(191) +8 + j*(-76) +-98 + j*(-105) +8 + j*(33) +-69 + j*(-42) +270 + j*(-35) +23 + j*(22) +-418 + j*(-221) +-38 + j*(-53) +28 + j*(64) +114 + j*(291) +421 + j*(272) +-222 + j*(250) +-34 + j*(83) +119 + j*(-148) +-141 + j*(136) +-165 + j*(40) +110 + j*(-94) +-341 + j*(105) +-62 + j*(25) +-187 + j*(107) +-132 + j*(221) +-17 + j*(1) +279 + j*(-247) +81 + j*(148) +46 + j*(116) +-448 + j*(-277) +-310 + j*(431) +30 + j*(28) +136 + j*(-87) +8 + j*(24) +257 + j*(-246) +-8 + j*(165) +-49 + j*(-32) +-11 + j*(-11) +34 + j*(-10) +-53 + j*(21) +361 + j*(103) +-284 + j*(-36) +-202 + j*(-190) +62 + j*(88) +-69 + j*(190) +-66 + j*(-338) +54 + j*(31) +-71 + j*(105) +-177 + j*(-55) +235 + j*(-53) +28 + j*(104) +-363 + j*(80) +144 + j*(2) +250 + j*(192) +-60 + j*(1) +-206 + j*(-163) +54 + j*(-66) +-91 + j*(-169) +-78 + j*(-36) +91 + j*(-15) +-30 + j*(107) +85 + j*(14) +-285 + j*(21) +179 + j*(152) +-197 + j*(-69) +86 + j*(-214) +200 + j*(158) +29 + j*(153) +-181 + j*(-278) +-89 + j*(-222) +-172 + j*(-129) +-30 + j*(272) +365 + j*(-10) +-40 + j*(-85) +-8 + j*(-57) +-241 + j*(-301) +-267 + j*(-530) +38 + j*(-85) +-91 + j*(478) +-18 + j*(-260) +-261 + j*(-103) +41 + j*(69) +376 + j*(74) +59 + j*(342) +-450 + j*(-386) +-185 + j*(-6) +399 + j*(284) +69 + j*(128) +-247 + j*(-365) +88 + j*(-74) +182 + j*(16) +-257 + j*(209) +-336 + j*(26) +-260 + j*(-74) +80 + j*(66) +-257 + j*(-243) +139 + j*(-35) +-354 + j*(33) +21 + j*(-107) +-279 + j*(46) +-124 + j*(192) +-474 + j*(-165) +61 + j*(-238) +-114 + j*(182) +-122 + j*(-105) +-265 + j*(192) +209 + j*(-58) +134 + j*(-87) +-124 + j*(-299) +-112 + j*(196) +132 + j*(38) +-180 + j*(303) +-203 + j*(82) +-62 + j*(-222) +37 + j*(371) +128 + j*(148) +194 + j*(198) +11 + j*(-93) +23 + j*(-392) +-9 + j*(213) +284 + j*(-231) +108 + j*(-115) +-86 + j*(-54) +-78 + j*(25) +-66 + j*(-118) +139 + j*(-135) +95 + j*(-66) +-155 + j*(-134) +-136 + j*(13) +37 + j*(147) +105 + j*(-52) +124 + j*(180) +93 + j*(129) +85 + j*(233) +139 + j*(-129) +363 + j*(93) +110 + j*(181) +321 + j*(-131) +-116 + j*(-50) +292 + j*(52) +130 + j*(-219) +-76 + j*(155) +170 + j*(8) +-60 + j*(36) +105 + j*(58) +368 + j*(125) +-136 + j*(-108) +-142 + j*(69) +21 + j*(-49) +10 + j*(-94) +-196 + j*(-4) +488 + j*(313) +86 + j*(-116) +167 + j*(34) +-52 + j*(267) +-132 + j*(273) +-107 + j*(-311) +12 + j*(-185) +148 + j*(-227) +-175 + j*(-88) +68 + j*(40) +44 + j*(-27) +158 + j*(-191) +-6 + j*(122) +315 + j*(-21) +-213 + j*(59) +421 + j*(-175) +-81 + j*(275) +-93 + j*(80) +-29 + j*(-130) +-58 + j*(153) +-246 + j*(-158) +71 + j*(-250) +-354 + j*(120) +37 + j*(195) +460 + j*(-35) +-176 + j*(-60) +109 + j*(30) +-274 + j*(46) +163 + j*(-293) +339 + j*(124) +-288 + j*(103) +256 + j*(-101) +-62 + j*(173) +-130 + j*(288) +137 + j*(-49) +169 + j*(-1) +-69 + j*(-170) +-231 + j*(207) +165 + j*(62) +-147 + j*(102) +-28 + j*(158) +-18 + j*(-250) +58 + j*(-124) +-211 + j*(-76) +-277 + j*(-126) +-288 + j*(281) +-47 + j*(91) +57 + j*(-258) +158 + j*(31) +173 + j*(-93) +64 + j*(-301) +-178 + j*(88) +-129 + j*(518) +144 + j*(-270) +146 + j*(-278) +239 + j*(122) +274 + j*(8) +77 + j*(-119) +-47 + j*(-154) +-2 + j*(219) +-204 + j*(267) +118 + j*(166) +42 + j*(-456) +-47 + j*(29) +-187 + j*(180) +-112 + j*(230) +95 + j*(-22) +120 + j*(381) +244 + j*(-168) +-9 + j*(103) +143 + j*(97) +-337 + j*(1) +228 + j*(18) +-43 + j*(92) +-42 + j*(6) +-16 + j*(483) +35 + j*(257) +100 + j*(-82) +245 + j*(144) +136 + j*(-35) +167 + j*(31) +-45 + j*(129) +-165 + j*(130) +431 + j*(227) +-163 + j*(-289) +157 + j*(-82) +371 + j*(-184) +8 + j*(117) +-247 + j*(-31) +57 + j*(120) +-107 + j*(-310) +-71 + j*(-28) +-234 + j*(-110) +-88 + j*(80) +-275 + j*(75) +-202 + j*(311) +-124 + j*(-170) +1 + j*(-284) +-44 + j*(-331) +-148 + j*(-53) +-11 + j*(8) +156 + j*(255) +302 + j*(170) +-139 + j*(47) +50 + j*(146) +-132 + j*(234) +-40 + j*(0) +31 + j*(-148) +-151 + j*(64) +202 + j*(-64) +207 + j*(42) +-194 + j*(48) +100 + j*(-102) +97 + j*(123) +262 + j*(82) +-321 + j*(-168) +-282 + j*(19) +-35 + j*(201) +257 + j*(114) +-47 + j*(-174) +-59 + j*(-81) +1 + j*(-50) +-180 + j*(-216) +-141 + j*(-33) +-106 + j*(167) +14 + j*(62) +151 + j*(104) +-206 + j*(-145) +132 + j*(-35) +-2 + j*(94) +107 + j*(101) +65 + j*(93) +30 + j*(-250) +175 + j*(159) +16 + j*(202) +-87 + j*(-223) +7 + j*(-244) +58 + j*(-51) +103 + j*(-135) +-168 + j*(-313) +-325 + j*(132) +-136 + j*(-111) +-211 + j*(-162) +35 + j*(-76) +354 + j*(196) +132 + j*(-28) +-12 + j*(-352) +140 + j*(-337) +-144 + j*(-102) +-115 + j*(-63) +-36 + j*(65) +-98 + j*(-89) +-119 + j*(53) +91 + j*(-206) +51 + j*(-476) +160 + j*(-76) +-222 + j*(-345) +-265 + j*(202) +86 + j*(-40) +142 + j*(170) +115 + j*(237) +187 + j*(-6) +-32 + j*(-87) +-379 + j*(175) +-46 + j*(-578) +-116 + j*(-57) +30 + j*(19) +-80 + j*(115) +13 + j*(100) +-116 + j*(121) +30 + j*(237) +-226 + j*(165) +-220 + j*(-202) +70 + j*(-153) +-282 + j*(-106) +-322 + j*(-4) +-46 + j*(7) +176 + j*(41) +195 + j*(132) +-103 + j*(23) +-114 + j*(-115) +153 + j*(317) +-57 + j*(60) +-160 + j*(-151) +-236 + j*(167) +203 + j*(-55) +-18 + j*(7) +-244 + j*(-16) +250 + j*(159) +3 + j*(-170) +-54 + j*(33) +-42 + j*(-67) +334 + j*(149) +-354 + j*(85) +-4 + j*(-64) +-63 + j*(92) +223 + j*(-244) +4 + j*(-47) +125 + j*(-204) +107 + j*(70) +191 + j*(-337) +-331 + j*(185) +-441 + j*(74) +-96 + j*(178) +-70 + j*(83) +152 + j*(100) +-117 + j*(371) +184 + j*(-202) +-223 + j*(200) +-42 + j*(-50) +18 + j*(126) +20 + j*(-46) +-298 + j*(203) +46 + j*(146) +-153 + j*(-19) +268 + j*(-62) +103 + j*(-322) +157 + j*(694) +-23 + j*(105) +-129 + j*(183) +-28 + j*(132) +21 + j*(37) +30 + j*(173) +-101 + j*(121) +-100 + j*(189) +-272 + j*(-186) +211 + j*(-85) +-222 + j*(-71) +-218 + j*(-44) +-98 + j*(38) +88 + j*(113) +249 + j*(-197) +86 + j*(346) +-49 + j*(-60) +235 + j*(230) +62 + j*(-8) +-169 + j*(-186) +304 + j*(-342) +119 + j*(65) +34 + j*(-357) +125 + j*(-96) +-258 + j*(103) +71 + j*(-79) +-179 + j*(193) +-139 + j*(-187) +-236 + j*(-131) +408 + j*(340) +139 + j*(-67) +-29 + j*(21) +-59 + j*(99) +-19 + j*(-37) +377 + j*(107) +-272 + j*(164) +81 + j*(-98) +-44 + j*(-69) +-203 + j*(-243) +-63 + j*(116) +-82 + j*(13) +-4 + j*(-42) +83 + j*(-158) +-216 + j*(-180) +-112 + j*(112) +-232 + j*(-168) +146 + j*(169) +-199 + j*(55) +74 + j*(-52) +-69 + j*(-372) +-64 + j*(-177) +-92 + j*(-14) +1 + j*(-285) +-81 + j*(-277) +57 + j*(-180) +-185 + j*(-419) +-235 + j*(-25) +-298 + j*(117) +-20 + j*(82) +110 + j*(231) +20 + j*(-115) +223 + j*(71) +-54 + j*(18) +-82 + j*(-61) +-54 + j*(88) +112 + j*(-132) +-216 + j*(-183) +144 + j*(135) +-95 + j*(361) +126 + j*(194) +4 + j*(-424) +185 + j*(91) +-4 + j*(-30) +-112 + j*(-177) +-479 + j*(195) +-301 + j*(-36) +-324 + j*(74) +66 + j*(20) +-174 + j*(-128) +57 + j*(-160) +1 + j*(-95) +121 + j*(-1) +78 + j*(-13) +8 + j*(-64) +-83 + j*(46) +-59 + j*(-35) +7 + j*(23) +-100 + j*(168) +-151 + j*(-72) +-171 + j*(-166) +124 + j*(396) +-94 + j*(-126) +136 + j*(-111) +-80 + j*(-441) +136 + j*(268) +358 + j*(69) +11 + j*(-5) +-298 + j*(-37) +-37 + j*(144) +-185 + j*(4) +-16 + j*(282) +-12 + j*(-115) +-4 + j*(-86) +29 + j*(-469) +-443 + j*(-96) +-258 + j*(7) +115 + j*(-133) +-213 + j*(-262) +279 + j*(-81) +129 + j*(-107) +-167 + j*(38) +-91 + j*(-312) +-202 + j*(335) +262 + j*(37) +1 + j*(-13) +135 + j*(319) +127 + j*(297) +130 + j*(115) +-280 + j*(151) +-213 + j*(-125) +-90 + j*(23) +110 + j*(192) +-148 + j*(-175) +-91 + j*(-89) +428 + j*(-33) +122 + j*(-108) +206 + j*(-93) +-56 + j*(-170) +330 + j*(-283) +243 + j*(18) +257 + j*(-235) +95 + j*(-140) +-50 + j*(-323) +-146 + j*(214) +167 + j*(229) +-22 + j*(23) +72 + j*(-136) +265 + j*(-286) +-305 + j*(-121) +6 + j*(165) +124 + j*(-304) +184 + j*(78) +360 + j*(8) +-103 + j*(-96) +99 + j*(-48) +-266 + j*(145) +206 + j*(-59) +313 + j*(58) +-79 + j*(-182) +109 + j*(91) +-360 + j*(-320) +153 + j*(227) +-165 + j*(87) +34 + j*(-18) +3 + j*(229) +1 + j*(49) +245 + j*(140) +-162 + j*(89) +-110 + j*(-125) +-93 + j*(202) +109 + j*(-93) +90 + j*(-56) +358 + j*(151) +286 + j*(-158) +182 + j*(-62) +-204 + j*(49) +20 + j*(279) +-105 + j*(-283) +-83 + j*(43) +-13 + j*(-51) +-68 + j*(176) +-152 + j*(-12) +-129 + j*(231) +9 + j*(143) +102 + j*(-153) +-134 + j*(-113) +34 + j*(174) +-151 + j*(180) +-45 + j*(-171) +206 + j*(-89) +154 + j*(144) +-146 + j*(-276) +216 + j*(57) +495 + j*(30) +-177 + j*(25) +97 + j*(240) +-84 + j*(-176) +-194 + j*(-102) +33 + j*(-204) +181 + j*(-70) +-52 + j*(280) +47 + j*(64) +-77 + j*(67) +408 + j*(27) +171 + j*(74) +-318 + j*(177) +98 + j*(136) +-166 + j*(124) +21 + j*(223) +-105 + j*(143) +-185 + j*(162) +11 + j*(6) +218 + j*(118) +-149 + j*(190) +42 + j*(121) +-117 + j*(100) +-86 + j*(32) +13 + j*(-127) +13 + j*(-260) +102 + j*(49) +173 + j*(210) +110 + j*(-64) +-13 + j*(329) +145 + j*(-61) +44 + j*(-65) +-110 + j*(-280) +226 + j*(-64) +207 + j*(205) +-9 + j*(-98) +-291 + j*(-194) +59 + j*(129) +-104 + j*(-78) +13 + j*(-115) +2 + j*(-84) +47 + j*(-117) +-182 + j*(-156) +371 + j*(66) +-185 + j*(249) +-360 + j*(-141) +74 + j*(-243) +150 + j*(412) +293 + j*(13) +161 + j*(-319) +-52 + j*(250) +-81 + j*(-110) +35 + j*(25) +62 + j*(146) +-134 + j*(-8) +-101 + j*(64) +-213 + j*(206) +49 + j*(27) +-9 + j*(44) +-30 + j*(57) +-185 + j*(-103) +-175 + j*(-29) +-315 + j*(127) +294 + j*(-68) +-98 + j*(390) +76 + j*(-11) +216 + j*(272) +-136 + j*(5) +44 + j*(210) +-3 + j*(-24) +182 + j*(-110) +-61 + j*(40) +-28 + j*(52) +-95 + j*(-206) +-57 + j*(230) +182 + j*(-40) +128 + j*(-143) +102 + j*(-54) +-83 + j*(28) +-37 + j*(-208) +-220 + j*(183) +158 + j*(-382) +88 + j*(-19) +-25 + j*(-37) +75 + j*(60) +-63 + j*(-173) +-230 + j*(-128) +112 + j*(-43) +-158 + j*(-47) +20 + j*(49) +-145 + j*(71) +-297 + j*(68) +-329 + j*(-21) +245 + j*(-95) +-303 + j*(88) +-72 + j*(151) +-126 + j*(-173) +11 + j*(199) +127 + j*(423) +213 + j*(-18) +230 + j*(17) +-110 + j*(-47) +347 + j*(166) +165 + j*(46) +-402 + j*(100) +-34 + j*(-164) +18 + j*(187) +-27 + j*(102) +100 + j*(324) +-43 + j*(-269) +118 + j*(-268) +-69 + j*(187) +192 + j*(-211) +99 + j*(-127) +262 + j*(42) +-93 + j*(-35) +-245 + j*(-249) +-39 + j*(-274) +115 + j*(-197) +179 + j*(8) +395 + j*(33) +324 + j*(-6) +-129 + j*(105) +72 + j*(-66) +-239 + j*(-16) +-112 + j*(189) +-334 + j*(-83) +91 + j*(235) +-139 + j*(91) +-136 + j*(122) +47 + j*(-132) +453 + j*(-16) +-150 + j*(-126) +-255 + j*(86) +146 + j*(-169) +-31 + j*(158) +98 + j*(132) +-260 + j*(86) +-20 + j*(145) +77 + j*(-175) +-227 + j*(271) +-25 + j*(115) +76 + j*(267) +-192 + j*(66) +-274 + j*(-34) +-163 + j*(-132) +-155 + j*(-195) +91 + j*(46) +-137 + j*(-191) +-151 + j*(260) +-8 + j*(29) +-83 + j*(25) +17 + j*(-16) +-430 + j*(494) +212 + j*(55) +134 + j*(86) +188 + j*(-2) +-11 + j*(151) +209 + j*(27) +-37 + j*(40) +-202 + j*(90) +-25 + j*(327) +81 + j*(-401) +-180 + j*(194) +-146 + j*(262) +221 + j*(87) +280 + j*(-118) +-30 + j*(15) +164 + j*(91) +45 + j*(-315) +-325 + j*(43) +-283 + j*(-286) +-63 + j*(-174) +-220 + j*(-100) +190 + j*(-108) +37 + j*(-11) +148 + j*(-88) +-103 + j*(-93) +122 + j*(94) +-124 + j*(-273) +-59 + j*(-193) +13 + j*(77) +3 + j*(-186) +36 + j*(-62) +-219 + j*(232) +103 + j*(71) +54 + j*(47) +13 + j*(52) +-356 + j*(119) +-124 + j*(152) +77 + j*(33) +-83 + j*(148) +-40 + j*(-25) +35 + j*(-64) +-170 + j*(-244) +-301 + j*(-208) +-61 + j*(140) +-197 + j*(-47) +-134 + j*(-243) +34 + j*(269) +-169 + j*(-330) +65 + j*(46) +167 + j*(47) +-118 + j*(-40) +65 + j*(-15) +-16 + j*(211) +-63 + j*(107) +50 + j*(120) +-194 + j*(9) +-97 + j*(90) +-226 + j*(-82) +59 + j*(-375) +123 + j*(-107) +112 + j*(63) +-95 + j*(146) +-209 + j*(91) +278 + j*(-85) +190 + j*(134) +296 + j*(-10) +-175 + j*(-175) +136 + j*(-52) +166 + j*(-25) +129 + j*(107) +-254 + j*(-54) +132 + j*(6) +137 + j*(95) +-457 + j*(-166) +-146 + j*(34) +-46 + j*(-144) +32 + j*(291) +143 + j*(168) +108 + j*(14) +25 + j*(-109) +-262 + j*(148) +-111 + j*(-62) +170 + j*(-84) +-148 + j*(217) +-279 + j*(-161) +-50 + j*(-172) +261 + j*(-89) +-186 + j*(31) +-35 + j*(201) +-392 + j*(-57) +-43 + j*(291) +-125 + j*(65) +157 + j*(-12) +-43 + j*(40) +173 + j*(-97) +231 + j*(-39) +40 + j*(-25) +-184 + j*(-57) +31 + j*(-173) +-262 + j*(74) +6 + j*(214) +37 + j*(-114) +-296 + j*(-238) +115 + j*(-8) +17 + j*(-50) +-165 + j*(134) +-115 + j*(127) +-419 + j*(-182) +-29 + j*(-102) +49 + j*(348) +-173 + j*(-4) +-431 + j*(31) +-60 + j*(21) +-130 + j*(-76) +-278 + j*(-74) +-156 + j*(-45) +383 + j*(187) +241 + j*(-255) +105 + j*(-116) +-6 + j*(-184) +327 + j*(-173) +-32 + j*(39) +23 + j*(78) +35 + j*(0) +116 + j*(-264) +-10 + j*(-5) +-44 + j*(110) +-103 + j*(-112) +-506 + j*(227) +144 + j*(-71) +150 + j*(43) +45 + j*(344) +-286 + j*(-126) +24 + j*(-301) +-136 + j*(-288) +23 + j*(-66) +-247 + j*(-122) +2 + j*(-254) +-434 + j*(-101) +-262 + j*(86) +-265 + j*(-110) +-293 + j*(115) +-11 + j*(361) +249 + j*(-121) +-88 + j*(35) +-232 + j*(-86) +296 + j*(8) +-125 + j*(4) +-14 + j*(-228) +-212 + j*(259) +30 + j*(207) +165 + j*(-69) +454 + j*(0) +-282 + j*(71) +41 + j*(-194) +264 + j*(-13) +-313 + j*(129) +82 + j*(106) +76 + j*(-2) +245 + j*(-102) +-92 + j*(245) +242 + j*(-47) +-132 + j*(-83) +231 + j*(-56) +-64 + j*(-59) +-94 + j*(-115) +241 + j*(154) +-261 + j*(-173) +-56 + j*(157) +-54 + j*(-21) +-180 + j*(28) +144 + j*(104) +64 + j*(23) +-93 + j*(-354) +189 + j*(185) +-110 + j*(-22) +209 + j*(-222) +79 + j*(-39) +217 + j*(-105) +-21 + j*(-139) +91 + j*(205) +195 + j*(-93) +-6 + j*(-144) +-231 + j*(117) +-18 + j*(-35) +87 + j*(190) +152 + j*(56) +248 + j*(66) +-3 + j*(-235) +-81 + j*(132) +-59 + j*(315) +-289 + j*(142) +100 + j*(-118) +-191 + j*(355) +52 + j*(-271) +1 + j*(-161) +-151 + j*(-81) +198 + j*(357) +-202 + j*(-13) +19 + j*(-220) +188 + j*(-258) +90 + j*(105) +-168 + j*(25) +37 + j*(-505) +281 + j*(-93) +-241 + j*(-156) +49 + j*(-28) +16 + j*(-299) +151 + j*(-229) +-42 + j*(136) +-228 + j*(43) +-124 + j*(148) +-7 + j*(19) +250 + j*(-66) +207 + j*(118) +80 + j*(28) +-22 + j*(61) +190 + j*(-61) +206 + j*(-161) +27 + j*(-344) +-176 + j*(-18) +233 + j*(-76) +64 + j*(-87) +334 + j*(-81) +216 + j*(-3) +1 + j*(499) +57 + j*(-66) +-123 + j*(-246) +-329 + j*(-81) +-113 + j*(-94) +41 + j*(204) +-194 + j*(-10) +-52 + j*(116) +-80 + j*(33) +-271 + j*(-388) +-288 + j*(-45) +-65 + j*(-40) +118 + j*(-59) +296 + j*(-220) +-175 + j*(57) +4 + j*(71) +-124 + j*(62) +153 + j*(95) +209 + j*(209) +132 + j*(293) +-72 + j*(-90) +378 + j*(3) +57 + j*(266) +-354 + j*(42) +84 + j*(-270) +-52 + j*(303) +211 + j*(-53) +132 + j*(-156) +375 + j*(37) +-21 + j*(87) +381 + j*(-107) +86 + j*(-33) +98 + j*(21) +-189 + j*(-212) +-138 + j*(-247) +330 + j*(-127) +34 + j*(-63) +181 + j*(139) +-86 + j*(144) +206 + j*(-378) +165 + j*(29) +-133 + j*(183) +52 + j*(-56) +-140 + j*(123) +-123 + j*(68) +-13 + j*(243) +-144 + j*(-129) +-265 + j*(-195) +148 + j*(139) +117 + j*(-42) +-105 + j*(-67) +-64 + j*(-123) +20 + j*(-232) +-250 + j*(85) +-117 + j*(-41) +-474 + j*(269) +76 + j*(-93) +23 + j*(-175) +-138 + j*(191) +13 + j*(-97) +15 + j*(395) +71 + j*(56) +-91 + j*(74) +-180 + j*(134) +-23 + j*(90) +110 + j*(313) +-309 + j*(-167) +13 + j*(44) +146 + j*(276) +105 + j*(-266) +-9 + j*(-158) +69 + j*(-4) +-45 + j*(-214) +148 + j*(69) +95 + j*(98) +322 + j*(-187) +-102 + j*(-109) +-287 + j*(66) +-108 + j*(-247) +62 + j*(112) +86 + j*(-119) +75 + j*(65) +-5 + j*(192) +-112 + j*(0) +301 + j*(-56) +-206 + j*(83) +-30 + j*(192) +-293 + j*(-1) +167 + j*(98) +144 + j*(-275) +76 + j*(80) +-81 + j*(314) +-132 + j*(-187) +-124 + j*(-295) +-412 + j*(339) +49 + j*(-5) +-10 + j*(-172) +-36 + j*(-47) +-112 + j*(-105) +171 + j*(441) +-104 + j*(-93) +128 + j*(211) +-76 + j*(-84) +84 + j*(350) +47 + j*(-100) +-137 + j*(-182) +-22 + j*(-212) +8 + j*(100) +-58 + j*(252) +55 + j*(40) +-95 + j*(127) +252 + j*(-148) +-147 + j*(-35) +202 + j*(-465) +127 + j*(-109) +-136 + j*(-75) +122 + j*(67) +34 + j*(-97) +-622 + j*(-2) +240 + j*(49) +230 + j*(95) +-16 + j*(33) +129 + j*(178) +-92 + j*(131) +-146 + j*(-288) +-11 + j*(-154) +243 + j*(-119) +-293 + j*(-419) +12 + j*(146) +11 + j*(258) +-267 + j*(-30) +378 + j*(180) +-145 + j*(-53) +-152 + j*(-247) +-127 + j*(-30) +244 + j*(-144) +-57 + j*(107) +324 + j*(203) +158 + j*(-66) +308 + j*(-268) +119 + j*(-105) +-98 + j*(127) +-189 + j*(-178) +-35 + j*(-40) +142 + j*(378) +-226 + j*(-28) +273 + j*(-14) +65 + j*(-8) +-95 + j*(-134) +-35 + j*(83) +49 + j*(157) +-52 + j*(-219) +14 + j*(280) +-33 + j*(-86) +86 + j*(-61) +-508 + j*(-100) +161 + j*(-415) +-86 + j*(-105) +65 + j*(-98) +233 + j*(69) +-90 + j*(115) +47 + j*(171) +-141 + j*(-136) +70 + j*(-102) +-40 + j*(-204) +-239 + j*(-93) +192 + j*(155) +-231 + j*(32) +-45 + j*(-419) +20 + j*(-41) +7 + j*(42) +258 + j*(-222) +98 + j*(-2) +-13 + j*(62) +-309 + j*(-131) +158 + j*(96) +-309 + j*(-138) +-322 + j*(-272) +168 + j*(-258) +-395 + j*(131) +187 + j*(-576) +-81 + j*(-438) +-147 + j*(-62) +-220 + j*(-71) +-203 + j*(-38) +184 + j*(113) +0 + j*(-317) +167 + j*(-6) +-226 + j*(78) +-146 + j*(-158) +-223 + j*(21) +-170 + j*(70) +21 + j*(-109) +-54 + j*(103) +407 + j*(-218) +-4 + j*(-20) +207 + j*(-315) +-80 + j*(-86) +180 + j*(-165) +-144 + j*(289) +146 + j*(262) +38 + j*(-47) +352 + j*(281) +290 + j*(-41) +-28 + j*(-112) +38 + j*(323) +-56 + j*(-105) +-68 + j*(74) +249 + j*(117) +13 + j*(223) +-66 + j*(356) +-146 + j*(-142) +-55 + j*(216) +181 + j*(215) +252 + j*(74) +143 + j*(-118) +93 + j*(125) +29 + j*(22) +-83 + j*(-94) +66 + j*(21) +-62 + j*(146) +264 + j*(-65) +-211 + j*(389) +-119 + j*(245) +24 + j*(-66) +71 + j*(22) +-1 + j*(-225) +80 + j*(-397) +-206 + j*(-12) +-6 + j*(158) +87 + j*(251) +-8 + j*(139) +-56 + j*(126) +-327 + j*(45) +37 + j*(-74) +-45 + j*(381) +94 + j*(-11) +-6 + j*(46) +-115 + j*(-161) +171 + j*(-400) +-3 + j*(44) +-228 + j*(208) +-20 + j*(-47) +-117 + j*(-197) +-104 + j*(89) +102 + j*(-254) +76 + j*(-246) +-368 + j*(-77) +49 + j*(107) +47 + j*(53) +87 + j*(-298) +199 + j*(-163) +116 + j*(-85) +25 + j*(-167) +-1 + j*(74) +-2 + j*(-13) +54 + j*(-91) +76 + j*(-262) +72 + j*(-146) +-135 + j*(-182) +6 + j*(-18) +-217 + j*(178) +-46 + j*(69) +-9 + j*(-42) +-65 + j*(-80) +-28 + j*(-10) +-97 + j*(-62) +158 + j*(-168) +106 + j*(2) +-184 + j*(-18) +-233 + j*(16) +158 + j*(294) +-172 + j*(-383) +-199 + j*(-178) +125 + j*(-46) +-41 + j*(17) +-365 + j*(247) +262 + j*(-253) +-105 + j*(72) +-32 + j*(141) +-2 + j*(-19) +143 + j*(-65) +42 + j*(125) +37 + j*(-173) +123 + j*(47) +45 + j*(-98) +-40 + j*(143) +28 + j*(-257) +97 + j*(-254) +170 + j*(-148) +-200 + j*(-47) +-126 + j*(158) +-278 + j*(21) +124 + j*(130) +-147 + j*(-42) +8 + j*(200) +-85 + j*(-76) +237 + j*(37) +-167 + j*(184) +175 + j*(235) +-180 + j*(380) +-506 + j*(-137) +-172 + j*(148) +-28 + j*(23) +18 + j*(-223) +-82 + j*(166) +11 + j*(121) +83 + j*(216) +-210 + j*(-182) +-269 + j*(99) +333 + j*(-19) +-129 + j*(-68) +281 + j*(-123) +-8 + j*(-74) +-146 + j*(36) +91 + j*(-126) +-94 + j*(45) +-42 + j*(-46) +62 + j*(464) +89 + j*(-21) +-281 + j*(67) +101 + j*(-325) +40 + j*(270) +-163 + j*(107) +-337 + j*(-230) +-49 + j*(-117) +94 + j*(200) +-100 + j*(119) +-252 + j*(49) +164 + j*(40) +337 + j*(72) +-47 + j*(-204) +-224 + j*(-218) +-180 + j*(218) +1 + j*(221) +221 + j*(-285) +259 + j*(-113) +-71 + j*(366) +-113 + j*(-133) +59 + j*(-132) +82 + j*(-6) +-69 + j*(21) +-182 + j*(-43) +-27 + j*(-281) +80 + j*(-69) +-54 + j*(-49) +91 + j*(-78) +214 + j*(-64) +-216 + j*(246) +-180 + j*(11) +81 + j*(-48) +-34 + j*(-7) +-8 + j*(57) +-26 + j*(45) +-324 + j*(264) +185 + j*(-170) +-119 + j*(-197) +28 + j*(132) +16 + j*(67) +403 + j*(142) +152 + j*(152) +-22 + j*(388) +44 + j*(0) +42 + j*(11) +35 + j*(-54) +182 + j*(-73) +153 + j*(-13) +159 + j*(-34) +316 + j*(83) +289 + j*(194) +-134 + j*(-163) +87 + j*(117) +95 + j*(-318) +108 + j*(-79) +-322 + j*(431) +-1 + j*(314) +69 + j*(-359) +117 + j*(-21) +-343 + j*(198) +-25 + j*(-99) +-10 + j*(-103) +-76 + j*(182) +-164 + j*(-390) +-95 + j*(40) +-181 + j*(182) +-129 + j*(-161) +-130 + j*(111) +-20 + j*(1) +-223 + j*(49) +-129 + j*(119) +-90 + j*(-31) +163 + j*(-215) +-130 + j*(-217) +111 + j*(30) +40 + j*(63) +-132 + j*(1) +-240 + j*(-94) +301 + j*(-80) +-62 + j*(-7) +85 + j*(-55) +144 + j*(4) +-60 + j*(11) +-43 + j*(-144) +-178 + j*(136) +125 + j*(133) +-44 + j*(124) +41 + j*(190) +75 + j*(223) +-161 + j*(-218) +131 + j*(7) +21 + j*(102) +-467 + j*(-260) +250 + j*(-82) +99 + j*(83) +-223 + j*(349) +-216 + j*(-151) +129 + j*(-349) +243 + j*(-324) +178 + j*(52) +194 + j*(-74) +146 + j*(200) +136 + j*(43) +-378 + j*(-235) +-290 + j*(151) +407 + j*(159) +-139 + j*(-40) +130 + j*(-59) +135 + j*(353) +89 + j*(100) +-30 + j*(-180) +-50 + j*(-217) +76 + j*(-12) +-197 + j*(-5) +-296 + j*(0) +-256 + j*(119) +233 + j*(-107) +16 + j*(-327) +-274 + j*(325) +91 + j*(24) +47 + j*(-30) +211 + j*(-159) +277 + j*(18) +138 + j*(3) +-142 + j*(-59) +212 + j*(-37) +97 + j*(382) +381 + j*(126) +221 + j*(-418) +328 + j*(-99) +-93 + j*(-224) +-30 + j*(-151) +-246 + j*(-29) +230 + j*(13) +97 + j*(242) +8 + j*(-52) +-58 + j*(141) +33 + j*(-67) +-415 + j*(-201) +-23 + j*(-113) +-18 + j*(-187) +245 + j*(-151) +69 + j*(-96) +-143 + j*(117) +179 + j*(47) +87 + j*(-223) +-263 + j*(-198) +-29 + j*(-86) +287 + j*(158) +-59 + j*(113) +184 + j*(95) +264 + j*(42) +-146 + j*(232) +-67 + j*(-57) +19 + j*(-152) +187 + j*(182) +-253 + j*(-218) +134 + j*(207) +91 + j*(-161) +131 + j*(-104) +132 + j*(-75) +95 + j*(427) +-11 + j*(-45) +-13 + j*(-20) +-47 + j*(227) +86 + j*(66) +94 + j*(-35) +-11 + j*(-71) +-160 + j*(56) +36 + j*(255) +276 + j*(-119) +49 + j*(108) +-98 + j*(-81) +-76 + j*(-313) +240 + j*(4) +-160 + j*(21) +8 + j*(-165) +-163 + j*(261) +-270 + j*(-73) +187 + j*(110) +-86 + j*(-165) +214 + j*(134) +-33 + j*(-112) +-421 + j*(278) +19 + j*(46) +53 + j*(228) +-442 + j*(-151) +69 + j*(59) +-86 + j*(55) +50 + j*(-371) +-199 + j*(113) +-13 + j*(172) +168 + j*(52) +384 + j*(291) +-89 + j*(-129) +-343 + j*(-387) +-37 + j*(300) +-37 + j*(-66) +-209 + j*(-116) +112 + j*(2) +87 + j*(-80) +-272 + j*(-38) +-51 + j*(40) +-221 + j*(-138) +-182 + j*(-378) +-461 + j*(-30) +-141 + j*(-149) +269 + j*(-55) +122 + j*(68) +122 + j*(33) +-153 + j*(-116) +-47 + j*(-1) +285 + j*(30) +102 + j*(-137) +50 + j*(-193) +-409 + j*(-35) +-162 + j*(171) +354 + j*(41) +-216 + j*(101) +33 + j*(256) +-114 + j*(203) +-353 + j*(-30) +42 + j*(-177) +-2 + j*(95) +-100 + j*(-156) +-117 + j*(-155) +-144 + j*(-4) +-138 + j*(-194) +33 + j*(-209) +-113 + j*(6) +-361 + j*(190) +153 + j*(-317) +-49 + j*(81) +-70 + j*(-52) +104 + j*(-284) +131 + j*(113) +28 + j*(6) +18 + j*(71) +47 + j*(100) +126 + j*(-6) +-138 + j*(199) +18 + j*(-209) +158 + j*(-37) +237 + j*(-211) +277 + j*(-17) +87 + j*(151) +-173 + j*(-153) +147 + j*(-314) +-79 + j*(247) +128 + j*(-87) +26 + j*(-173) +236 + j*(-258) +-177 + j*(25) +-112 + j*(-148) +-136 + j*(-163) +-16 + j*(-223) +-124 + j*(218) +-49 + j*(-257) +-156 + j*(-51) +-25 + j*(-276) +88 + j*(1) +-191 + j*(-42) +-81 + j*(-92) +138 + j*(419) +2 + j*(88) +-1 + j*(84) +119 + j*(194) +-129 + j*(-187) +-151 + j*(-66) +-141 + j*(11) +107 + j*(-457) +256 + j*(140) +1 + j*(218) +130 + j*(134) +122 + j*(62) +96 + j*(-102) +72 + j*(-88) +59 + j*(-168) +-111 + j*(-354) +189 + j*(-89) +224 + j*(-129) +-127 + j*(88) +1 + j*(357) +139 + j*(163) +147 + j*(244) +100 + j*(94) +269 + j*(6) +13 + j*(-315) +71 + j*(-104) +-110 + j*(30) +18 + j*(-172) +-40 + j*(-19) +-182 + j*(307) +129 + j*(344) +-29 + j*(-144) +-138 + j*(-13) +361 + j*(-96) +-143 + j*(105) +-92 + j*(-118) +16 + j*(52) +-119 + j*(187) +296 + j*(-150) +-188 + j*(-91) +-7 + j*(-250) +83 + j*(-74) +-110 + j*(113) +-170 + j*(331) +-52 + j*(-16) +97 + j*(-301) +-269 + j*(-31) +-89 + j*(69) +84 + j*(-25) +161 + j*(-239) +-80 + j*(156) +148 + j*(-129) +191 + j*(196) +-153 + j*(43) +-117 + j*(-74) +-46 + j*(-340) +-41 + j*(-180) +53 + j*(-113) +182 + j*(195) +208 + j*(221) +6 + j*(14) +144 + j*(73) +-83 + j*(-97) +30 + j*(223) +-98 + j*(-148) +-493 + j*(-247) +-386 + j*(32) +-112 + j*(326) +41 + j*(-60) +155 + j*(-324) +42 + j*(-76) +-39 + j*(-154) +123 + j*(409) +-132 + j*(-122) +209 + j*(-33) +-313 + j*(55) +235 + j*(189) +-382 + j*(339) +87 + j*(-11) +101 + j*(1) +186 + j*(-173) +23 + j*(-135) +427 + j*(74) +280 + j*(-122) +-69 + j*(-35) +247 + j*(-23) +112 + j*(-204) +110 + j*(-6) +-303 + j*(14) +245 + j*(250) +-73 + j*(-16) +35 + j*(123) +49 + j*(49) +-154 + j*(-42) +-281 + j*(-35) +-308 + j*(151) +151 + j*(22) +45 + j*(-136) +-244 + j*(-184) +-175 + j*(-62) +38 + j*(231) +6 + j*(98) +-51 + j*(-29) +-168 + j*(-286) +60 + j*(-317) +53 + j*(221) +-120 + j*(98) +-54 + j*(-115) +93 + j*(-67) +139 + j*(57) +-66 + j*(108) +-183 + j*(54) +-59 + j*(-28) +-165 + j*(35) +-184 + j*(29) +-275 + j*(165) +377 + j*(17) +-283 + j*(-351) +42 + j*(141) +90 + j*(-40) +-74 + j*(-148) +53 + j*(353) +4 + j*(-133) +440 + j*(-84) +-33 + j*(113) +83 + j*(76) +-175 + j*(-44) +69 + j*(-90) +103 + j*(135) +156 + j*(92) +-122 + j*(-37) +48 + j*(-104) +250 + j*(-129) +88 + j*(190) +-170 + j*(335) +-293 + j*(20) +40 + j*(-365) +140 + j*(-265) +340 + j*(49) +-47 + j*(135) +330 + j*(-47) +-25 + j*(-161) +-59 + j*(112) +185 + j*(186) +125 + j*(-295) +-45 + j*(554) +100 + j*(13) +52 + j*(40) +-13 + j*(-54) +-218 + j*(-153) +11 + j*(-43) +-39 + j*(3) +10 + j*(-15) +-298 + j*(9) +123 + j*(-210) +179 + j*(-168) +211 + j*(-169) +250 + j*(216) +74 + j*(-95) +-288 + j*(59) +-35 + j*(135) +23 + j*(127) +-22 + j*(190) +-76 + j*(-112) +180 + j*(-251) +226 + j*(-145) +30 + j*(37) +79 + j*(137) +83 + j*(-292) +209 + j*(-6) +-307 + j*(-122) +119 + j*(-90) +26 + j*(-105) +-28 + j*(-279) +-95 + j*(-34) +-57 + j*(-282) +-361 + j*(-175) +-83 + j*(-77) +-74 + j*(16) +370 + j*(52) +-276 + j*(-269) +285 + j*(-62) +-129 + j*(-197) +-21 + j*(-14) +-3 + j*(45) +371 + j*(43) +-213 + j*(-98) +196 + j*(23) +187 + j*(62) +-165 + j*(173) +61 + j*(-60) +194 + j*(-329) +-269 + j*(-18) +160 + j*(-72) +62 + j*(284) +47 + j*(-228) +-74 + j*(294) +64 + j*(78) +37 + j*(-100) +-81 + j*(50) +18 + j*(-113) +157 + j*(217) +188 + j*(355) +37 + j*(-31) +176 + j*(-282) +190 + j*(28) +81 + j*(-1) +-202 + j*(311) +-52 + j*(120) +-18 + j*(17) +-330 + j*(-110) +-84 + j*(472) +51 + j*(234) +-144 + j*(366) +-25 + j*(12) +-69 + j*(-14) +540 + j*(-155) +52 + j*(81) +174 + j*(-171) +117 + j*(-86) +-15 + j*(-315) +154 + j*(135) +107 + j*(97) +-119 + j*(-209) +67 + j*(-233) +14 + j*(58) +-94 + j*(159) +-81 + j*(1) +107 + j*(-90) +-29 + j*(38) +-565 + j*(-190) +-35 + j*(36) +255 + j*(220) +-25 + j*(18) +-337 + j*(-27) +89 + j*(-148) +-89 + j*(-141) +-12 + j*(20) +69 + j*(-27) +228 + j*(-64) +112 + j*(-27) +-181 + j*(81) +-102 + j*(-2) +61 + j*(257) +-170 + j*(8) +-4 + j*(-171) +-119 + j*(-27) +-156 + j*(10) +315 + j*(-231) +264 + j*(260) +-37 + j*(129) +69 + j*(-72) +121 + j*(146) +-37 + j*(221) +-195 + j*(1) +301 + j*(107) +221 + j*(16) +-313 + j*(-181) +-51 + j*(-94) +140 + j*(-295) +6 + j*(-176) +-135 + j*(4) +-49 + j*(355) +87 + j*(69) +-40 + j*(-108) +81 + j*(187) +51 + j*(-194) +-98 + j*(175) +-280 + j*(127) +194 + j*(-100) +-287 + j*(185) +-28 + j*(14) +57 + j*(55) +-313 + j*(-42) +175 + j*(-13) +-138 + j*(136) +-7 + j*(27) +16 + j*(214) +-4 + j*(70) +-28 + j*(-166) +-91 + j*(214) +-64 + j*(-305) +293 + j*(-61) +268 + j*(182) +153 + j*(23) +-50 + j*(-63) +57 + j*(-17) +-127 + j*(47) +-107 + j*(-67) +68 + j*(83) +38 + j*(-78) +-169 + j*(-76) +132 + j*(134) +202 + j*(197) +-224 + j*(140) +-37 + j*(643) +-233 + j*(16) +-227 + j*(-88) +-168 + j*(-213) +63 + j*(-224) +88 + j*(28) +8 + j*(165) +-273 + j*(-146) +-140 + j*(-8) +-100 + j*(13) +-232 + j*(1) +-223 + j*(93) +-132 + j*(-45) +-20 + j*(248) +156 + j*(-44) +74 + j*(-89) +88 + j*(26) +161 + j*(-94) +-11 + j*(-143) +-145 + j*(124) +-33 + j*(30) +485 + j*(173) +249 + j*(-310) +-246 + j*(164) +-104 + j*(134) +-126 + j*(184) +-135 + j*(259) +18 + j*(79) +-115 + j*(67) +-190 + j*(-126) +-159 + j*(183) +184 + j*(-190) +390 + j*(-129) +-35 + j*(-129) +342 + j*(363) +110 + j*(-233) +158 + j*(-269) +15 + j*(-55) +-204 + j*(-508) +11 + j*(165) +-346 + j*(-145) +-168 + j*(75) +-175 + j*(-120) +-25 + j*(294) +-119 + j*(337) +-119 + j*(111) +11 + j*(-257) +-141 + j*(-127) +116 + j*(57) +-173 + j*(30) +-138 + j*(68) +-71 + j*(-35) +14 + j*(250) +-11 + j*(-57) +57 + j*(-279) +74 + j*(274) +-81 + j*(64) +-378 + j*(-80) +-279 + j*(211) +-79 + j*(194) +-6 + j*(261) +156 + j*(-58) +-8 + j*(-139) +239 + j*(-23) +-117 + j*(-64) +-107 + j*(41) +-198 + j*(-283) +-91 + j*(-135) +-43 + j*(-13) +99 + j*(30) +4 + j*(105) +-276 + j*(319) +-298 + j*(-84) +-7 + j*(-237) +-286 + j*(9) +74 + j*(122) +10 + j*(344) +-185 + j*(161) +139 + j*(187) +-332 + j*(-48) +-35 + j*(-204) +-7 + j*(-144) +-6 + j*(266) +78 + j*(25) +37 + j*(78) +96 + j*(183) +-107 + j*(-141) +66 + j*(-433) +-127 + j*(-27) +-96 + j*(138) +-1 + j*(-129) +-351 + j*(71) +-324 + j*(202) +-93 + j*(-97) +73 + j*(153) +115 + j*(-252) +156 + j*(172) +-312 + j*(-143) +-336 + j*(-115) +-119 + j*(-85) +47 + j*(-141) +300 + j*(174) +-219 + j*(57) +102 + j*(-172) +45 + j*(390) +17 + j*(-127) +31 + j*(135) +344 + j*(83) +-76 + j*(140) +53 + j*(57) +199 + j*(192) +-69 + j*(165) +5 + j*(216) +525 + j*(152) +-233 + j*(-83) +-221 + j*(283) +50 + j*(12) +214 + j*(-559) +-118 + j*(-131) +-77 + j*(-31) +-30 + j*(-192) +130 + j*(-141) +215 + j*(296) +-64 + j*(65) +209 + j*(-41) +81 + j*(219) +-110 + j*(-412) +119 + j*(130) +199 + j*(-42) +72 + j*(-13) +-223 + j*(53) +45 + j*(28) +262 + j*(-16) +11 + j*(78) +182 + j*(-139) +73 + j*(211) +183 + j*(11) +-7 + j*(171) +65 + j*(-11) +-12 + j*(-45) +10 + j*(251) +110 + j*(-240) +187 + j*(-95) +-42 + j*(-128) +26 + j*(117) +-77 + j*(128) +-45 + j*(70) +74 + j*(-117) +-28 + j*(109) +-175 + j*(-98) +119 + j*(204) +8 + j*(298) +-43 + j*(-71) +105 + j*(107) +-46 + j*(31) +-23 + j*(-230) +-141 + j*(-225) +-245 + j*(-98) +-115 + j*(-24) +52 + j*(330) +-5 + j*(218) +-179 + j*(37) +50 + j*(52) +40 + j*(127) +-165 + j*(-45) +199 + j*(-132) +242 + j*(-7) +-489 + j*(-55) +-220 + j*(-413) +80 + j*(-27) +-104 + j*(103) +-245 + j*(383) +-40 + j*(-466) +197 + j*(144) +-98 + j*(13) +-8 + j*(345) +335 + j*(190) +42 + j*(35) +157 + j*(58) +175 + j*(-229) +284 + j*(-218) +421 + j*(283) +272 + j*(-241) +-252 + j*(157) +-209 + j*(22) +-40 + j*(-61) +-30 + j*(84) +293 + j*(-244) +-286 + j*(241) +-197 + j*(-78) +-107 + j*(-2) +-329 + j*(-105) +93 + j*(-472) +187 + j*(-107) +-279 + j*(150) +-337 + j*(211) +117 + j*(-244) +-221 + j*(267) +224 + j*(70) +174 + j*(168) +-124 + j*(-14) +16 + j*(-190) +-207 + j*(305) +143 + j*(54) +-124 + j*(30) +43 + j*(-15) +-67 + j*(-205) +21 + j*(-163) +157 + j*(-183) +-59 + j*(-42) +-53 + j*(-147) +231 + j*(30) +-61 + j*(-77) +4 + j*(-422) +-378 + j*(259) +74 + j*(-154) +36 + j*(153) +-182 + j*(-66) +189 + j*(-37) +-129 + j*(-29) +46 + j*(-117) +-88 + j*(-76) +-23 + j*(164) +-111 + j*(-12) +-228 + j*(-86) +134 + j*(-25) +-142 + j*(93) +-182 + j*(25) +215 + j*(-70) +181 + j*(-52) +212 + j*(156) +421 + j*(-248) +52 + j*(-489) +36 + j*(86) +105 + j*(-277) +283 + j*(-57) +250 + j*(73) +86 + j*(-120) +-230 + j*(-105) +-86 + j*(-75) +-118 + j*(88) +59 + j*(-71) +-106 + j*(-66) +-314 + j*(-8) +-16 + j*(270) +-138 + j*(189) +-151 + j*(-110) +365 + j*(-158) +-216 + j*(-23) +4 + j*(181) +-245 + j*(88) +-132 + j*(202) +-115 + j*(-160) +69 + j*(310) +47 + j*(45) +104 + j*(72) +260 + j*(204) +-190 + j*(46) +-192 + j*(312) +8 + j*(-155) +-162 + j*(90) +-115 + j*(44) +-37 + j*(-298) +-72 + j*(238) +170 + j*(310) +72 + j*(248) +-28 + j*(151) +103 + j*(-130) +78 + j*(-173) +120 + j*(-121) +435 + j*(-305) +-20 + j*(45) +-93 + j*(235) +66 + j*(-35) +204 + j*(4) +-134 + j*(50) +-397 + j*(-16) +91 + j*(166) +112 + j*(-139) +-42 + j*(-366) +25 + j*(223) +79 + j*(-212) +-67 + j*(-242) +-235 + j*(-83) +-160 + j*(62) +124 + j*(347) +110 + j*(-49) +127 + j*(49) +167 + j*(-341) +-427 + j*(-66) +-172 + j*(82) +-130 + j*(-25) +-9 + j*(-11) +99 + j*(252) +-225 + j*(-153) +-220 + j*(175) +141 + j*(122) +110 + j*(288) +-286 + j*(149) +-47 + j*(218) +322 + j*(127) +159 + j*(101) +-252 + j*(185) +-443 + j*(-124) +10 + j*(165) +182 + j*(169) +-32 + j*(-81) +-44 + j*(-41) +-229 + j*(50) +157 + j*(421) +-155 + j*(-18) +-85 + j*(-13) +148 + j*(-432) +-298 + j*(-108) +-260 + j*(219) +272 + j*(-179) +35 + j*(-123) +137 + j*(8) +29 + j*(-116) +84 + j*(167) +308 + j*(-47) +204 + j*(64) +339 + j*(-60) +-224 + j*(-70) +186 + j*(730) +-59 + j*(86) +66 + j*(-30) +-16 + j*(-260) +-309 + j*(200) +-143 + j*(-127) +33 + j*(-50) +12 + j*(-74) +-113 + j*(-52) +-31 + j*(197) +330 + j*(197) +264 + j*(-106) +214 + j*(-164) +-8 + j*(431) +-143 + j*(66) +98 + j*(66) +-65 + j*(92) +233 + j*(145) +-93 + j*(133) +28 + j*(-104) +-283 + j*(89) +91 + j*(-319) +53 + j*(111) +57 + j*(139) +90 + j*(88) +45 + j*(66) +-43 + j*(140) +307 + j*(127) +173 + j*(-86) +115 + j*(-327) +255 + j*(-238) +212 + j*(-170) +173 + j*(279) +49 + j*(142) +6 + j*(3) +218 + j*(184) +-39 + j*(-110) +-10 + j*(-238) +30 + j*(303) +35 + j*(-55) +6 + j*(-54) +140 + j*(-167) +62 + j*(52) +204 + j*(-169) +-64 + j*(163) +-135 + j*(70) +82 + j*(63) +21 + j*(80) +-81 + j*(-139) +-84 + j*(76) +-129 + j*(-13) +-10 + j*(-159) +27 + j*(192) +-158 + j*(118) +81 + j*(-167) +64 + j*(-67) +-82 + j*(48) +-18 + j*(102) +-343 + j*(83) +161 + j*(-159) +-10 + j*(460) +-13 + j*(-252) +148 + j*(-252) +-69 + j*(61) +-152 + j*(48) +38 + j*(137) +90 + j*(40) +39 + j*(-65) +85 + j*(244) +-76 + j*(-138) +-209 + j*(59) +-16 + j*(-194) +424 + j*(175) +-57 + j*(-143) +21 + j*(239) +93 + j*(93) +75 + j*(151) +-66 + j*(-127) +124 + j*(57) +78 + j*(142) +-124 + j*(107) +-184 + j*(-105) +-43 + j*(83) +86 + j*(50) +-46 + j*(1) +108 + j*(-211) +47 + j*(-100) +-136 + j*(-327) +45 + j*(124) +471 + j*(-310) +-72 + j*(52) +-329 + j*(-104) +34 + j*(260) +433 + j*(-45) +-202 + j*(-414) +-115 + j*(-4) +-67 + j*(143) +-21 + j*(462) +74 + j*(-28) +-301 + j*(-155) +107 + j*(-202) +-85 + j*(26) +-31 + j*(322) +416 + j*(352) +-236 + j*(-16) +15 + j*(235) +-250 + j*(120) +-171 + j*(-234) +380 + j*(-51) +301 + j*(91) +118 + j*(79) +20 + j*(-35) +106 + j*(175) +-217 + j*(-156) +146 + j*(156) +-88 + j*(237) +573 + j*(-96) +68 + j*(90) +31 + j*(-156) +-256 + j*(41) +119 + j*(249) +40 + j*(115) +82 + j*(131) +71 + j*(67) +-373 + j*(37) +78 + j*(-76) +-20 + j*(71) +-38 + j*(-23) +117 + j*(-29) +-78 + j*(-358) +-199 + j*(-98) +228 + j*(165) +51 + j*(-88) +-136 + j*(300) +76 + j*(46) +-58 + j*(-200) +82 + j*(-96) +-204 + j*(-250) +209 + j*(462) +-178 + j*(20) +-187 + j*(236) +296 + j*(-223) +-211 + j*(-119) +-232 + j*(199) +-223 + j*(-18) +101 + j*(165) +-349 + j*(-64) +-121 + j*(-27) +-192 + j*(513) +35 + j*(-97) +139 + j*(103) +209 + j*(-49) +97 + j*(73) +105 + j*(3) +54 + j*(-61) +-60 + j*(257) +112 + j*(57) +193 + j*(-144) +88 + j*(24) +150 + j*(-133) +42 + j*(90) +409 + j*(-157) +-37 + j*(-123) +156 + j*(136) +-146 + j*(61) +153 + j*(-356) +-45 + j*(-37) +-69 + j*(198) +-408 + j*(202) +-18 + j*(102) +259 + j*(-2) +220 + j*(-238) +-82 + j*(-42) +68 + j*(65) +-25 + j*(144) +303 + j*(-100) +6 + j*(81) +-25 + j*(47) +106 + j*(245) +-204 + j*(-276) +59 + j*(23) +-472 + j*(161) +-196 + j*(-26) +266 + j*(-304) +132 + j*(-221) +-108 + j*(28) +-82 + j*(-34) +-107 + j*(-3) +-110 + j*(91) +-11 + j*(-317) +106 + j*(76) +28 + j*(-119) +32 + j*(-52) +-256 + j*(33) +-46 + j*(-450) +-10 + j*(-294) +454 + j*(-266) +89 + j*(-168) +100 + j*(-173) +240 + j*(71) +69 + j*(-199) +-110 + j*(71) +-36 + j*(18) +-145 + j*(103) +-317 + j*(-51) +11 + j*(62) +184 + j*(78) +182 + j*(-217) +-168 + j*(-93) +-58 + j*(75) +-173 + j*(-167) +-139 + j*(153) +47 + j*(-235) +128 + j*(-67) +-226 + j*(143) +-220 + j*(-101) +240 + j*(-123) +-86 + j*(-377) +52 + j*(30) +-39 + j*(-147) +236 + j*(-35) +150 + j*(-226) +-52 + j*(-192) +-37 + j*(187) +-201 + j*(52) +-146 + j*(116) +-168 + j*(123) +54 + j*(-331) +-33 + j*(-58) +-139 + j*(-2) +23 + j*(-123) +94 + j*(-83) +127 + j*(158) +-29 + j*(-93) +148 + j*(269) +-21 + j*(227) +-178 + j*(-3) +-72 + j*(-140) +35 + j*(13) +-14 + j*(122) +-113 + j*(63) +-177 + j*(6) +-291 + j*(250) +-184 + j*(260) +-119 + j*(-229) +-255 + j*(-19) +-83 + j*(-202) +14 + j*(-102) +-83 + j*(91) +100 + j*(-115) +-289 + j*(83) +-209 + j*(-58) +-3 + j*(-247) +164 + j*(-134) +380 + j*(18) +40 + j*(-62) +-132 + j*(-80) +-1 + j*(-203) +-175 + j*(-139) +50 + j*(92) +-28 + j*(-29) +181 + j*(40) +-241 + j*(40) +221 + j*(166) +81 + j*(-112) +4 + j*(-86) +-7 + j*(-132) +-78 + j*(-117) +-152 + j*(92) +-62 + j*(-200) +-28 + j*(72) +186 + j*(-240) +-9 + j*(148) +81 + j*(-139) +-62 + j*(-86) +-14 + j*(-98) +125 + j*(-161) +-198 + j*(306) +-57 + j*(33) +122 + j*(-140) +-69 + j*(-103) +-66 + j*(308) +-9 + j*(206) +-63 + j*(33) +175 + j*(15) +-42 + j*(-182) +6 + j*(45) +-218 + j*(15) +-93 + j*(-39) +30 + j*(81) +66 + j*(405) +-52 + j*(373) +467 + j*(55) +17 + j*(81) +145 + j*(226) +-86 + j*(-193) +-112 + j*(-109) +203 + j*(-74) +-12 + j*(-225) +52 + j*(-145) +-61 + j*(330) +98 + j*(-218) +114 + j*(-56) +31 + j*(-127) +-337 + j*(-109) +212 + j*(-71) +-111 + j*(-33) +113 + j*(250) +195 + j*(-205) +-23 + j*(88) +151 + j*(-217) +105 + j*(-339) +139 + j*(275) +-42 + j*(407) +215 + j*(-210) +-390 + j*(-214) +-330 + j*(-141) +-125 + j*(-173) +164 + j*(-199) +262 + j*(43) +172 + j*(355) +69 + j*(151) +-35 + j*(-54) +-218 + j*(-117) +13 + j*(276) +-42 + j*(-181) +176 + j*(-191) +-174 + j*(-44) +-300 + j*(-130) +29 + j*(-37) +-274 + j*(-3) +-23 + j*(57) +122 + j*(-143) +215 + j*(17) +78 + j*(110) +-305 + j*(83) +-4 + j*(43) +92 + j*(-425) +-323 + j*(-36) +-18 + j*(-63) +63 + j*(8) +50 + j*(170) +105 + j*(79) +-18 + j*(-273) +-66 + j*(-273) +86 + j*(-55) +173 + j*(-37) +-87 + j*(30) +107 + j*(-247) +57 + j*(134) +-118 + j*(518) +164 + j*(-260) +155 + j*(-93) +95 + j*(42) +293 + j*(-62) +-26 + j*(250) +129 + j*(216) +86 + j*(69) +191 + j*(1) +214 + j*(-134) +-308 + j*(-433) +-33 + j*(-70) +-98 + j*(57) +116 + j*(19) +-248 + j*(185) +74 + j*(-148) +-2 + j*(-165) +32 + j*(238) +-4 + j*(170) +-112 + j*(-122) +343 + j*(62) +145 + j*(72) +-62 + j*(383) +-105 + j*(-106) +-480 + j*(200) +184 + j*(346) +83 + j*(-158) +187 + j*(170) +-105 + j*(-212) +-326 + j*(140) +240 + j*(-288) +107 + j*(-84) +-231 + j*(-215) +-162 + j*(99) +-205 + j*(202) +-89 + j*(170) +128 + j*(-134) +31 + j*(-245) +-21 + j*(45) +-5 + j*(32) +-71 + j*(138) +-300 + j*(55) +31 + j*(-25) +-2 + j*(153) +163 + j*(-122) +-132 + j*(-221) +192 + j*(62) +-168 + j*(4) +-10 + j*(-241) +193 + j*(-8) +31 + j*(-57) +-58 + j*(-64) +-134 + j*(-218) +78 + j*(-81) +-13 + j*(107) +-163 + j*(-23) +-287 + j*(189) +-226 + j*(-65) +54 + j*(-36) +25 + j*(260) +177 + j*(167) +-83 + j*(245) +-95 + j*(-302) +97 + j*(-70) +135 + j*(-128) +15 + j*(-54) +57 + j*(-5) +33 + j*(9) +196 + j*(297) +-26 + j*(-111) +-112 + j*(211) +-215 + j*(54) +-286 + j*(-7) +157 + j*(81) +626 + j*(96) +157 + j*(170) +-2 + j*(116) +-131 + j*(10) +443 + j*(48) +-343 + j*(-14) +-46 + j*(136) +235 + j*(98) +298 + j*(-99) +27 + j*(-122) +-303 + j*(269) +-65 + j*(-224) +86 + j*(119) +363 + j*(-146) +289 + j*(112) +416 + j*(-343) +23 + j*(62) +359 + j*(-118) +43 + j*(-156) +3 + j*(-25) +-28 + j*(112) +100 + j*(211) +-28 + j*(47) +-169 + j*(18) +107 + j*(-104) +-50 + j*(-117) +269 + j*(-52) +13 + j*(-81) +-108 + j*(12) +-103 + j*(-257) +-258 + j*(93) +-202 + j*(211) +-117 + j*(-83) +5 + j*(-173) +-289 + j*(281) +-30 + j*(175) +-20 + j*(-96) +177 + j*(40) +-42 + j*(-80) +-156 + j*(-88) +-87 + j*(56) +112 + j*(42) +-115 + j*(-334) +121 + j*(123) +-197 + j*(308) +43 + j*(-219) +-191 + j*(-131) +19 + j*(-239) +-103 + j*(-7) +-67 + j*(-83) +-372 + j*(-101) +211 + j*(-40) +-242 + j*(-88) +-66 + j*(-199) +-8 + j*(30) +183 + j*(-58) +59 + j*(220) +288 + j*(62) +233 + j*(109) +23 + j*(127) +-99 + j*(-173) +-48 + j*(-95) +182 + j*(167) +146 + j*(-223) +209 + j*(-64) +23 + j*(243) +65 + j*(78) +-36 + j*(30) +-384 + j*(-61) +187 + j*(9) +-46 + j*(-52) +187 + j*(-119) +26 + j*(199) +-296 + j*(-226) +224 + j*(-408) +-184 + j*(221) +-184 + j*(174) +83 + j*(107) +-125 + j*(-95) +417 + j*(197) +10 + j*(-238) +32 + j*(-39) +-59 + j*(161) +74 + j*(272) +291 + j*(139) +-144 + j*(81) +-321 + j*(0) +125 + j*(-56) +-44 + j*(32) +57 + j*(-141) +-115 + j*(32) +91 + j*(103) +-204 + j*(-151) +-112 + j*(-84) +-49 + j*(42) +67 + j*(-351) +-51 + j*(61) +-269 + j*(54) +-247 + j*(-315) +38 + j*(-28) +17 + j*(-354) +157 + j*(-127) +267 + j*(85) +137 + j*(-86) +-77 + j*(-158) +344 + j*(-275) +-101 + j*(136) +-156 + j*(-459) +-9 + j*(-119) +344 + j*(33) +16 + j*(-237) +74 + j*(-71) +-19 + j*(321) +228 + j*(-115) +-228 + j*(82) +-291 + j*(49) +-216 + j*(-457) +-161 + j*(-90) +-145 + j*(85) +-417 + j*(130) +-32 + j*(51) +-341 + j*(-24) +60 + j*(174) +-70 + j*(220) +-177 + j*(-25) +-42 + j*(-177) +141 + j*(-44) +126 + j*(-156) +180 + j*(-93) +239 + j*(-163) +-242 + j*(-108) +74 + j*(133) +24 + j*(-28) +-310 + j*(242) +134 + j*(201) +-296 + j*(119) +-98 + j*(-12) +69 + j*(71) +-313 + j*(-73) +28 + j*(-25) +62 + j*(-102) +-325 + j*(136) +322 + j*(-87) +64 + j*(247) +-152 + j*(86) +95 + j*(-110) +145 + j*(344) +95 + j*(-163) +-30 + j*(-364) +276 + j*(-101) +104 + j*(-206) +119 + j*(-93) +-153 + j*(324) +-3 + j*(-38) +70 + j*(83) +-1 + j*(-329) +-12 + j*(122) +41 + j*(104) +-51 + j*(-198) +129 + j*(61) +4 + j*(23) +214 + j*(-16) +-95 + j*(90) +-84 + j*(-9) +-159 + j*(78) +-108 + j*(278) +156 + j*(-250) +106 + j*(172) +184 + j*(155) +159 + j*(47) +-63 + j*(87) +-8 + j*(115) +-214 + j*(-180) +-78 + j*(-164) +63 + j*(-165) +-56 + j*(290) +-69 + j*(-195) +-155 + j*(53) +139 + j*(180) +205 + j*(-108) +30 + j*(342) +-103 + j*(37) +-204 + j*(-105) +-125 + j*(-243) +211 + j*(306) +-264 + j*(-107) +-119 + j*(-308) +34 + j*(163) +5 + j*(112) +279 + j*(43) +209 + j*(-43) +15 + j*(157) +262 + j*(-8) +26 + j*(194) +170 + j*(-77) +-65 + j*(-503) +18 + j*(-21) +228 + j*(-116) +-71 + j*(54) +98 + j*(-200) +273 + j*(0) +-126 + j*(-49) +118 + j*(-24) +-1 + j*(21) +-122 + j*(74) +247 + j*(-27) +-94 + j*(252) +31 + j*(-20) +153 + j*(44) +38 + j*(-140) +62 + j*(200) +-21 + j*(-37) +126 + j*(191) +-3 + j*(-28) +261 + j*(284) +-329 + j*(-189) +23 + j*(-105) +200 + j*(-269) +113 + j*(36) +61 + j*(151) +-50 + j*(49) +-150 + j*(-70) +-115 + j*(-88) +-46 + j*(-153) +100 + j*(92) +-61 + j*(138) +-35 + j*(-166) +-185 + j*(189) +254 + j*(-180) +47 + j*(464) +24 + j*(273) +-240 + j*(-223) +-3 + j*(-196) +-204 + j*(189) +-33 + j*(-244) +-112 + j*(-252) +-103 + j*(-173) +-12 + j*(-321) +-150 + j*(-90) +-26 + j*(238) +209 + j*(-52) +217 + j*(262) +-211 + j*(69) +165 + j*(177) +13 + j*(-94) +-110 + j*(-168) +167 + j*(-127) +-100 + j*(64) +98 + j*(164) +138 + j*(-101) +97 + j*(-344) +-255 + j*(33) +-40 + j*(-127) +99 + j*(-166) +-106 + j*(-271) +240 + j*(18) +-58 + j*(-147) +-145 + j*(50) +-203 + j*(-132) +12 + j*(-170) +-270 + j*(175) +-47 + j*(-71) +279 + j*(-226) +181 + j*(202) +24 + j*(13) +65 + j*(148) +-98 + j*(240) +36 + j*(206) +134 + j*(12) +-144 + j*(-184) +-402 + j*(83) +-103 + j*(119) +-62 + j*(-148) +-113 + j*(202) +-266 + j*(41) +185 + j*(-2) +-196 + j*(-76) +-123 + j*(-203) +-195 + j*(-21) +-23 + j*(232) +-156 + j*(225) +219 + j*(152) +155 + j*(-184) +-100 + j*(-13) +-29 + j*(-129) +357 + j*(-53) +192 + j*(-126) +-6 + j*(-172) +57 + j*(114) +183 + j*(-358) +47 + j*(-211) +-42 + j*(131) +-194 + j*(-122) +-171 + j*(304) +31 + j*(95) +-160 + j*(281) +37 + j*(-166) +-142 + j*(37) +6 + j*(342) +-55 + j*(-177) +-20 + j*(-42) +-351 + j*(87) +225 + j*(-8) +92 + j*(258) +71 + j*(83) +103 + j*(-59) +182 + j*(42) +78 + j*(-264) +-153 + j*(-325) +-160 + j*(25) +21 + j*(91) +-123 + j*(-245) +81 + j*(-151) +277 + j*(63) +-86 + j*(-250) +-173 + j*(30) +86 + j*(-86) +11 + j*(95) +61 + j*(-32) +-122 + j*(25) +-52 + j*(-103) +-93 + j*(445) +105 + j*(16) +-68 + j*(-42) +129 + j*(-107) +-199 + j*(-258) +-273 + j*(108) +93 + j*(4) +176 + j*(-44) +98 + j*(-21) +-145 + j*(-4) +-192 + j*(22) +-33 + j*(96) +-176 + j*(-115) +-29 + j*(47) +-221 + j*(98) +139 + j*(249) +260 + j*(-54) +-64 + j*(-2) +252 + j*(-52) +150 + j*(-151) +6 + j*(145) +-78 + j*(136) +315 + j*(91) +30 + j*(91) +-70 + j*(2) +105 + j*(-147) +-159 + j*(380) +475 + j*(-3) +221 + j*(130) +224 + j*(-352) +23 + j*(180) +57 + j*(19) +-322 + j*(94) +-28 + j*(-117) +156 + j*(-285) +68 + j*(109) +-77 + j*(-47) +87 + j*(-23) +392 + j*(44) +-187 + j*(-203) +-108 + j*(-540) +-227 + j*(45) +2 + j*(-269) +-64 + j*(204) +-185 + j*(-205) +-119 + j*(2) +404 + j*(-132) +-144 + j*(20) +160 + j*(181) +-283 + j*(86) +33 + j*(-139) +-195 + j*(69) +117 + j*(-152) +-308 + j*(-221) +337 + j*(127) +-18 + j*(-202) +118 + j*(-132) +13 + j*(-235) +-29 + j*(-47) +206 + j*(41) +-243 + j*(306) +5 + j*(137) +-48 + j*(42) +-547 + j*(-230) +-20 + j*(53) +-49 + j*(0) +20 + j*(211) +-115 + j*(359) +22 + j*(158) +-108 + j*(-13) +169 + j*(-289) +92 + j*(69) +-124 + j*(95) +113 + j*(-54) +-382 + j*(-159) +274 + j*(214) +-21 + j*(224) +29 + j*(59) +496 + j*(233) +-115 + j*(-141) +246 + j*(-170) +-75 + j*(-33) +251 + j*(-71) +7 + j*(144) +119 + j*(-99) +197 + j*(16) +52 + j*(-139) +17 + j*(-294) +-66 + j*(177) +-299 + j*(-142) +139 + j*(142) +34 + j*(126) +16 + j*(260) +90 + j*(44) +-303 + j*(196) +67 + j*(-71) +74 + j*(179) +211 + j*(-202) +349 + j*(378) +444 + j*(3) +31 + j*(98) +-217 + j*(-99) +35 + j*(98) +-111 + j*(211) +253 + j*(69) +312 + j*(-1) +139 + j*(163) +-30 + j*(5) +-177 + j*(112) +-195 + j*(211) +-254 + j*(-32) +-90 + j*(8) +170 + j*(-214) +254 + j*(257) +-179 + j*(6) +-69 + j*(202) +98 + j*(128) +-197 + j*(-299) +-250 + j*(-177) +156 + j*(-23) +-64 + j*(-156) +-35 + j*(-64) +32 + j*(101) +-92 + j*(-60) +180 + j*(22) +21 + j*(134) +166 + j*(-83) +423 + j*(7) +12 + j*(219) +37 + j*(168) +1 + j*(118) +42 + j*(-40) +-148 + j*(-71) +-93 + j*(-12) +-103 + j*(-221) +298 + j*(49) +56 + j*(91) +340 + j*(52) +-117 + j*(132) +10 + j*(24) +-24 + j*(151) +-82 + j*(-61) +126 + j*(-199) +-42 + j*(249) +102 + j*(74) +53 + j*(126) +245 + j*(161) +-50 + j*(285) +106 + j*(136) +235 + j*(-6) +120 + j*(-202) +165 + j*(-13) +-181 + j*(81) +318 + j*(-256) +-25 + j*(137) +153 + j*(128) +123 + j*(-73) +61 + j*(51) +-190 + j*(268) +-363 + j*(214) +11 + j*(42) +75 + j*(-95) +-62 + j*(-16) +-15 + j*(-403) +-33 + j*(-66) +95 + j*(64) +-129 + j*(-220) +-33 + j*(33) +-38 + j*(-90) +103 + j*(-49) +252 + j*(227) +25 + j*(-282) +98 + j*(64) +151 + j*(-88) +-182 + j*(117) +-89 + j*(-91) +-313 + j*(-100) +-117 + j*(-107) +8 + j*(-174) +-83 + j*(-45) +-324 + j*(83) +47 + j*(70) +97 + j*(81) +223 + j*(375) +43 + j*(13) +-156 + j*(103) +-112 + j*(117) +-36 + j*(65) +-18 + j*(174) +-209 + j*(-86) +173 + j*(-186) +130 + j*(-262) +1 + j*(74) +-180 + j*(31) +-285 + j*(295) +-158 + j*(-69) +-165 + j*(86) +-221 + j*(-175) +-166 + j*(47) +-202 + j*(162) +263 + j*(47) +187 + j*(-681) +63 + j*(-173) +74 + j*(119) +23 + j*(-364) +-226 + j*(-106) +-11 + j*(293) +32 + j*(243) +63 + j*(-235) +-28 + j*(42) +-165 + j*(228) +375 + j*(98) +-142 + j*(115) +131 + j*(85) +41 + j*(-390) +202 + j*(339) +-311 + j*(91) +194 + j*(-33) +49 + j*(479) +59 + j*(-524) +310 + j*(266) +131 + j*(-93) +77 + j*(6) +-170 + j*(180) +45 + j*(165) +-6 + j*(151) +291 + j*(-45) +-74 + j*(163) +70 + j*(148) +209 + j*(-54) +-52 + j*(296) +426 + j*(-81) +6 + j*(100) +305 + j*(14) +37 + j*(95) +11 + j*(294) +-152 + j*(-21) +-30 + j*(-151) +47 + j*(-141) +391 + j*(12) +-60 + j*(-167) +16 + j*(110) +161 + j*(6) +213 + j*(158) +35 + j*(-8) +231 + j*(-83) +119 + j*(190) +-35 + j*(191) +35 + j*(339) +-9 + j*(35) +249 + j*(-193) +-153 + j*(162) +175 + j*(-298) +-35 + j*(150) +-11 + j*(-353) +231 + j*(-64) +-139 + j*(-264) +-25 + j*(203) +105 + j*(-223) +94 + j*(125) +150 + j*(-11) +170 + j*(71) +69 + j*(13) +128 + j*(126) +-145 + j*(44) +-33 + j*(166) +-4 + j*(153) +-42 + j*(0) +-281 + j*(40) +-43 + j*(230) +-202 + j*(-315) +210 + j*(-83) +193 + j*(-252) +221 + j*(-6) +-262 + j*(81) +-247 + j*(58) +66 + j*(122) +73 + j*(-110) +-47 + j*(-16) +-62 + j*(54) +153 + j*(-28) +-28 + j*(-310) +55 + j*(-151) +92 + j*(27) +-258 + j*(-75) +206 + j*(-6) +66 + j*(60) +-139 + j*(-156) +50 + j*(134) +-24 + j*(103) +165 + j*(155) +30 + j*(206) +67 + j*(74) +5 + j*(-52) +-168 + j*(-119) +69 + j*(59) +54 + j*(-223) +-196 + j*(1) +217 + j*(-269) +88 + j*(282) +-47 + j*(33) +-124 + j*(-10) +-184 + j*(-282) +-325 + j*(94) +40 + j*(331) +-44 + j*(-128) +56 + j*(163) +-107 + j*(-361) +278 + j*(120) +62 + j*(84) +206 + j*(219) +-192 + j*(-233) +170 + j*(-263) +71 + j*(-114) +260 + j*(293) +-4 + j*(91) +-110 + j*(-105) +-269 + j*(-175) +-282 + j*(210) +213 + j*(-96) +312 + j*(33) +-138 + j*(-117) +18 + j*(-124) +75 + j*(-114) +-409 + j*(21) +-54 + j*(98) +78 + j*(-160) +42 + j*(-13) +-27 + j*(-368) +-54 + j*(191) +87 + j*(95) +-26 + j*(110) +15 + j*(-362) +325 + j*(-46) +-42 + j*(-44) +108 + j*(-125) +-49 + j*(117) +-66 + j*(71) +-21 + j*(-75) +-243 + j*(-115) +-77 + j*(46) +162 + j*(222) +165 + j*(131) +72 + j*(-66) +-47 + j*(21) +112 + j*(-103) +130 + j*(-159) +64 + j*(-24) +124 + j*(-74) +-255 + j*(204) +144 + j*(221) +28 + j*(-227) +-13 + j*(278) +328 + j*(190) +253 + j*(482) +187 + j*(-18) +-191 + j*(-597) +204 + j*(-31) +-57 + j*(144) +-252 + j*(-190) +221 + j*(-197) +35 + j*(139) +43 + j*(-66) +-35 + j*(-119) +288 + j*(-279) +195 + j*(100) +215 + j*(312) +-47 + j*(-114) +-228 + j*(-92) +49 + j*(216) +-376 + j*(82) +-26 + j*(-35) +280 + j*(58) +-412 + j*(-246) +-158 + j*(-41) +-95 + j*(316) +124 + j*(-209) +-127 + j*(105) +69 + j*(89) +-215 + j*(272) +88 + j*(-143) +112 + j*(-29) +69 + j*(40) +-50 + j*(-23) +163 + j*(7) +69 + j*(-132) +60 + j*(115) +25 + j*(-206) +-172 + j*(176) +-535 + j*(-53) +141 + j*(52) +179 + j*(69) +65 + j*(29) +12 + j*(-180) +-205 + j*(64) +82 + j*(136) +62 + j*(-64) +194 + j*(264) +-332 + j*(177) +-65 + j*(373) +34 + j*(107) +-112 + j*(208) +140 + j*(-209) +269 + j*(4) +-247 + j*(-40) +-70 + j*(68) +-179 + j*(-117) +102 + j*(-54) +148 + j*(-216) +446 + j*(35) +281 + j*(-202) +-71 + j*(-89) +180 + j*(161) +-77 + j*(-236) +-33 + j*(-301) +-11 + j*(-132) +71 + j*(-301) +-94 + j*(43) +-209 + j*(-148) +204 + j*(-35) +137 + j*(-66) +8 + j*(54) +-186 + j*(-173) +-82 + j*(-146) +-218 + j*(-95) +202 + j*(-250) +212 + j*(-194) +-2 + j*(-124) +-425 + j*(190) +-10 + j*(-141) +-445 + j*(27) +-66 + j*(-164) +13 + j*(-260) +-109 + j*(132) +79 + j*(165) +39 + j*(259) +173 + j*(110) +35 + j*(264) +-13 + j*(197) +-47 + j*(-209) +-219 + j*(-66) +93 + j*(142) +-129 + j*(-158) +49 + j*(213) +270 + j*(57) +-144 + j*(-371) +-7 + j*(40) +276 + j*(-67) +-144 + j*(94) +-177 + j*(-30) +-61 + j*(-129) +-596 + j*(331) +-67 + j*(214) +-144 + j*(59) +-301 + j*(-268) +-146 + j*(-204) +-117 + j*(-105) +90 + j*(24) +-30 + j*(35) +-166 + j*(-23) +92 + j*(-79) +106 + j*(-62) +127 + j*(400) +-154 + j*(68) +31 + j*(354) +144 + j*(-104) +56 + j*(170) +-74 + j*(25) +-240 + j*(204) +-111 + j*(-112) +-57 + j*(69) +17 + j*(-59) +-76 + j*(86) +-168 + j*(262) +-66 + j*(97) +-360 + j*(224) +-159 + j*(42) +-131 + j*(-4) +-68 + j*(-267) +110 + j*(151) +-110 + j*(-136) +-171 + j*(-18) +-81 + j*(-235) +-236 + j*(173) +378 + j*(-101) +-203 + j*(47) +61 + j*(47) +12 + j*(349) +291 + j*(73) +-470 + j*(73) +339 + j*(48) +-1 + j*(-18) +-132 + j*(-96) +86 + j*(63) +-191 + j*(-190) +-142 + j*(-22) +-134 + j*(-180) +-326 + j*(52) +-198 + j*(-278) +-88 + j*(146) +-207 + j*(33) +-192 + j*(-90) +-55 + j*(-57) +-156 + j*(64) +-332 + j*(327) +235 + j*(-50) +65 + j*(373) +107 + j*(-127) +122 + j*(98) +123 + j*(-29) +-61 + j*(-6) +-35 + j*(58) +96 + j*(-22) +35 + j*(63) +123 + j*(-92) +172 + j*(-159) +240 + j*(57) +-175 + j*(92) +-87 + j*(-8) +122 + j*(-253) +-236 + j*(-38) +-163 + j*(300) +-310 + j*(40) +87 + j*(-207) +454 + j*(68) +-103 + j*(-186) +250 + j*(115) +474 + j*(156) +51 + j*(22) +31 + j*(2) +75 + j*(-193) +-36 + j*(168) +162 + j*(-11) +86 + j*(187) +-86 + j*(-121) +77 + j*(-82) +222 + j*(-158) +-19 + j*(-135) +188 + j*(279) +-4 + j*(198) +54 + j*(30) +-199 + j*(173) +37 + j*(206) +-16 + j*(359) +24 + j*(-164) +211 + j*(-117) +56 + j*(99) +-17 + j*(32) +100 + j*(-287) +-289 + j*(9) +122 + j*(158) +318 + j*(13) +59 + j*(-168) +78 + j*(218) +-42 + j*(191) +-202 + j*(-32) +74 + j*(99) +-167 + j*(98) +64 + j*(343) +119 + j*(-105) +-218 + j*(131) +-116 + j*(-496) +44 + j*(267) +-109 + j*(222) +42 + j*(40) +-15 + j*(164) +-74 + j*(308) +-1 + j*(-144) +-284 + j*(186) +146 + j*(-49) +-244 + j*(240) +-19 + j*(-161) +43 + j*(320) +-136 + j*(20) +247 + j*(0) +69 + j*(-146) +-141 + j*(400) +-21 + j*(-227) +139 + j*(-40) +275 + j*(-26) +-157 + j*(34) +28 + j*(83) +-578 + j*(-7) +-135 + j*(73) +76 + j*(148) +-310 + j*(-154) +210 + j*(123) +52 + j*(-453) +-257 + j*(14) +23 + j*(20) +130 + j*(202) +45 + j*(223) +299 + j*(-381) +-103 + j*(-58) +39 + j*(40) +-42 + j*(86) +161 + j*(-38) +129 + j*(-187) +-84 + j*(-164) +8 + j*(-97) +110 + j*(172) +247 + j*(356) +-310 + j*(-209) +46 + j*(13) +291 + j*(-132) +44 + j*(228) +-43 + j*(166) +-258 + j*(121) +-17 + j*(-28) +327 + j*(-172) +336 + j*(153) +321 + j*(-74) +83 + j*(-168) +3 + j*(-115) +28 + j*(276) +124 + j*(-30) +88 + j*(-173) +341 + j*(-122) +-32 + j*(288) +143 + j*(150) +-389 + j*(-63) +-136 + j*(4) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +]; diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index fecc4abb63f..e094c9eb007 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -192,6 +192,7 @@ typedef struct { //! \brief Center frequency in Hz for TX. //! index: [0..rx_num_channels[ !!! see lte-ue.c:427 FIXME iterates over rx_num_channels double tx_freq[4]; + double tune_offset; //! \brief memory //! \brief Pointer to Calibration table for RX gains rx_gain_calib_table_t *rx_gain_calib_table; @@ -383,7 +384,7 @@ struct openair0_device_t { @param buff Buffer which holds the samples (2 dimensional) @param nsamps number of samples to be sent @param number of antennas - @param flags flags must be set to TRUE if timestamp parameter needs to be applied + @param flags flags must be set to true if timestamp parameter needs to be applied */ int (*trx_write_func)(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int antenna_id, int flags); @@ -393,7 +394,7 @@ struct openair0_device_t { @param buff Buffer which holds the samples (1 dimensional) @param nsamps number of samples to be sent @param antenna_id index of the antenna if the device has multiple anteannas - @param flags flags must be set to TRUE if timestamp parameter needs to be applied + @param flags flags must be set to true if timestamp parameter needs to be applied */ int (*trx_write_func2)(openair0_device *device, openair0_timestamp timestamp, void *buff, int nsamps,int antenna_id, int flags); diff --git a/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp b/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp index 1273097f3b9..47bbadfe282 100644 --- a/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp +++ b/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp @@ -134,7 +134,7 @@ static void trx_iris_end(openair0_device *device) { @param buff Buffer which holds the samples @param nsamps number of samples to be sent @param antenna_id index of the antenna if the device has multiple anteannas - @param flags flags must be set to TRUE if timestamp parameter needs to be applied + @param flags flags must be set to true if timestamp parameter needs to be applied */ diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index ed17d7eefd3..cc1062c6f2f 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -335,7 +335,7 @@ static void trx_usrp_end(openair0_device *device) { @param buff Buffer which holds the samples @param nsamps number of samples to be sent @param antenna_id index of the antenna if the device has multiple antennas - @param flags flags must be set to TRUE if timestamp parameter needs to be applied + @param flags flags must be set to true if timestamp parameter needs to be applied */ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, @@ -356,7 +356,7 @@ static int trx_usrp_write(openair0_device *device, AssertFatal( MAX_WRITE_THREAD_BUFFER_SIZE >= cc,"Do not support more than %d cc number\n", MAX_WRITE_THREAD_BUFFER_SIZE); - boolean_t first_packet_state=false,last_packet_state=false; + bool first_packet_state=false,last_packet_state=false; if (flags_lsb == 2) { // start of burst // s->tx_md.start_of_burst = true; @@ -492,7 +492,7 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHI @param buff Buffer which holds the samples @param nsamps number of samples to be sent @param antenna_id index of the antenna if the device has multiple antennas - @param flags flags must be set to TRUE if timestamp parameter needs to be applied + @param flags flags must be set to true if timestamp parameter needs to be applied */ void *trx_usrp_write_thread(void * arg){ int ret=0; @@ -662,6 +662,7 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp break; case USRP_X300_DEV: case USRP_N300_DEV: + case USRP_X400_DEV: rxshift=2; break; default: @@ -692,7 +693,7 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp } if (samples_received == nsamps) s->wait_for_first_pps=0; - // bring RX data into 12 LSBs for softmodem RX + // bring RX data into 12 LSBs for softmodem RX for (int i=0; i<cc; i++) { for (int j=0; j<nsamps2; j++) { #if defined(__x86_64__) || defined(__i386__) @@ -770,8 +771,12 @@ static bool is_equal(double a, double b) { void *freq_thread(void *arg) { openair0_device *device=(openair0_device *)arg; usrp_state_t *s = (usrp_state_t *)device->priv; - s->usrp->set_tx_freq(device->openair0_cfg[0].tx_freq[0]); - s->usrp->set_rx_freq(device->openair0_cfg[0].rx_freq[0]); + uhd::tune_request_t tx_tune_req(device->openair0_cfg[0].tx_freq[0], + device->openair0_cfg[0].tune_offset); + uhd::tune_request_t rx_tune_req(device->openair0_cfg[0].rx_freq[0], + device->openair0_cfg[0].tune_offset); + s->usrp->set_tx_freq(tx_tune_req); + s->usrp->set_rx_freq(rx_tune_req); return NULL; } /*! \brief Set frequencies (TX/RX). Spawns a thread to handle the frequency change to not block the calling thread @@ -783,14 +788,18 @@ void *freq_thread(void *arg) { int trx_usrp_set_freq(openair0_device *device, openair0_config_t *openair0_cfg, int dont_block) { usrp_state_t *s = (usrp_state_t *)device->priv; pthread_t f_thread; - printf("Setting USRP TX Freq %f, RX Freq %f\n",openair0_cfg[0].tx_freq[0],openair0_cfg[0].rx_freq[0]); + printf("Setting USRP TX Freq %f, RX Freq %f, tune_offset: %f, dont_block: %d\n", + openair0_cfg[0].tx_freq[0],openair0_cfg[0].rx_freq[0], + openair0_cfg[0].tune_offset, dont_block); // spawn a thread to handle the frequency change to not block the calling thread if (dont_block == 1) pthread_create(&f_thread,NULL,freq_thread,(void *)device); else { - s->usrp->set_tx_freq(device->openair0_cfg[0].tx_freq[0]); - s->usrp->set_rx_freq(device->openair0_cfg[0].rx_freq[0]); + uhd::tune_request_t tx_tune_req(openair0_cfg[0].tx_freq[0], openair0_cfg[0].tune_offset); + uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[0], openair0_cfg[0].tune_offset); + s->usrp->set_tx_freq(tx_tune_req); + s->usrp->set_rx_freq(rx_tune_req); } return(0); @@ -803,9 +812,11 @@ int trx_usrp_set_freq(openair0_device *device, openair0_config_t *openair0_cfg, */ int openair0_set_rx_frequencies(openair0_device *device, openair0_config_t *openair0_cfg) { usrp_state_t *s = (usrp_state_t *)device->priv; - uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[0]); - rx_tune_req.rf_freq_policy = uhd::tune_request_t::POLICY_MANUAL; - rx_tune_req.rf_freq = openair0_cfg[0].rx_freq[0]; + uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[0], openair0_cfg[0].tune_offset); + printf("In openair0_set_rx_frequencies, freq: %f, tune offset: %f\n", + openair0_cfg[0].rx_freq[0], openair0_cfg[0].tune_offset); + //rx_tune_req.rf_freq_policy = uhd::tune_request_t::POLICY_MANUAL; + //rx_tune_req.rf_freq = openair0_cfg[0].rx_freq[0]; s->usrp->set_rx_freq(rx_tune_req); return(0); } @@ -1043,9 +1054,13 @@ extern "C" { } if (device_adds[0].get("type") == "n3xx") { - printf("Found USRP n300\n"); + const std::string product = device_adds[0].get("product"); + printf("Found USRP %s\n", product.c_str()); device->type=USRP_N300_DEV; - usrp_master_clock = 122.88e6; + if (product == "n320") + usrp_master_clock = 245.76e6; // N320 does not support 122.88e6 master clock rate + else + usrp_master_clock = 122.88e6; args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock); if ( 0 != system("sysctl -w net.core.rmem_max=62500000 net.core.wmem_max=62500000") ) @@ -1329,7 +1344,9 @@ extern "C" { for(int i=0; i<((int) s->usrp->get_rx_num_channels()); i++) { if (i<openair0_cfg[0].rx_num_channels) { s->usrp->set_rx_rate(openair0_cfg[0].sample_rate,i+choffset); - s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i+choffset); + uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[i], + openair0_cfg[0].tune_offset); + s->usrp->set_rx_freq(rx_tune_req, i+choffset); set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust); ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i+choffset); // limit to maximum gain @@ -1355,7 +1372,9 @@ extern "C" { if (i<openair0_cfg[0].tx_num_channels) { s->usrp->set_tx_rate(openair0_cfg[0].sample_rate,i+choffset); - s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i+choffset); + uhd::tune_request_t tx_tune_req(openair0_cfg[0].tx_freq[i], + openair0_cfg[0].tune_offset); + s->usrp->set_tx_freq(tx_tune_req, i+choffset); s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i+choffset); LOG_I(HW,"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf\n", gain_range_tx.stop()-openair0_cfg[0].tx_gain[i], gain_range_tx.stop(), openair0_cfg[0].tx_gain[i]); } diff --git a/targets/ARCH/iqplayer/iqplayer_lib.c b/targets/ARCH/iqplayer/iqplayer_lib.c index b62c1935d36..f6578d6e9a3 100644 --- a/targets/ARCH/iqplayer/iqplayer_lib.c +++ b/targets/ARCH/iqplayer/iqplayer_lib.c @@ -158,7 +158,7 @@ static void trx_iqplayer_end(openair0_device *device) { @param buff Buffer which holds the samples @param nsamps number of samples to be sent @param antenna_id index of the antenna if the device has multiple antennas - @param flags flags must be set to TRUE if timestamp parameter needs to be applied + @param flags flags must be set to true if timestamp parameter needs to be applied */ static int trx_iqplayer_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { struct timespec req; diff --git a/targets/ARCH/rfsimulator/README.md b/targets/ARCH/rfsimulator/README.md index 4a8d5ff79ac..feb7f015b96 100644 --- a/targets/ARCH/rfsimulator/README.md +++ b/targets/ARCH/rfsimulator/README.md @@ -61,6 +61,8 @@ Setting the env variable RFSIMULATOR can be used instead of using the serveraddr ## How to use the RF simulator options +To define and use a channel model, the configuration file needs to include a channel configuration file. To do this, add `@include "channelmod_rfsimu.conf"` to the end of the configuration file, and place the channel configuration file in the same directory. An example channel configuration file `channelmod_rfsimu.conf` is in `ci-scripts/conf_files`. + Add the following options to the command line to enable the channel model and the IQ samples saving for future replay: ```bash --rfsimulator.options chanmod,saviq @@ -82,6 +84,8 @@ Example run: sudo RFSIMULATOR=server ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --parallel-config PARALLEL_SINGLE_THREAD --rfsim --phy-test --rfsimulator.options chanmod --rfsimulator.modelname AWGN ``` +where `@include "channelmod_rfsimu.conf"` has been added at the end of the file, and `ci-scripts/conf_files/channelmod_rfsimu.conf` copied to `targets/PROJECTS/GENERIC-LTE-EPC/CONF/`. + ## 4G case For the UE, it should be set to the IP address of the eNB. For example: @@ -102,9 +106,7 @@ $OPENAIR_DIR/targets/bin/conf2uedata -c $OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurec ## 5G case -The 5G RF simulator will be aligned with the 4G as the efforts for merging the 5G specific branches into the develop make progresses. - -After regular build, add the simulation driver (do not use ./build_oai -w SIMU until 4G and 5G branches are merged). +If `build_oai` has not been run with `-w SIMU`, you need to build the `rfsimulator` manually. To do so: ```bash cd ran_build/build make rfsimulator @@ -113,7 +115,7 @@ make rfsimulator ### Launch gNB in one window ```bash -sudo RFSIMULATOR=server ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --parallel-config PARALLEL_SINGLE_THREAD --rfsim --phy-test +sudo RFSIMULATOR=server ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --parallel-config PARALLEL_SINGLE_THREAD --rfsim --phy-test --nokrnmod 1 ``` ### Launch UE in another window @@ -124,15 +126,17 @@ sudo RFSIMULATOR=<TARGET_GNB_INTERFACE_ADDRESS> ./nr-uesoftmodem --rfsim --phy-t Notes: -1. <TARGET_GNB_INTERFACE_ADDRESS> can be 127.0.0.1 if both gNB and nrUE executables run on the same host, OR the IP interface address of the remote host running the gNB executable, if the gNB and nrUE run on separate hosts -2. the --rrc_config_path parameter SHALL specify where the 2 RAW files are located (`rbconfig.raw` and `reconfig.raw`). +1. This starts the gNB and UE in the `phy-test` UP-only mode where the gNB is started as if a UE had already connected, and a configurable scheduler is used instead of the default one. The options `-m`, `-l`, `-t`, `-M`, `-T`, `-D`, and `-U` can be used to configure this scheduler. +2. <TARGET_GNB_INTERFACE_ADDRESS> can be 127.0.0.1 if both gNB and nrUE executables run on the same host, OR the IP interface address of the remote host running the gNB executable, if the gNB and nrUE run on separate hosts. +3. The --rrc_config_path parameter SHALL specify where the 2 RAW files are located (`rbconfig.raw` and `reconfig.raw`). - If you are running on the same machine and launched the 2 executables (`nr-softmodem` and `nr-uesoftmodem`) from the same directory, nothing has to be done. - If you launched the 2 executables from 2 different folders, just point to the location where you launched the `nr-softmodem`: * `sudo RFSIMULATOR=<TARGET_GNB_INTERFACE_ADDRESS> ./nr-uesoftmodem --rfsim --phy-test --rrc_config_path /the/path/where/you/launched/nr-softmodem` - If you are not running on the same machine or launched the 2 executables from 2 different folders, you need to **COPY** the 2 raw files * `scp usera@machineA:/the/path/where/you/launched/nr-softmodem/r*config.raw userb@machineB:/the/path/where/you/will/launch/nr-uesoftmodem/` * Obviously this operation SHALL be done before launching the `nr-uesoftmodem` executable. -3. to enable the noS1 mode --noS1 and --nokrnmod 1 options should be added to the command line +4. To enable the noS1 mode, `--noS1` option should be added to the command line. +5. To operate the gNB/UE with a 5GC, start them using the `--sa` option. More information can be found [here](../../../doc/TESTING_5GSA_setup.md#2-sa-setup-with-oai-nr-ue-softmodem). In the UE, you can add `-d` option to get the softscope. diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c index bc9882b4bd2..127b2975d58 100644 --- a/targets/ARCH/rfsimulator/simulator.c +++ b/targets/ARCH/rfsimulator/simulator.c @@ -429,6 +429,8 @@ static int rfsimulator_write_internal(rfsimulator_state_t *t, openair0_timestamp if (!alreadyLocked) pthread_mutex_lock(&Sockmutex); + LOG_D(HW,"sending %d samples at time: %ld, nbAnt %d\n", nsamps, timestamp, nbAnt); + for (int i=0; i<FD_SETSIZE; i++) { buffer_t *b=&t->buf[i]; @@ -621,7 +623,7 @@ static int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimest } rfsimulator_state_t *t = device->priv; - LOG_D(HW, "Enter rfsimulator_read, expect %d samples, will release at TS: %ld\n", nsamps, t->nextRxTstamp+nsamps); + LOG_D(HW, "Enter rfsimulator_read, expect %d samples, will release at TS: %ld, nbAnt %d\n", nsamps, t->nextRxTstamp+nsamps, nbAnt); // deliver data from received data // check if a UE is connected int first_sock; @@ -693,15 +695,16 @@ static int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimest t->poll_telnetcmdq(t->telnetcmd_qid,t); for (int a=0; a<nbAnt; a++) {//loop over number of Rx antennas - if ( ptr->channel_model != NULL ) // apply a channel model - rxAddInput( ptr->circularBuf, (c16_t *) samplesVoid[a], - a, - ptr->channel_model, - nsamps, - t->nextRxTstamp, - CirSize - ); + if ( ptr->channel_model != NULL ) { // apply a channel model + rxAddInput(ptr->circularBuf, (c16_t *) samplesVoid[a], + a, + ptr->channel_model, + nsamps, + t->nextRxTstamp, + CirSize); + } else { // no channel modeling + double H_awgn_mimo[4][4] ={{1.0, 0.2, 0.1, 0.05}, //rx 0 {0.2, 1.0, 0.2, 0.1}, //rx 1 {0.1, 0.2, 1.0, 0.2}, //rx 2 diff --git a/targets/ARCH/rfsimulator/stored_node.c b/targets/ARCH/rfsimulator/stored_node.c index cf025680cd7..17ab3cb7343 100644 --- a/targets/ARCH/rfsimulator/stored_node.c +++ b/targets/ARCH/rfsimulator/stored_node.c @@ -187,7 +187,7 @@ int main(int argc, char *argv[]) { } uint64_t typeStamp=ENB_MAGICDL; - boolean_t raw=false; + bool raw = false; if ( argc == 5 ) { raw=true; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf index d14267dcd84..c8e109d3023 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf @@ -22,7 +22,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf index 4682dd39344..358c2fc2eed 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf index ab435c96866..e5478983cff 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf index 912a9f328b3..14040dfe4fb 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf @@ -21,8 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - servingCellConfigCommon = ( { #spCellConfigCommon diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf index 426f9e782b1..8a2ce9f63ec 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf index 216728577a7..616f86a1cd6 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf index 59d466656c6..0818fe11d7c 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf @@ -21,8 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - servingCellConfigCommon = ( { #spCellConfigCommon diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf new file mode 100644 index 00000000000..022f17e490e --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf @@ -0,0 +1,263 @@ +Active_gNBs = ( "gNB-Eurecom-5GNRBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + + cell_type = "CELL_MACRO_GNB"; + + gNB_name = "gNB-Eurecom-5GNRBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + + plmn_list = ({mcc = 208; mnc = 93; mnc_length = 2;}); + + tr_s_preference = "local_mac"; + + ////////// Physical parameters: + + min_rxtxtime = 6; + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 2150 MHz + 12 PRBs@15kHz SCS (same as initial BWP), points to Subcarrier 0 of RB#10 of SSB block + absoluteFrequencySSB = 430432; + dl_frequencyBand = 66; + # this is 2150 MHz + dl_absoluteFrequencyPointA = 430000; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 0; + dl_carrierBandwidth = 25; + #initialDownlinkBWP + #genericParameters + # this is RBstart=0,L=25 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 6600; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 0; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 0; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 66; + ul_absoluteFrequencyPointA = 350000; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 0; + ul_carrierBandwidth = 25; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 6600; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 0; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 13; + preambleReceivedTargetPower = -118; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + msg1_SubcarrierSpacing = 0; +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0; + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -90; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 0x1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 0; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 0; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.26"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + GNB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; + GNB_INTERFACE_NAME_FOR_S1U = "eth0"; + GNB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + } +); + +L1s = ( + { + num_cc = 1; + tr_n_preference = "local_mac"; + thread_pool_size = 8; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 + } +); + +RUs = ( + { + local_rf = "yes"; + nb_tx = 1; + nb_rx = 1; + att_tx = 0; + att_rx = 0; + bands = [7]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 50; + eNB_instances = [0]; + ## beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000]; + ## beamforming 1x4 matrix: 1 layer x 4 antennas + #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000]; + ## beamforming 2x2 matrix: + #bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff]; + ## beamforming 4x4 matrix: + #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; + sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2"; + clock_src = "external"; + # if_freq = 3700000000L; + # if_offset = 1000000; + } +); + +THREAD_STRUCT = ( + { + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_RU_L1_TRX_SPLIT"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_DISABLE"; + } +); + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + + log_config : + { + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + }; + diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf index 2ae4df07d9c..5c636af06c0 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf index 21267870bd5..812ac8dafbc 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf index a0fd0bda9f0..781384a7891 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf @@ -20,8 +20,6 @@ gNBs = tr_s_preference = "local_mac" ////////// Physical parameters: - - ssb_SubcarrierOffset = 0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf index 5c8f90d9b55..1450c45eee0 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf @@ -21,8 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - servingCellConfigCommon = ( { #spCellConfigCommon diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf index 7bf3626870a..562e2b16ab0 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf @@ -21,8 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - servingCellConfigCommon = ( { #spCellConfigCommon diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf index 1773e1fb792..a8ecb8c4b67 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf @@ -21,8 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - servingCellConfigCommon = ( { #spCellConfigCommon @@ -182,11 +180,11 @@ gNBs = ); MACRLCs = ( - { - num_cc = 1; - tr_s_preference = "local_L1"; - tr_n_preference = "local_RRC"; - } + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + } ); L1s = ( @@ -194,6 +192,7 @@ L1s = ( num_cc = 1; tr_n_preference = "local_mac"; thread_pool_size = 8; + max_ldpc_iterations = 5; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf index d0f394be16a..10122b9eb2c 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf @@ -21,8 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - servingCellConfigCommon = ( { #spCellConfigCommon diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf index 0438e613372..20d01c2a00d 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf @@ -20,8 +20,6 @@ gNBs = tr_s_preference = "local_mac" ////////// Physical parameters: - - ssb_SubcarrierOffset = 0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf index 66c2151eb83..44f3889eece 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf index c6ea066fc48..fbafef81b41 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf index fcfe58a3c02..38d6ed3c610 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf index 2ad9757cb13..b7da7b17f4b 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf index 44074f3fd91..9f78716bcc2 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf index 7ce150506f0..1dcef897368 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf index 306e652eaa9..9a3fe358a54 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf @@ -21,8 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; - servingCellConfigCommon = ( { #spCellConfigCommon diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf index d08c0f14a08..9e1ae24d673 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf @@ -21,8 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; - servingCellConfigCommon = ( { #spCellConfigCommon diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf index e3204db8fae..9ec28b93e70 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf @@ -20,8 +20,6 @@ gNBs = tr_s_preference = "local_mac" ////////// Physical parameters: - - ssb_SubcarrierOffset = 31; //0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf index 030dc102267..35778ef7059 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; pusch_TargetSNRx10 = 200; pucch_TargetSNRx10 = 200; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf index 6aacd98c7f0..a64a4c6022e 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf @@ -44,7 +44,6 @@ gNBs = local_s_portd = 2152; remote_s_portc = 500; remote_s_portd = 2152; - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf index f95bdf91aee..4309c13dd39 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf @@ -36,7 +36,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf index f91683897f7..cb90889b52f 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf @@ -36,7 +36,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; servingCellConfigCommon = ( { diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf index e645094e8be..42aa5557712 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf @@ -28,8 +28,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - min_rxtxtime = 2; do_SRS = 1; pdcch_ConfigSIB1 = ( @@ -167,6 +165,64 @@ gNBs = ); +# Dedicated Serving Cell Configuration +servingCellConfigDedicated = ({ + # BWP-Downlink + # BWP 1 Configuration + dl_bwp-Id_1 = 1; + dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp1_subcarrierSpacing = 1; + + # BWP 2 Configuration + dl_bwp-Id_2 = 2; + dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp2_subcarrierSpacing = 1; + + # BWP 3 Configuration + dl_bwp-Id_3 = 3; + dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp3_subcarrierSpacing = 1; + + firstActiveDownlinkBWP-Id = 1; #BWP-Id + defaultDownlinkBWP-Id = 1; #BWP-Id + + # bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, + # ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500, + # ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8, + # spare7, spare6, spare5, spare4, spare3, spare2, spare1 } + + # UplinkConfig + # BWP-Uplink + # BWP 1 Configuration + ul_bwp-Id_1 = 1; + ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp1_subcarrierSpacing = 1; + + # BWP 2 Configuration + ul_bwp-Id_2 = 2; + ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp2_subcarrierSpacing = 1; + + # BWP 3 Configuration + ul_bwp-Id_3 = 3; + ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp3_subcarrierSpacing = 1; + + firstActiveUplinkBWP-Id = 1; #BWP-Id + } +); # ------- SCTP definitions SCTP : @@ -283,4 +339,7 @@ log_config : ngap_log_level ="debug"; f1ap_log_level ="debug"; }; +<<<<<<< HEAD +======= +>>>>>>> origin/develop diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.106PRB.usrpn300.conf index ff64fe718af..6abf2c19cc6 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.106PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.fr1.106PRB.usrpn300.conf @@ -32,9 +32,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts = 1; - pusch_AntennaPorts = 1; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf index 2881a77d48f..30be5972558 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf @@ -28,9 +28,9 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; pdsch_AntennaPorts_N1 = 2; pusch_AntennaPorts = 2; + do_CSIRS = 1; do_SRS = 1; ul_prbblacklist = "51,52,53,54" @@ -68,7 +68,7 @@ gNBs = # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 1; #pdcch-ConfigCommon - initialDLBWPcontrolResourceSetZero = 11; + initialDLBWPcontrolResourceSetZero = 12; initialDLBWPsearchSpaceZero = 0; #uplinkConfigCommon @@ -169,6 +169,64 @@ gNBs = ); +# Dedicated Serving Cell Configuration +servingCellConfigDedicated = ({ + # BWP-Downlink + # BWP 1 Configuration + dl_bwp-Id_1 = 1; + dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp1_subcarrierSpacing = 1; + + # BWP 2 Configuration + dl_bwp-Id_2 = 2; + dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp2_subcarrierSpacing = 1; + + # BWP 3 Configuration + dl_bwp-Id_3 = 3; + dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp3_subcarrierSpacing = 1; + + firstActiveDownlinkBWP-Id = 1; #BWP-Id + defaultDownlinkBWP-Id = 1; #BWP-Id + + # bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, + # ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500, + # ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8, + # spare7, spare6, spare5, spare4, spare3, spare2, spare1 } + + # UplinkConfig + # BWP-Uplink + # BWP 1 Configuration + ul_bwp-Id_1 = 1; + ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp1_subcarrierSpacing = 1; + + # BWP 2 Configuration + ul_bwp-Id_2 = 2; + ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp2_subcarrierSpacing = 1; + + # BWP 3 Configuration + ul_bwp-Id_3 = 3; + ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp3_subcarrierSpacing = 1; + + firstActiveUplinkBWP-Id = 1; #BWP-Id + } +); # ------- SCTP definitions SCTP : @@ -207,6 +265,7 @@ MACRLCs = ( tr_n_preference = "local_RRC"; #pusch_TargetSNRx10 = 150; #pucch_TargetSNRx10 = 200; + ul_prbblack_SNR_threshold = 10; ulsch_max_frame_inactivity = 0; } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf new file mode 100644 index 00000000000..8ff83b5d023 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf @@ -0,0 +1,297 @@ +Active_gNBs = ( "gNB-Eurecom-5GNRBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-Eurecom-5GNRBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + pdsch_AntennaPorts_XP = 2; + pdsch_AntennaPorts_N1 = 2; + pusch_AntennaPorts = 4; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 12; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) + absoluteFrequencySSB = 641280; + dl_frequencyBand = 78; + # this is 3600 MHz + dl_absoluteFrequencyPointA = 640008; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 106; + #initialDownlinkBWP + #genericParameters + # this is RBstart=27,L=48 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 106; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 28875; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 13; + preambleReceivedTargetPower = -96; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -90; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + } +); + +L1s = ( + { + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 + } +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 4 + nb_rx = 4 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; + clock_src = "internal"; + } +); + +THREAD_STRUCT = ( + { + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; + } +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="info"; + ngap_log_verbosity ="medium"; + }; + diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index 451079edf18..c11c6952fa2 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -28,8 +28,9 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 2; + do_CSIRS = 1; + do_SRS = 1; pdcch_ConfigSIB1 = ( { @@ -167,6 +168,64 @@ gNBs = ); +# Dedicated Serving Cell Configuration +servingCellConfigDedicated = ({ + # BWP-Downlink + # BWP 1 Configuration + dl_bwp-Id_1 = 1; + dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp1_subcarrierSpacing = 1; + + # BWP 2 Configuration + dl_bwp-Id_2 = 2; + dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp2_subcarrierSpacing = 1; + + # BWP 3 Configuration + dl_bwp-Id_3 = 3; + dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp3_subcarrierSpacing = 1; + + firstActiveDownlinkBWP-Id = 1; #BWP-Id + defaultDownlinkBWP-Id = 1; #BWP-Id + + # bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, + # ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500, + # ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8, + # spare7, spare6, spare5, spare4, spare3, spare2, spare1 } + + # UplinkConfig + # BWP-Uplink + # BWP 1 Configuration + ul_bwp-Id_1 = 1; + ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp1_subcarrierSpacing = 1; + + # BWP 2 Configuration + ul_bwp-Id_2 = 2; + ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp2_subcarrierSpacing = 1; + + # BWP 3 Configuration + ul_bwp-Id_3 = 3; + ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp3_subcarrierSpacing = 1; + + firstActiveUplinkBWP-Id = 1; #BWP-Id + } +); # ------- SCTP definitions SCTP : @@ -205,13 +264,14 @@ MACRLCs = ( tr_n_preference = "local_RRC"; pusch_TargetSNRx10 = 150; pucch_TargetSNRx10 = 200; + ul_prbblack_SNR_threshold = 10; ulsch_max_frame_inactivity = 0; } ); prs_config = ( { - NumPRSResources = 2; + NumPRSResources = 1; PRSResourceSetPeriod = [20, 2]; SymbolStart = [7, 7]; NumPRSSymbols = [6, 6]; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf index 8ca0c088769..6719a5534d4 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf @@ -30,7 +30,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; pdcch_ConfigSIB1 = ( { diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf index b8d71015c17..5f8bf452321 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf @@ -21,17 +21,17 @@ gNBs = sd = 0x1; // 0 false, else true } ); - }); nr_cellid = 12345678L; ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts_N1 = 1; - pusch_AntennaPorts = 2; - ul_prbblacklist = "79,80,81,82" + pdsch_AntennaPorts_XP = 1; + pusch_AntennaPorts = 2; + do_CSIRS = 0; + ul_prbblacklist = "79,80,81,82" + pdcch_ConfigSIB1 = ( { controlResourceSetZero = 12; @@ -66,21 +66,8 @@ gNBs = # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 1; #pdcch-ConfigCommon - initialDLBWPcontrolResourceSetZero = 11; + initialDLBWPcontrolResourceSetZero = 12; initialDLBWPsearchSpaceZero = 10; - #pdsch-ConfigCommon - #pdschTimeDomainAllocationList (up to 16 entries) - initialDLBWPk0_0 = 0; - #initialULBWPmappingType - #0=typeA,1=typeB - initialDLBWPmappingType_0 = 0; - #this is SS=1,L=13 - initialDLBWPstartSymbolAndLength_0 = 40; - - initialDLBWPk0_1 = 0; - initialDLBWPmappingType_1 = 0; - #this is SS=1,L=5 - initialDLBWPstartSymbolAndLength_1 = 57; #uplinkConfigCommon #frequencyInfoUL @@ -135,22 +122,6 @@ gNBs = # 0=unrestricted, 1=restricted type A, 2=restricted type B restrictedSetConfig = 0, - # pusch-ConfigCommon (up to 16 elements) - initialULBWPk2_0 = 2; - initialULBWPmappingType_0 = 1 - # this is SS=2 L=13 - initialULBWPstartSymbolAndLength_0 = 41; - - initialULBWPk2_1 = 2; - initialULBWPmappingType_1 = 1; - # this is SS=0 L=4 - initialULBWPstartSymbolAndLength_1 = 52; - - initialULBWPk2_2 = 7; - initialULBWPmappingType_2 = 1; - # this is SS=10 L=4 - initialULBWPstartSymbolAndLength_2 = 52; - msg3_DeltaPreamble = 1; p0_NominalWithGrant =-90; @@ -243,16 +214,16 @@ L1s = ( num_cc = 1; tr_n_preference = "local_mac"; prach_dtx_threshold = 120; - pucch0_dtx_threshold = 100; + pucch0_dtx_threshold = 80; } ); RUs = ( { local_rf = "yes" - nb_tx = 2 - nb_rx = 2 - att_tx = 0 + nb_tx = 2; + nb_rx = 2; + att_tx = 0; att_rx = 0; bands = [78]; max_pdschReferenceSignalPower = -27; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.2x2.usrpn300.conf new file mode 100644 index 00000000000..1f1f64ce3ff --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.2x2.usrpn300.conf @@ -0,0 +1,320 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + } + ); + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + pdsch_AntennaPorts_XP = 1; + pusch_AntennaPorts = 2; + do_CSIRS = 0; + ul_prbblacklist = "107,108,109,110" + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 12; + searchSpaceZero = 10; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3300.24 + 106*12*30e3 = 3338.40 MHz (5G NR GSCN: 7734) + absoluteFrequencySSB = 622560; + dl_frequencyBand = 78; + # this is 3300.24 MHz + dl_absoluteFrequencyPointA = 620016; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 217; + #initialDownlinkBWP + #genericParameters + # this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart)) + initialDLBWPlocationAndBandwidth = 31624; + # +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 10; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 217; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 31624; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 12; + preambleReceivedTargetPower = -96; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -70; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + +# Dedicated Serving Cell Configuration +servingCellConfigDedicated = ({ + # BWP-Downlink + # BWP 1 Configuration + dl_bwp-Id_1 = 1; + dl_bwp1_locationAndBandwidth = 16499; // RBstart=0, L=217 (80 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp1_subcarrierSpacing = 1; + + firstActiveDownlinkBWP-Id = 1; #BWP-Id + defaultDownlinkBWP-Id = 1; #BWP-Id + + # bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, + # ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500, + # ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8, + # spare7, spare6, spare5, spare4, spare3, spare2, spare1 } + + # UplinkConfig + # BWP-Uplink + # BWP 1 Configuration + ul_bwp-Id_1 = 1; + ul_bwp1_locationAndBandwidth = 16499; // RBstart=0, L=217 (80 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp1_subcarrierSpacing = 1; + + firstActiveUplinkBWP-Id = 1; #BWP-Id + } +); + + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + pusch_FailureThres = 1000; + ulsch_max_frame_inactivity = 0; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 80; +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 2; + nb_rx = 2; + att_tx = 0; + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 75; + eNB_instances = [0]; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "mgmt_addr=192.168.10.2,addr=192.168.10.2,clock_source=internal,time_source=internal" +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + +log_config : +{ + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + ngap_log_level ="debug"; + f1ap_log_level ="debug"; +}; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.24PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.24PRB.usrpb210.conf index bd3076a014c..ad1471339a2 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.24PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.24PRB.usrpb210.conf @@ -32,9 +32,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts = 1; - pusch_AntennaPorts = 1; sib1_tda = 15; min_rxtxtime = 6; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf new file mode 100644 index 00000000000..24090bef85b --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf @@ -0,0 +1,320 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + } + ); + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + pdsch_AntennaPorts_XP = 1; + pusch_AntennaPorts = 2; + do_CSIRS = 0; + ul_prbblacklist = "135,136,137,138" + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 12; + searchSpaceZero = 10; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741) + absoluteFrequencySSB = 623232; + dl_frequencyBand = 78; + # this is 3300.24 MHz + dl_absoluteFrequencyPointA = 620016; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 273; + #initialDownlinkBWP + #genericParameters + # this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart)) + initialDLBWPlocationAndBandwidth = 31624; + # +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 10; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 273; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 31624; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 12; + preambleReceivedTargetPower = -90; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -70; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + +# Dedicated Serving Cell Configuration +servingCellConfigDedicated = ({ + # BWP-Downlink + # BWP 1 Configuration + dl_bwp-Id_1 = 1; + dl_bwp1_locationAndBandwidth = 1099; // RBstart=0, L=273 (100 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp1_subcarrierSpacing = 1; + + firstActiveDownlinkBWP-Id = 1; #BWP-Id + defaultDownlinkBWP-Id = 1; #BWP-Id + + # bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, + # ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500, + # ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8, + # spare7, spare6, spare5, spare4, spare3, spare2, spare1 } + + # UplinkConfig + # BWP-Uplink + # BWP 1 Configuration + ul_bwp-Id_1 = 1; + ul_bwp1_locationAndBandwidth = 1099; // RBstart=0, L=273 (100 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp1_subcarrierSpacing = 1; + + firstActiveUplinkBWP-Id = 1; #BWP-Id + } +); + + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + pusch_FailureThres = 1000; + ulsch_max_frame_inactivity = 0; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 80; +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 2; + nb_rx = 2; + att_tx = 0; + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 75; + eNB_instances = [0]; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "mgmt_addr=192.168.10.2,addr=192.168.10.2,clock_source=internal,time_source=internal" +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + +log_config : +{ + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + ngap_log_level ="debug"; + f1ap_log_level ="debug"; +}; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf index 044f5c6feb3..c94bb292a2d 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf @@ -5,18 +5,18 @@ PRSs = prs_config0 = ( { gNB_id = 0; - NumPRSResources = 2; - PRSResourceSetPeriod = [20, 5]; - SymbolStart = [7, 8]; - NumPRSSymbols = [5, 5]; + NumPRSResources = 1; + PRSResourceSetPeriod = [20, 2]; + SymbolStart = [7, 7]; + NumPRSSymbols = [6, 6]; NumRB = 106; RBOffset = 0; CombSize = 4; REOffset = [0, 1]; - PRSResourceOffset = [0, 1]; - PRSResourceRepetition = 1; + PRSResourceOffset = [0, 0]; + PRSResourceRepetition = 2; PRSResourceTimeGap = 1; - NPRS_ID = [0, 5]; + NPRS_ID = [10, 5]; MutingPattern1 = []; MutingPattern2 = []; MutingBitRepetition = 1; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 49f7db28673..3d62d5c19ad 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -231,9 +231,9 @@ static inline int rxtx(PHY_VARS_eNB *eNB, dlsch_ue_select_tbl_in_use = !dlsch_ue_select_tbl_in_use; // L2-emulator can work only one eNB. // memcpy(&pre_scd_eNB_UE_stats,&RC.mac[ru->eNB_list[0]->Mod_id]->UE_info.eNB_UE_stats, sizeof(eNB_UE_STATS)*MAX_NUM_CCs*NUMBER_OF_UE_MAX); - // memcpy(&pre_scd_activeUE, &RC.mac[ru->eNB_list[0]->Mod_id]->UE_info.active, sizeof(boolean_t)*NUMBER_OF_UE_MAX); + // memcpy(&pre_scd_activeUE, &RC.mac[ru->eNB_list[0]->Mod_id]->UE_info.active, sizeof(bool)*NUMBER_OF_UE_MAX); memcpy(&pre_scd_eNB_UE_stats,&RC.mac[0]->UE_info.eNB_UE_stats, sizeof(eNB_UE_STATS)*MAX_NUM_CCs*NUMBER_OF_UE_MAX); - memcpy(&pre_scd_activeUE, &RC.mac[0]->UE_info.active, sizeof(boolean_t)*NUMBER_OF_UE_MAX); + memcpy(&pre_scd_activeUE, &RC.mac[0]->UE_info.active, sizeof(bool)*NUMBER_OF_UE_MAX); AssertFatal((ret= pthread_mutex_lock(&ru->proc.mutex_pre_scd))==0,"[eNB] error locking proc mutex for eNB pre scd, return %d\n",ret); ru->proc.instance_pre_scd++; @@ -1135,7 +1135,7 @@ void init_transport(PHY_VARS_eNB *eNB) { } for (int i=0;i<NUMBER_OF_ULSCH_MAX; i++) { - LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH %d/%d\n",i,NUMBER_OF_ULSCH_MAX); + LOG_I(PHY,"Allocating Transport Channel Buffers for ULSCH %d/%d\n",i,NUMBER_OF_ULSCH_MAX); eNB->ulsch[i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,fp->N_RB_UL, 0); if (!eNB->ulsch[i]) { diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index 571551cee9a..1d464cb90c4 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -89,7 +89,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,int br_flag); void stop_RU(RU_t **rup,int nb_ru); -void do_ru_synch(RU_t *ru); +static void do_ru_synch(RU_t *ru); void configure_ru(int idx, void *arg); @@ -1059,7 +1059,7 @@ int wakeup_synch(RU_t *ru) { } -void do_ru_synch(RU_t *ru) { +static void do_ru_synch(RU_t *ru) { LTE_DL_FRAME_PARMS *fp = ru->frame_parms; RU_proc_t *proc = &ru->proc; int rxs, ic, ret, i; @@ -1371,11 +1371,12 @@ void fill_rf_config(RU_t *ru, cfg->tx_gain[i] = (double)ru->att_tx; cfg->rx_gain[i] = ru->max_rxgain-(double)ru->att_rx; cfg->configFilename = rf_config_file; - LOG_I(PHY,"channel %d, Setting tx_gain offset %f, rx_gain offset %f, tx_freq %f, rx_freq %f\n", + LOG_I(PHY,"channel %d, Setting tx_gain offset %.0f, rx_gain offset %.0f, tx_freq %.0f, rx_freq %.0f, tune_offset %.0f Hz\n", i, cfg->tx_gain[i], cfg->rx_gain[i], cfg->tx_freq[i], - cfg->rx_freq[i]); + cfg->rx_freq[i], + cfg->tune_offset); } } @@ -1833,7 +1834,7 @@ static void *ru_thread( void *param ) { new_dlsch_ue_select_tbl_in_use = dlsch_ue_select_tbl_in_use; dlsch_ue_select_tbl_in_use = !dlsch_ue_select_tbl_in_use; memcpy(&pre_scd_eNB_UE_stats,&RC.mac[ru->eNB_list[0]->Mod_id]->UE_info.eNB_UE_stats, sizeof(eNB_UE_STATS)*MAX_NUM_CCs*NUMBER_OF_UE_MAX); - memcpy(&pre_scd_activeUE, &RC.mac[ru->eNB_list[0]->Mod_id]->UE_info.active, sizeof(boolean_t)*NUMBER_OF_UE_MAX); + memcpy(&pre_scd_activeUE, &RC.mac[ru->eNB_list[0]->Mod_id]->UE_info.active, sizeof(bool)*NUMBER_OF_UE_MAX); AssertFatal((ret=pthread_mutex_lock(&ru->proc.mutex_pre_scd))==0,"[eNB] error locking proc mutex for eNB pre scd\n"); ru->proc.instance_pre_scd++; @@ -1923,7 +1924,7 @@ static void *ru_thread( void *param ) { // This thread run the initial synchronization like a UE -void *ru_thread_synch(void *arg) { +static void *ru_thread_synch(void *arg) { RU_t *ru = (RU_t *)arg; __attribute__((unused)) LTE_DL_FRAME_PARMS *fp = ru->frame_parms; @@ -2972,6 +2973,8 @@ RU_t **RCconfig_RU(int nb_RU,int nb_L1_inst,PHY_VARS_eNB ***eNB,uint64_t *ru_mas ru[j]->openair0_cfg.time_source = unset; } + ru[j]->openair0_cfg.tune_offset = get_softmodem_params()->tune_offset; + LOG_I(PHY,"RU %d is_slave=%s\n",j,*(RUParamList.paramarray[j][RU_IS_SLAVE_IDX].strptr)); if (strcmp(*(RUParamList.paramarray[j][RU_IS_SLAVE_IDX].strptr), "yes") == 0) ru[j]->is_slave=1; diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h index 1c887dd3c8e..38b71238b82 100644 --- a/targets/RT/USER/lte-softmodem.h +++ b/targets/RT/USER/lte-softmodem.h @@ -29,6 +29,7 @@ #include "flexran_agent.h" #include "s1ap_eNB.h" #include "SIMULATION/ETH_TRANSPORT/proto.h" +#include "targets/ARCH/COMMON/common_lib.h" #include "executables/softmodem-common.h" @@ -213,5 +214,19 @@ extern void init_UE_standalone_thread(int ue_idx); extern PHY_VARS_UE *init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms, uint8_t UE_id, uint8_t abstraction_flag); extern void init_bler_table(void); - +void feptx_ofdm_2thread(RU_t *ru, + int frame, + int subframe); +void* ru_thread_control( void* param ); +void wait_eNBs(void); +void kill_feptx_thread(RU_t *ru); +void init_fep_thread(RU_t *ru, pthread_attr_t *attr_fep); +void init_feptx_thread(RU_t *ru, pthread_attr_t *attr_feptx); +void fep_full(RU_t *ru, int subframe); +void configure_ru(int, void *arg); +void configure_rru(int, void *arg); +void ru_fep_full_2thread(RU_t *ru,int subframe); +void feptx_ofdm(RU_t*ru, int frame_tx, int tti_tx); +void feptx_prec(struct RU_t_s *ru, int frame_tx, int tti_tx); +void fill_rf_config(RU_t *ru, char *rf_config_file); #endif diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c index 089941c7dfc..05602b63da6 100644 --- a/targets/RT/USER/lte-uesoftmodem.c +++ b/targets/RT/USER/lte-uesoftmodem.c @@ -176,7 +176,6 @@ extern char uecap_xer[1024]; char uecap_xer_in=0; int oaisim_flag=0; -//threads_t threads= {-1,-1,-1,-1,-1,-1,-1,-1}; /* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed * this is very hackish - find a proper solution @@ -446,6 +445,7 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain) { openair0_cfg[card].num_rb_dl=frame_parms->N_RB_DL; openair0_cfg[card].clock_source = get_softmodem_params()->clock_source; openair0_cfg[card].time_source = get_softmodem_params()->timing_source; + openair0_cfg[card].tune_offset = get_softmodem_params()->tune_offset; openair0_cfg[card].tx_num_channels=min(2,frame_parms->nb_antennas_tx); openair0_cfg[card].rx_num_channels=min(2,frame_parms->nb_antennas_rx); @@ -464,11 +464,12 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain) { openair0_cfg[card].tx_gain[i] = tx_gain[0][i]; openair0_cfg[card].rx_gain[i] = rxgain - rx_gain_off; openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file; - printf("Card %d, channel %d, Setting tx_gain %f, rx_gain %f, tx_freq %f, rx_freq %f\n", + printf("Card %d, channel %d, Setting tx_gain %.0f, rx_gain %.0f, tx_freq %.0f, rx_freq %.0f, tune_offset %.0f\n", card,i, openair0_cfg[card].tx_gain[i], openair0_cfg[card].rx_gain[i], openair0_cfg[card].tx_freq[i], - openair0_cfg[card].rx_freq[i]); + openair0_cfg[card].rx_freq[i], + openair0_cfg[card].tune_offset); } if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args; diff --git a/targets/TEST/PDCP/test_pdcp.c b/targets/TEST/PDCP/test_pdcp.c index b62edf12154..d6becf87c14 100644 --- a/targets/TEST/PDCP/test_pdcp.c +++ b/targets/TEST/PDCP/test_pdcp.c @@ -100,7 +100,7 @@ int main(int argc, char **argv) list_init(&test_pdu_rx_list, NULL); logInit(); - if (init_pdcp_entity(&pdcp_array[0]) == TRUE && init_pdcp_entity(&pdcp_array[1]) == TRUE) + if (init_pdcp_entity(&pdcp_array[0]) == true && init_pdcp_entity(&pdcp_array[1]) == true) msg("[TEST] PDCP entity initialization OK\n"); else { msg("[TEST] Cannot initialize PDCP entities!\n"); @@ -109,7 +109,7 @@ int main(int argc, char **argv) /* Initialize PDCP state variables */ for (index = 0; index < 2; ++index) { - if (pdcp_init_seq_numbers(&pdcp_array[index]) == FALSE) { + if (pdcp_init_seq_numbers(&pdcp_array[index]) == false) { msg("[TEST] Cannot initialize sequence numbers of PDCP entity %d!\n", index); exit(1); } else { @@ -120,11 +120,11 @@ int main(int argc, char **argv) #if TEST_RX_AND_TX_WINDOW /* Test TX window */ - if (test_tx_window() == FALSE) + if (test_tx_window() == false) test_result = 1; /* Test RX window */ - if (test_rx_window() == FALSE) + if (test_rx_window() == false) test_result = 1; #endif @@ -132,11 +132,11 @@ int main(int argc, char **argv) #if TEST_PDCP_DATA_REQUEST_AND_INDICATION /* Test pdcp_data_req() method in pdcp.c */ - if (test_pdcp_data_req() == FALSE) + if (test_pdcp_data_req() == false) test_result = 1; /* Test pdcp_data_ind() method in pdcp.c */ - if (test_pdcp_data_ind() == FALSE) + if (test_pdcp_data_ind() == false) test_result = 1; #endif @@ -150,10 +150,10 @@ int main(int argc, char **argv) return test_result; } -BOOL init_pdcp_entity(pdcp_t *pdcp_entity) +bool init_pdcp_entity(pdcp_t *pdcp_entity) { if (pdcp_entity == NULL) - return FALSE; + return false; /* * Initialize sequence number state variables of relevant PDCP entity @@ -171,10 +171,10 @@ BOOL init_pdcp_entity(pdcp_t *pdcp_entity) pdcp_entity->next_pdcp_rx_sn, pdcp_entity->tx_hfn, pdcp_entity->rx_hfn, \ pdcp_entity->last_submitted_pdcp_rx_sn, pdcp_entity->seq_num_size); - return TRUE; + return true; } -BOOL test_tx_window(void) +bool test_tx_window(void) { unsigned long index = 0; @@ -185,33 +185,33 @@ BOOL test_tx_window(void) msg("TX packet # %07lu seq # %04d hfn # %04d\n", index, pseudo_tx_sn, pdcp_array[0].tx_hfn); else { msg("TX packet is out-of-window!\n"); - return FALSE; + return false; } } - return TRUE; + return true; } -BOOL test_rx_window(void) +bool test_rx_window(void) { unsigned long index = 0; for (index = 0; index < NUMBER_OF_TEST_PACKETS; ++index) { u16 pseudo_rx_sn = (index == 0) ? 0 : index % WINDOW_SIZE; - if (pdcp_is_rx_seq_number_valid(pseudo_rx_sn, &pdcp_array[1]) == TRUE) { + if (pdcp_is_rx_seq_number_valid(pseudo_rx_sn, &pdcp_array[1]) == true) { msg("RX packet # %07lu seq # %04d last-submitted # %04d hfn # %04d\n", \ index, pdcp_array[1].next_pdcp_rx_sn, pdcp_array[1].last_submitted_pdcp_rx_sn, pdcp_array[1].rx_hfn); } else { msg("RX packet seq # %04lu is not valid!\n", index); - return FALSE; + return false; } } - return TRUE; + return true; } -BOOL test_pdcp_data_req(void) +bool test_pdcp_data_req(void) { unsigned char* pdcp_test_pdu_buffer = NULL; unsigned char pdcp_test_pdu_buffer_size = DUMMY_BUFFER_SIZE + PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE; @@ -224,7 +224,7 @@ BOOL test_pdcp_data_req(void) if (pdcp_test_pdu_buffer == NULL) { msg("Cannot allocate a buffer for test!\n"); - return FALSE; + return false; } /* @@ -241,7 +241,7 @@ BOOL test_pdcp_data_req(void) /* * Ask PDCP to create a PDU with given buffer and enqueue it to `test_pdu_tx_list` */ - if (pdcp_data_req(0, 0, 10, DUMMY_BUFFER, &pdcp_array[0], &test_pdu_tx_list) == TRUE) { + if (pdcp_data_req(0, 0, 10, DUMMY_BUFFER, &pdcp_array[0], &test_pdu_tx_list) == true) { msg("[TEST] Starting to dissect PDU created by PDCP...\n"); /* @@ -251,7 +251,7 @@ BOOL test_pdcp_data_req(void) if (pdcp_test_pdu_buffer_size == 0 ) { msg("[TEST] PDU created by pdcp_data_req() is invalid!\n"); - return FALSE; + return false; } /* @@ -269,7 +269,7 @@ BOOL test_pdcp_data_req(void) */ if (pdcp_test_pdu_buffer[0] & 0x80) { msg("[TEST] First bit is not 0, which means this is not a Data PDU!\n"); - return FALSE; + return false; } else { msg("[TEST] First bit is 0 so this is a Data PDU, OK\n"); } @@ -279,7 +279,7 @@ BOOL test_pdcp_data_req(void) */ if ((pdcp_test_pdu_buffer[0] & 0x70) != 0) { msg("[TEST] Reserved bits are not 0!\n"); - return FALSE; + return false; } else { msg("[TEST] Reserved bits are all 0, OK\n"); } @@ -292,21 +292,21 @@ BOOL test_pdcp_data_req(void) if (sequence_number != index % WINDOW_SIZE) { msg("[TEST] Sequence numbers are out-of-order!\n"); - return FALSE; + return false; } else { msg("[TEST] Sequence number is correct\n"); } } else { msg("[TEST] pdcp_data_req() returned FALSE!\n"); - return FALSE; + return false; } } - return TRUE; + return true; } -BOOL test_pdcp_data_ind(void) +bool test_pdcp_data_ind(void) { /* * This is the list that pdcp_data_ind() takes to put pdcp_data_ind_header_t @@ -341,9 +341,9 @@ BOOL test_pdcp_data_ind(void) test_sdu = list_remove_head(&test_pdu_rx_list); - if (pdcp_data_ind(0, 0, test_sdu_size, test_sdu, &pdcp_array[0], &test_pdu_indication_list) == FALSE) { + if (pdcp_data_ind(0, 0, test_sdu_size, test_sdu, &pdcp_array[0], &test_pdu_indication_list) == false) { msg("[TEST] pdcp_data_ind() failed to handle data indication!\n"); - return FALSE; + return false; } else { msg("[TEST] pdcp_data_ind() succcessfuly handled data indication\n"); } @@ -359,7 +359,7 @@ BOOL test_pdcp_data_ind(void) if (test_data_ind_header == NULL) { msg("[TEST] Data indication header is not valid!\n"); - return FALSE; + return false; } else { pdcp_data_ind_header_t* indication_header = (pdcp_data_ind_header_t*)test_data_ind_header->data; @@ -370,7 +370,7 @@ BOOL test_pdcp_data_ind(void) msg("[TEST] Radio bearer ID is correct\n"); } else { msg("[TEST] Radio bearer ID is not correct! (expected: 0, parsed: %d)\n", indication_header->rb_id); - return FALSE; + return false; } /* @@ -380,7 +380,7 @@ BOOL test_pdcp_data_ind(void) msg("[TEST] SDU size is correct\n"); } else { msg("[TEST] SDU size is not correct! (expected: %d, parsed: %d)\n", DUMMY_BUFFER_SIZE, indication_header->data_size); - return FALSE; + return false; } /* @@ -412,11 +412,11 @@ BOOL test_pdcp_data_ind(void) print_byte_stream("[TEST] TXed data: ", DUMMY_BUFFER, DUMMY_BUFFER_SIZE); print_byte_stream("[TEST] RXed data: ", (unsigned char*)&(test_data_ind_header->data[data_index]), DUMMY_BUFFER_SIZE); - return FALSE; + return false; } } - return TRUE; + return true; } diff --git a/targets/TEST/PDCP/test_pdcp.h b/targets/TEST/PDCP/test_pdcp.h index 0da174cc8ca..629f6f25391 100644 --- a/targets/TEST/PDCP/test_pdcp.h +++ b/targets/TEST/PDCP/test_pdcp.h @@ -42,17 +42,17 @@ int pdcp_fifo_flush_sdus (void) { return 0; } int pdcp_fifo_read_input_sdus_remaining_bytes (void) { return 0; } int pdcp_fifo_read_input_sdus (void) { return 0; } -BOOL init_pdcp_entity(pdcp_t *pdcp_entity); -BOOL test_tx_window(void); -BOOL test_rx_window(void); -BOOL test_pdcp_data_req(void); -BOOL test_pdcp_data_ind(void); +bool init_pdcp_entity(pdcp_t *pdcp_entity); +bool test_tx_window(void); +bool test_rx_window(void); +bool test_pdcp_data_req(void); +bool test_pdcp_data_ind(void); /* * PDCP methods that are going to be utilised throughout the test */ -extern BOOL pdcp_init_seq_numbers(pdcp_t* pdcp_entity); +extern bool pdcp_init_seq_numbers(pdcp_t* pdcp_entity); extern u16 pdcp_get_next_tx_seq_number(pdcp_t* pdcp_entity); -extern BOOL pdcp_is_rx_seq_number_valid(u16 seq_num, pdcp_t* pdcp_entity); +extern bool pdcp_is_rx_seq_number_valid(u16 seq_num, pdcp_t* pdcp_entity); #endif diff --git a/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c b/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c index 378ee95c3be..7b801717243 100644 --- a/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c +++ b/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c @@ -109,7 +109,7 @@ int pdcp_fifo_flush_sdus () {} int pdcp_fifo_read_input_sdus_remaining_bytes () {} int pdcp_fifo_read_input_sdus () {} -BOOL init_pdcp_entity(pdcp_t *pdcp_entity); +bool init_pdcp_entity(pdcp_t *pdcp_entity); //----------------------------------------------------------------------------- void pdcp_rlc_test_mac_rlc_loop (struct mac_data_ind *data_indP, struct mac_data_req *data_requestP, int* drop_countP, int *tx_packetsP, int* dropped_tx_packetsP) //----------------------------------------------------------------------------- @@ -230,7 +230,7 @@ int main(int argc, char **argv) pdcp_module_init(); logInit(); - if (init_pdcp_entity(&pdcp_array[0][1]) == TRUE && init_pdcp_entity(&pdcp_array[1][1]) == TRUE) + if (init_pdcp_entity(&pdcp_array[0][1]) == true && init_pdcp_entity(&pdcp_array[1][1]) == true) msg("PDCP entity initialization OK\n"); else { msg("Cannot initialize PDCP entities!\n"); @@ -239,7 +239,7 @@ int main(int argc, char **argv) /* Initialize PDCP state variables */ for (index = 0; index < 2; ++index) { - if (pdcp_init_seq_numbers(&pdcp_array[index][1]) == FALSE) { + if (pdcp_init_seq_numbers(&pdcp_array[index][1]) == false) { msg("Cannot initialize %s PDCP entity!\n", ((index == 0) ? "first" : "second")); exit(1); } @@ -275,11 +275,11 @@ int main(int argc, char **argv) } //----------------------------------------------------------------------------- -BOOL init_pdcp_entity(pdcp_t *pdcp_entity) +bool init_pdcp_entity(pdcp_t *pdcp_entity) //----------------------------------------------------------------------------- { if (pdcp_entity == NULL) - return FALSE; + return false; /* * Initialize sequence number state variables of relevant PDCP entity @@ -292,6 +292,6 @@ BOOL init_pdcp_entity(pdcp_t *pdcp_entity) pdcp_entity->last_submitted_pdcp_rx_sn = 4095; pdcp_entity->seq_num_size = 12; - return TRUE; + return true; } diff --git a/txsig0.m b/txsig0.m new file mode 100644 index 00000000000..e795208a15a --- /dev/null +++ b/txsig0.m @@ -0,0 +1,61441 @@ +txs0 = [-194 + j*(-202) +-136 + j*(186) +248 + j*(59) +61 + j*(-331) +-327 + j*(-134) +-161 + j*(205) +70 + j*(64) +-84 + j*(-35) +-82 + j*(168) +170 + j*(116) +105 + j*(-159) +-163 + j*(-94) +-102 + j*(147) +100 + j*(89) +31 + j*(-79) +-114 + j*(4) +-25 + j*(144) +112 + j*(64) +41 + j*(-65) +-84 + j*(9) +-18 + j*(151) +137 + j*(129) +190 + j*(9) +163 + j*(-89) +85 + j*(-173) +-68 + j*(-154) +-93 + j*(26) +119 + j*(64) +183 + j*(-209) +-139 + j*(-343) +-365 + j*(-29) +-107 + j*(252) +180 + j*(51) +11 + j*(-232) +-279 + j*(-96) +-200 + j*(193) +42 + j*(170) +37 + j*(-5) +-93 + j*(13) +-81 + j*(137) +21 + j*(187) +158 + j*(174) +303 + j*(-10) +155 + j*(-324) +-275 + j*(-277) +-348 + j*(180) +57 + j*(327) +197 + j*(1) +-89 + j*(-71) +-107 + j*(244) +254 + j*(283) +382 + j*(-61) +137 + j*(-263) +-69 + j*(-141) +-19 + j*(32) +138 + j*(8) +135 + j*(-159) +-20 + j*(-175) +-9 + j*(-51) +126 + j*(-153) +-52 + j*(-384) +-409 + j*(-234) +-389 + j*(165) +-78 + j*(276) +81 + j*(133) +94 + j*(11) +42 + j*(-99) +-103 + j*(-112) +-155 + j*(25) +-57 + j*(74) +-47 + j*(23) +-64 + j*(69) +36 + j*(51) +-16 + j*(-105) +-230 + j*(-46) +-211 + j*(189) +-51 + j*(221) +-39 + j*(208) +67 + j*(312) +308 + j*(188) +240 + j*(-112) +-30 + j*(-91) +-16 + j*(126) +153 + j*(117) +170 + j*(12) +156 + j*(-11) +173 + j*(-64) +130 + j*(-112) +123 + j*(-123) +100 + j*(-220) +-86 + j*(-247) +-170 + j*(-43) +21 + j*(40) +64 + j*(-161) +-175 + j*(-176) +-196 + j*(100) +91 + j*(138) +151 + j*(-144) +-111 + j*(-234) +-230 + j*(-19) +-85 + j*(96) +-11 + j*(9) +-78 + j*(-10) +-66 + j*(57) +-17 + j*(30) +-70 + j*(21) +-45 + j*(133) +139 + j*(109) +154 + j*(-121) +-70 + j*(-189) +-165 + j*(-28) +-98 + j*(46) +-93 + j*(60) +-33 + j*(136) +93 + j*(59) +-5 + j*(-81) +-144 + j*(55) +36 + j*(194) +176 + j*(-16) +-49 + j*(-146) +-166 + j*(75) +32 + j*(179) +109 + j*(33) +25 + j*(9) +74 + j*(42) +80 + j*(-77) +-93 + j*(-79) +-105 + j*(128) +111 + j*(162) +170 + j*(-36) +-4 + j*(-98) +-60 + j*(74) +142 + j*(148) +281 + j*(-80) +70 + j*(-296) +-184 + j*(-135) +-49 + j*(103) +166 + j*(-62) +-46 + j*(-301) +-354 + j*(-80) +-202 + j*(281) +147 + j*(244) +206 + j*(-15) +78 + j*(-109) +20 + j*(-95) +-17 + j*(-116) +-112 + j*(-98) +-159 + j*(30) +-44 + j*(146) +110 + j*(66) +59 + j*(-88) +-69 + j*(-35) +13 + j*(67) +104 + j*(-51) +-37 + j*(-129) +-83 + j*(6) +40 + j*(-13) +-67 + j*(-129) +-181 + j*(74) +120 + j*(185) +238 + j*(-213) +-223 + j*(-363) +-411 + j*(107) +-2 + j*(288) +109 + j*(-43) +-169 + j*(-46) +-73 + j*(214) +182 + j*(56) +-7 + j*(-186) +-223 + j*(5) +-57 + j*(177) +38 + j*(27) +-137 + j*(19) +-122 + j*(259) +152 + j*(303) +272 + j*(86) +172 + j*(-42) +145 + j*(-28) +195 + j*(-117) +64 + j*(-272) +-177 + j*(-182) +-171 + j*(71) +32 + j*(98) +31 + j*(-51) +-99 + j*(11) +8 + j*(153) +159 + j*(35) +35 + j*(-93) +-64 + j*(65) +149 + j*(186) +355 + j*(-29) +238 + j*(-317) +-43 + j*(-356) +-204 + j*(-183) +-149 + j*(-11) +-34 + j*(-13) +-62 + j*(-84) +-139 + j*(-6) +-34 + j*(103) +103 + j*(-2) +18 + j*(-142) +-96 + j*(-79) +-27 + j*(-25) +-26 + j*(-159) +-263 + j*(-175) +-385 + j*(125) +-127 + j*(377) +177 + j*(252) +168 + j*(13) +60 + j*(5) +144 + j*(21) +160 + j*(-194) +-136 + j*(-288) +-318 + j*(5) +-82 + j*(217) +93 + j*(27) +-91 + j*(-98) +-199 + j*(90) +-41 + j*(188) +8 + j*(95) +-67 + j*(132) +27 + j*(257) +204 + j*(201) +247 + j*(55) +214 + j*(-49) +131 + j*(-134) +-10 + j*(-97) +16 + j*(65) +221 + j*(31) +221 + j*(-237) +-64 + j*(-323) +-230 + j*(-107) +-126 + j*(61) +-33 + j*(42) +-40 + j*(42) +20 + j*(91) +120 + j*(29) +89 + j*(-100) +-38 + j*(-103) +-58 + j*(13) +58 + j*(46) +122 + j*(-83) +0 + j*(-199) +-163 + j*(-120) +-140 + j*(45) +-11 + j*(53) +-18 + j*(-31) +-82 + j*(17) +11 + j*(74) +59 + j*(-59) +-120 + j*(-101) +-171 + j*(128) +76 + j*(203) +172 + j*(-20) +10 + j*(-92) +9 + j*(9) +75 + j*(-86) +-111 + j*(-147) +-175 + j*(105) +122 + j*(173) +203 + j*(-151) +-111 + j*(-262) +-245 + j*(-17) +-110 + j*(93) +-74 + j*(53) +-79 + j*(90) +-29 + j*(81) +-96 + j*(72) +-87 + j*(255) +197 + j*(303) +325 + j*(8) +103 + j*(-132) +39 + j*(30) +215 + j*(1) +166 + j*(-223) +-55 + j*(-224) +-98 + j*(-93) +-86 + j*(-68) +-130 + j*(-1) +-34 + j*(97) +81 + j*(-18) +-69 + j*(-147) +-237 + j*(30) +-83 + j*(245) +132 + j*(166) +120 + j*(25) +91 + j*(37) +170 + j*(-23) +83 + j*(-180) +-124 + j*(-100) +-45 + j*(129) +206 + j*(34) +113 + j*(-245) +-176 + j*(-175) +-128 + j*(87) +92 + j*(37) +29 + j*(-153) +-144 + j*(-103) +-128 + j*(23) +-92 + j*(30) +-112 + j*(88) +-8 + j*(170) +122 + j*(83) +81 + j*(-45) +-4 + j*(-42) +-18 + j*(-16) +-43 + j*(-1) +-42 + j*(64) +40 + j*(78) +47 + j*(6) +-19 + j*(44) +76 + j*(154) +281 + j*(49) +264 + j*(-238) +-18 + j*(-369) +-266 + j*(-198) +-245 + j*(78) +-7 + j*(177) +168 + j*(-5) +40 + j*(-248) +-272 + j*(-207) +-366 + j*(132) +-85 + j*(356) +208 + j*(202) +177 + j*(-63) +3 + j*(-96) +-23 + j*(-18) +-3 + j*(-49) +-109 + j*(-69) +-184 + j*(77) +-69 + j*(223) +105 + j*(208) +198 + j*(93) +202 + j*(-50) +97 + j*(-165) +-67 + j*(-153) +-146 + j*(-14) +-83 + j*(126) +72 + j*(153) +183 + j*(23) +98 + j*(-141) +-86 + j*(-95) +-59 + j*(91) +134 + j*(71) +122 + j*(-134) +-97 + j*(-146) +-147 + j*(77) +66 + j*(191) +257 + j*(23) +194 + j*(-226) +-39 + j*(-298) +-208 + j*(-178) +-243 + j*(-25) +-216 + j*(119) +-76 + j*(247) +144 + j*(186) +151 + j*(-23) +4 + j*(-19) +91 + j*(98) +249 + j*(-80) +41 + j*(-301) +-199 + j*(-124) +-54 + j*(63) +53 + j*(-95) +-144 + j*(-161) +-214 + j*(38) +-77 + j*(104) +-69 + j*(55) +-69 + j*(140) +83 + j*(153) +127 + j*(-1) +25 + j*(-45) +27 + j*(0) +44 + j*(-57) +-45 + j*(-78) +-70 + j*(5) +-9 + j*(15) +-13 + j*(-43) +-80 + j*(-61) +-170 + j*(-14) +-212 + j*(145) +-59 + j*(313) +175 + j*(250) +221 + j*(59) +145 + j*(-12) +130 + j*(-25) +116 + j*(-76) +69 + j*(-121) +-23 + j*(-160) +-188 + j*(-76) +-166 + j*(193) +141 + j*(249) +243 + j*(-24) +41 + j*(-97) +64 + j*(44) +183 + j*(-84) +-27 + j*(-175) +-50 + j*(114) +363 + j*(58) +303 + j*(-504) +-333 + j*(-527) +-450 + j*(41) +-40 + j*(153) +-25 + j*(-122) +-240 + j*(-37) +-124 + j*(148) +-1 + j*(45) +-100 + j*(14) +-57 + j*(126) +62 + j*(41) +-56 + j*(-71) +-175 + j*(71) +-45 + j*(213) +107 + j*(142) +114 + j*(21) +66 + j*(-37) +-12 + j*(-71) +-130 + j*(-15) +-141 + j*(177) +85 + j*(297) +323 + j*(107) +219 + j*(-204) +-95 + j*(-180) +-118 + j*(100) +119 + j*(148) +185 + j*(-22) +117 + j*(-76) +129 + j*(-119) +34 + j*(-238) +-174 + j*(-164) +-153 + j*(57) +23 + j*(79) +60 + j*(-21) +45 + j*(-59) +23 + j*(-130) +-110 + j*(-151) +-168 + j*(-12) +-75 + j*(34) +-113 + j*(-22) +-182 + j*(123) +25 + j*(248) +192 + j*(50) +38 + j*(-102) +-52 + j*(12) +51 + j*(23) +1 + j*(-83) +-116 + j*(-6) +-47 + j*(104) +17 + j*(71) +16 + j*(99) +153 + j*(109) +215 + j*(-111) +-33 + j*(-237) +-202 + j*(0) +14 + j*(183) +216 + j*(-10) +61 + j*(-235) +-169 + j*(-145) +-139 + j*(46) +-11 + j*(21) +-91 + j*(-76) +-228 + j*(60) +-99 + j*(269) +136 + j*(210) +139 + j*(28) +42 + j*(33) +100 + j*(93) +185 + j*(6) +139 + j*(-114) +26 + j*(-142) +-59 + j*(-71) +-20 + j*(39) +111 + j*(11) +86 + j*(-144) +-77 + j*(-129) +-51 + j*(8) +54 + j*(-62) +-78 + j*(-164) +-202 + j*(-3) +-66 + j*(136) +41 + j*(61) +23 + j*(25) +78 + j*(16) +68 + j*(-111) +-93 + j*(-116) +-100 + j*(38) +25 + j*(27) +-13 + j*(-73) +-98 + j*(-31) +-88 + j*(21) +-105 + j*(69) +-13 + j*(190) +216 + j*(78) +108 + j*(-244) +-277 + j*(-153) +-214 + j*(264) +196 + j*(235) +199 + j*(-131) +-99 + j*(-150) +-117 + j*(66) +24 + j*(66) +-5 + j*(-31) +-98 + j*(15) +-83 + j*(126) +14 + j*(186) +138 + j*(156) +200 + j*(43) +163 + j*(-57) +107 + j*(-97) +49 + j*(-122) +-23 + j*(-93) +-13 + j*(-21) +56 + j*(-54) +-11 + j*(-151) +-169 + j*(-84) +-148 + j*(123) +69 + j*(170) +175 + j*(-24) +16 + j*(-158) +-123 + j*(-22) +7 + j*(114) +156 + j*(-19) +43 + j*(-183) +-119 + j*(-129) +-136 + j*(-23) +-138 + j*(41) +-78 + j*(157) +117 + j*(136) +134 + j*(-84) +-78 + j*(-120) +-107 + j*(64) +33 + j*(69) +-13 + j*(-21) +-76 + j*(95) +91 + j*(178) +231 + j*(29) +181 + j*(-138) +58 + j*(-223) +-117 + j*(-201) +-183 + j*(-8) +-10 + j*(71) +25 + j*(-103) +-186 + j*(-88) +-157 + j*(153) +59 + j*(127) +13 + j*(-8) +-35 + j*(103) +158 + j*(102) +157 + j*(-132) +-30 + j*(-143) +-12 + j*(-71) +-68 + j*(-188) +-312 + j*(-68) +-202 + j*(255) +106 + j*(181) +32 + j*(-31) +-72 + j*(78) +74 + j*(97) +14 + j*(-49) +-103 + j*(99) +141 + j*(182) +200 + j*(-136) +-147 + j*(-175) +-165 + j*(148) +81 + j*(121) +-36 + j*(-28) +-121 + j*(200) +169 + j*(290) +270 + j*(55) +179 + j*(21) +314 + j*(-1) +285 + j*(-309) +-81 + j*(-343) +-148 + j*(-45) +36 + j*(-34) +-51 + j*(-122) +-74 + j*(53) +172 + j*(23) +110 + j*(-277) +-204 + j*(-220) +-161 + j*(42) +7 + j*(-23) +-116 + j*(-115) +-186 + j*(62) +4 + j*(139) +91 + j*(-23) +-27 + j*(-114) +-117 + j*(-51) +-107 + j*(23) +-71 + j*(40) +-76 + j*(35) +-93 + j*(89) +-12 + j*(156) +100 + j*(99) +95 + j*(0) +68 + j*(-22) +71 + j*(-80) +-33 + j*(-146) +-141 + j*(-59) +-110 + j*(25) +-114 + j*(23) +-142 + j*(128) +8 + j*(211) +113 + j*(82) +28 + j*(33) +90 + j*(103) +182 + j*(-69) +-69 + j*(-202) +-224 + j*(82) +57 + j*(229) +154 + j*(-28) +-82 + j*(-46) +-26 + j*(180) +177 + j*(80) +50 + j*(-60) +-1 + j*(112) +234 + j*(100) +214 + j*(-171) +-30 + j*(-161) +-8 + j*(3) +81 + j*(-49) +11 + j*(-83) +39 + j*(-25) +76 + j*(-131) +-100 + j*(-167) +-144 + j*(49) +84 + j*(95) +136 + j*(-136) +-80 + j*(-215) +-209 + j*(-57) +-156 + j*(109) +3 + j*(178) +167 + j*(73) +132 + j*(-123) +-33 + j*(-134) +-35 + j*(-33) +21 + j*(-82) +-76 + j*(-132) +-132 + j*(-34) +-72 + j*(-1) +-93 + j*(-41) +-139 + j*(23) +-83 + j*(71) +-75 + j*(44) +-97 + j*(95) +-10 + j*(140) +38 + j*(66) +-10 + j*(60) +47 + j*(98) +87 + j*(-15) +-70 + j*(-41) +-76 + j*(173) +202 + j*(187) +267 + j*(-129) +-20 + j*(-264) +-206 + j*(-71) +-133 + j*(107) +-13 + j*(140) +75 + j*(89) +69 + j*(-3) +-16 + j*(7) +30 + j*(97) +139 + j*(17) +36 + j*(-110) +-91 + j*(18) +63 + j*(139) +184 + j*(-37) +4 + j*(-156) +-102 + j*(13) +51 + j*(100) +123 + j*(-25) +40 + j*(-88) +-7 + j*(-67) +-64 + j*(-44) +-83 + j*(100) +135 + j*(192) +322 + j*(-47) +141 + j*(-305) +-98 + j*(-221) +-71 + j*(-95) +-74 + j*(-156) +-224 + j*(-89) +-173 + j*(126) +46 + j*(119) +59 + j*(-66) +-92 + j*(-74) +-102 + j*(55) +17 + j*(83) +78 + j*(-22) +-5 + j*(-134) +-163 + j*(-98) +-198 + j*(73) +-69 + j*(168) +25 + j*(117) +40 + j*(82) +81 + j*(57) +89 + j*(-18) +42 + j*(-52) +33 + j*(-74) +-54 + j*(-149) +-226 + j*(-48) +-151 + j*(182) +61 + j*(127) +-40 + j*(-22) +-134 + j*(177) +169 + j*(257) +239 + j*(-114) +-183 + j*(-148) +-180 + j*(333) +346 + j*(337) +386 + j*(-156) +13 + j*(-190) +69 + j*(57) +272 + j*(-112) +67 + j*(-338) +-147 + j*(-214) +-138 + j*(-105) +-197 + j*(-58) +-168 + j*(129) +66 + j*(134) +58 + j*(-88) +-147 + j*(-33) +-42 + j*(170) +154 + j*(37) +13 + j*(-136) +-124 + j*(11) +17 + j*(112) +87 + j*(-14) +-11 + j*(-47) +-3 + j*(23) +49 + j*(-22) +-16 + j*(-62) +-42 + j*(8) +30 + j*(13) +21 + j*(-71) +-76 + j*(-71) +-110 + j*(18) +-71 + j*(82) +-9 + j*(115) +81 + j*(99) +123 + j*(-4) +43 + j*(-77) +-13 + j*(-18) +59 + j*(-4) +41 + j*(-132) +-149 + j*(-117) +-168 + j*(110) +54 + j*(157) +94 + j*(-24) +-43 + j*(-18) +30 + j*(95) +135 + j*(-37) +-33 + j*(-132) +-107 + j*(57) +92 + j*(104) +111 + j*(-83) +-29 + j*(-65) +56 + j*(11) +83 + j*(-171) +-190 + j*(-189) +-227 + j*(131) +93 + j*(187) +159 + j*(-101) +-77 + j*(-175) +-156 + j*(-15) +-83 + j*(51) +-49 + j*(43) +-36 + j*(27) +-81 + j*(19) +-98 + j*(130) +69 + j*(174) +136 + j*(-19) +-67 + j*(-74) +-95 + j*(139) +124 + j*(143) +112 + j*(-52) +-35 + j*(-11) +42 + j*(84) +90 + j*(-14) +-3 + j*(-4) +95 + j*(69) +164 + j*(-132) +-128 + j*(-231) +-281 + j*(105) +27 + j*(307) +236 + j*(92) +127 + j*(-53) +91 + j*(-12) +117 + j*(-66) +21 + j*(-92) +17 + j*(26) +163 + j*(13) +181 + j*(-146) +79 + j*(-215) +19 + j*(-230) +-83 + j*(-263) +-221 + j*(-168) +-188 + j*(5) +-35 + j*(-1) +-52 + j*(-155) +-252 + j*(-163) +-347 + j*(56) +-194 + j*(232) +-23 + j*(169) +-54 + j*(60) +-143 + j*(129) +-72 + j*(266) +100 + j*(289) +249 + j*(188) +310 + j*(-8) +184 + j*(-207) +-50 + j*(-197) +-107 + j*(-20) +9 + j*(33) +37 + j*(-66) +-71 + j*(-104) +-163 + j*(-24) +-169 + j*(118) +-42 + j*(227) +118 + j*(168) +116 + j*(40) +59 + j*(55) +148 + j*(66) +160 + j*(-96) +-42 + j*(-122) +-75 + j*(100) +170 + j*(142) +241 + j*(-99) +49 + j*(-201) +-41 + j*(-86) +25 + j*(-41) +37 + j*(-102) +-24 + j*(-126) +-75 + j*(-99) +-100 + j*(-59) +-117 + j*(-15) +-122 + j*(64) +-17 + j*(167) +188 + j*(89) +176 + j*(-187) +-116 + j*(-242) +-204 + j*(13) +1 + j*(68) +-25 + j*(-117) +-233 + j*(-18) +-103 + j*(222) +136 + j*(86) +-18 + j*(-122) +-207 + j*(60) +-23 + j*(254) +156 + j*(115) +74 + j*(1) +53 + j*(74) +169 + j*(38) +151 + j*(-116) +9 + j*(-153) +-66 + j*(-77) +-56 + j*(-2) +1 + j*(18) +27 + j*(-35) +-42 + j*(-64) +-83 + j*(21) +1 + j*(78) +62 + j*(10) +25 + j*(-33) +25 + j*(-25) +24 + j*(-86) +-94 + j*(-115) +-179 + j*(21) +-87 + j*(153) +40 + j*(136) +84 + j*(81) +120 + j*(39) +149 + j*(-49) +94 + j*(-165) +-58 + j*(-222) +-250 + j*(-126) +-292 + j*(157) +-4 + j*(361) +327 + j*(146) +220 + j*(-244) +-158 + j*(-236) +-211 + j*(86) +41 + j*(154) +88 + j*(-45) +-88 + j*(-61) +-89 + j*(115) +85 + j*(123) +98 + j*(-33) +-39 + j*(-42) +-38 + j*(100) +124 + j*(104) +147 + j*(-66) +-16 + j*(-96) +-28 + j*(74) +194 + j*(75) +242 + j*(-210) +-58 + j*(-366) +-318 + j*(-151) +-255 + j*(142) +-24 + j*(223) +139 + j*(105) +119 + j*(-82) +-71 + j*(-118) +-136 + j*(92) +116 + j*(196) +286 + j*(-92) +3 + j*(-344) +-312 + j*(-116) +-159 + j*(211) +137 + j*(116) +62 + j*(-134) +-164 + j*(-58) +-81 + j*(167) +156 + j*(90) +97 + j*(-168) +-182 + j*(-148) +-221 + j*(134) +23 + j*(240) +168 + j*(72) +91 + j*(-66) +-8 + j*(-58) +-41 + j*(-9) +-33 + j*(50) +40 + j*(79) +105 + j*(7) +54 + j*(-72) +-13 + j*(-45) +8 + j*(-11) +19 + j*(-43) +-23 + j*(-54) +-45 + j*(-25) +-45 + j*(-5) +-40 + j*(20) +-13 + j*(32) +-4 + j*(18) +0 + j*(25) +30 + j*(4) +-22 + j*(-54) +-124 + j*(45) +15 + j*(223) +294 + j*(79) +206 + j*(-286) +-193 + j*(-308) +-334 + j*(42) +-115 + j*(271) +130 + j*(213) +218 + j*(28) +136 + j*(-144) +-40 + j*(-163) +-117 + j*(-43) +-76 + j*(32) +-50 + j*(56) +8 + j*(89) +77 + j*(14) +-23 + j*(-69) +-119 + j*(71) +39 + j*(196) +177 + j*(67) +111 + j*(-15) +162 + j*(22) +255 + j*(-180) +-35 + j*(-395) +-370 + j*(-116) +-168 + j*(276) +217 + j*(171) +198 + j*(-155) +-37 + j*(-199) +-114 + j*(-66) +-65 + j*(12) +12 + j*(21) +74 + j*(-71) +-16 + j*(-208) +-224 + j*(-183) +-316 + j*(28) +-198 + j*(214) +-19 + j*(222) +58 + j*(128) +44 + j*(74) +54 + j*(69) +66 + j*(15) +-12 + j*(-14) +-53 + j*(98) +100 + j*(182) +267 + j*(35) +209 + j*(-199) +-7 + j*(-283) +-209 + j*(-177) +-248 + j*(46) +-88 + j*(182) +49 + j*(96) +-12 + j*(27) +-16 + j*(144) +192 + j*(141) +260 + j*(-132) +6 + j*(-308) +-255 + j*(-176) +-310 + j*(85) +-154 + j*(310) +153 + j*(320) +295 + j*(34) +78 + j*(-156) +-93 + j*(13) +53 + j*(149) +153 + j*(42) +105 + j*(16) +206 + j*(45) +294 + j*(-177) +48 + j*(-372) +-206 + j*(-206) +-146 + j*(11) +-28 + j*(11) +-23 + j*(-14) +11 + j*(-11) +11 + j*(-80) +-82 + j*(-71) +-68 + j*(40) +57 + j*(23) +50 + j*(-105) +-58 + j*(-122) +-83 + j*(-64) +-75 + j*(-74) +-138 + j*(-86) +-218 + j*(-9) +-206 + j*(144) +-28 + j*(240) +173 + j*(89) +70 + j*(-199) +-288 + j*(-182) +-414 + j*(196) +-140 + j*(471) +180 + j*(421) +344 + j*(233) +393 + j*(-2) +255 + j*(-228) +6 + j*(-238) +-80 + j*(-84) +-32 + j*(-26) +-45 + j*(-15) +-14 + j*(54) +83 + j*(-1) +-13 + j*(-116) +-156 + j*(29) +28 + j*(211) +238 + j*(10) +42 + j*(-211) +-158 + j*(-20) +36 + j*(136) +151 + j*(-74) +-80 + j*(-159) +-156 + j*(83) +73 + j*(162) +150 + j*(-23) +24 + j*(-78) +12 + j*(1) +81 + j*(-30) +38 + j*(-105) +-42 + j*(-90) +-61 + j*(-25) +-17 + j*(21) +47 + j*(-12) +19 + j*(-93) +-73 + j*(-64) +-35 + j*(26) +56 + j*(-37) +-26 + j*(-142) +-135 + j*(-66) +-85 + j*(6) +-86 + j*(-47) +-186 + j*(16) +-110 + j*(165) +38 + j*(110) +-9 + j*(1) +-79 + j*(61) +-27 + j*(107) +-32 + j*(104) +21 + j*(213) +260 + j*(155) +242 + j*(-181) +-134 + j*(-202) +-160 + j*(181) +224 + j*(190) +216 + j*(-189) +-139 + j*(-156) +-69 + j*(175) +260 + j*(72) +172 + j*(-259) +-123 + j*(-233) +-154 + j*(-45) +-105 + j*(-16) +-145 + j*(29) +-96 + j*(141) +24 + j*(151) +79 + j*(110) +144 + j*(78) +197 + j*(-41) +103 + j*(-162) +-15 + j*(-137) +-24 + j*(-78) +-23 + j*(-83) +-43 + j*(-78) +-48 + j*(-87) +-113 + j*(-107) +-196 + j*(-16) +-129 + j*(103) +-30 + j*(62) +-91 + j*(1) +-163 + j*(100) +-78 + j*(225) +67 + j*(235) +181 + j*(153) +216 + j*(4) +111 + j*(-110) +-6 + j*(-66) +16 + j*(-4) +25 + j*(-49) +-65 + j*(-36) +-69 + j*(85) +42 + j*(132) +122 + j*(88) +175 + j*(18) +159 + j*(-100) +31 + j*(-126) +30 + j*(-3) +199 + j*(-62) +119 + j*(-332) +-223 + j*(-313) +-296 + j*(4) +-91 + j*(117) +-18 + j*(42) +1 + j*(54) +105 + j*(-19) +12 + j*(-202) +-216 + j*(-123) +-162 + j*(92) +-13 + j*(24) +-153 + j*(-72) +-262 + j*(153) +-11 + j*(321) +198 + j*(113) +51 + j*(-77) +-103 + j*(44) +4 + j*(185) +151 + j*(115) +144 + j*(-12) +74 + j*(-54) +22 + j*(-39) +2 + j*(20) +88 + j*(78) +228 + j*(-34) +148 + j*(-286) +-177 + j*(-305) +-310 + j*(6) +-71 + j*(195) +112 + j*(17) +-47 + j*(-148) +-235 + j*(1) +-142 + j*(242) +117 + j*(265) +272 + j*(52) +167 + j*(-184) +-72 + j*(-199) +-171 + j*(-28) +-112 + j*(79) +-78 + j*(122) +5 + j*(219) +218 + j*(185) +282 + j*(-69) +71 + j*(-206) +-76 + j*(-67) +15 + j*(54) +127 + j*(-10) +110 + j*(-136) +-12 + j*(-192) +-136 + j*(-111) +-108 + j*(28) +11 + j*(23) +-10 + j*(-81) +-129 + j*(-52) +-131 + j*(86) +-10 + j*(163) +151 + j*(122) +234 + j*(-81) +56 + j*(-294) +-225 + j*(-198) +-224 + j*(59) +-66 + j*(95) +-71 + j*(54) +-40 + j*(144) +126 + j*(98) +96 + j*(-96) +-75 + j*(-85) +-69 + j*(23) +-50 + j*(-3) +-115 + j*(64) +8 + j*(177) +144 + j*(28) +-23 + j*(-90) +-106 + j*(107) +122 + j*(170) +179 + j*(-56) +0 + j*(-101) +4 + j*(23) +95 + j*(-48) +-16 + j*(-141) +-111 + j*(-45) +-58 + j*(23) +-47 + j*(-2) +-88 + j*(36) +-48 + j*(116) +69 + j*(120) +136 + j*(-18) +-23 + j*(-159) +-256 + j*(24) +-80 + j*(365) +330 + j*(245) +287 + j*(-135) +37 + j*(-103) +168 + j*(-3) +186 + j*(-301) +-249 + j*(-327) +-316 + j*(146) +108 + j*(220) +131 + j*(-115) +-116 + j*(-52) +32 + j*(124) +145 + j*(-91) +-105 + j*(-140) +-87 + j*(123) +180 + j*(47) +63 + j*(-209) +-160 + j*(-81) +-38 + j*(88) +64 + j*(-7) +20 + j*(-28) +115 + j*(-38) +99 + j*(-277) +-234 + j*(-341) +-409 + j*(-42) +-264 + j*(163) +-161 + j*(181) +-78 + j*(243) +97 + j*(187) +78 + j*(-12) +-109 + j*(10) +-78 + j*(188) +74 + j*(170) +57 + j*(90) +52 + j*(166) +225 + j*(163) +296 + j*(-59) +115 + j*(-217) +-72 + j*(-135) +-82 + j*(17) +-6 + j*(81) +66 + j*(100) +185 + j*(84) +301 + j*(-90) +166 + j*(-356) +-186 + j*(-339) +-274 + j*(-1) +9 + j*(103) +66 + j*(-180) +-290 + j*(-209) +-366 + j*(228) +91 + j*(401) +346 + j*(-5) +26 + j*(-292) +-251 + j*(-59) +-98 + j*(175) +66 + j*(78) +-12 + j*(8) +-7 + j*(115) +160 + j*(83) +155 + j*(-130) +-54 + j*(-180) +-153 + j*(-28) +-89 + j*(84) +-6 + j*(110) +89 + j*(86) +142 + j*(-53) +-13 + j*(-197) +-251 + j*(-72) +-217 + j*(242) +96 + j*(346) +317 + j*(132) +251 + j*(-104) +109 + j*(-132) +105 + j*(-97) +118 + j*(-192) +-37 + j*(-279) +-204 + j*(-156) +-153 + j*(13) +-40 + j*(-14) +-92 + j*(-90) +-186 + j*(-26) +-175 + j*(81) +-127 + j*(153) +-21 + j*(222) +151 + j*(170) +187 + j*(-21) +50 + j*(-118) +-42 + j*(-59) +-39 + j*(-8) +-21 + j*(18) +40 + j*(1) +13 + j*(-132) +-224 + j*(-133) +-315 + j*(181) +-11 + j*(388) +260 + j*(185) +177 + j*(-47) +52 + j*(-30) +74 + j*(-1) +69 + j*(-54) +11 + j*(-70) +-47 + j*(-48) +-98 + j*(51) +21 + j*(202) +278 + j*(107) +259 + j*(-214) +-47 + j*(-292) +-184 + j*(-76) +-87 + j*(51) +-16 + j*(53) +48 + j*(52) +106 + j*(-47) +0 + j*(-146) +-110 + j*(-61) +-61 + j*(11) +-78 + j*(-21) +-138 + j*(102) +61 + j*(233) +269 + j*(23) +98 + j*(-221) +-117 + j*(-100) +-11 + j*(49) +83 + j*(-84) +-86 + j*(-168) +-194 + j*(12) +-35 + j*(151) +134 + j*(22) +34 + j*(-185) +-217 + j*(-127) +-222 + j*(148) +38 + j*(204) +94 + j*(-13) +-94 + j*(-19) +-34 + j*(184) +206 + j*(78) +87 + j*(-186) +-176 + j*(-74) +-70 + j*(165) +139 + j*(65) +45 + j*(-117) +-125 + j*(-42) +-93 + j*(124) +66 + j*(168) +198 + j*(37) +115 + j*(-163) +-119 + j*(-122) +-93 + j*(118) +155 + j*(82) +110 + j*(-169) +-119 + j*(-132) +-86 + j*(26) +-31 + j*(-42) +-178 + j*(-10) +-111 + j*(211) +130 + j*(144) +46 + j*(-66) +-131 + j*(70) +38 + j*(249) +221 + j*(107) +157 + j*(-16) +155 + j*(-5) +179 + j*(-116) +18 + j*(-182) +-58 + j*(-21) +92 + j*(47) +168 + j*(-78) +130 + j*(-164) +100 + j*(-258) +-71 + j*(-373) +-326 + j*(-263) +-372 + j*(6) +-234 + j*(173) +-55 + j*(218) +138 + j*(98) +81 + j*(-190) +-284 + j*(-191) +-366 + j*(220) +19 + j*(387) +223 + j*(95) +37 + j*(-59) +-33 + j*(66) +74 + j*(77) +67 + j*(-16) +18 + j*(-8) +35 + j*(-17) +-20 + j*(-47) +-59 + j*(38) +51 + j*(74) +84 + j*(-63) +-71 + j*(-116) +-163 + j*(29) +-78 + j*(157) +45 + j*(167) +136 + j*(98) +145 + j*(-29) +32 + j*(-86) +-31 + j*(0) +45 + j*(35) +37 + j*(-54) +-79 + j*(-17) +-37 + j*(136) +124 + j*(117) +135 + j*(4) +116 + j*(9) +202 + j*(-54) +114 + j*(-238) +-129 + j*(-163) +-43 + j*(97) +244 + j*(-28) +110 + j*(-376) +-279 + j*(-310) +-317 + j*(26) +-120 + j*(119) +-50 + j*(67) +-16 + j*(54) +-6 + j*(-23) +-122 + j*(-19) +-99 + j*(146) +88 + j*(121) +55 + j*(-42) +-49 + j*(33) +95 + j*(83) +111 + j*(-130) +-130 + j*(-122) +-85 + j*(98) +86 + j*(-28) +-152 + j*(-158) +-274 + j*(185) +112 + j*(320) +233 + j*(-37) +-53 + j*(-80) +35 + j*(146) +236 + j*(-71) +-59 + j*(-267) +-232 + j*(49) +74 + j*(153) +74 + j*(-140) +-220 + j*(-44) +-60 + j*(252) +216 + j*(71) +47 + j*(-149) +-83 + j*(-3) +47 + j*(13) +-41 + j*(-135) +-235 + j*(13) +-110 + j*(233) +67 + j*(183) +64 + j*(119) +117 + j*(146) +194 + j*(61) +143 + j*(-20) +128 + j*(15) +204 + j*(-31) +170 + j*(-153) +68 + j*(-177) +22 + j*(-149) +-2 + j*(-132) +5 + j*(-116) +-2 + j*(-176) +-142 + j*(-200) +-238 + j*(-6) +-39 + j*(161) +194 + j*(-13) +81 + j*(-310) +-246 + j*(-333) +-436 + j*(-70) +-335 + j*(222) +-67 + j*(279) +45 + j*(95) +-96 + j*(21) +-137 + j*(187) +50 + j*(249) +135 + j*(106) +70 + j*(63) +136 + j*(97) +212 + j*(-73) +5 + j*(-238) +-239 + j*(-66) +-150 + j*(211) +103 + j*(215) +163 + j*(35) +57 + j*(-25) +30 + j*(62) +146 + j*(84) +233 + j*(-52) +152 + j*(-210) +-9 + j*(-251) +-136 + j*(-193) +-221 + j*(-83) +-220 + j*(81) +-87 + j*(194) +66 + j*(155) +107 + j*(48) +74 + j*(-18) +21 + j*(-40) +-28 + j*(-1) +13 + j*(69) +110 + j*(30) +85 + j*(-83) +-18 + j*(-68) +13 + j*(9) +90 + j*(-57) +10 + j*(-161) +-117 + j*(-118) +-137 + j*(-20) +-113 + j*(33) +-80 + j*(78) +-25 + j*(77) +-42 + j*(56) +-46 + j*(147) +124 + j*(187) +217 + j*(-13) +31 + j*(-104) +2 + j*(95) +279 + j*(64) +256 + j*(-303) +-119 + j*(-344) +-187 + j*(-61) +-23 + j*(-69) +-168 + j*(-178) +-296 + j*(68) +-33 + j*(220) +90 + j*(-9) +-116 + j*(-49) +-62 + j*(161) +171 + j*(33) +8 + j*(-227) +-273 + j*(-74) +-165 + j*(191) +39 + j*(132) +1 + j*(-1) +-91 + j*(30) +-94 + j*(113) +-35 + j*(174) +59 + j*(161) +62 + j*(87) +10 + j*(141) +151 + j*(231) +321 + j*(64) +194 + j*(-141) +42 + j*(-47) +175 + j*(44) +270 + j*(-148) +98 + j*(-295) +-53 + j*(-226) +-73 + j*(-174) +-142 + j*(-168) +-224 + j*(-60) +-188 + j*(91) +-53 + j*(160) +82 + j*(100) +92 + j*(-41) +-30 + j*(-74) +-54 + j*(42) +82 + j*(57) +119 + j*(-100) +-28 + j*(-187) +-156 + j*(-103) +-156 + j*(23) +-69 + j*(81) +-1 + j*(32) +-45 + j*(-26) +-103 + j*(35) +-39 + j*(94) +-1 + j*(37) +-69 + j*(52) +-14 + j*(148) +107 + j*(83) +38 + j*(-28) +-47 + j*(65) +69 + j*(149) +162 + j*(56) +148 + j*(-6) +187 + j*(-57) +151 + j*(-212) +-47 + j*(-245) +-120 + j*(-114) +-88 + j*(-104) +-215 + j*(-94) +-254 + j*(150) +25 + j*(280) +215 + j*(49) +75 + j*(-141) +-57 + j*(-86) +-49 + j*(-52) +-116 + j*(-78) +-218 + j*(32) +-154 + j*(216) +44 + j*(256) +159 + j*(120) +93 + j*(11) +29 + j*(79) +168 + j*(136) +289 + j*(-55) +121 + j*(-248) +-80 + j*(-144) +-9 + j*(2) +95 + j*(-88) +-16 + j*(-204) +-158 + j*(-133) +-169 + j*(-13) +-126 + j*(45) +-87 + j*(78) +-39 + j*(97) +15 + j*(76) +16 + j*(18) +-62 + j*(27) +-51 + j*(170) +177 + j*(209) +314 + j*(-57) +86 + j*(-280) +-158 + j*(-137) +-91 + j*(60) +25 + j*(33) +6 + j*(-6) +29 + j*(25) +83 + j*(-34) +33 + j*(-112) +-38 + j*(-119) +-115 + j*(-112) +-223 + j*(7) +-120 + j*(232) +189 + j*(190) +219 + j*(-157) +-121 + j*(-256) +-274 + j*(45) +-37 + j*(234) +153 + j*(59) +25 + j*(-115) +-133 + j*(-16) +-61 + j*(133) +59 + j*(97) +47 + j*(34) +62 + j*(63) +148 + j*(-17) +33 + j*(-173) +-186 + j*(-53) +-88 + j*(214) +206 + j*(169) +242 + j*(-101) +56 + j*(-220) +-110 + j*(-164) +-190 + j*(8) +-42 + j*(207) +250 + j*(103) +214 + j*(-243) +-114 + j*(-279) +-187 + j*(-39) +-49 + j*(-1) +-78 + j*(-83) +-148 + j*(-26) +-132 + j*(13) +-185 + j*(52) +-146 + j*(223) +103 + j*(230) +155 + j*(-30) +-83 + j*(-110) +-197 + j*(76) +-116 + j*(229) +21 + j*(315) +247 + j*(280) +337 + j*(28) +148 + j*(-100) +95 + j*(46) +279 + j*(8) +224 + j*(-229) +4 + j*(-213) +19 + j*(-83) +58 + j*(-142) +-37 + j*(-124) +52 + j*(-28) +164 + j*(-220) +-91 + j*(-414) +-366 + j*(-209) +-298 + j*(42) +-187 + j*(81) +-144 + j*(138) +12 + j*(137) +37 + j*(-57) +-192 + j*(-78) +-225 + j*(185) +33 + j*(250) +116 + j*(46) +-38 + j*(-6) +-51 + j*(135) +100 + j*(148) +154 + j*(6) +57 + j*(-79) +-26 + j*(-34) +-6 + j*(18) +17 + j*(-15) +-52 + j*(-29) +-91 + j*(77) +27 + j*(167) +163 + j*(81) +145 + j*(-67) +37 + j*(-111) +-34 + j*(-67) +-49 + j*(-6) +-13 + j*(38) +33 + j*(25) +28 + j*(-11) +10 + j*(5) +55 + j*(19) +85 + j*(-62) +-13 + j*(-122) +-99 + j*(-35) +-28 + j*(44) +11 + j*(-31) +-107 + j*(-26) +-80 + j*(164) +177 + j*(151) +196 + j*(-140) +-95 + j*(-177) +-123 + j*(104) +161 + j*(116) +181 + j*(-173) +-81 + j*(-233) +-182 + j*(-49) +-103 + j*(49) +-45 + j*(55) +-7 + j*(40) +-18 + j*(9) +-38 + j*(62) +76 + j*(97) +147 + j*(-59) +1 + j*(-163) +-95 + j*(-69) +-64 + j*(-48) +-163 + j*(-59) +-209 + j*(148) +40 + j*(250) +170 + j*(28) +2 + j*(-81) +-56 + j*(37) +15 + j*(49) +-16 + j*(30) +20 + j*(98) +111 + j*(29) +21 + j*(-49) +-20 + j*(66) +112 + j*(75) +100 + j*(-32) +85 + j*(42) +291 + j*(-49) +173 + j*(-420) +-298 + j*(-370) +-324 + j*(59) +-48 + j*(74) +-159 + j*(-41) +-181 + j*(245) +249 + j*(251) +287 + j*(-256) +-209 + j*(-344) +-335 + j*(52) +-99 + j*(153) +-103 + j*(59) +-148 + j*(183) +20 + j*(267) +143 + j*(168) +164 + j*(77) +154 + j*(-22) +39 + j*(-74) +-16 + j*(31) +81 + j*(57) +69 + j*(-30) +8 + j*(27) +122 + j*(63) +148 + j*(-88) +8 + j*(-102) +31 + j*(-4) +88 + j*(-91) +-49 + j*(-115) +-43 + j*(47) +124 + j*(12) +73 + j*(-129) +17 + j*(-69) +127 + j*(-136) +-30 + j*(-349) +-322 + j*(-190) +-207 + j*(65) +-92 + j*(-72) +-361 + j*(-65) +-357 + j*(356) +94 + j*(453) +255 + j*(125) +100 + j*(25) +146 + j*(93) +240 + j*(-49) +127 + j*(-201) +-4 + j*(-204) +-99 + j*(-184) +-204 + j*(-93) +-183 + j*(53) +-101 + j*(95) +-60 + j*(116) +37 + j*(127) +93 + j*(2) +-21 + j*(-56) +-40 + j*(37) +48 + j*(-22) +-98 + j*(-139) +-279 + j*(56) +-123 + j*(288) +81 + j*(230) +97 + j*(149) +161 + j*(140) +210 + j*(7) +93 + j*(-68) +64 + j*(6) +116 + j*(-44) +-8 + j*(-90) +-49 + j*(92) +177 + j*(143) +261 + j*(-70) +144 + j*(-159) +139 + j*(-167) +78 + j*(-310) +-162 + j*(-307) +-234 + j*(-112) +-184 + j*(-62) +-274 + j*(4) +-209 + j*(250) +97 + j*(261) +163 + j*(23) +49 + j*(-13) +113 + j*(1) +88 + j*(-163) +-120 + j*(-135) +-76 + j*(54) +69 + j*(-40) +-93 + j*(-144) +-165 + j*(64) +66 + j*(83) +15 + j*(-163) +-262 + j*(-41) +-98 + j*(272) +240 + j*(97) +84 + j*(-248) +-245 + j*(-141) +-202 + j*(138) +-9 + j*(141) +-1 + j*(28) +-83 + j*(39) +-77 + j*(132) +23 + j*(163) +81 + j*(83) +12 + j*(46) +16 + j*(149) +179 + j*(144) +218 + j*(-46) +69 + j*(-117) +20 + j*(-46) +28 + j*(-66) +-68 + j*(-49) +-46 + j*(98) +112 + j*(77) +72 + j*(-54) +-12 + j*(48) +187 + j*(113) +289 + j*(-169) +-6 + j*(-335) +-197 + j*(-103) +-42 + j*(43) +20 + j*(-68) +-81 + j*(-54) +-11 + j*(52) +110 + j*(-62) +-29 + j*(-222) +-240 + j*(-105) +-187 + j*(134) +35 + j*(152) +90 + j*(-28) +-54 + j*(-78) +-71 + j*(60) +93 + j*(36) +40 + j*(-177) +-226 + j*(-124) +-188 + j*(163) +86 + j*(129) +23 + j*(-124) +-231 + j*(-31) +-148 + j*(234) +86 + j*(197) +88 + j*(45) +25 + j*(46) +52 + j*(56) +45 + j*(24) +30 + j*(45) +59 + j*(49) +66 + j*(45) +127 + j*(57) +200 + j*(-73) +43 + j*(-219) +-136 + j*(-70) +16 + j*(93) +148 + j*(-98) +-89 + j*(-221) +-221 + j*(32) +6 + j*(159) +101 + j*(-30) +-57 + j*(-80) +-86 + j*(57) +13 + j*(91) +62 + j*(70) +149 + j*(31) +168 + j*(-148) +-50 + j*(-239) +-175 + j*(-48) +-16 + j*(45) +9 + j*(-124) +-214 + j*(-118) +-241 + j*(146) +-8 + j*(228) +90 + j*(82) +18 + j*(32) +32 + j*(85) +107 + j*(50) +110 + j*(-39) +56 + j*(-98) +-40 + j*(-115) +-132 + j*(-23) +-74 + j*(122) +91 + j*(100) +89 + j*(-47) +-24 + j*(-38) +23 + j*(49) +101 + j*(-47) +-33 + j*(-129) +-115 + j*(35) +75 + j*(115) +168 + j*(-95) +-33 + j*(-216) +-160 + j*(-74) +-98 + j*(11) +-95 + j*(-8) +-118 + j*(54) +-52 + j*(83) +-64 + j*(42) +-121 + j*(134) +11 + j*(265) +197 + j*(185) +222 + j*(35) +206 + j*(-37) +188 + j*(-154) +32 + j*(-243) +-110 + j*(-148) +-96 + j*(-51) +-106 + j*(-40) +-139 + j*(66) +8 + j*(163) +144 + j*(21) +14 + j*(-112) +-97 + j*(24) +70 + j*(129) +204 + j*(-57) +37 + j*(-243) +-178 + j*(-142) +-157 + j*(46) +-51 + j*(66) +-57 + j*(59) +1 + j*(157) +222 + j*(100) +239 + j*(-216) +-88 + j*(-344) +-288 + j*(-112) +-199 + j*(47) +-189 + j*(48) +-208 + j*(198) +13 + j*(298) +150 + j*(100) +-20 + j*(11) +-41 + j*(216) +219 + j*(242) +327 + j*(5) +231 + j*(-164) +106 + j*(-264) +-136 + j*(-272) +-288 + j*(7) +-48 + j*(240) +183 + j*(67) +69 + j*(-98) +8 + j*(-6) +122 + j*(-62) +-15 + j*(-235) +-255 + j*(-78) +-135 + j*(192) +119 + j*(133) +104 + j*(-75) +-58 + j*(-89) +-105 + j*(45) +6 + j*(143) +162 + j*(75) +156 + j*(-111) +-13 + j*(-154) +-62 + j*(-30) +33 + j*(-12) +28 + j*(-91) +-11 + j*(-88) +13 + j*(-136) +-122 + j*(-258) +-389 + j*(-124) +-364 + j*(233) +-42 + j*(342) +110 + j*(139) +2 + j*(38) +-25 + j*(129) +90 + j*(124) +81 + j*(5) +-28 + j*(35) +36 + j*(149) +177 + j*(70) +100 + j*(-72) +-10 + j*(13) +117 + j*(105) +227 + j*(-49) +110 + j*(-186) +2 + j*(-158) +-42 + j*(-147) +-136 + j*(-84) +-80 + j*(61) +59 + j*(-19) +-93 + j*(-139) +-214 + j*(105) +108 + j*(238) +248 + j*(-132) +-146 + j*(-269) +-270 + j*(115) +57 + j*(209) +85 + j*(-21) +-40 + j*(62) +174 + j*(110) +185 + j*(-214) +-194 + j*(-202) +-136 + j*(186) +248 + j*(59) +61 + j*(-331) +-327 + j*(-134) +-161 + j*(205) +70 + j*(64) +-84 + j*(-35) +-82 + j*(168) +170 + j*(116) +105 + j*(-159) +-163 + j*(-94) +-102 + j*(147) +100 + j*(89) +31 + j*(-79) +-114 + j*(4) +-25 + j*(144) +112 + j*(64) +41 + j*(-65) +-84 + j*(9) +-18 + j*(151) +137 + j*(129) +190 + j*(9) +163 + j*(-89) +85 + j*(-173) +-68 + j*(-154) +-93 + j*(26) +119 + j*(64) +183 + j*(-209) +-139 + j*(-343) +-365 + j*(-29) +-107 + j*(252) +180 + j*(51) +11 + j*(-232) +-279 + j*(-96) +-200 + j*(193) +42 + j*(170) +37 + j*(-5) +-93 + j*(13) +-81 + j*(137) +21 + j*(187) +158 + j*(174) +303 + j*(-10) +155 + j*(-324) +-275 + j*(-277) +-348 + j*(180) +57 + j*(327) +197 + j*(1) +-89 + j*(-71) +-107 + j*(244) +254 + j*(283) +382 + j*(-61) +137 + j*(-263) +-69 + j*(-141) +-19 + j*(32) +138 + j*(8) +135 + j*(-159) +-20 + j*(-175) +-9 + j*(-51) +126 + j*(-153) +-52 + j*(-384) +-409 + j*(-234) +-389 + j*(165) +-78 + j*(276) +81 + j*(133) +94 + j*(11) +42 + j*(-99) +-103 + j*(-112) +-155 + j*(25) +-57 + j*(74) +-47 + j*(23) +-64 + j*(69) +36 + j*(51) +-16 + j*(-105) +-230 + j*(-46) +-211 + j*(189) +-51 + j*(221) +-39 + j*(208) +67 + j*(312) +308 + j*(188) +240 + j*(-112) +-30 + j*(-91) +-16 + j*(126) +153 + j*(117) +170 + j*(12) +156 + j*(-11) +173 + j*(-64) +130 + j*(-112) +123 + j*(-123) +100 + j*(-220) +-86 + j*(-247) +-170 + j*(-43) +21 + j*(40) +64 + j*(-161) +-175 + j*(-176) +-196 + j*(100) +91 + j*(138) +151 + j*(-144) +-111 + j*(-234) +-230 + j*(-19) +-85 + j*(96) +-11 + j*(9) +-78 + j*(-10) +-66 + j*(57) +-17 + j*(30) +-70 + j*(21) +-45 + j*(133) +139 + j*(109) +154 + j*(-121) +-70 + j*(-189) +-165 + j*(-28) +-98 + j*(46) +-93 + j*(60) +-33 + j*(136) +93 + j*(59) +-5 + j*(-81) +-144 + j*(55) +36 + j*(194) +176 + j*(-16) +-49 + j*(-146) +-166 + j*(75) +32 + j*(179) +109 + j*(33) +25 + j*(9) +74 + j*(42) +80 + j*(-77) +-93 + j*(-79) +-105 + j*(128) +111 + j*(162) +170 + j*(-36) +-4 + j*(-98) +-60 + j*(74) +142 + j*(148) +281 + j*(-80) +70 + j*(-296) +-184 + j*(-135) +-49 + j*(103) +166 + j*(-62) +-46 + j*(-301) +-354 + j*(-80) +-202 + j*(281) +147 + j*(244) +206 + j*(-15) +78 + j*(-109) +20 + j*(-95) +-17 + j*(-116) +-112 + j*(-98) +-159 + j*(30) +-44 + j*(146) +110 + j*(66) +59 + j*(-88) +-69 + j*(-35) +13 + j*(67) +104 + j*(-51) +-37 + j*(-129) +-83 + j*(6) +40 + j*(-13) +-67 + j*(-129) +-181 + j*(74) +120 + j*(185) +238 + j*(-213) +-223 + j*(-363) +-411 + j*(107) +-2 + j*(288) +109 + j*(-43) +-169 + j*(-46) +-73 + j*(214) +182 + j*(56) +-7 + j*(-186) +-223 + j*(5) +-57 + j*(177) +38 + j*(27) +-137 + j*(19) +-122 + j*(259) +152 + j*(303) +272 + j*(86) +-58 + j*(-93) +-100 + j*(0) +-47 + j*(62) +-12 + j*(48) +-19 + j*(68) +38 + j*(112) +134 + j*(77) +177 + j*(-38) +98 + j*(-164) +-70 + j*(-146) +-91 + j*(26) +86 + j*(44) +100 + j*(-155) +-105 + j*(-187) +-153 + j*(-31) +-88 + j*(-11) +-148 + j*(4) +-104 + j*(144) +77 + j*(93) +1 + j*(-83) +-163 + j*(29) +-42 + j*(179) +59 + j*(88) +6 + j*(103) +173 + j*(161) +295 + j*(-125) +-27 + j*(-320) +-240 + j*(-48) +-51 + j*(89) +-64 + j*(-56) +-240 + j*(108) +-5 + j*(366) +302 + j*(178) +229 + j*(-81) +117 + j*(-100) +71 + j*(-159) +-107 + j*(-115) +-44 + j*(127) +263 + j*(4) +87 + j*(-390) +-380 + j*(-223) +-282 + j*(247) +94 + j*(209) +51 + j*(-11) +-28 + j*(110) +204 + j*(122) +228 + j*(-181) +-72 + j*(-256) +-180 + j*(-27) +-45 + j*(78) +35 + j*(24) +47 + j*(-24) +25 + j*(-95) +-91 + j*(-107) +-139 + j*(34) +9 + j*(113) +112 + j*(-32) +-18 + j*(-163) +-177 + j*(-57) +-107 + j*(117) +78 + j*(79) +77 + j*(-130) +-155 + j*(-194) +-317 + j*(21) +-192 + j*(254) +25 + j*(245) +75 + j*(124) +42 + j*(116) +113 + j*(134) +172 + j*(31) +92 + j*(-42) +69 + j*(21) +177 + j*(-21) +120 + j*(-209) +-117 + j*(-191) +-136 + j*(36) +48 + j*(42) +5 + j*(-117) +-158 + j*(-22) +-24 + j*(159) +185 + j*(-5) +11 + j*(-269) +-325 + j*(-140) +-317 + j*(235) +-3 + j*(373) +219 + j*(210) +212 + j*(26) +151 + j*(-43) +105 + j*(-101) +-23 + j*(-127) +-122 + j*(30) +38 + j*(196) +255 + j*(71) +202 + j*(-150) +57 + j*(-155) +62 + j*(-115) +39 + j*(-182) +-60 + j*(-165) +-47 + j*(-109) +-64 + j*(-175) +-222 + j*(-132) +-204 + j*(82) +8 + j*(83) +1 + j*(-105) +-180 + j*(-86) +-175 + j*(76) +-64 + j*(91) +-54 + j*(36) +-90 + j*(42) +-106 + j*(91) +-60 + j*(166) +63 + j*(159) +100 + j*(40) +21 + j*(1) +16 + j*(33) +9 + j*(-4) +-69 + j*(47) +34 + j*(168) +188 + j*(21) +13 + j*(-138) +-121 + j*(76) +148 + j*(175) +223 + j*(-135) +-93 + j*(-193) +-115 + j*(88) +107 + j*(58) +14 + j*(-93) +-54 + j*(69) +182 + j*(64) +148 + j*(-245) +-184 + j*(-229) +-210 + j*(34) +-93 + j*(59) +-148 + j*(106) +-1 + j*(295) +303 + j*(149) +215 + j*(-178) +-49 + j*(-133) +8 + j*(54) +163 + j*(-39) +81 + j*(-192) +-59 + j*(-179) +-118 + j*(-100) +-118 + j*(-17) +-53 + j*(13) +-23 + j*(-49) +-103 + j*(-74) +-150 + j*(24) +-73 + j*(118) +40 + j*(91) +52 + j*(-34) +-111 + j*(-65) +-180 + j*(177) +151 + j*(338) +451 + j*(-25) +139 + j*(-444) +-315 + j*(-242) +-226 + j*(152) +42 + j*(132) +35 + j*(14) +57 + j*(62) +177 + j*(-66) +-3 + j*(-282) +-297 + j*(-113) +-188 + j*(219) +132 + j*(180) +148 + j*(-101) +-95 + j*(-163) +-209 + j*(33) +-90 + j*(197) +86 + j*(182) +173 + j*(62) +156 + j*(-76) +34 + j*(-168) +-134 + j*(-119) +-182 + j*(73) +-31 + j*(220) +190 + j*(178) +297 + j*(-51) +141 + j*(-304) +-197 + j*(-269) +-278 + j*(76) +25 + j*(207) +144 + j*(-59) +-113 + j*(-132) +-148 + j*(136) +122 + j*(145) +107 + j*(-110) +-127 + j*(-78) +-93 + j*(135) +77 + j*(127) +96 + j*(30) +80 + j*(14) +95 + j*(-9) +99 + j*(-38) +117 + j*(-107) +3 + j*(-215) +-190 + j*(-97) +-77 + j*(134) +146 + j*(0) +-30 + j*(-206) +-221 + j*(6) +1 + j*(166) +99 + j*(-44) +-90 + j*(-54) +-4 + j*(112) +129 + j*(-68) +-141 + j*(-153) +-177 + j*(202) +255 + j*(204) +247 + j*(-276) +-231 + j*(-282) +-257 + j*(129) +39 + j*(151) +18 + j*(-12) +-31 + j*(76) +124 + j*(52) +65 + j*(-145) +-137 + j*(-75) +-69 + j*(94) +24 + j*(14) +-105 + j*(13) +-45 + j*(247) +314 + j*(206) +386 + j*(-235) +-34 + j*(-457) +-368 + j*(-156) +-218 + j*(197) +83 + j*(174) +133 + j*(-45) +3 + j*(-134) +-103 + j*(-102) +-164 + j*(-21) +-149 + j*(93) +-49 + j*(140) +1 + j*(98) +-2 + j*(107) +66 + j*(122) +112 + j*(45) +75 + j*(13) +108 + j*(7) +89 + j*(-122) +-135 + j*(-112) +-146 + j*(194) +220 + j*(252) +347 + j*(-121) +47 + j*(-301) +-122 + j*(-133) +-78 + j*(-59) +-132 + j*(-39) +-121 + j*(107) +43 + j*(123) +65 + j*(3) +0 + j*(6) +28 + j*(19) +-25 + j*(-3) +-30 + j*(155) +253 + j*(176) +336 + j*(-194) +-51 + j*(-327) +-173 + j*(32) +180 + j*(102) +216 + j*(-272) +-151 + j*(-323) +-221 + j*(-20) +2 + j*(30) +21 + j*(-152) +-139 + j*(-194) +-252 + j*(-92) +-257 + j*(56) +-141 + j*(144) +-59 + j*(66) +-171 + j*(40) +-189 + j*(245) +78 + j*(329) +228 + j*(83) +52 + j*(-64) +-35 + j*(65) +88 + j*(93) +81 + j*(-29) +-19 + j*(4) +51 + j*(73) +91 + j*(-49) +-89 + j*(-61) +-86 + j*(194) +256 + j*(208) +338 + j*(-194) +-61 + j*(-372) +-310 + j*(-57) +-134 + j*(196) +39 + j*(155) +78 + j*(124) +184 + j*(71) +158 + j*(-110) +-35 + j*(-86) +41 + j*(105) +264 + j*(-45) +71 + j*(-322) +-231 + j*(-133) +-52 + j*(143) +177 + j*(-59) +-62 + j*(-261) +-265 + j*(-12) +-57 + j*(189) +100 + j*(47) +11 + j*(-28) +30 + j*(59) +171 + j*(-17) +115 + j*(-232) +-136 + j*(-275) +-298 + j*(-68) +-198 + j*(163) +26 + j*(162) +63 + j*(-18) +-88 + j*(-41) +-87 + j*(114) +82 + j*(100) +62 + j*(-83) +-148 + j*(-65) +-165 + j*(178) +78 + j*(281) +283 + j*(105) +230 + j*(-146) +14 + j*(-204) +-83 + j*(-59) +19 + j*(8) +47 + j*(-107) +-103 + j*(-122) +-119 + j*(39) +34 + j*(43) +8 + j*(-108) +-144 + j*(-64) +-92 + j*(64) +-23 + j*(-25) +-202 + j*(-58) +-268 + j*(207) +-1 + j*(356) +174 + j*(184) +100 + j*(89) +133 + j*(158) +271 + j*(72) +241 + j*(-103) +148 + j*(-155) +100 + j*(-218) +-76 + j*(-274) +-255 + j*(-100) +-162 + j*(118) +-14 + j*(100) +-36 + j*(74) +29 + j*(173) +219 + j*(96) +190 + j*(-135) +-16 + j*(-155) +-52 + j*(0) +69 + j*(35) +124 + j*(-68) +57 + j*(-160) +-52 + j*(-144) +-59 + j*(-53) +17 + j*(-84) +-78 + j*(-204) +-276 + j*(-84) +-190 + j*(167) +47 + j*(124) +13 + j*(-64) +-138 + j*(-23) +-124 + j*(95) +-76 + j*(151) +35 + j*(229) +257 + j*(121) +202 + j*(-192) +-126 + j*(-186) +-129 + j*(104) +112 + j*(78) +50 + j*(-122) +-115 + j*(-42) +-47 + j*(78) +13 + j*(50) +39 + j*(70) +154 + j*(0) +69 + j*(-195) +-146 + j*(-127) +-76 + j*(21) +-59 + j*(-121) +-358 + j*(-37) +-269 + j*(436) +284 + j*(436) +382 + j*(-49) +68 + j*(-164) +28 + j*(-40) +11 + j*(-114) +-161 + j*(-1) +25 + j*(226) +277 + j*(-13) +2 + j*(-267) +-229 + j*(18) +38 + j*(206) +164 + j*(-23) +-12 + j*(-69) +23 + j*(59) +113 + j*(-27) +19 + j*(-70) +52 + j*(20) +153 + j*(-98) +1 + j*(-229) +-131 + j*(-111) +-78 + j*(-48) +-129 + j*(-68) +-166 + j*(77) +5 + j*(139) +53 + j*(0) +-34 + j*(21) +91 + j*(74) +140 + j*(-159) +-173 + j*(-236) +-292 + j*(107) +22 + j*(258) +171 + j*(2) +-24 + j*(-113) +-100 + j*(34) +14 + j*(82) +34 + j*(-3) +-37 + j*(-2) +-23 + j*(80) +86 + j*(86) +136 + j*(-40) +23 + j*(-136) +-95 + j*(-59) +-56 + j*(43) +0 + j*(30) +-11 + j*(40) +77 + j*(76) +170 + j*(-75) +3 + j*(-244) +-219 + j*(-118) +-163 + j*(91) +-27 + j*(72) +-74 + j*(15) +-110 + j*(128) +45 + j*(200) +165 + j*(61) +72 + j*(-80) +-64 + j*(-24) +-37 + j*(105) +81 + j*(119) +138 + j*(49) +156 + j*(-16) +142 + j*(-117) +9 + j*(-184) +-108 + j*(-65) +-1 + j*(55) +105 + j*(-69) +-52 + j*(-182) +-187 + j*(-1) +-2 + j*(153) +178 + j*(-25) +27 + j*(-255) +-250 + j*(-187) +-313 + j*(76) +-156 + j*(240) +-13 + j*(222) +21 + j*(215) +143 + j*(276) +366 + j*(147) +343 + j*(-151) +117 + j*(-214) +105 + j*(-119) +141 + j*(-264) +-132 + j*(-344) +-269 + j*(-49) +-8 + j*(69) +23 + j*(-182) +-247 + j*(-142) +-164 + j*(129) +55 + j*(-15) +-192 + j*(-189) +-375 + j*(148) +-27 + j*(369) +183 + j*(85) +-32 + j*(-37) +-41 + j*(161) +185 + j*(100) +115 + j*(-148) +-120 + j*(-119) +-140 + j*(70) +-25 + j*(124) +41 + j*(73) +18 + j*(6) +-73 + j*(35) +-45 + j*(182) +153 + j*(185) +195 + j*(-16) +21 + j*(-59) +9 + j*(117) +218 + j*(127) +294 + j*(-98) +137 + j*(-260) +-60 + j*(-227) +-136 + j*(-63) +-22 + j*(70) +148 + j*(-11) +111 + j*(-217) +-107 + j*(-260) +-231 + j*(-105) +-192 + j*(38) +-115 + j*(89) +-54 + j*(93) +-22 + j*(81) +1 + j*(84) +52 + j*(76) +77 + j*(13) +37 + j*(-25) +25 + j*(8) +88 + j*(-7) +87 + j*(-119) +-45 + j*(-185) +-189 + j*(-96) +-198 + j*(83) +-51 + j*(183) +87 + j*(113) +77 + j*(4) +25 + j*(16) +90 + j*(40) +155 + j*(-81) +42 + j*(-221) +-137 + j*(-199) +-225 + j*(-76) +-243 + j*(45) +-204 + j*(182) +-61 + j*(288) +133 + j*(248) +224 + j*(81) +153 + j*(-76) +4 + j*(-97) +-74 + j*(21) +14 + j*(138) +168 + j*(95) +193 + j*(-69) +64 + j*(-153) +-27 + j*(-81) +20 + j*(-16) +66 + j*(-81) +-18 + j*(-142) +-101 + j*(-75) +-67 + j*(-4) +-41 + j*(-32) +-103 + j*(-24) +-98 + j*(81) +29 + j*(103) +74 + j*(-22) +-47 + j*(-78) +-127 + j*(41) +-26 + j*(160) +125 + j*(113) +160 + j*(-31) +75 + j*(-139) +-60 + j*(-154) +-174 + j*(-51) +-153 + j*(119) +6 + j*(189) +113 + j*(96) +94 + j*(30) +121 + j*(30) +172 + j*(-88) +10 + j*(-219) +-187 + j*(-54) +-39 + j*(184) +237 + j*(52) +151 + j*(-251) +-156 + j*(-244) +-231 + j*(13) +-58 + j*(145) +87 + j*(50) +42 + j*(-88) +-91 + j*(-62) +-61 + j*(79) +98 + j*(30) +33 + j*(-157) +-182 + j*(-86) +-115 + j*(130) +73 + j*(50) +-46 + j*(-101) +-185 + j*(64) +5 + j*(214) +159 + j*(35) +18 + j*(-108) +-103 + j*(-11) +-60 + j*(83) +-4 + j*(95) +47 + j*(91) +85 + j*(33) +40 + j*(-16) +4 + j*(17) +15 + j*(41) +26 + j*(81) +150 + j*(123) +303 + j*(-62) +138 + j*(-344) +-212 + j*(-277) +-256 + j*(30) +-73 + j*(128) +-6 + j*(70) +5 + j*(75) +61 + j*(65) +85 + j*(18) +101 + j*(-24) +77 + j*(-115) +-62 + j*(-132) +-110 + j*(13) +10 + j*(68) +47 + j*(-10) +30 + j*(-11) +99 + j*(-71) +-31 + j*(-247) +-332 + j*(-99) +-231 + j*(294) +177 + j*(280) +240 + j*(-62) +8 + j*(-164) +-102 + j*(-46) +-88 + j*(66) +23 + j*(156) +206 + j*(66) +171 + j*(-167) +-32 + j*(-187) +-60 + j*(-83) +-61 + j*(-118) +-185 + j*(-63) +-129 + j*(107) +15 + j*(49) +-84 + j*(-28) +-100 + j*(136) +112 + j*(112) +54 + j*(-110) +-141 + j*(-11) +1 + j*(137) +76 + j*(-54) +-173 + j*(-47) +-104 + j*(264) +245 + j*(156) +110 + j*(-190) +-223 + j*(-24) +-37 + j*(310) +304 + j*(158) +242 + j*(-159) +-3 + j*(-188) +-87 + j*(-29) +23 + j*(78) +160 + j*(-24) +63 + j*(-215) +-173 + j*(-147) +-156 + j*(84) +15 + j*(103) +30 + j*(21) +25 + j*(35) +62 + j*(-1) +10 + j*(-11) +81 + j*(68) +237 + j*(-103) +16 + j*(-366) +-320 + j*(-170) +-194 + j*(140) +1 + j*(51) +-114 + j*(-6) +-73 + j*(151) +81 + j*(52) +-91 + j*(-49) +-141 + j*(226) +212 + j*(274) +280 + j*(-65) +42 + j*(-98) +131 + j*(21) +194 + j*(-222) +-152 + j*(-291) +-223 + j*(76) +125 + j*(115) +122 + j*(-217) +-176 + j*(-213) +-190 + j*(-3) +-119 + j*(-14) +-219 + j*(14) +-203 + j*(210) +-6 + j*(287) +149 + j*(202) +209 + j*(55) +133 + j*(-83) +2 + j*(-46) +74 + j*(49) +179 + j*(-95) +3 + j*(-258) +-199 + j*(-132) +-170 + j*(35) +-119 + j*(71) +-83 + j*(136) +38 + j*(141) +54 + j*(34) +-25 + j*(61) +61 + j*(153) +182 + j*(53) +131 + j*(-63) +85 + j*(-67) +73 + j*(-127) +-61 + j*(-151) +-122 + j*(-9) +-18 + j*(52) +4 + j*(-5) +-14 + j*(23) +58 + j*(1) +-18 + j*(-116) +-194 + j*(16) +-37 + j*(268) +283 + j*(143) +243 + j*(-203) +-57 + j*(-267) +-205 + j*(-64) +-112 + j*(121) +74 + j*(116) +119 + j*(-62) +-58 + j*(-122) +-123 + j*(66) +80 + j*(141) +176 + j*(-57) +19 + j*(-171) +-87 + j*(-83) +-71 + j*(-20) +-68 + j*(3) +-41 + j*(40) +-4 + j*(32) +-2 + j*(34) +58 + j*(47) +114 + j*(-51) +21 + j*(-151) +-78 + j*(-112) +-97 + j*(-73) +-161 + j*(-37) +-148 + j*(109) +38 + j*(129) +73 + j*(-78) +-150 + j*(-136) +-269 + j*(67) +-170 + j*(247) +-1 + j*(320) +208 + j*(259) +281 + j*(28) +121 + j*(-89) +81 + j*(-4) +174 + j*(-98) +-25 + j*(-274) +-297 + j*(-57) +-144 + j*(271) +159 + j*(225) +216 + j*(40) +196 + j*(-65) +116 + j*(-190) +-76 + j*(-161) +-54 + j*(21) +95 + j*(-53) +-59 + j*(-198) +-228 + j*(7) +-27 + j*(187) +124 + j*(35) +44 + j*(-49) +60 + j*(-37) +15 + j*(-174) +-230 + j*(-104) +-174 + j*(205) +130 + j*(169) +79 + j*(-66) +-72 + j*(47) +117 + j*(155) +221 + j*(-62) +61 + j*(-147) +62 + j*(-91) +47 + j*(-239) +-243 + j*(-231) +-281 + j*(124) +54 + j*(195) +121 + j*(-86) +-101 + j*(-129) +-133 + j*(22) +-74 + j*(42) +-87 + j*(78) +10 + j*(142) +106 + j*(36) +32 + j*(-50) +4 + j*(-21) +-4 + j*(-89) +-188 + j*(-73) +-204 + j*(218) +144 + j*(295) +277 + j*(-48) +-11 + j*(-194) +-123 + j*(30) +61 + j*(74) +34 + j*(-107) +-177 + j*(-31) +-98 + j*(231) +204 + j*(197) +244 + j*(-111) +-33 + j*(-225) +-197 + j*(-1) +-30 + j*(187) +153 + j*(67) +63 + j*(-95) +-81 + j*(-9) +12 + j*(141) +190 + j*(67) +177 + j*(-129) +13 + j*(-197) +-107 + j*(-113) +-117 + j*(-1) +-60 + j*(71) +23 + j*(88) +100 + j*(35) +88 + j*(-69) +-11 + j*(-82) +-11 + j*(6) +96 + j*(-40) +5 + j*(-206) +-248 + j*(-99) +-163 + j*(227) +199 + j*(185) +191 + j*(-167) +-119 + j*(-162) +-76 + j*(105) +180 + j*(8) +55 + j*(-266) +-228 + j*(-161) +-160 + j*(80) +11 + j*(8) +-114 + j*(-124) +-274 + j*(42) +-139 + j*(257) +96 + j*(208) +119 + j*(18) +-11 + j*(-27) +-40 + j*(74) +57 + j*(83) +52 + j*(-25) +-79 + j*(-2) +-48 + j*(165) +156 + j*(155) +175 + j*(-50) +-1 + j*(-70) +21 + j*(83) +192 + j*(18) +117 + j*(-190) +-97 + j*(-135) +-58 + j*(47) +81 + j*(-12) +-18 + j*(-130) +-134 + j*(4) +12 + j*(124) +128 + j*(-17) +5 + j*(-112) +-49 + j*(-5) +57 + j*(1) +31 + j*(-127) +-113 + j*(-108) +-129 + j*(9) +-81 + j*(48) +-56 + j*(81) +28 + j*(83) +38 + j*(-24) +-100 + j*(-11) +-66 + j*(181) +176 + j*(162) +204 + j*(-91) +9 + j*(-158) +-65 + j*(-59) +-69 + j*(-22) +-90 + j*(67) +57 + j*(156) +198 + j*(-14) +37 + j*(-180) +-115 + j*(-44) +4 + j*(60) +52 + j*(-54) +-56 + j*(-61) +-39 + j*(26) +-1 + j*(-2) +-39 + j*(29) +76 + j*(92) +187 + j*(-96) +-28 + j*(-264) +-224 + j*(-92) +-122 + j*(61) +-80 + j*(-1) +-158 + j*(60) +-59 + j*(183) +66 + j*(103) +13 + j*(32) +11 + j*(85) +72 + j*(45) +11 + j*(-5) +-17 + j*(65) +42 + j*(86) +44 + j*(95) +161 + j*(163) +363 + j*(-30) +178 + j*(-357) +-187 + j*(-235) +-96 + j*(74) +130 + j*(-52) +-52 + j*(-229) +-209 + j*(-28) +-30 + j*(89) +23 + j*(-59) +-107 + j*(-59) +-92 + j*(40) +-68 + j*(20) +-115 + j*(91) +22 + j*(194) +168 + j*(57) +70 + j*(-71) +26 + j*(-2) +120 + j*(-66) +-8 + j*(-235) +-249 + j*(-124) +-223 + j*(129) +-40 + j*(185) +47 + j*(116) +68 + j*(49) +35 + j*(-7) +-30 + j*(8) +-28 + j*(79) +33 + j*(113) +123 + j*(102) +204 + j*(-24) +76 + j*(-203) +-170 + j*(-90) +-69 + j*(195) +245 + j*(95) +158 + j*(-240) +-174 + j*(-190) +-177 + j*(107) +42 + j*(163) +142 + j*(49) +151 + j*(-68) +50 + j*(-195) +-172 + j*(-136) +-173 + j*(142) +119 + j*(221) +278 + j*(-36) +114 + j*(-250) +-102 + j*(-200) +-130 + j*(-32) +-1 + j*(11) +24 + j*(-122) +-148 + j*(-151) +-196 + j*(33) +-47 + j*(76) +-72 + j*(-30) +-170 + j*(101) +50 + j*(231) +221 + j*(-35) +-45 + j*(-224) +-215 + j*(4) +-42 + j*(105) +-57 + j*(-28) +-194 + j*(96) +-16 + j*(271) +156 + j*(112) +44 + j*(19) +76 + j*(128) +238 + j*(-6) +78 + j*(-228) +-148 + j*(-119) +-98 + j*(23) +-104 + j*(-27) +-246 + j*(102) +-106 + j*(381) +239 + j*(347) +337 + j*(71) +212 + j*(-62) +150 + j*(-42) +183 + j*(-61) +163 + j*(-170) +12 + j*(-219) +-98 + j*(-71) +46 + j*(55) +183 + j*(-117) +-18 + j*(-289) +-238 + j*(-91) +-73 + j*(152) +176 + j*(39) +127 + j*(-198) +-57 + j*(-233) +-146 + j*(-152) +-180 + j*(-85) +-200 + j*(1) +-144 + j*(107) +1 + j*(119) +73 + j*(-41) +-114 + j*(-161) +-310 + j*(48) +-119 + j*(334) +217 + j*(216) +178 + j*(-86) +-22 + j*(-79) +32 + j*(16) +74 + j*(-133) +-153 + j*(-197) +-279 + j*(30) +-129 + j*(180) +-37 + j*(119) +-78 + j*(130) +-8 + j*(230) +156 + j*(186) +185 + j*(20) +64 + j*(-52) +2 + j*(38) +104 + j*(86) +163 + j*(-53) +3 + j*(-146) +-120 + j*(19) +37 + j*(163) +194 + j*(24) +87 + j*(-128) +-36 + j*(-46) +44 + j*(45) +132 + j*(-40) +68 + j*(-155) +-65 + j*(-154) +-138 + j*(-47) +-95 + j*(70) +10 + j*(97) +74 + j*(43) +95 + j*(-16) +81 + j*(-103) +-44 + j*(-167) +-199 + j*(-45) +-132 + j*(197) +158 + j*(233) +322 + j*(-40) +137 + j*(-305) +-164 + j*(-239) +-192 + j*(28) +18 + j*(87) +59 + j*(-82) +-100 + j*(-79) +-55 + j*(91) +147 + j*(14) +74 + j*(-220) +-156 + j*(-181) +-140 + j*(-11) +-47 + j*(-61) +-153 + j*(-135) +-257 + j*(-30) +-238 + j*(66) +-244 + j*(126) +-209 + j*(260) +-46 + j*(312) +22 + j*(236) +9 + j*(281) +201 + j*(363) +430 + j*(145) +317 + j*(-176) +32 + j*(-187) +-30 + j*(-4) +60 + j*(49) +90 + j*(29) +136 + j*(47) +245 + j*(-40) +196 + j*(-244) +-38 + j*(-298) +-174 + j*(-123) +-88 + j*(11) +-17 + j*(-28) +-68 + j*(-49) +-83 + j*(29) +-5 + j*(65) +43 + j*(22) +53 + j*(-15) +59 + j*(-69) +-15 + j*(-142) +-151 + j*(-98) +-187 + j*(67) +-66 + j*(193) +110 + j*(187) +238 + j*(45) +207 + j*(-169) +2 + j*(-263) +-160 + j*(-136) +-109 + j*(12) +-6 + j*(-22) +-65 + j*(-117) +-212 + j*(-54) +-209 + j*(144) +-12 + j*(242) +166 + j*(105) +113 + j*(-104) +-93 + j*(-127) +-184 + j*(53) +-57 + j*(207) +129 + j*(167) +175 + j*(4) +84 + j*(-77) +45 + j*(-45) +97 + j*(-89) +6 + j*(-246) +-279 + j*(-209) +-381 + j*(130) +-100 + j*(376) +206 + j*(229) +187 + j*(-40) +-4 + j*(-87) +-64 + j*(35) +8 + j*(90) +42 + j*(54) +29 + j*(59) +69 + j*(88) +132 + j*(49) +135 + j*(-20) +111 + j*(-54) +91 + j*(-91) +34 + j*(-111) +-1 + j*(-77) +13 + j*(-76) +-38 + j*(-104) +-95 + j*(-18) +4 + j*(59) +75 + j*(-46) +-35 + j*(-94) +-40 + j*(23) +91 + j*(-29) +-1 + j*(-185) +-167 + j*(-86) +-81 + j*(33) +-61 + j*(-68) +-223 + j*(7) +-105 + j*(243) +148 + j*(127) +32 + j*(-69) +-72 + j*(95) +171 + j*(127) +173 + j*(-175) +-131 + j*(-167) +-89 + j*(83) +95 + j*(-29) +-90 + j*(-171) +-210 + j*(43) +-22 + j*(119) +-40 + j*(-27) +-184 + j*(100) +2 + j*(282) +200 + j*(127) +130 + j*(-17) +111 + j*(-9) +117 + j*(-129) +-94 + j*(-177) +-190 + j*(54) +12 + j*(165) +109 + j*(14) +8 + j*(-57) +-64 + j*(-12) +-117 + j*(70) +-55 + j*(274) +291 + j*(320) +506 + j*(-68) +216 + j*(-407) +-111 + j*(-269) +-52 + j*(-72) +22 + j*(-175) +-177 + j*(-229) +-292 + j*(14) +-74 + j*(188) +116 + j*(2) +-67 + j*(-202) +-332 + j*(-25) +-221 + j*(295) +78 + j*(299) +143 + j*(116) +87 + j*(101) +180 + j*(128) +279 + j*(-5) +235 + j*(-170) +111 + j*(-284) +-101 + j*(-310) +-286 + j*(-110) +-165 + j*(149) +86 + j*(95) +54 + j*(-112) +-113 + j*(-77) +-71 + j*(54) +33 + j*(-2) +-43 + j*(-102) +-169 + j*(-28) +-141 + j*(131) +21 + j*(176) +119 + j*(57) +62 + j*(-42) +23 + j*(-21) +62 + j*(-74) +-66 + j*(-185) +-256 + j*(-33) +-129 + j*(194) +70 + j*(87) +-54 + j*(-48) +-144 + j*(112) +21 + j*(165) +12 + j*(29) +-115 + j*(135) +61 + j*(291) +226 + j*(127) +120 + j*(44) +197 + j*(144) +371 + j*(-76) +93 + j*(-339) +-199 + j*(-67) +62 + j*(204) +298 + j*(-40) +105 + j*(-233) +-4 + j*(-117) +64 + j*(-120) +-18 + j*(-175) +-41 + j*(-80) +53 + j*(-147) +-121 + j*(-286) +-337 + j*(-67) +-146 + j*(177) +47 + j*(35) +-89 + j*(-62) +-99 + j*(100) +95 + j*(51) +17 + j*(-166) +-212 + j*(-88) +-161 + j*(119) +-18 + j*(93) +-62 + j*(25) +-94 + j*(119) +40 + j*(178) +163 + j*(55) +100 + j*(-137) +-139 + j*(-170) +-284 + j*(79) +-76 + j*(322) +199 + j*(191) +124 + j*(-40) +-28 + j*(47) +128 + j*(159) +260 + j*(-51) +57 + j*(-220) +-107 + j*(-76) +-18 + j*(35) +21 + j*(-42) +-72 + j*(-40) +-78 + j*(76) +26 + j*(135) +158 + j*(83) +202 + j*(-102) +0 + j*(-253) +-227 + j*(-74) +-90 + j*(181) +142 + j*(74) +46 + j*(-95) +-36 + j*(17) +120 + j*(2) +25 + j*(-218) +-256 + j*(-74) +-93 + j*(234) +197 + j*(65) +5 + j*(-176) +-179 + j*(49) +68 + j*(189) +176 + j*(-54) +-35 + j*(-127) +-68 + j*(35) +38 + j*(34) +17 + j*(-4) +62 + j*(30) +120 + j*(-97) +-59 + j*(-191) +-181 + j*(-20) +-69 + j*(86) +-48 + j*(62) +-11 + j*(187) +285 + j*(157) +341 + j*(-256) +-76 + j*(-428) +-305 + j*(-126) +-152 + j*(51) +-106 + j*(-14) +-175 + j*(42) +-112 + j*(139) +-47 + j*(139) +-3 + j*(173) +124 + j*(151) +150 + j*(21) +98 + j*(-5) +159 + j*(-37) +103 + j*(-225) +-169 + j*(-203) +-190 + j*(72) +42 + j*(92) +26 + j*(-97) +-136 + j*(-57) +-112 + j*(64) +-71 + j*(72) +-46 + j*(134) +115 + j*(112) +98 + j*(-119) +-182 + j*(-112) +-197 + j*(175) +30 + j*(197) +-2 + j*(75) +-61 + j*(226) +189 + j*(305) +315 + j*(74) +192 + j*(-13) +255 + j*(34) +334 + j*(-185) +63 + j*(-341) +-110 + j*(-105) +100 + j*(14) +175 + j*(-221) +-57 + j*(-315) +-185 + j*(-172) +-187 + j*(-81) +-210 + j*(38) +-52 + j*(190) +195 + j*(50) +103 + j*(-244) +-187 + j*(-214) +-216 + j*(17) +-74 + j*(57) +-68 + j*(-6) +-95 + j*(25) +-50 + j*(40) +-60 + j*(-6) +-115 + j*(25) +-94 + j*(90) +-54 + j*(87) +-71 + j*(102) +-31 + j*(175) +88 + j*(174) +153 + j*(68) +116 + j*(-25) +47 + j*(-53) +-10 + j*(-28) +-8 + j*(33) +66 + j*(31) +66 + j*(-81) +-95 + j*(-101) +-158 + j*(102) +57 + j*(216) +211 + j*(13) +25 + j*(-153) +-134 + j*(28) +48 + j*(187) +210 + j*(25) +92 + j*(-111) +34 + j*(-24) +149 + j*(-68) +56 + j*(-260) +-198 + j*(-196) +-202 + j*(29) +-91 + j*(60) +-122 + j*(81) +-25 + j*(231) +221 + j*(131) +146 + j*(-146) +-112 + j*(-62) +26 + j*(181) +291 + j*(2) +134 + j*(-296) +-140 + j*(-214) +-124 + j*(-47) +-105 + j*(-64) +-187 + j*(31) +-49 + j*(195) +172 + j*(66) +89 + j*(-181) +-160 + j*(-173) +-251 + j*(30) +-158 + j*(216) +66 + j*(269) +252 + j*(84) +152 + j*(-173) +-115 + j*(-153) +-155 + j*(78) +22 + j*(159) +121 + j*(59) +110 + j*(-18) +107 + j*(-64) +78 + j*(-160) +-71 + j*(-231) +-272 + j*(-127) +-298 + j*(153) +-40 + j*(322) +209 + j*(154) +129 + j*(-89) +-78 + j*(-45) +-30 + j*(139) +154 + j*(100) +146 + j*(-78) +5 + j*(-105) +-30 + j*(-6) +42 + j*(25) +78 + j*(-33) +49 + j*(-81) +10 + j*(-93) +-25 + j*(-88) +-45 + j*(-66) +-37 + j*(-63) +-71 + j*(-98) +-168 + j*(-62) +-174 + j*(75) +-57 + j*(114) +-51 + j*(44) +-114 + j*(128) +53 + j*(245) +244 + j*(46) +56 + j*(-189) +-183 + j*(-27) +-54 + j*(180) +86 + j*(95) +33 + j*(69) +147 + j*(130) +258 + j*(-103) +-43 + j*(-267) +-233 + j*(59) +105 + j*(238) +250 + j*(-105) +-94 + j*(-200) +-133 + j*(144) +221 + j*(134) +185 + j*(-224) +-156 + j*(-179) +-106 + j*(123) +157 + j*(67) +100 + j*(-156) +-79 + j*(-107) +-30 + j*(28) +83 + j*(-28) +36 + j*(-136) +-61 + j*(-124) +-77 + j*(-66) +-62 + j*(-59) +-79 + j*(-62) +-92 + j*(-49) +-110 + j*(-57) +-182 + j*(-35) +-214 + j*(95) +-91 + j*(204) +60 + j*(141) +56 + j*(3) +-45 + j*(-40) +-129 + j*(17) +-141 + j*(137) +-25 + j*(233) +122 + j*(161) +86 + j*(21) +-23 + j*(67) +54 + j*(190) +211 + j*(124) +212 + j*(-29) +135 + j*(-88) +77 + j*(-112) +-6 + j*(-95) +-18 + j*(2) +88 + j*(3) +71 + j*(-130) +-93 + j*(-113) +-89 + j*(60) +63 + j*(59) +40 + j*(-63) +-64 + j*(4) +46 + j*(124) +199 + j*(3) +110 + j*(-165) +-14 + j*(-121) +27 + j*(-78) +-1 + j*(-172) +-158 + j*(-121) +-114 + j*(62) +56 + j*(11) +-25 + j*(-129) +-136 + j*(-5) +47 + j*(67) +91 + j*(-194) +-243 + j*(-243) +-317 + j*(116) +11 + j*(177) +3 + j*(-127) +-325 + j*(-47) +-234 + j*(315) +100 + j*(265) +64 + j*(33) +-65 + j*(122) +97 + j*(205) +181 + j*(7) +-6 + j*(-79) +-92 + j*(75) +12 + j*(163) +88 + j*(139) +138 + j*(116) +185 + j*(54) +168 + j*(-6) +181 + j*(-8) +240 + j*(-107) +139 + j*(-284) +-102 + j*(-268) +-188 + j*(-57) +-70 + j*(79) +58 + j*(59) +124 + j*(-29) +103 + j*(-166) +-71 + j*(-239) +-239 + j*(-76) +-129 + j*(154) +112 + j*(103) +102 + j*(-105) +-44 + j*(-100) +5 + j*(-24) +39 + j*(-165) +-192 + j*(-214) +-280 + j*(54) +-28 + j*(146) +11 + j*(-100) +-272 + j*(-77) +-240 + j*(257) +103 + j*(257) +129 + j*(-45) +-126 + j*(-84) +-192 + j*(124) +-57 + j*(243) +98 + j*(217) +176 + j*(70) +47 + j*(-66) +-117 + j*(63) +3 + j*(264) +213 + j*(202) +236 + j*(78) +286 + j*(42) +349 + j*(-157) +115 + j*(-352) +-127 + j*(-173) +20 + j*(19) +157 + j*(-155) +-40 + j*(-293) +-196 + j*(-150) +-152 + j*(-35) +-146 + j*(-13) +-134 + j*(73) +-30 + j*(105) +13 + j*(47) +10 + j*(41) +62 + j*(22) +60 + j*(-71) +-35 + j*(-108) +-110 + j*(-59) +-139 + j*(27) +-74 + j*(130) +66 + j*(100) +47 + j*(-45) +-98 + j*(-1) +-24 + j*(165) +166 + j*(89) +119 + j*(-95) +-11 + j*(-73) +14 + j*(-10) +33 + j*(-52) +-2 + j*(-54) +25 + j*(-62) +-21 + j*(-153) +-182 + j*(-127) +-233 + j*(45) +-139 + j*(170) +1 + j*(206) +148 + j*(111) +108 + j*(-99) +-129 + j*(-91) +-134 + j*(153) +90 + j*(165) +76 + j*(2) +-10 + j*(93) +205 + j*(142) +282 + j*(-177) +-66 + j*(-310) +-218 + j*(-15) +1 + j*(78) +-14 + j*(-107) +-235 + j*(-4) +-125 + j*(271) +153 + j*(228) +177 + j*(35) +113 + j*(18) +173 + j*(6) +194 + j*(-136) +57 + j*(-248) +-127 + j*(-214) +-227 + j*(-45) +-142 + j*(150) +74 + j*(161) +149 + j*(-24) +10 + j*(-123) +-74 + j*(-17) +27 + j*(42) +69 + j*(-86) +-99 + j*(-143) +-210 + j*(53) +-30 + j*(233) +194 + j*(115) +153 + j*(-89) +27 + j*(-88) +62 + j*(-47) +72 + j*(-163) +-100 + j*(-204) +-189 + j*(-44) +-81 + j*(39) +-68 + j*(-37) +-172 + j*(21) +-89 + j*(191) +129 + j*(135) +123 + j*(-83) +-49 + j*(-111) +-71 + j*(-8) +-25 + j*(-44) +-149 + j*(-86) +-254 + j*(98) +-92 + j*(288) +134 + j*(214) +148 + j*(37) +54 + j*(-8) +28 + j*(28) +52 + j*(37) +73 + j*(12) +54 + j*(-32) +0 + j*(-33) +-11 + j*(12) +13 + j*(13) +-25 + j*(10) +-30 + j*(112) +132 + j*(161) +252 + j*(-8) +144 + j*(-168) +29 + j*(-141) +30 + j*(-132) +-53 + j*(-196) +-215 + j*(-105) +-197 + j*(113) +-7 + j*(194) +131 + j*(92) +123 + j*(-40) +34 + j*(-86) +-18 + j*(-30) +45 + j*(15) +116 + j*(-76) +27 + j*(-212) +-169 + j*(-191) +-255 + j*(8) +-118 + j*(182) +92 + j*(132) +102 + j*(-62) +-54 + j*(-100) +-85 + j*(8) +-28 + j*(4) +-95 + j*(-16) +-102 + j*(118) +75 + j*(128) +71 + j*(-64) +-132 + j*(-17) +-40 + j*(214) +228 + j*(106) +140 + j*(-165) +-86 + j*(-104) +-25 + j*(43) +59 + j*(-49) +-69 + j*(-115) +-153 + j*(-3) +-126 + j*(90) +-95 + j*(182) +64 + j*(298) +332 + j*(189) +383 + j*(-132) +158 + j*(-334) +-75 + j*(-292) +-163 + j*(-157) +-159 + j*(-76) +-169 + j*(-34) +-181 + j*(57) +-85 + j*(127) +-28 + j*(52) +-142 + j*(67) +-79 + j*(303) +290 + j*(274) +351 + j*(-153) +-33 + j*(-279) +-140 + j*(3) +62 + j*(5) +-73 + j*(-185) +-316 + j*(36) +-100 + j*(343) +207 + j*(205) +150 + j*(-18) +44 + j*(9) +76 + j*(36) +62 + j*(19) +93 + j*(89) +264 + j*(37) +279 + j*(-225) +16 + j*(-364) +-221 + j*(-199) +-173 + j*(59) +66 + j*(86) +129 + j*(-153) +-130 + j*(-253) +-272 + j*(4) +-43 + j*(154) +59 + j*(-58) +-181 + j*(-96) +-188 + j*(203) +158 + j*(231) +231 + j*(-121) +-78 + j*(-242) +-231 + j*(-1) +-73 + j*(164) +84 + j*(79) +61 + j*(-66) +-76 + j*(-97) +-165 + j*(21) +-100 + j*(154) +40 + j*(170) +131 + j*(82) +130 + j*(-43) +13 + j*(-129) +-132 + j*(-51) +-111 + j*(118) +43 + j*(163) +134 + j*(69) +128 + j*(-24) +84 + j*(-93) +-4 + j*(-115) +-61 + j*(-58) +-43 + j*(-29) +-78 + j*(-49) +-159 + j*(25) +-115 + j*(165) +18 + j*(211) +129 + j*(172) +212 + j*(86) +221 + j*(-52) +125 + j*(-137) +45 + j*(-125) +16 + j*(-107) +-10 + j*(-80) +27 + j*(-62) +37 + j*(-163) +-149 + j*(-210) +-275 + j*(22) +-55 + j*(215) +170 + j*(40) +67 + j*(-195) +-156 + j*(-200) +-302 + j*(-58) +-322 + j*(194) +-71 + j*(402) +238 + j*(243) +168 + j*(-30) +2 + j*(40) +160 + j*(127) +233 + j*(-122) +-49 + j*(-212) +-134 + j*(47) +83 + j*(91) +67 + j*(-90) +-89 + j*(-14) +31 + j*(129) +164 + j*(5) +69 + j*(-88) +65 + j*(-21) +152 + j*(-116) +13 + j*(-266) +-174 + j*(-155) +-125 + j*(-5) +-59 + j*(-30) +-108 + j*(-16) +-58 + j*(72) +64 + j*(13) +32 + j*(-130) +-104 + j*(-166) +-220 + j*(-107) +-293 + j*(26) +-243 + j*(204) +-74 + j*(280) +58 + j*(226) +134 + j*(148) +170 + j*(0) +11 + j*(-155) +-245 + j*(-18) +-176 + j*(311) +156 + j*(342) +262 + j*(116) +193 + j*(44) +262 + j*(13) +243 + j*(-202) +-38 + j*(-252) +-123 + j*(7) +99 + j*(65) +106 + j*(-138) +-89 + j*(-102) +-18 + j*(80) +149 + j*(-20) +48 + j*(-172) +-64 + j*(-101) +-25 + j*(-78) +-115 + j*(-115) +-180 + j*(65) +54 + j*(159) +156 + j*(-105) +-135 + j*(-199) +-218 + j*(101) +74 + j*(163) +98 + j*(-118) +-190 + j*(-112) +-197 + j*(192) +77 + j*(262) +214 + j*(89) +193 + j*(-59) +103 + j*(-161) +-49 + j*(-148) +-66 + j*(-4) +71 + j*(-13) +25 + j*(-175) +-161 + j*(-125) +-121 + j*(42) +-14 + j*(-19) +-148 + j*(-78) +-216 + j*(136) +24 + j*(252) +177 + j*(52) +52 + j*(-83) +-16 + j*(-22) +18 + j*(-40) +-71 + j*(-76) +-123 + j*(59) +44 + j*(127) +129 + j*(-62) +-69 + j*(-186) +-238 + j*(-18) +-142 + j*(175) +23 + j*(151) +30 + j*(36) +-66 + j*(38) +-69 + j*(160) +87 + j*(211) +202 + j*(57) +70 + j*(-105) +-125 + j*(11) +-36 + j*(258) +256 + j*(247) +360 + j*(-23) +197 + j*(-205) +21 + j*(-161) +-1 + j*(-37) +98 + j*(21) +211 + j*(-69) +178 + j*(-262) +-44 + j*(-342) +-214 + j*(-179) +-140 + j*(-1) +-15 + j*(-43) +-81 + j*(-137) +-187 + j*(-45) +-99 + j*(74) +3 + j*(-13) +-115 + j*(-96) +-217 + j*(71) +-26 + j*(221) +170 + j*(42) +25 + j*(-180) +-197 + j*(-85) +-160 + j*(109) +-40 + j*(117) +-26 + j*(94) +37 + j*(112) +98 + j*(-15) +-82 + j*(-117) +-240 + j*(110) +-1 + j*(338) +275 + j*(139) +134 + j*(-122) +-68 + j*(-4) +70 + j*(153) +226 + j*(2) +109 + j*(-165) +-36 + j*(-118) +-52 + j*(-29) +-26 + j*(29) +66 + j*(57) +154 + j*(-70) +16 + j*(-228) +-197 + j*(-118) +-143 + j*(106) +51 + j*(93) +57 + j*(-57) +-50 + j*(-73) +-76 + j*(-7) +-59 + j*(15) +-70 + j*(35) +-49 + j*(91) +35 + j*(104) +85 + j*(16) +-7 + j*(-52) +-91 + j*(71) +88 + j*(199) +296 + j*(-21) +82 + j*(-317) +-267 + j*(-149) +-164 + j*(194) +119 + j*(135) +63 + j*(-51) +-30 + j*(45) +124 + j*(87) +167 + j*(-99) +21 + j*(-161) +-25 + j*(-115) +-90 + j*(-147) +-234 + j*(-19) +-102 + j*(209) +148 + j*(103) +43 + j*(-117) +-130 + j*(21) +50 + j*(173) +204 + j*(-17) +57 + j*(-162) +-29 + j*(-80) +25 + j*(-93) +-62 + j*(-186) +-221 + j*(-114) +-245 + j*(52) +-156 + j*(170) +-15 + j*(185) +43 + j*(71) +-71 + j*(38) +-92 + j*(211) +127 + j*(278) +246 + j*(107) +192 + j*(24) +250 + j*(10) +283 + j*(-182) +70 + j*(-308) +-66 + j*(-182) +-13 + j*(-148) +-116 + j*(-216) +-252 + j*(-37) +-62 + j*(138) +112 + j*(-57) +-100 + j*(-228) +-281 + j*(-28) +-136 + j*(136) +-43 + j*(33) +-157 + j*(18) +-152 + j*(171) +-5 + j*(194) +13 + j*(103) +-39 + j*(147) +66 + j*(231) +209 + j*(132) +166 + j*(-13) +83 + j*(9) +156 + j*(37) +194 + j*(-104) +38 + j*(-194) +-76 + j*(-85) +-24 + j*(-7) +-20 + j*(-30) +-55 + j*(39) +60 + j*(112) +179 + j*(-3) +111 + j*(-139) +19 + j*(-146) +-33 + j*(-150) +-140 + j*(-105) +-130 + j*(66) +59 + j*(73) +48 + j*(-127) +-174 + j*(-85) +-111 + j*(163) +148 + j*(89) +57 + j*(-166) +-199 + j*(-43) +-42 + j*(231) +268 + j*(74) +163 + j*(-266) +-154 + j*(-243) +-196 + j*(-18) +-93 + j*(25) +-111 + j*(3) +-117 + j*(85) +-22 + j*(112) +-1 + j*(53) +-16 + j*(87) +100 + j*(93) +138 + j*(-99) +-95 + j*(-192) +-242 + j*(38) +-50 + j*(209) +101 + j*(59) +-30 + j*(-54) +-123 + j*(69) +-38 + j*(158) +14 + j*(148) +58 + j*(201) +231 + j*(191) +325 + j*(-23) +185 + j*(-195) +45 + j*(-173) +7 + j*(-163) +-122 + j*(-169) +-247 + j*(42) +-34 + j*(297) +319 + j*(155) +280 + j*(-231) +-61 + j*(-281) +-139 + j*(-29) +41 + j*(18) +45 + j*(-135) +-93 + j*(-124) +-81 + j*(-28) +-38 + j*(-63) +-110 + j*(-82) +-141 + j*(-9) +-116 + j*(16) +-156 + j*(40) +-140 + j*(154) +-14 + j*(196) +58 + j*(135) +78 + j*(104) +120 + j*(43) +58 + j*(-41) +-25 + j*(34) +86 + j*(121) +199 + j*(-7) +112 + j*(-131) +44 + j*(-110) +33 + j*(-158) +-121 + j*(-179) +-187 + j*(18) +6 + j*(85) +30 + j*(-119) +-228 + j*(-107) +-243 + j*(201) +52 + j*(291) +208 + j*(91) +141 + j*(-68) +42 + j*(-112) +-58 + j*(-93) +-100 + j*(0) +-47 + j*(62) +-12 + j*(48) +-19 + j*(68) +38 + j*(112) +134 + j*(77) +177 + j*(-38) +98 + j*(-164) +-70 + j*(-146) +-91 + j*(26) +86 + j*(44) +100 + j*(-155) +-105 + j*(-187) +-153 + j*(-31) +-88 + j*(-11) +-148 + j*(4) +-104 + j*(144) +77 + j*(93) +1 + j*(-83) +-163 + j*(29) +-42 + j*(179) +59 + j*(88) +6 + j*(103) +173 + j*(161) +295 + j*(-125) +-27 + j*(-320) +-240 + j*(-48) +-51 + j*(89) +-64 + j*(-56) +-240 + j*(108) +-5 + j*(366) +302 + j*(178) +229 + j*(-81) +117 + j*(-100) +71 + j*(-159) +-107 + j*(-115) +-44 + j*(127) +263 + j*(4) +87 + j*(-390) +-380 + j*(-223) +-282 + j*(247) +94 + j*(209) +51 + j*(-11) +-28 + j*(110) +204 + j*(122) +228 + j*(-181) +-72 + j*(-256) +-180 + j*(-27) +-45 + j*(78) +35 + j*(24) +47 + j*(-24) +25 + j*(-95) +-91 + j*(-107) +-139 + j*(34) +9 + j*(113) +112 + j*(-32) +-18 + j*(-163) +-177 + j*(-57) +-107 + j*(117) +78 + j*(79) +77 + j*(-130) +-155 + j*(-194) +-317 + j*(21) +-192 + j*(254) +25 + j*(245) +75 + j*(124) +42 + j*(116) +113 + j*(134) +172 + j*(31) +92 + j*(-42) +69 + j*(21) +177 + j*(-21) +120 + j*(-209) +-117 + j*(-191) +-136 + j*(36) +48 + j*(42) +5 + j*(-117) +-158 + j*(-22) +-24 + j*(159) +185 + j*(-5) +11 + j*(-269) +-325 + j*(-140) +-317 + j*(235) +-3 + j*(373) +219 + j*(210) +212 + j*(26) +151 + j*(-43) +105 + j*(-101) +-23 + j*(-127) +-122 + j*(30) +38 + j*(196) +255 + j*(71) +202 + j*(-150) +57 + j*(-155) +62 + j*(-115) +39 + j*(-182) +-60 + j*(-165) +-47 + j*(-109) +-64 + j*(-175) +-222 + j*(-132) +-204 + j*(82) +8 + j*(83) +1 + j*(-105) +-180 + j*(-86) +-175 + j*(76) +-64 + j*(91) +-54 + j*(36) +-90 + j*(42) +-106 + j*(91) +-60 + j*(166) +63 + j*(159) +100 + j*(40) +21 + j*(1) +16 + j*(33) +9 + j*(-4) +-69 + j*(47) +34 + j*(168) +188 + j*(21) +13 + j*(-138) +-121 + j*(76) +148 + j*(175) +223 + j*(-135) +-93 + j*(-193) +-115 + j*(88) +107 + j*(58) +14 + j*(-93) +-54 + j*(69) +182 + j*(64) +148 + j*(-245) +-184 + j*(-229) +-210 + j*(34) +-93 + j*(59) +-148 + j*(106) +-1 + j*(295) +303 + j*(149) +215 + j*(-178) +-49 + j*(-133) +8 + j*(54) +163 + j*(-39) +81 + j*(-192) +-59 + j*(-179) +-118 + j*(-100) +-118 + j*(-17) +254 + j*(-10) +76 + j*(-153) +-18 + j*(-66) +47 + j*(-84) +-64 + j*(-223) +-321 + j*(-112) +-313 + j*(218) +-22 + j*(334) +153 + j*(167) +99 + j*(27) +22 + j*(46) +63 + j*(111) +179 + j*(66) +187 + j*(-107) +5 + j*(-195) +-132 + j*(-49) +-30 + j*(89) +84 + j*(16) +40 + j*(-76) +-21 + j*(-76) +-74 + j*(-69) +-136 + j*(7) +-70 + j*(119) +35 + j*(62) +-59 + j*(2) +-95 + j*(186) +182 + j*(254) +316 + j*(-60) +25 + j*(-243) +-161 + j*(4) +49 + j*(172) +197 + j*(2) +77 + j*(-119) +9 + j*(-37) +89 + j*(-21) +93 + j*(-126) +-8 + j*(-157) +-58 + j*(-104) +-63 + j*(-88) +-116 + j*(-65) +-126 + j*(49) +14 + j*(114) +130 + j*(-16) +37 + j*(-168) +-119 + j*(-136) +-157 + j*(-20) +-112 + j*(59) +-28 + j*(83) +31 + j*(3) +-67 + j*(-66) +-148 + j*(71) +28 + j*(179) +158 + j*(-12) +-24 + j*(-141) +-117 + j*(20) +31 + j*(50) +-12 + j*(-100) +-171 + j*(-1) +-35 + j*(156) +93 + j*(-4) +-98 + j*(-98) +-174 + j*(116) +35 + j*(187) +96 + j*(18) +-18 + j*(-19) +-39 + j*(40) +-48 + j*(51) +-66 + j*(136) +66 + j*(216) +198 + j*(115) +176 + j*(-5) +137 + j*(-35) +116 + j*(-69) +88 + j*(-67) +142 + j*(-100) +82 + j*(-290) +-246 + j*(-293) +-373 + j*(76) +-87 + j*(290) +103 + j*(158) +93 + j*(109) +226 + j*(86) +247 + j*(-175) +-47 + j*(-240) +-90 + j*(38) +199 + j*(8) +119 + j*(-333) +-255 + j*(-281) +-264 + j*(42) +-71 + j*(64) +-111 + j*(-4) +-120 + j*(132) +69 + j*(139) +86 + j*(-52) +-85 + j*(-52) +-62 + j*(112) +108 + j*(74) +86 + j*(-99) +-75 + j*(-96) +-78 + j*(42) +48 + j*(34) +23 + j*(-105) +-137 + j*(-85) +-141 + j*(82) +-5 + j*(100) +-5 + j*(16) +-49 + j*(69) +77 + j*(88) +92 + j*(-113) +-182 + j*(-150) +-276 + j*(168) +23 + j*(330) +208 + j*(107) +64 + j*(-23) +19 + j*(103) +180 + j*(107) +218 + j*(-68) +98 + j*(-160) +4 + j*(-145) +-81 + j*(-99) +-108 + j*(50) +88 + j*(154) +288 + j*(-64) +101 + j*(-367) +-256 + j*(-279) +-276 + j*(37) +-73 + j*(96) +-68 + j*(-6) +-135 + j*(78) +10 + j*(161) +100 + j*(9) +-40 + j*(-54) +-47 + j*(86) +120 + j*(31) +17 + j*(-182) +-261 + j*(-69) +-202 + j*(252) +85 + j*(308) +233 + j*(171) +313 + j*(39) +313 + j*(-197) +59 + j*(-351) +-148 + j*(-180) +-38 + j*(-49) +-19 + j*(-190) +-227 + j*(-170) +-216 + j*(52) +-65 + j*(30) +-182 + j*(-33) +-238 + j*(215) +83 + j*(325) +241 + j*(23) +12 + j*(-115) +-50 + j*(55) +91 + j*(32) +-6 + j*(-98) +-127 + j*(57) +63 + j*(179) +190 + j*(-16) +9 + j*(-130) +-76 + j*(42) +98 + j*(110) +183 + j*(-63) +37 + j*(-179) +-99 + j*(-83) +-46 + j*(57) +93 + j*(35) +106 + j*(-106) +-13 + j*(-163) +-94 + j*(-113) +-136 + j*(-58) +-165 + j*(54) +-32 + j*(177) +162 + j*(64) +71 + j*(-158) +-149 + j*(-78) +-66 + j*(133) +136 + j*(49) +71 + j*(-140) +-71 + j*(-119) +-86 + j*(-66) +-157 + j*(-65) +-223 + j*(89) +-69 + j*(231) +83 + j*(136) +29 + j*(52) +28 + j*(136) +187 + j*(112) +212 + j*(-88) +43 + j*(-182) +-72 + j*(-89) +-44 + j*(-6) +-4 + j*(-25) +-49 + j*(-52) +-112 + j*(14) +-66 + j*(126) +68 + j*(138) +146 + j*(37) +121 + j*(-84) +-1 + j*(-151) +-154 + j*(-57) +-107 + j*(158) +141 + j*(159) +177 + j*(-77) +-22 + j*(-104) +13 + j*(62) +192 + j*(-56) +21 + j*(-290) +-262 + j*(-132) +-165 + j*(151) +51 + j*(113) +37 + j*(-5) +8 + j*(18) +48 + j*(-3) +5 + j*(-36) +13 + j*(17) +94 + j*(-44) +-9 + j*(-171) +-174 + j*(-58) +-77 + j*(116) +74 + j*(33) +-8 + j*(-82) +-98 + j*(-1) +-31 + j*(72) +20 + j*(40) +21 + j*(30) +64 + j*(12) +51 + j*(-73) +-57 + j*(-83) +-91 + j*(29) +23 + j*(86) +109 + j*(-33) +-9 + j*(-166) +-200 + j*(-70) +-149 + j*(159) +74 + j*(156) +83 + j*(-26) +-53 + j*(5) +53 + j*(127) +204 + j*(-57) +-27 + j*(-267) +-308 + j*(-41) +-140 + j*(284) +176 + j*(204) +175 + j*(-47) +9 + j*(-84) +-35 + j*(17) +29 + j*(69) +103 + j*(41) +121 + j*(-43) +66 + j*(-91) +41 + j*(-82) +42 + j*(-129) +-63 + j*(-180) +-174 + j*(-76) +-117 + j*(28) +-91 + j*(-16) +-206 + j*(47) +-128 + j*(283) +193 + j*(266) +258 + j*(-54) +-4 + j*(-167) +-118 + j*(26) +6 + j*(127) +75 + j*(84) +110 + j*(81) +209 + j*(21) +190 + j*(-151) +24 + j*(-204) +-61 + j*(-107) +-36 + j*(-48) +-18 + j*(-37) +16 + j*(-31) +38 + j*(-91) +-39 + j*(-144) +-117 + j*(-92) +-119 + j*(-35) +-132 + j*(4) +-97 + j*(93) +38 + j*(78) +30 + j*(-82) +-153 + j*(-69) +-146 + j*(127) +32 + j*(129) +7 + j*(-2) +-95 + j*(94) +70 + j*(228) +284 + j*(57) +206 + j*(-215) +-42 + j*(-288) +-244 + j*(-165) +-298 + j*(76) +-113 + j*(277) +151 + j*(194) +148 + j*(-52) +-52 + j*(-83) +-88 + j*(83) +62 + j*(131) +139 + j*(-5) +27 + j*(-122) +-129 + j*(-40) +-79 + j*(156) +146 + j*(141) +173 + j*(-105) +-63 + j*(-176) +-173 + j*(10) +-83 + j*(117) +-54 + j*(129) +-1 + j*(231) +201 + j*(235) +281 + j*(44) +183 + j*(-27) +228 + j*(15) +324 + j*(-140) +168 + j*(-317) +9 + j*(-233) +95 + j*(-191) +66 + j*(-401) +-260 + j*(-458) +-479 + j*(-179) +-404 + j*(89) +-280 + j*(207) +-132 + j*(310) +119 + j*(280) +226 + j*(27) +56 + j*(-135) +-73 + j*(-43) +-4 + j*(4) +-29 + j*(-98) +-199 + j*(-45) +-175 + j*(177) +49 + j*(215) +124 + j*(40) +13 + j*(-30) +-31 + j*(44) +29 + j*(79) +76 + j*(40) +74 + j*(-19) +21 + j*(-52) +-27 + j*(-10) +15 + j*(32) +49 + j*(-23) +-18 + j*(-55) +-40 + j*(7) +6 + j*(-1) +-54 + j*(-41) +-117 + j*(76) +35 + j*(183) +183 + j*(40) +79 + j*(-119) +-56 + j*(-58) +-21 + j*(38) +50 + j*(14) +41 + j*(-52) +-28 + j*(-80) +-106 + j*(-21) +-86 + j*(90) +12 + j*(117) +50 + j*(80) +88 + j*(90) +192 + j*(17) +143 + j*(-177) +-98 + j*(-196) +-193 + j*(33) +-33 + j*(197) +168 + j*(150) +250 + j*(-32) +138 + j*(-204) +-47 + j*(-156) +9 + j*(-8) +151 + j*(-147) +-70 + j*(-351) +-349 + j*(-124) +-182 + j*(161) +18 + j*(32) +-139 + j*(-53) +-158 + j*(165) +86 + j*(170) +72 + j*(-34) +-64 + j*(42) +110 + j*(148) +255 + j*(-100) +24 + j*(-322) +-247 + j*(-218) +-320 + j*(-6) +-276 + j*(197) +-72 + j*(337) +158 + j*(236) +158 + j*(52) +81 + j*(40) +131 + j*(45) +138 + j*(-57) +52 + j*(-81) +54 + j*(-54) +50 + j*(-128) +-89 + j*(-151) +-167 + j*(-4) +-62 + j*(112) +55 + j*(58) +35 + j*(-46) +-64 + j*(-44) +-78 + j*(58) +19 + j*(84) +42 + j*(1) +-32 + j*(1) +-6 + j*(69) +49 + j*(25) +-19 + j*(8) +16 + j*(121) +192 + j*(54) +127 + j*(-167) +-102 + j*(-120) +-66 + j*(75) +74 + j*(30) +8 + j*(-43) +1 + j*(54) +139 + j*(17) +100 + j*(-153) +-66 + j*(-147) +-98 + j*(-37) +-68 + j*(16) +-15 + j*(61) +84 + j*(8) +28 + j*(-129) +-129 + j*(-59) +-46 + j*(98) +94 + j*(-8) +-35 + j*(-121) +-118 + j*(24) +33 + j*(71) +48 + j*(-83) +-100 + j*(-80) +-98 + j*(34) +-57 + j*(25) +-103 + j*(65) +-9 + j*(173) +144 + j*(78) +78 + j*(-78) +-37 + j*(-34) +0 + j*(20) +-2 + j*(-29) +-74 + j*(18) +-7 + j*(117) +107 + j*(59) +73 + j*(-45) +1 + j*(-21) +39 + j*(28) +100 + j*(-18) +72 + j*(-114) +-42 + j*(-136) +-112 + j*(-36) +-37 + j*(57) +66 + j*(1) +25 + j*(-115) +-92 + j*(-118) +-153 + j*(-37) +-148 + j*(53) +-81 + j*(117) +6 + j*(95) +-6 + j*(8) +-119 + j*(34) +-115 + j*(215) +116 + j*(305) +327 + j*(112) +244 + j*(-161) +6 + j*(-180) +-41 + j*(-23) +54 + j*(-16) +8 + j*(-91) +-58 + j*(-13) +45 + j*(30) +57 + j*(-109) +-122 + j*(-103) +-122 + j*(91) +43 + j*(95) +12 + j*(-2) +-17 + j*(115) +218 + j*(117) +244 + j*(-215) +-125 + j*(-296) +-244 + j*(61) +66 + j*(191) +192 + j*(-68) +-1 + j*(-185) +-94 + j*(-71) +-57 + j*(-23) +-71 + j*(-9) +-31 + j*(62) +89 + j*(21) +81 + j*(-135) +-74 + j*(-192) +-194 + j*(-103) +-212 + j*(11) +-192 + j*(98) +-140 + j*(192) +-10 + j*(256) +150 + j*(190) +185 + j*(32) +104 + j*(-49) +66 + j*(-52) +30 + j*(-100) +-106 + j*(-81) +-137 + j*(122) +101 + j*(227) +299 + j*(7) +167 + j*(-274) +-129 + j*(-287) +-291 + j*(-65) +-211 + j*(175) +12 + j*(243) +161 + j*(110) +141 + j*(-30) +76 + j*(-87) +0 + j*(-122) +-113 + j*(-66) +-84 + j*(83) +66 + j*(64) +27 + j*(-73) +-97 + j*(8) +37 + j*(119) +139 + j*(-71) +-106 + j*(-170) +-213 + j*(111) +76 + j*(228) +186 + j*(-36) +-42 + j*(-121) +-96 + j*(71) +56 + j*(107) +79 + j*(19) +66 + j*(16) +92 + j*(-28) +16 + j*(-65) +13 + j*(39) +163 + j*(-16) +59 + j*(-238) +-233 + j*(-105) +-89 + j*(243) +305 + j*(105) +205 + j*(-313) +-194 + j*(-281) +-226 + j*(44) +-6 + j*(103) +47 + j*(-24) +-11 + j*(-57) +-18 + j*(-42) +-17 + j*(-63) +-56 + j*(-95) +-145 + j*(-77) +-183 + j*(60) +-34 + j*(148) +72 + j*(-6) +-105 + j*(-104) +-199 + j*(105) +18 + j*(197) +80 + j*(-12) +-137 + j*(-14) +-93 + j*(242) +199 + j*(199) +197 + j*(-86) +-37 + j*(-129) +-113 + j*(28) +-45 + j*(131) +69 + j*(158) +174 + j*(63) +106 + j*(-69) +-1 + j*(5) +128 + j*(93) +242 + j*(-97) +55 + j*(-266) +-127 + j*(-158) +-124 + j*(-42) +-134 + j*(18) +-73 + j*(149) +127 + j*(127) +139 + j*(-74) +-11 + j*(-93) +-3 + j*(-16) +10 + j*(-75) +-98 + j*(-40) +-27 + j*(89) +96 + j*(-18) +-55 + j*(-123) +-149 + j*(67) +45 + j*(164) +137 + j*(19) +86 + j*(-37) +105 + j*(-89) +-21 + j*(-194) +-181 + j*(-13) +57 + j*(156) +234 + j*(-164) +-155 + j*(-371) +-403 + j*(13) +-110 + j*(256) +44 + j*(81) +-47 + j*(73) +78 + j*(133) +125 + j*(-73) +-116 + j*(-96) +-110 + j*(153) +117 + j*(132) +90 + j*(-28) +31 + j*(24) +131 + j*(-12) +42 + j*(-148) +-80 + j*(-46) +35 + j*(4) +-16 + j*(-148) +-221 + j*(-10) +-23 + j*(239) +247 + j*(18) +35 + j*(-240) +-163 + j*(-67) +-24 + j*(13) +-80 + j*(-137) +-294 + j*(2) +-169 + j*(264) +54 + j*(219) +59 + j*(127) +112 + j*(136) +174 + j*(1) +14 + j*(-87) +-62 + j*(85) +124 + j*(143) +178 + j*(-30) +48 + j*(-71) +57 + j*(12) +126 + j*(-59) +17 + j*(-147) +-106 + j*(-33) +-15 + j*(132) +194 + j*(95) +240 + j*(-132) +50 + j*(-254) +-88 + j*(-122) +29 + j*(-28) +99 + j*(-187) +-95 + j*(-300) +-267 + j*(-153) +-228 + j*(6) +-156 + j*(41) +-122 + j*(45) +-116 + j*(18) +-200 + j*(42) +-203 + j*(222) +21 + j*(305) +157 + j*(124) +35 + j*(19) +1 + j*(133) +151 + j*(129) +161 + j*(-35) +23 + j*(-59) +8 + j*(44) +104 + j*(49) +136 + j*(-48) +61 + j*(-132) +-68 + j*(-103) +-92 + j*(47) +61 + j*(115) +170 + j*(-22) +78 + j*(-151) +-27 + j*(-126) +-45 + j*(-93) +-95 + j*(-88) +-137 + j*(16) +-23 + j*(93) +66 + j*(-27) +-81 + j*(-129) +-231 + j*(39) +-94 + j*(255) +139 + j*(207) +181 + j*(49) +168 + j*(5) +231 + j*(-105) +105 + j*(-317) +-192 + j*(-274) +-228 + j*(-6) +-57 + j*(23) +-119 + j*(-89) +-247 + j*(63) +-71 + j*(233) +102 + j*(82) +-31 + j*(-52) +-136 + j*(80) +-28 + j*(187) +78 + j*(155) +148 + j*(89) +148 + j*(-62) +-52 + j*(-130) +-185 + j*(100) +29 + j*(301) +266 + j*(177) +280 + j*(9) +292 + j*(-85) +248 + j*(-291) +-40 + j*(-396) +-267 + j*(-170) +-177 + j*(76) +-1 + j*(95) +80 + j*(14) +73 + j*(-90) +-40 + j*(-127) +-90 + j*(-12) +42 + j*(26) +76 + j*(-139) +-103 + j*(-202) +-210 + j*(-71) +-193 + j*(36) +-164 + j*(129) +-33 + j*(216) +126 + j*(130) +117 + j*(-5) +87 + j*(-40) +73 + j*(-141) +-123 + j*(-200) +-259 + j*(21) +-77 + j*(185) +45 + j*(64) +-32 + j*(29) +25 + j*(78) +39 + j*(-61) +-186 + j*(-27) +-119 + j*(289) +267 + j*(222) +222 + j*(-170) +-119 + j*(-139) +-74 + j*(124) +100 + j*(53) +10 + j*(-36) +6 + j*(71) +132 + j*(1) +15 + j*(-147) +-148 + j*(-28) +-78 + j*(127) +16 + j*(134) +77 + j*(156) +214 + j*(111) +246 + j*(-65) +144 + j*(-152) +95 + j*(-178) +-23 + j*(-248) +-216 + j*(-129) +-152 + j*(127) +95 + j*(122) +135 + j*(-69) +17 + j*(-143) +-75 + j*(-119) +-157 + j*(-23) +-88 + j*(161) +169 + j*(155) +256 + j*(-113) +64 + j*(-281) +-111 + j*(-223) +-162 + j*(-124) +-154 + j*(-61) +-140 + j*(-59) +-221 + j*(-59) +-289 + j*(105) +-129 + j*(254) +20 + j*(151) +-62 + j*(88) +-39 + j*(217) +130 + j*(165) +64 + j*(25) +-11 + j*(163) +244 + j*(229) +377 + j*(-88) +127 + j*(-293) +-59 + j*(-196) +-95 + j*(-131) +-170 + j*(-47) +-93 + j*(93) +25 + j*(1) +-151 + j*(-75) +-233 + j*(204) +87 + j*(337) +245 + j*(80) +103 + j*(-13) +141 + j*(52) +190 + j*(-105) +-16 + j*(-148) +-7 + j*(62) +220 + j*(-32) +76 + j*(-298) +-201 + j*(-168) +-111 + j*(37) +-32 + j*(-49) +-175 + j*(-12) +-93 + j*(198) +136 + j*(139) +124 + j*(-34) +64 + j*(-37) +95 + j*(-90) +-20 + j*(-189) +-171 + j*(-74) +-114 + j*(78) +-15 + j*(88) +44 + j*(83) +137 + j*(1) +63 + j*(-166) +-142 + j*(-103) +-74 + j*(103) +123 + j*(6) +-6 + j*(-195) +-221 + j*(-57) +-105 + j*(156) +79 + j*(72) +19 + j*(-69) +-80 + j*(-19) +-35 + j*(44) +6 + j*(-13) +-87 + j*(-61) +-192 + j*(52) +-112 + j*(243) +129 + j*(253) +236 + j*(35) +91 + j*(-115) +-44 + j*(-27) +28 + j*(87) +164 + j*(11) +116 + j*(-182) +-134 + j*(-210) +-259 + j*(60) +-3 + j*(262) +236 + j*(19) +-20 + j*(-234) +-297 + j*(56) +16 + j*(375) +365 + j*(76) +103 + j*(-260) +-189 + j*(-14) +66 + j*(234) +293 + j*(-16) +82 + j*(-218) +-50 + j*(-61) +93 + j*(-19) +71 + j*(-188) +-122 + j*(-160) +-113 + j*(14) +15 + j*(16) +16 + j*(-71) +-30 + j*(-85) +-64 + j*(-98) +-147 + j*(-69) +-159 + j*(56) +-42 + j*(100) +-10 + j*(16) +-82 + j*(27) +-41 + j*(112) +51 + j*(78) +37 + j*(17) +42 + j*(22) +63 + j*(-54) +-76 + j*(-110) +-168 + j*(71) +37 + j*(191) +164 + j*(-25) +-70 + j*(-147) +-192 + j*(117) +93 + j*(267) +295 + j*(3) +106 + j*(-244) +-141 + j*(-170) +-177 + j*(23) +-72 + j*(125) +36 + j*(92) +20 + j*(3) +-78 + j*(56) +6 + j*(214) +238 + j*(158) +263 + j*(-87) +98 + j*(-170) +50 + j*(-124) +33 + j*(-194) +-156 + j*(-219) +-292 + j*(2) +-151 + j*(224) +63 + j*(221) +158 + j*(116) +206 + j*(26) +218 + j*(-108) +115 + j*(-239) +-49 + j*(-247) +-142 + j*(-158) +-155 + j*(-78) +-161 + j*(-39) +-186 + j*(23) +-165 + j*(136) +-27 + j*(216) +141 + j*(137) +158 + j*(-59) +-6 + j*(-153) +-134 + j*(-54) +-101 + j*(64) +-33 + j*(65) +-40 + j*(52) +-20 + j*(94) +48 + j*(69) +9 + j*(-5) +-81 + j*(67) +15 + j*(206) +206 + j*(132) +190 + j*(-62) +49 + j*(-74) +56 + j*(9) +117 + j*(-29) +82 + j*(-70) +109 + j*(-51) +172 + j*(-185) +-23 + j*(-366) +-314 + j*(-216) +-270 + j*(88) +-56 + j*(100) +-87 + j*(-6) +-153 + j*(111) +8 + j*(194) +96 + j*(55) +1 + j*(24) +62 + j*(109) +177 + j*(-33) +-5 + j*(-171) +-139 + j*(36) +106 + j*(148) +213 + j*(-146) +-103 + j*(-272) +-249 + j*(13) +-27 + j*(144) +54 + j*(-21) +-76 + j*(-47) +-66 + j*(56) +-2 + j*(21) +-71 + j*(-16) +-115 + j*(82) +-36 + j*(163) +71 + j*(156) +151 + j*(59) +82 + j*(-78) +-102 + j*(-16) +-26 + j*(233) +302 + j*(174) +305 + j*(-202) +-49 + j*(-272) +-136 + j*(16) +96 + j*(71) +115 + j*(-139) +-86 + j*(-150) +-104 + j*(27) +35 + j*(42) +37 + j*(-70) +-75 + j*(-55) +-54 + j*(78) +115 + j*(75) +156 + j*(-124) +-50 + j*(-234) +-222 + j*(-63) +-117 + j*(148) +104 + j*(119) +156 + j*(-89) +-21 + j*(-228) +-242 + j*(-114) +-213 + j*(168) +88 + j*(238) +245 + j*(-41) +39 + j*(-260) +-187 + j*(-162) +-201 + j*(-8) +-169 + j*(58) +-125 + j*(132) +-17 + j*(139) +13 + j*(47) +-62 + j*(23) +-98 + j*(83) +-105 + j*(158) +-29 + j*(301) +257 + j*(325) +447 + j*(-21) +163 + j*(-355) +-231 + j*(-200) +-208 + j*(164) +71 + j*(241) +204 + j*(75) +139 + j*(-61) +31 + j*(-52) +40 + j*(45) +155 + j*(26) +152 + j*(-117) +21 + j*(-144) +-9 + j*(-71) +-6 + j*(-77) +-78 + j*(-23) +15 + j*(126) +240 + j*(30) +194 + j*(-238) +-36 + j*(-265) +-91 + j*(-148) +-93 + j*(-141) +-160 + j*(-93) +-126 + j*(-5) +-101 + j*(-31) +-165 + j*(47) +11 + j*(185) +234 + j*(-70) +-75 + j*(-383) +-466 + j*(-63) +-175 + j*(363) +235 + j*(107) +8 + j*(-264) +-322 + j*(-86) +-228 + j*(157) +-153 + j*(132) +-203 + j*(249) +27 + j*(402) +252 + j*(170) +44 + j*(-29) +-88 + j*(217) +237 + j*(332) +385 + j*(-18) +80 + j*(-173) +-9 + j*(91) +257 + j*(102) +236 + j*(-187) +-31 + j*(-152) +47 + j*(62) +228 + j*(-81) +47 + j*(-245) +-74 + j*(-57) +150 + j*(-21) +128 + j*(-331) +-258 + j*(-325) +-310 + j*(66) +21 + j*(145) +88 + j*(-127) +-151 + j*(-194) +-251 + j*(-11) +-170 + j*(112) +-82 + j*(139) +-10 + j*(121) +11 + j*(64) +-31 + j*(62) +-7 + j*(124) +93 + j*(112) +126 + j*(6) +42 + j*(-59) +-32 + j*(-1) +19 + j*(89) +142 + j*(49) +147 + j*(-100) +18 + j*(-167) +-82 + j*(-115) +-127 + j*(-44) +-140 + j*(68) +-24 + j*(180) +145 + j*(122) +173 + j*(-27) +119 + j*(-105) +63 + j*(-177) +-92 + j*(-196) +-182 + j*(-29) +-30 + j*(71) +28 + j*(-77) +-143 + j*(-95) +-134 + j*(83) +23 + j*(35) +-97 + j*(-97) +-238 + j*(85) +-45 + j*(245) +86 + j*(83) +-67 + j*(37) +-52 + j*(232) +197 + j*(238) +286 + j*(17) +182 + j*(-133) +50 + j*(-175) +-86 + j*(-118) +-106 + j*(40) +28 + j*(112) +120 + j*(37) +129 + j*(-43) +112 + j*(-134) +-9 + j*(-215) +-161 + j*(-141) +-180 + j*(-4) +-148 + j*(71) +-98 + j*(168) +72 + j*(206) +185 + j*(52) +101 + j*(-66) +54 + j*(-49) +39 + j*(-105) +-122 + j*(-78) +-98 + j*(180) +253 + j*(181) +315 + j*(-221) +-54 + j*(-357) +-211 + j*(-95) +-59 + j*(-6) +-71 + j*(-112) +-192 + j*(-51) +-170 + j*(62) +-144 + j*(98) +-115 + j*(206) +75 + j*(272) +245 + j*(103) +181 + j*(-96) +48 + j*(-134) +-18 + j*(-117) +-96 + j*(-97) +-159 + j*(6) +-98 + j*(127) +32 + j*(123) +52 + j*(21) +-45 + j*(25) +-13 + j*(169) +207 + j*(154) +260 + j*(-107) +22 + j*(-226) +-115 + j*(-51) +6 + j*(68) +105 + j*(-15) +75 + j*(-115) +-16 + j*(-165) +-156 + j*(-121) +-179 + j*(66) +6 + j*(146) +101 + j*(-12) +-24 + j*(-93) +-80 + j*(9) +5 + j*(45) +41 + j*(-20) +14 + j*(-86) +-86 + j*(-133) +-232 + j*(-35) +-189 + j*(170) +-17 + j*(186) +-16 + j*(129) +40 + j*(239) +302 + j*(142) +232 + j*(-231) +-175 + j*(-193) +-135 + j*(192) +209 + j*(107) +62 + j*(-202) +-229 + j*(6) +7 + j*(298) +291 + j*(92) +164 + j*(-139) +38 + j*(-79) +85 + j*(-69) +36 + j*(-137) +-35 + j*(-97) +-25 + j*(-71) +-74 + j*(-62) +-58 + j*(52) +118 + j*(33) +110 + j*(-211) +-180 + j*(-263) +-324 + j*(4) +-163 + j*(216) +29 + j*(197) +110 + j*(105) +139 + j*(16) +114 + j*(-91) +-4 + j*(-152) +-122 + j*(-69) +-78 + j*(74) +77 + j*(49) +64 + j*(-122) +-115 + j*(-130) +-146 + j*(22) +-57 + j*(50) +-74 + j*(18) +-73 + j*(103) +56 + j*(91) +34 + j*(-60) +-123 + j*(-23) +-85 + j*(131) +33 + j*(101) +-1 + j*(56) +42 + j*(124) +165 + j*(4) +-16 + j*(-183) +-284 + j*(33) +-88 + j*(383) +301 + j*(281) +313 + j*(-45) +132 + j*(-107) +120 + j*(-59) +117 + j*(-146) +-25 + j*(-164) +-78 + j*(-21) +50 + j*(42) +121 + j*(-77) +15 + j*(-170) +-95 + j*(-87) +-25 + j*(22) +95 + j*(-66) +-10 + j*(-231) +-231 + j*(-156) +-216 + j*(67) +-58 + j*(75) +-108 + j*(-13) +-192 + j*(141) +27 + j*(284) +223 + j*(67) +39 + j*(-119) +-94 + j*(57) +118 + j*(142) +185 + j*(-107) +-74 + j*(-174) +-129 + j*(74) +108 + j*(103) +122 + j*(-139) +-121 + j*(-174) +-208 + j*(45) +-54 + j*(185) +111 + j*(119) +115 + j*(-40) +-29 + j*(-81) +-82 + j*(69) +83 + j*(148) +202 + j*(0) +124 + j*(-132) +52 + j*(-143) +6 + j*(-183) +-119 + j*(-177) +-158 + j*(-59) +-113 + j*(-46) +-206 + j*(-45) +-221 + j*(156) +25 + j*(206) +66 + j*(-45) +-206 + j*(-42) +-188 + j*(257) +80 + j*(268) +86 + j*(122) +84 + j*(221) +343 + j*(170) +361 + j*(-197) +23 + j*(-321) +-142 + j*(-121) +-106 + j*(-8) +-95 + j*(71) +39 + j*(152) +164 + j*(8) +15 + j*(-106) +-46 + j*(63) +163 + j*(71) +142 + j*(-177) +-112 + j*(-150) +-83 + j*(72) +87 + j*(40) +53 + j*(-65) +25 + j*(-30) +74 + j*(-76) +-7 + j*(-144) +-54 + j*(-71) +3 + j*(-107) +-147 + j*(-208) +-345 + j*(4) +-169 + j*(287) +110 + j*(211) +119 + j*(41) +110 + j*(19) +148 + j*(-118) +-73 + j*(-258) +-314 + j*(-25) +-127 + j*(276) +167 + j*(165) +117 + j*(-55) +-4 + j*(-7) +100 + j*(40) +143 + j*(-129) +-39 + j*(-216) +-150 + j*(-91) +-101 + j*(-23) +-125 + j*(-52) +-200 + j*(29) +-144 + j*(153) +-40 + j*(166) +11 + j*(151) +85 + j*(118) +91 + j*(-7) +-61 + j*(-33) +-100 + j*(148) +93 + j*(218) +199 + j*(59) +112 + j*(-40) +63 + j*(-27) +28 + j*(-44) +-54 + j*(28) +35 + j*(182) +256 + j*(131) +306 + j*(-94) +187 + j*(-243) +21 + j*(-292) +-157 + j*(-193) +-129 + j*(25) +83 + j*(13) +42 + j*(-211) +-204 + j*(-165) +-187 + j*(63) +-46 + j*(74) +-51 + j*(54) +43 + j*(98) +112 + j*(-78) +-137 + j*(-135) +-150 + j*(200) +284 + j*(163) +214 + j*(-362) +-363 + j*(-276) +-255 + j*(302) +293 + j*(146) +83 + j*(-375) +-423 + j*(-147) +-228 + j*(315) +134 + j*(178) +39 + j*(-47) +-64 + j*(32) +-3 + j*(41) +-75 + j*(15) +-71 + j*(171) +154 + j*(167) +175 + j*(-86) +-69 + j*(-142) +-149 + j*(66) +4 + j*(169) +115 + j*(78) +75 + j*(-21) +-17 + j*(6) +23 + j*(125) +205 + j*(89) +219 + j*(-150) +-26 + j*(-232) +-145 + j*(-30) +8 + j*(84) +98 + j*(-42) +-12 + j*(-126) +-103 + j*(-57) +-100 + j*(23) +-71 + j*(86) +13 + j*(136) +128 + j*(88) +135 + j*(-43) +35 + j*(-82) +3 + j*(-13) +74 + j*(-7) +74 + j*(-98) +-23 + j*(-114) +-48 + j*(-29) +23 + j*(-13) +37 + j*(-82) +-19 + j*(-112) +-54 + j*(-98) +-83 + j*(-95) +-122 + j*(-71) +-146 + j*(-47) +-209 + j*(-8) +-245 + j*(141) +-91 + j*(293) +115 + j*(228) +140 + j*(78) +114 + j*(45) +153 + j*(-23) +64 + j*(-152) +-105 + j*(-92) +-72 + j*(58) +28 + j*(18) +-56 + j*(-42) +-107 + j*(85) +36 + j*(156) +123 + j*(37) +47 + j*(-40) +1 + j*(1) +21 + j*(21) +24 + j*(16) +45 + j*(29) +75 + j*(-9) +35 + j*(-57) +-26 + j*(-11) +36 + j*(71) +168 + j*(4) +137 + j*(-182) +-62 + j*(-215) +-121 + j*(-64) +-18 + j*(-70) +-149 + j*(-198) +-399 + j*(23) +-184 + j*(413) +272 + j*(271) +185 + j*(-159) +-191 + j*(-66) +-62 + j*(284) +279 + j*(151) +170 + j*(-151) +-56 + j*(-49) +82 + j*(110) +231 + j*(-54) +95 + j*(-223) +-56 + j*(-167) +-69 + j*(-92) +-76 + j*(-71) +-86 + j*(-23) +-50 + j*(15) +-8 + j*(13) +24 + j*(-11) +33 + j*(-72) +-23 + j*(-122) +-91 + j*(-112) +-129 + j*(-92) +-197 + j*(-66) +-251 + j*(42) +-188 + j*(165) +-86 + j*(171) +-81 + j*(136) +-107 + j*(202) +-6 + j*(310) +184 + j*(270) +243 + j*(90) +127 + j*(6) +94 + j*(98) +244 + j*(95) +273 + j*(-111) +74 + j*(-185) +13 + j*(-28) +173 + j*(-26) +148 + j*(-244) +-113 + j*(-246) +-159 + j*(-1) +40 + j*(54) +84 + j*(-108) +-50 + j*(-150) +-100 + j*(-60) +-72 + j*(-21) +-64 + j*(3) +-14 + j*(33) +53 + j*(-29) +1 + j*(-134) +-134 + j*(-132) +-203 + j*(-6) +-136 + j*(125) +16 + j*(111) +16 + j*(-48) +-190 + j*(-33) +-182 + j*(265) +206 + j*(314) +344 + j*(-115) +-71 + j*(-330) +-330 + j*(21) +-79 + j*(273) +98 + j*(139) +45 + j*(103) +168 + j*(148) +262 + j*(-77) +10 + j*(-212) +-114 + j*(34) +141 + j*(115) +204 + j*(-159) +-43 + j*(-242) +-132 + j*(-90) +-115 + j*(-62) +-211 + j*(23) +-103 + j*(257) +225 + j*(193) +228 + j*(-151) +-64 + j*(-209) +-135 + j*(-3) +-9 + j*(37) +-16 + j*(-38) +-65 + j*(2) +-9 + j*(28) +-17 + j*(-59) +-173 + j*(-44) +-218 + j*(197) +60 + j*(376) +379 + j*(150) +269 + j*(-243) +-109 + j*(-243) +-162 + j*(63) +66 + j*(113) +81 + j*(-51) +-37 + j*(-18) +35 + j*(69) +100 + j*(-15) +40 + j*(-34) +110 + j*(-2) +157 + j*(-185) +-97 + j*(-291) +-256 + j*(-37) +-44 + j*(111) +45 + j*(-82) +-172 + j*(-120) +-209 + j*(113) +-8 + j*(174) +56 + j*(55) +19 + j*(27) +41 + j*(8) +-13 + j*(-49) +-89 + j*(33) +17 + j*(125) +119 + j*(4) +6 + j*(-98) +-88 + j*(-2) +-11 + j*(70) +25 + j*(18) +-7 + j*(28) +58 + j*(59) +112 + j*(-53) +-15 + j*(-151) +-150 + j*(-53) +-114 + j*(76) +-48 + j*(92) +-37 + j*(117) +45 + j*(177) +184 + j*(117) +210 + j*(-41) +116 + j*(-142) +1 + j*(-157) +-101 + j*(-91) +-107 + j*(54) +39 + j*(117) +136 + j*(-5) +49 + j*(-109) +-28 + j*(-47) +35 + j*(-3) +76 + j*(-88) +-8 + j*(-164) +-124 + j*(-138) +-185 + j*(-31) +-127 + j*(90) +-1 + j*(72) +-35 + j*(-47) +-191 + j*(39) +-83 + j*(275) +226 + j*(209) +233 + j*(-107) +-24 + j*(-156) +-54 + j*(23) +73 + j*(-1) +4 + j*(-107) +-91 + j*(-16) +14 + j*(49) +49 + j*(-82) +-109 + j*(-105) +-136 + j*(57) +6 + j*(71) +-23 + j*(-66) +-205 + j*(0) +-170 + j*(249) +99 + j*(314) +259 + j*(119) +187 + j*(-54) +83 + j*(-64) +80 + j*(-42) +74 + j*(-91) +-12 + j*(-110) +-60 + j*(-23) +15 + j*(33) +69 + j*(-41) +-9 + j*(-100) +-71 + j*(-27) +-15 + j*(25) +7 + j*(-19) +-36 + j*(-1) +28 + j*(59) +127 + j*(-49) +-5 + j*(-206) +-233 + j*(-87) +-170 + j*(190) +111 + j*(216) +231 + j*(-8) +119 + j*(-180) +-25 + j*(-201) +-130 + j*(-160) +-214 + j*(-70) +-226 + j*(76) +-125 + j*(190) +18 + j*(189) +89 + j*(100) +66 + j*(33) +50 + j*(39) +93 + j*(19) +85 + j*(-71) +-31 + j*(-95) +-86 + j*(21) +30 + j*(101) +147 + j*(-8) +78 + j*(-171) +-108 + j*(-180) +-200 + j*(-35) +-151 + j*(91) +-68 + j*(125) +-8 + j*(127) +56 + j*(101) +77 + j*(23) +11 + j*(-21) +-42 + j*(26) +-31 + j*(79) +-11 + j*(127) +71 + j*(201) +253 + j*(163) +330 + j*(-45) +214 + j*(-199) +112 + j*(-206) +83 + j*(-250) +-57 + j*(-326) +-268 + j*(-235) +-325 + j*(4) +-178 + j*(190) +42 + j*(175) +108 + j*(-13) +-57 + j*(-97) +-132 + j*(84) +90 + j*(159) +181 + j*(-96) +-88 + j*(-200) +-194 + j*(58) +47 + j*(148) +115 + j*(-77) +-90 + j*(-131) +-146 + j*(30) +-64 + j*(77) +-58 + j*(88) +11 + j*(163) +161 + j*(100) +155 + j*(-69) +41 + j*(-119) +-9 + j*(-103) +-74 + j*(-113) +-176 + j*(-38) +-165 + j*(134) +11 + j*(231) +211 + j*(119) +199 + j*(-142) +-76 + j*(-228) +-226 + j*(30) +9 + j*(209) +200 + j*(-6) +21 + j*(-205) +-164 + j*(-93) +-141 + j*(21) +-167 + j*(45) +-193 + j*(214) +25 + j*(373) +298 + j*(247) +339 + j*(-19) +193 + j*(-187) +6 + j*(-186) +-74 + j*(-49) +9 + j*(35) +66 + j*(-16) +44 + j*(-30) +100 + j*(-42) +60 + j*(-196) +-193 + j*(-154) +-158 + j*(175) +229 + j*(144) +200 + j*(-293) +-264 + j*(-284) +-288 + j*(158) +83 + j*(194) +88 + j*(-88) +-126 + j*(-33) +-25 + j*(153) +156 + j*(48) +86 + j*(-111) +-18 + j*(-86) +-4 + j*(-40) +15 + j*(-69) +-14 + j*(-108) +-82 + j*(-122) +-151 + j*(-66) +-136 + j*(14) +-91 + j*(25) +-88 + j*(16) +-79 + j*(6) +-142 + j*(-51) +-326 + j*(49) +-298 + j*(388) +96 + j*(531) +383 + j*(238) +268 + j*(-56) +84 + j*(-71) +29 + j*(-13) +1 + j*(42) +54 + j*(143) +218 + j*(122) +266 + j*(-61) +140 + j*(-158) +66 + j*(-114) +79 + j*(-106) +57 + j*(-148) +2 + j*(-156) +-47 + j*(-148) +-113 + j*(-105) +-115 + j*(8) +15 + j*(54) +98 + j*(-83) +-35 + j*(-215) +-214 + j*(-125) +-200 + j*(57) +-76 + j*(100) +-28 + j*(53) +-25 + j*(40) +-6 + j*(14) +-44 + j*(-23) +-100 + j*(23) +-60 + j*(91) +-9 + j*(66) +-38 + j*(46) +-46 + j*(100) +6 + j*(135) +68 + j*(144) +162 + j*(107) +194 + j*(-35) +66 + j*(-109) +26 + j*(-7) +151 + j*(-57) +23 + j*(-262) +-274 + j*(-100) +-108 + j*(252) +257 + j*(83) +76 + j*(-270) +-252 + j*(-71) +-45 + j*(216) +184 + j*(10) +-11 + j*(-144) +-75 + j*(35) +95 + j*(13) +1 + j*(-161) +-164 + j*(-30) +-23 + j*(100) +51 + j*(-47) +-111 + j*(-62) +-88 + j*(113) +86 + j*(73) +46 + j*(-92) +-112 + j*(-87) +-181 + j*(48) +-118 + j*(214) +111 + j*(260) +245 + j*(37) +64 + j*(-98) +10 + j*(86) +279 + j*(38) +194 + j*(-350) +-269 + j*(-301) +-269 + j*(151) +103 + j*(166) +97 + j*(-110) +-85 + j*(-75) +-29 + j*(7) +-47 + j*(-75) +-155 + j*(13) +-47 + j*(115) +-23 + j*(8) +-161 + j*(115) +73 + j*(341) +402 + j*(43) +104 + j*(-348) +-291 + j*(-73) +-41 + j*(291) +286 + j*(80) +141 + j*(-188) +-30 + j*(-125) +-25 + j*(-79) +-93 + j*(-71) +-95 + j*(68) +67 + j*(79) +82 + j*(-76) +-42 + j*(-91) +-57 + j*(-19) +-46 + j*(-17) +-73 + j*(24) +-16 + j*(76) +40 + j*(37) +27 + j*(22) +93 + j*(28) +146 + j*(-124) +-43 + j*(-261) +-264 + j*(-112) +-212 + j*(122) +-37 + j*(161) +26 + j*(78) +6 + j*(52) +33 + j*(64) +81 + j*(0) +-1 + j*(-100) +-160 + j*(-18) +-111 + j*(191) +105 + j*(204) +164 + j*(69) +171 + j*(43) +288 + j*(-88) +132 + j*(-406) +-337 + j*(-333) +-398 + j*(167) +19 + j*(324) +200 + j*(46) +62 + j*(-95) +-21 + j*(-85) +-133 + j*(-71) +-204 + j*(156) +99 + j*(325) +346 + j*(9) +52 + j*(-248) +-148 + j*(45) +208 + j*(187) +358 + j*(-264) +-139 + j*(-507) +-506 + j*(-58) +-180 + j*(391) +290 + j*(215) +249 + j*(-226) +-124 + j*(-294) +-255 + j*(-22) +-95 + j*(107) +-29 + j*(27) +-74 + j*(37) +-13 + j*(66) +-13 + j*(-32) +-161 + j*(-1) +-132 + j*(199) +66 + j*(206) +91 + j*(81) +59 + j*(102) +163 + j*(83) +148 + j*(-71) +2 + j*(-67) +16 + j*(41) +86 + j*(13) +69 + j*(-12) +115 + j*(-17) +103 + j*(-153) +-99 + j*(-158) +-127 + j*(71) +85 + j*(114) +129 + j*(-27) +112 + j*(-34) +218 + j*(-152) +32 + j*(-427) +-383 + j*(-278) +-339 + j*(162) +15 + j*(195) +56 + j*(-23) +-36 + j*(-38) +-22 + j*(-61) +-161 + j*(-107) +-261 + j*(129) +12 + j*(298) +224 + j*(59) +70 + j*(-136) +-52 + j*(-70) +-47 + j*(-59) +-140 + j*(-52) +-154 + j*(98) +-23 + j*(129) +-24 + j*(57) +-47 + j*(139) +116 + j*(153) +151 + j*(-49) +-37 + j*(-100) +-79 + j*(33) +-25 + j*(25) +-133 + j*(35) +-129 + j*(269) +173 + j*(357) +363 + j*(115) +275 + j*(-83) +205 + j*(-116) +185 + j*(-214) +9 + j*(-309) +-196 + j*(-190) +-194 + j*(33) +-32 + j*(125) +95 + j*(32) +40 + j*(-100) +-120 + j*(-52) +-76 + j*(165) +205 + j*(163) +271 + j*(-156) +-33 + j*(-278) +-160 + j*(-15) +83 + j*(70) +123 + j*(-186) +-147 + j*(-210) +-156 + j*(40) +52 + j*(11) +-41 + j*(-169) +-214 + j*(-28) +-52 + j*(142) +107 + j*(-16) +-21 + j*(-165) +-147 + j*(-124) +-230 + j*(-78) +-342 + j*(105) +-146 + j*(390) +249 + j*(259) +194 + j*(-158) +-195 + j*(-152) +-223 + j*(187) +37 + j*(253) +122 + j*(97) +56 + j*(23) +-13 + j*(51) +5 + j*(165) +209 + j*(189) +316 + j*(-83) +35 + j*(-265) +-167 + j*(-19) +47 + j*(158) +181 + j*(-25) +46 + j*(-106) +53 + j*(-27) +105 + j*(-142) +-91 + j*(-211) +-183 + j*(-4) +-4 + j*(66) +-1 + j*(-104) +-207 + j*(-59) +-187 + j*(189) +39 + j*(249) +162 + j*(117) +140 + j*(-4) +64 + j*(-35) +35 + j*(21) +118 + j*(47) +178 + j*(-62) +99 + j*(-157) +27 + j*(-137) +33 + j*(-146) +-40 + j*(-216) +-193 + j*(-161) +-205 + j*(27) +-36 + j*(80) +11 + j*(-88) +-214 + j*(-137) +-328 + j*(147) +-54 + j*(356) +190 + j*(168) +86 + j*(-4) +30 + j*(81) +143 + j*(59) +93 + j*(-39) +91 + j*(59) +321 + j*(-57) +171 + j*(-471) +-364 + j*(-392) +-382 + j*(114) +-21 + j*(144) +-91 + j*(-66) +-223 + j*(142) +67 + j*(259) +170 + j*(-28) +-49 + j*(-78) +-8 + j*(59) +57 + j*(-97) +-209 + j*(-124) +-242 + j*(199) +52 + j*(252) +82 + j*(60) +1 + j*(119) +163 + j*(142) +177 + j*(-79) +-37 + j*(-81) +-11 + j*(94) +128 + j*(43) +76 + j*(-49) +56 + j*(-5) +112 + j*(-57) +29 + j*(-132) +-37 + j*(-64) +15 + j*(-53) +-33 + j*(-123) +-136 + j*(-69) +-132 + j*(37) +-85 + j*(86) +-25 + j*(117) +38 + j*(82) +11 + j*(58) +51 + j*(136) +216 + j*(64) +161 + j*(-162) +-64 + j*(-133) +-36 + j*(40) +72 + j*(-15) +-13 + j*(-60) +1 + j*(43) +103 + j*(-13) +25 + j*(-83) +36 + j*(16) +181 + j*(-104) +-18 + j*(-312) +-258 + j*(-88) +-38 + j*(113) +69 + j*(-120) +-192 + j*(-119) +-91 + j*(164) +205 + j*(-31) +-57 + j*(-346) +-381 + j*(-87) +-197 + j*(186) +-54 + j*(93) +-95 + j*(115) +54 + j*(133) +33 + j*(-93) +-244 + j*(-11) +-107 + j*(305) +207 + j*(138) +18 + j*(-119) +-147 + j*(105) +119 + j*(175) +96 + j*(-133) +-253 + j*(-41) +-149 + j*(344) +222 + j*(285) +220 + j*(11) +82 + j*(6) +124 + j*(48) +144 + j*(-33) +71 + j*(-71) +6 + j*(-41) +-13 + j*(59) +137 + j*(151) +328 + j*(-30) +182 + j*(-309) +-106 + j*(-240) +-87 + j*(-27) +31 + j*(-71) +-78 + j*(-133) +-141 + j*(31) +40 + j*(122) +172 + j*(-39) +65 + j*(-214) +-133 + j*(-192) +-195 + j*(-4) +-39 + j*(106) +78 + j*(-33) +-74 + j*(-144) +-187 + j*(40) +24 + j*(165) +167 + j*(-59) +-47 + j*(-227) +-223 + j*(-54) +-111 + j*(86) +-56 + j*(2) +-182 + j*(34) +-129 + j*(248) +155 + j*(257) +254 + j*(-10) +76 + j*(-153) +-18 + j*(-66) +47 + j*(-84) +-64 + j*(-223) +-321 + j*(-112) +-313 + j*(218) +-22 + j*(334) +153 + j*(167) +99 + j*(27) +22 + j*(46) +63 + j*(111) +179 + j*(66) +187 + j*(-107) +5 + j*(-195) +-132 + j*(-49) +-30 + j*(89) +84 + j*(16) +40 + j*(-76) +-21 + j*(-76) +-74 + j*(-69) +-136 + j*(7) +-70 + j*(119) +35 + j*(62) +-59 + j*(2) +-95 + j*(186) +182 + j*(254) +316 + j*(-60) +25 + j*(-243) +-161 + j*(4) +49 + j*(172) +197 + j*(2) +77 + j*(-119) +9 + j*(-37) +89 + j*(-21) +93 + j*(-126) +-8 + j*(-157) +-58 + j*(-104) +-63 + j*(-88) +-116 + j*(-65) +-126 + j*(49) +14 + j*(114) +130 + j*(-16) +37 + j*(-168) +-119 + j*(-136) +-157 + j*(-20) +-112 + j*(59) +-28 + j*(83) +31 + j*(3) +-67 + j*(-66) +-148 + j*(71) +28 + j*(179) +158 + j*(-12) +-24 + j*(-141) +-117 + j*(20) +31 + j*(50) +-12 + j*(-100) +-171 + j*(-1) +-35 + j*(156) +93 + j*(-4) +-98 + j*(-98) +-174 + j*(116) +35 + j*(187) +96 + j*(18) +-18 + j*(-19) +-39 + j*(40) +-48 + j*(51) +-66 + j*(136) +66 + j*(216) +198 + j*(115) +176 + j*(-5) +137 + j*(-35) +116 + j*(-69) +88 + j*(-67) +142 + j*(-100) +82 + j*(-290) +-246 + j*(-293) +-373 + j*(76) +-87 + j*(290) +103 + j*(158) +93 + j*(109) +226 + j*(86) +247 + j*(-175) +-47 + j*(-240) +-90 + j*(38) +199 + j*(8) +119 + j*(-333) +-255 + j*(-281) +-264 + j*(42) +-71 + j*(64) +-111 + j*(-4) +-120 + j*(132) +69 + j*(139) +86 + j*(-52) +-85 + j*(-52) +-62 + j*(112) +108 + j*(74) +86 + j*(-99) +-75 + j*(-96) +-78 + j*(42) +48 + j*(34) +23 + j*(-105) +-137 + j*(-85) +-141 + j*(82) +-5 + j*(100) +-5 + j*(16) +-49 + j*(69) +77 + j*(88) +92 + j*(-113) +-182 + j*(-150) +-276 + j*(168) +23 + j*(330) +208 + j*(107) +64 + j*(-23) +19 + j*(103) +180 + j*(107) +218 + j*(-68) +98 + j*(-160) +4 + j*(-145) +-81 + j*(-99) +-108 + j*(50) +88 + j*(154) +288 + j*(-64) +101 + j*(-367) +-256 + j*(-279) +-276 + j*(37) +-73 + j*(96) +-68 + j*(-6) +-135 + j*(78) +10 + j*(161) +100 + j*(9) +-40 + j*(-54) +-47 + j*(86) +120 + j*(31) +17 + j*(-182) +-261 + j*(-69) +-202 + j*(252) +85 + j*(308) +233 + j*(171) +313 + j*(39) +313 + j*(-197) +59 + j*(-351) +-148 + j*(-180) +-38 + j*(-49) +-81 + j*(-46) +-16 + j*(85) +103 + j*(-8) +-16 + j*(-98) +-54 + j*(54) +149 + j*(39) +102 + j*(-221) +-192 + j*(-181) +-167 + j*(105) +78 + j*(81) +42 + j*(-127) +-145 + j*(-88) +-132 + j*(79) +8 + j*(108) +81 + j*(4) +7 + j*(-110) +-141 + j*(-67) +-123 + j*(97) +32 + j*(84) +-13 + j*(-54) +-156 + j*(39) +-35 + j*(213) +158 + j*(103) +86 + j*(-72) +-36 + j*(-31) +-8 + j*(33) +12 + j*(3) +-18 + j*(3) +-26 + j*(21) +-40 + j*(49) +-1 + j*(110) +91 + j*(77) +57 + j*(-6) +1 + j*(72) +150 + j*(144) +295 + j*(-41) +176 + j*(-265) +-59 + j*(-291) +-229 + j*(-135) +-201 + j*(130) +114 + j*(213) +281 + j*(-125) +-55 + j*(-348) +-282 + j*(-45) +-9 + j*(112) +31 + j*(-186) +-354 + j*(-137) +-294 + j*(325) +173 + j*(303) +168 + j*(-91) +-138 + j*(-62) +-81 + j*(177) +95 + j*(133) +79 + j*(59) +144 + j*(83) +242 + j*(-95) +37 + j*(-299) +-247 + j*(-161) +-223 + j*(132) +5 + j*(216) +146 + j*(88) +110 + j*(-48) +15 + j*(-57) +13 + j*(1) +62 + j*(-21) +42 + j*(-80) +-10 + j*(-93) +-57 + j*(-95) +-132 + j*(-48) +-117 + j*(71) +-4 + j*(81) +-21 + j*(-1) +-98 + j*(76) +10 + j*(199) +175 + j*(142) +238 + j*(12) +245 + j*(-152) +62 + j*(-344) +-260 + j*(-221) +-199 + j*(131) +117 + j*(80) +23 + j*(-192) +-208 + j*(-39) +-1 + j*(132) +88 + j*(-134) +-250 + j*(-153) +-228 + j*(236) +160 + j*(183) +52 + j*(-163) +-254 + j*(30) +9 + j*(329) +326 + j*(51) +100 + j*(-272) +-187 + j*(-156) +-197 + j*(35) +-144 + j*(139) +-6 + j*(221) +158 + j*(98) +41 + j*(-88) +-153 + j*(50) +-9 + j*(281) +256 + j*(204) +310 + j*(-22) +224 + j*(-184) +53 + j*(-279) +-167 + j*(-194) +-196 + j*(51) +-12 + j*(165) +132 + j*(88) +176 + j*(-17) +170 + j*(-149) +28 + j*(-263) +-156 + j*(-184) +-144 + j*(-11) +-22 + j*(-8) +-47 + j*(-112) +-171 + j*(-77) +-164 + j*(60) +-51 + j*(81) +-47 + j*(-8) +-152 + j*(21) +-140 + j*(176) +28 + j*(229) +139 + j*(130) +151 + j*(42) +165 + j*(-37) +103 + j*(-161) +-70 + j*(-179) +-158 + j*(-38) +-97 + j*(66) +-30 + j*(76) +13 + j*(75) +59 + j*(37) +47 + j*(-21) +20 + j*(-23) +34 + j*(-53) +-50 + j*(-124) +-206 + j*(-18) +-139 + j*(218) +118 + j*(235) +202 + j*(41) +112 + j*(-37) +115 + j*(-7) +166 + j*(-97) +58 + j*(-223) +-95 + j*(-175) +-90 + j*(-58) +-28 + j*(-78) +-98 + j*(-123) +-185 + j*(-47) +-167 + j*(49) +-157 + j*(98) +-117 + j*(235) +140 + j*(299) +325 + j*(19) +93 + j*(-212) +-86 + j*(-13) +160 + j*(75) +199 + j*(-272) +-233 + j*(-331) +-342 + j*(107) +18 + j*(229) +87 + j*(-29) +-98 + j*(6) +40 + j*(168) +213 + j*(-25) +25 + j*(-207) +-131 + j*(-75) +-62 + j*(12) +-69 + j*(-28) +-123 + j*(47) +-41 + j*(129) +35 + j*(94) +56 + j*(64) +83 + j*(13) +10 + j*(-50) +-74 + j*(51) +56 + j*(165) +204 + j*(49) +142 + j*(-91) +78 + j*(-69) +125 + j*(-101) +64 + j*(-228) +-124 + j*(-233) +-235 + j*(-74) +-181 + j*(107) +-5 + j*(154) +80 + j*(28) +-16 + j*(-20) +17 + j*(107) +236 + j*(8) +134 + j*(-330) +-291 + j*(-291) +-337 + j*(137) +24 + j*(231) +107 + j*(-56) +-137 + j*(-117) +-220 + j*(99) +-74 + j*(236) +87 + j*(215) +190 + j*(102) +170 + j*(-55) +44 + j*(-113) +-37 + j*(-57) +-55 + j*(-3) +-64 + j*(71) +32 + j*(159) +192 + j*(98) +202 + j*(-74) +95 + j*(-137) +58 + j*(-116) +57 + j*(-165) +-45 + j*(-228) +-190 + j*(-177) +-257 + j*(-37) +-233 + j*(117) +-110 + j*(246) +111 + j*(260) +280 + j*(59) +185 + j*(-203) +-71 + j*(-223) +-153 + j*(-43) +-52 + j*(22) +-49 + j*(-45) +-122 + j*(-13) +-112 + j*(59) +-109 + j*(77) +-118 + j*(186) +57 + j*(296) +267 + j*(158) +236 + j*(-60) +112 + j*(-116) +49 + j*(-120) +-46 + j*(-100) +-64 + j*(30) +73 + j*(61) +98 + j*(-70) +-2 + j*(-81) +14 + j*(-40) +-16 + j*(-98) +-130 + j*(4) +43 + j*(180) +282 + j*(-47) +43 + j*(-334) +-238 + j*(-124) +-54 + j*(81) +45 + j*(-129) +-231 + j*(-156) +-253 + j*(165) +40 + j*(216) +103 + j*(1) +-19 + j*(-45) +-43 + j*(-1) +-65 + j*(13) +-57 + j*(88) +45 + j*(73) +1 + j*(-36) +-126 + j*(59) +-6 + j*(226) +196 + j*(142) +196 + j*(-37) +100 + j*(-117) +-24 + j*(-124) +-115 + j*(30) +78 + j*(194) +328 + j*(-31) +119 + j*(-364) +-248 + j*(-228) +-198 + j*(104) +54 + j*(115) +112 + j*(-59) +21 + j*(-175) +-156 + j*(-185) +-276 + j*(3) +-127 + j*(174) +-3 + j*(57) +-167 + j*(33) +-131 + j*(307) +233 + j*(283) +233 + j*(-86) +-93 + j*(-55) +10 + j*(262) +358 + j*(125) +259 + j*(-226) +-8 + j*(-181) +48 + j*(-40) +110 + j*(-176) +-99 + j*(-247) +-218 + j*(-33) +-54 + j*(109) +65 + j*(-14) +-57 + j*(-100) +-139 + j*(45) +28 + j*(158) +182 + j*(0) +69 + j*(-180) +-88 + j*(-124) +-69 + j*(-43) +-74 + j*(-78) +-165 + j*(-21) +-103 + j*(114) +45 + j*(63) +-7 + j*(-81) +-170 + j*(-40) +-177 + j*(142) +-13 + j*(234) +148 + j*(132) +103 + j*(-50) +-79 + j*(-21) +-26 + j*(179) +214 + j*(95) +111 + j*(-183) +-202 + j*(-62) +-65 + j*(286) +315 + j*(166) +247 + j*(-214) +-81 + j*(-214) +-130 + j*(21) +3 + j*(99) +97 + j*(65) +159 + j*(-36) +64 + j*(-176) +-128 + j*(-100) +-64 + j*(124) +179 + j*(76) +174 + j*(-169) +-23 + j*(-226) +-122 + j*(-134) +-151 + j*(-48) +-122 + j*(69) +34 + j*(99) +103 + j*(-63) +-43 + j*(-161) +-153 + j*(-62) +-126 + j*(22) +-119 + j*(59) +-62 + j*(153) +116 + j*(122) +127 + j*(-105) +-116 + j*(-155) +-199 + j*(83) +21 + j*(189) +140 + j*(-9) +-33 + j*(-146) +-199 + j*(-18) +-157 + j*(160) +-21 + j*(222) +100 + j*(185) +158 + j*(81) +110 + j*(-5) +48 + j*(25) +108 + j*(71) +187 + j*(-6) +154 + j*(-117) +86 + j*(-159) +15 + j*(-206) +-144 + j*(-207) +-269 + j*(-13) +-130 + j*(208) +117 + j*(156) +132 + j*(-68) +-62 + j*(-125) +-164 + j*(41) +-47 + j*(194) +119 + j*(163) +163 + j*(57) +165 + j*(20) +226 + j*(-57) +159 + j*(-233) +-67 + j*(-223) +-69 + j*(-4) +162 + j*(-57) +66 + j*(-364) +-327 + j*(-300) +-351 + j*(98) +-35 + j*(180) +35 + j*(-36) +-113 + j*(-70) +-138 + j*(25) +-122 + j*(54) +-122 + j*(134) +18 + j*(202) +151 + j*(71) +77 + j*(-88) +-50 + j*(-88) +-115 + j*(-35) +-170 + j*(60) +-103 + j*(218) +100 + j*(221) +163 + j*(52) +70 + j*(0) +94 + j*(52) +177 + j*(-44) +76 + j*(-206) +-129 + j*(-180) +-207 + j*(-13) +-145 + j*(124) +-36 + j*(175) +72 + j*(143) +110 + j*(42) +35 + j*(-27) +-54 + j*(42) +8 + j*(174) +184 + j*(151) +238 + j*(-20) +127 + j*(-120) +41 + j*(-89) +18 + j*(-49) +14 + j*(13) +120 + j*(69) +255 + j*(-63) +156 + j*(-270) +-48 + j*(-243) +-50 + j*(-122) +-13 + j*(-175) +-153 + j*(-200) +-223 + j*(-23) +-74 + j*(87) +52 + j*(-10) +15 + j*(-144) +-121 + j*(-197) +-276 + j*(-108) +-284 + j*(95) +-121 + j*(185) +-32 + j*(103) +-72 + j*(75) +-62 + j*(121) +-23 + j*(132) +16 + j*(161) +151 + j*(142) +204 + j*(-68) +-15 + j*(-202) +-190 + j*(-33) +-98 + j*(127) +-8 + j*(94) +-21 + j*(100) +47 + j*(135) +111 + j*(59) +66 + j*(-3) +42 + j*(13) +32 + j*(-7) +-28 + j*(33) +42 + j*(144) +214 + j*(71) +183 + j*(-139) +-11 + j*(-169) +-77 + j*(-37) +-13 + j*(28) +28 + j*(4) +6 + j*(-13) +-9 + j*(39) +87 + j*(86) +190 + j*(-39) +71 + j*(-185) +-72 + j*(-78) +59 + j*(27) +148 + j*(-169) +-95 + j*(-299) +-284 + j*(-90) +-183 + j*(114) +-41 + j*(128) +42 + j*(76) +41 + j*(-37) +-104 + j*(-27) +-61 + j*(190) +254 + j*(127) +204 + j*(-261) +-199 + j*(-235) +-174 + j*(119) +93 + j*(52) +-48 + j*(-120) +-139 + j*(107) +165 + j*(136) +159 + j*(-217) +-197 + j*(-197) +-162 + j*(107) +62 + j*(37) +-49 + j*(-124) +-175 + j*(-10) +-124 + j*(65) +-156 + j*(110) +-60 + j*(294) +245 + j*(221) +237 + j*(-116) +-35 + j*(-135) +-19 + j*(35) +81 + j*(-70) +-105 + j*(-158) +-230 + j*(45) +-98 + j*(192) +4 + j*(180) +74 + j*(200) +221 + j*(139) +243 + j*(-57) +95 + j*(-151) +-8 + j*(-93) +-18 + j*(-30) +0 + j*(6) +32 + j*(16) +68 + j*(11) +120 + j*(-41) +82 + j*(-187) +-162 + j*(-208) +-276 + j*(105) +57 + j*(322) +353 + j*(23) +128 + j*(-309) +-186 + j*(-168) +-115 + j*(102) +116 + j*(84) +170 + j*(-120) +5 + j*(-276) +-236 + j*(-190) +-244 + j*(74) +-15 + j*(129) +18 + j*(-59) +-169 + j*(-57) +-166 + j*(146) +8 + j*(187) +89 + j*(97) +104 + j*(8) +26 + j*(-96) +-151 + j*(-27) +-93 + j*(222) +204 + j*(211) +271 + j*(-60) +118 + j*(-177) +35 + j*(-197) +-118 + j*(-234) +-296 + j*(-45) +-152 + j*(199) +51 + j*(112) +-34 + j*(23) +-15 + j*(175) +233 + j*(110) +190 + j*(-203) +-110 + j*(-227) +-203 + j*(-18) +-148 + j*(100) +-77 + j*(214) +154 + j*(251) +313 + j*(-6) +112 + j*(-228) +-91 + j*(-103) +2 + j*(36) +103 + j*(-71) +-13 + j*(-194) +-187 + j*(-126) +-211 + j*(74) +-35 + j*(177) +103 + j*(34) +-38 + j*(-107) +-194 + j*(48) +-54 + j*(236) +139 + j*(153) +111 + j*(17) +49 + j*(28) +78 + j*(55) +118 + j*(41) +170 + j*(-4) +170 + j*(-122) +45 + j*(-183) +-30 + j*(-103) +19 + j*(-76) +-4 + j*(-136) +-82 + j*(-109) +-69 + j*(-55) +-71 + j*(-72) +-119 + j*(-47) +-114 + j*(8) +-107 + j*(29) +-91 + j*(101) +47 + j*(107) +65 + j*(-80) +-173 + j*(-102) +-209 + j*(184) +93 + j*(252) +185 + j*(-21) +-38 + j*(-115) +-121 + j*(50) +-29 + j*(117) +-6 + j*(107) +30 + j*(156) +132 + j*(152) +189 + j*(82) +221 + j*(23) +244 + j*(-66) +218 + j*(-163) +179 + j*(-264) +26 + j*(-409) +-295 + j*(-341) +-363 + j*(37) +-18 + j*(168) +91 + j*(-151) +-255 + j*(-233) +-349 + j*(125) +-42 + j*(233) +11 + j*(0) +-204 + j*(31) +-136 + j*(288) +141 + j*(272) +200 + j*(45) +67 + j*(-45) +-9 + j*(32) +59 + j*(119) +215 + j*(54) +209 + j*(-194) +-94 + j*(-302) +-320 + j*(-16) +-112 + j*(284) +194 + j*(171) +148 + j*(-88) +-57 + j*(-61) +-19 + j*(124) +183 + j*(101) +230 + j*(-124) +29 + j*(-272) +-207 + j*(-153) +-192 + j*(122) +68 + j*(192) +184 + j*(-30) +1 + j*(-141) +-74 + j*(33) +127 + j*(67) +157 + j*(-180) +-114 + j*(-251) +-228 + j*(-17) +-82 + j*(104) +-14 + j*(49) +-8 + j*(66) +86 + j*(42) +71 + j*(-99) +-79 + j*(-98) +-80 + j*(25) +-6 + j*(4) +-71 + j*(-25) +-71 + j*(88) +77 + j*(71) +49 + j*(-103) +-151 + j*(-70) +-147 + j*(149) +59 + j*(213) +199 + j*(84) +207 + j*(-97) +67 + j*(-251) +-182 + j*(-228) +-293 + j*(14) +-147 + j*(204) +23 + j*(180) +74 + j*(98) +80 + j*(47) +62 + j*(-4) +2 + j*(-7) +-12 + j*(57) +57 + j*(87) +107 + j*(38) +102 + j*(0) +119 + j*(-10) +156 + j*(-88) +71 + j*(-206) +-96 + j*(-164) +-83 + j*(-8) +54 + j*(-48) +-49 + j*(-215) +-287 + j*(-91) +-204 + j*(205) +94 + j*(183) +115 + j*(-76) +-100 + j*(-132) +-210 + j*(28) +-159 + j*(198) +22 + j*(296) +242 + j*(185) +238 + j*(-55) +69 + j*(-94) +85 + j*(-11) +148 + j*(-138) +-55 + j*(-249) +-222 + j*(-41) +-63 + j*(134) +74 + j*(28) +4 + j*(-62) +-53 + j*(-33) +-95 + j*(4) +-113 + j*(147) +127 + j*(271) +388 + j*(-3) +170 + j*(-368) +-207 + j*(-255) +-165 + j*(28) +-20 + j*(-34) +-176 + j*(-87) +-212 + j*(161) +56 + j*(214) +88 + j*(-25) +-130 + j*(20) +-13 + j*(269) +270 + j*(145) +179 + j*(-109) +32 + j*(-13) +214 + j*(32) +240 + j*(-249) +-54 + j*(-318) +-115 + j*(-124) +-49 + j*(-179) +-281 + j*(-192) +-308 + j*(177) +122 + j*(210) +110 + j*(-257) +-413 + j*(-193) +-341 + j*(371) +194 + j*(319) +129 + j*(-114) +-196 + j*(16) +9 + j*(273) +226 + j*(30) +-14 + j*(-144) +-143 + j*(71) +37 + j*(160) +98 + j*(29) +11 + j*(-23) +-62 + j*(30) +-59 + j*(172) +170 + j*(260) +374 + j*(-22) +91 + j*(-315) +-235 + j*(-52) +17 + j*(264) +308 + j*(32) +112 + j*(-209) +-40 + j*(-46) +129 + j*(11) +146 + j*(-182) +-29 + j*(-237) +-134 + j*(-165) +-228 + j*(-64) +-201 + j*(183) +124 + j*(269) +307 + j*(-57) +36 + j*(-274) +-158 + j*(-65) +25 + j*(76) +141 + j*(-103) +-4 + j*(-233) +-125 + j*(-177) +-166 + j*(-139) +-263 + j*(-87) +-305 + j*(98) +-144 + j*(253) +52 + j*(184) +46 + j*(33) +-37 + j*(44) +24 + j*(87) +57 + j*(-37) +-132 + j*(-75) +-199 + j*(168) +64 + j*(276) +189 + j*(35) +-25 + j*(-61) +-81 + j*(156) +144 + j*(209) +223 + j*(22) +127 + j*(-48) +130 + j*(-33) +136 + j*(-127) +8 + j*(-185) +-102 + j*(-104) +-106 + j*(10) +-30 + j*(91) +103 + j*(66) +124 + j*(-93) +-32 + j*(-141) +-78 + j*(-13) +25 + j*(-13) +-52 + j*(-115) +-190 + j*(29) +-10 + j*(219) +214 + j*(38) +43 + j*(-186) +-152 + j*(-14) +47 + j*(155) +214 + j*(-83) +-40 + j*(-281) +-275 + j*(-59) +-132 + j*(180) +62 + j*(122) +66 + j*(18) +66 + j*(-15) +33 + j*(-124) +-178 + j*(-131) +-274 + j*(151) +3 + j*(363) +296 + j*(180) +255 + j*(-107) +62 + j*(-172) +-33 + j*(-97) +-42 + j*(-28) +-8 + j*(23) +67 + j*(13) +92 + j*(-84) +-1 + j*(-163) +-136 + j*(-114) +-154 + j*(33) +-37 + j*(105) +46 + j*(37) +23 + j*(-28) +-10 + j*(-42) +-65 + j*(-58) +-161 + j*(40) +-48 + j*(238) +242 + j*(153) +208 + j*(-176) +-96 + j*(-171) +-71 + j*(79) +141 + j*(0) +22 + j*(-195) +-145 + j*(-69) +-23 + j*(32) +1 + j*(-106) +-158 + j*(-91) +-144 + j*(37) +-114 + j*(6) +-225 + j*(88) +-99 + j*(313) +187 + j*(224) +156 + j*(-27) +6 + j*(-21) +26 + j*(18) +-44 + j*(-21) +-110 + j*(156) +166 + j*(279) +373 + j*(-39) +102 + j*(-322) +-210 + j*(-171) +-206 + j*(98) +-38 + j*(230) +175 + j*(190) +238 + j*(-39) +24 + j*(-137) +-42 + j*(72) +193 + j*(92) +178 + j*(-170) +-78 + j*(-119) +30 + j*(127) +289 + j*(-23) +171 + j*(-293) +-29 + j*(-264) +-54 + j*(-238) +-212 + j*(-272) +-380 + j*(-33) +-190 + j*(227) +57 + j*(135) +23 + j*(-16) +-23 + j*(14) +38 + j*(-11) +-19 + j*(-117) +-170 + j*(-73) +-187 + j*(109) +-20 + j*(211) +161 + j*(103) +127 + j*(-109) +-69 + j*(-141) +-123 + j*(8) +-30 + j*(41) +-50 + j*(-23) +-117 + j*(51) +-20 + j*(134) +69 + j*(46) +-4 + j*(-28) +-60 + j*(30) +-26 + j*(81) +18 + j*(88) +84 + j*(67) +106 + j*(-46) +-32 + j*(-121) +-155 + j*(11) +-52 + j*(162) +104 + j*(91) +49 + j*(-57) +-107 + j*(-10) +-84 + j*(162) +78 + j*(184) +108 + j*(79) +66 + j*(119) +233 + j*(180) +402 + j*(-80) +151 + j*(-373) +-197 + j*(-202) +-103 + j*(110) +122 + j*(50) +57 + j*(-78) +13 + j*(30) +183 + j*(25) +190 + j*(-180) +16 + j*(-221) +-12 + j*(-131) +28 + j*(-171) +-58 + j*(-234) +-159 + j*(-191) +-208 + j*(-126) +-233 + j*(-35) +-175 + j*(46) +-124 + j*(7) +-218 + j*(2) +-249 + j*(175) +-74 + j*(280) +54 + j*(189) +38 + j*(134) +87 + j*(160) +177 + j*(76) +134 + j*(-44) +55 + j*(-45) +66 + j*(-36) +42 + j*(-107) +-86 + j*(-110) +-147 + j*(40) +-18 + j*(158) +138 + j*(78) +116 + j*(-87) +-26 + j*(-118) +-91 + j*(-23) +-45 + j*(52) +23 + j*(49) +59 + j*(-13) +6 + j*(-88) +-102 + j*(-58) +-103 + j*(64) +0 + j*(80) +0 + j*(1) +-79 + j*(38) +-22 + j*(141) +101 + j*(96) +76 + j*(-18) +-18 + j*(6) +22 + j*(97) +136 + j*(53) +112 + j*(-92) +-50 + j*(-98) +-86 + j*(70) +83 + j*(131) +158 + j*(-28) +12 + j*(-99) +-45 + j*(52) +128 + j*(119) +250 + j*(-48) +161 + j*(-238) +-41 + j*(-281) +-210 + j*(-143) +-170 + j*(83) +44 + j*(117) +103 + j*(-55) +-17 + j*(-90) +6 + j*(-11) +67 + j*(-115) +-100 + j*(-185) +-186 + j*(7) +6 + j*(85) +59 + j*(-106) +-128 + j*(-150) +-174 + j*(-2) +-106 + j*(23) +-146 + j*(30) +-115 + j*(137) +16 + j*(115) +-12 + j*(10) +-88 + j*(73) +11 + j*(140) +76 + j*(25) +-41 + j*(-23) +-69 + j*(100) +61 + j*(120) +73 + j*(-14) +-76 + j*(-17) +-76 + j*(166) +146 + j*(190) +203 + j*(-59) +-65 + j*(-141) +-179 + j*(158) +127 + j*(331) +366 + j*(92) +271 + j*(-130) +192 + j*(-168) +129 + j*(-303) +-170 + j*(-330) +-313 + j*(18) +4 + j*(231) +230 + j*(-30) +35 + j*(-240) +-133 + j*(-135) +-115 + j*(-52) +-153 + j*(-35) +-172 + j*(101) +-16 + j*(192) +129 + j*(86) +98 + j*(-69) +-40 + j*(-105) +-125 + j*(18) +-9 + j*(138) +136 + j*(25) +25 + j*(-136) +-140 + j*(-26) +-40 + j*(128) +86 + j*(42) +8 + j*(-37) +-24 + j*(43) +59 + j*(53) +67 + j*(-8) +61 + j*(-6) +91 + j*(-59) +16 + j*(-127) +-57 + j*(-59) +2 + j*(-24) +-6 + j*(-105) +-116 + j*(-82) +-112 + j*(23) +-62 + j*(28) +-76 + j*(44) +-19 + j*(91) +38 + j*(19) +-56 + j*(-11) +-56 + j*(129) +135 + j*(124) +157 + j*(-80) +3 + j*(-127) +-21 + j*(-65) +-49 + j*(-135) +-255 + j*(-85) +-267 + j*(240) +88 + j*(366) +314 + j*(74) +134 + j*(-172) +-48 + j*(-84) +16 + j*(-5) +13 + j*(-124) +-199 + j*(-104) +-243 + j*(177) +21 + j*(323) +231 + j*(174) +241 + j*(6) +211 + j*(-120) +67 + j*(-256) +-177 + j*(-171) +-163 + j*(88) +32 + j*(101) +6 + j*(3) +-6 + j*(133) +254 + j*(110) +267 + j*(-250) +-100 + j*(-334) +-221 + j*(-70) +-113 + j*(-4) +-188 + j*(12) +-129 + j*(237) +175 + j*(192) +129 + j*(-105) +-121 + j*(4) +83 + j*(243) +358 + j*(-13) +136 + j*(-320) +-134 + j*(-193) +-85 + j*(-28) +-25 + j*(-49) +-39 + j*(-59) +-42 + j*(-81) +-126 + j*(-83) +-144 + j*(44) +-16 + j*(53) +-59 + j*(-66) +-182 + j*(48) +-15 + j*(173) +83 + j*(-40) +-190 + j*(-96) +-234 + j*(235) +103 + j*(293) +141 + j*(22) +-61 + j*(75) +105 + j*(276) +367 + j*(68) +211 + j*(-231) +-35 + j*(-161) +0 + j*(-14) +74 + j*(-76) +-12 + j*(-136) +-82 + j*(-64) +-36 + j*(-12) +-21 + j*(-69) +-129 + j*(-76) +-170 + j*(76) +-22 + j*(163) +64 + j*(42) +-47 + j*(8) +-32 + j*(148) +131 + j*(115) +85 + j*(-23) +4 + j*(89) +236 + j*(157) +371 + j*(-161) +77 + j*(-395) +-167 + j*(-233) +-142 + j*(-103) +-190 + j*(-85) +-221 + j*(99) +-4 + j*(197) +113 + j*(18) +-13 + j*(-54) +-8 + j*(36) +69 + j*(-48) +-64 + j*(-131) +-150 + j*(8) +-42 + j*(59) +-83 + j*(-22) +-187 + j*(132) +33 + j*(313) +291 + j*(114) +173 + j*(-157) +-25 + j*(-118) +-11 + j*(-26) +-4 + j*(-68) +-82 + j*(-47) +-72 + j*(32) +-42 + j*(31) +-70 + j*(67) +2 + j*(145) +115 + j*(83) +69 + j*(-19) +2 + j*(51) +117 + j*(122) +245 + j*(2) +214 + j*(-159) +125 + j*(-253) +-7 + j*(-340) +-247 + j*(-320) +-415 + j*(-74) +-314 + j*(210) +-62 + j*(283) +95 + j*(155) +68 + j*(13) +-33 + j*(16) +-16 + j*(117) +112 + j*(99) +112 + j*(-35) +4 + j*(-37) +42 + j*(50) +138 + j*(-35) +48 + j*(-168) +-95 + j*(-132) +-135 + j*(-46) +-175 + j*(45) +-99 + j*(234) +212 + j*(230) +308 + j*(-136) +-42 + j*(-317) +-255 + j*(-39) +-71 + j*(141) +24 + j*(26) +-61 + j*(32) +14 + j*(115) +88 + j*(12) +-23 + j*(-21) +12 + j*(112) +178 + j*(14) +47 + j*(-193) +-189 + j*(-53) +-62 + j*(185) +148 + j*(84) +74 + j*(-69) +-12 + j*(-4) +55 + j*(35) +66 + j*(-12) +81 + j*(13) +192 + j*(-59) +122 + j*(-283) +-159 + j*(-285) +-238 + j*(-45) +-95 + j*(30) +-93 + j*(-46) +-166 + j*(18) +-97 + j*(98) +-63 + j*(34) +-175 + j*(78) +-115 + j*(289) +161 + j*(317) +301 + j*(96) +231 + j*(-69) +163 + j*(-127) +91 + j*(-209) +-72 + j*(-214) +-153 + j*(-78) +-91 + j*(0) +-83 + j*(-28) +-144 + j*(37) +-59 + j*(159) +102 + j*(96) +62 + j*(-69) +-101 + j*(-29) +-47 + j*(142) +145 + j*(75) +66 + j*(-145) +-194 + j*(-59) +-121 + j*(255) +226 + j*(237) +284 + j*(-82) +60 + j*(-177) +6 + j*(-68) +46 + j*(-112) +-89 + j*(-147) +-141 + j*(33) +42 + j*(86) +74 + j*(-95) +-98 + j*(-101) +-79 + j*(47) +28 + j*(-16) +-104 + j*(-104) +-210 + j*(83) +-21 + j*(232) +139 + j*(103) +92 + j*(-8) +67 + j*(-16) +40 + j*(-74) +-71 + j*(-34) +2 + j*(122) +231 + j*(6) +110 + j*(-317) +-290 + j*(-269) +-358 + j*(111) +-109 + j*(267) +21 + j*(192) +65 + j*(185) +185 + j*(136) +192 + j*(-16) +103 + j*(-41) +150 + j*(-35) +134 + j*(-185) +-76 + j*(-198) +-94 + j*(1) +70 + j*(-44) +-75 + j*(-212) +-285 + j*(13) +-35 + j*(257) +196 + j*(19) +-34 + j*(-148) +-113 + j*(96) +163 + j*(103) +129 + j*(-198) +-148 + j*(-154) +-99 + j*(44) +-8 + j*(-47) +-171 + j*(-51) +-137 + j*(169) +82 + j*(134) +39 + j*(-27) +-40 + j*(47) +66 + j*(49) +6 + j*(-69) +-103 + j*(54) +69 + j*(132) +98 + j*(-70) +-124 + j*(-29) +-10 + j*(222) +260 + j*(67) +114 + j*(-181) +-49 + j*(-58) +71 + j*(-25) +-18 + j*(-165) +-169 + j*(13) +81 + j*(142) +180 + j*(-171) +-167 + j*(-261) +-250 + j*(37) +-76 + j*(62) +-204 + j*(18) +-202 + j*(334) +235 + j*(380) +347 + j*(-47) +23 + j*(-152) +3 + j*(66) +168 + j*(-11) +37 + j*(-153) +-72 + j*(-21) +45 + j*(47) +83 + j*(-41) +49 + j*(-69) +35 + j*(-114) +-78 + j*(-126) +-99 + j*(24) +77 + j*(13) +19 + j*(-216) +-276 + j*(-156) +-284 + j*(150) +-77 + j*(244) +25 + j*(216) +167 + j*(210) +296 + j*(-6) +105 + j*(-216) +-93 + j*(-66) +57 + j*(64) +146 + j*(-127) +-79 + j*(-224) +-211 + j*(-19) +-73 + j*(138) +80 + j*(81) +96 + j*(-46) +1 + j*(-110) +-70 + j*(-42) +5 + j*(-4) +1 + j*(-139) +-228 + j*(-139) +-295 + j*(160) +-11 + j*(317) +194 + j*(139) +155 + j*(-28) +108 + j*(-105) +-11 + j*(-213) +-255 + j*(-135) +-271 + j*(165) +-18 + j*(264) +84 + j*(119) +25 + j*(99) +105 + j*(161) +235 + j*(39) +151 + j*(-148) +-40 + j*(-140) +-90 + j*(16) +25 + j*(94) +120 + j*(14) +75 + j*(-83) +5 + j*(-74) +2 + j*(-60) +-56 + j*(-86) +-141 + j*(25) +-11 + j*(178) +184 + j*(57) +73 + j*(-150) +-120 + j*(-24) +37 + j*(170) +266 + j*(-8) +126 + j*(-279) +-144 + j*(-231) +-191 + j*(-41) +-134 + j*(50) +-66 + j*(119) +76 + j*(112) +122 + j*(-46) +-18 + j*(-110) +-66 + j*(10) +49 + j*(23) +34 + j*(-105) +-104 + j*(-74) +-68 + j*(72) +86 + j*(34) +71 + j*(-132) +-91 + j*(-177) +-204 + j*(-71) +-194 + j*(69) +-88 + j*(142) +6 + j*(93) +-11 + j*(27) +-46 + j*(41) +-32 + j*(51) +-63 + j*(48) +-66 + j*(142) +88 + j*(167) +131 + j*(-28) +-103 + j*(-74) +-167 + j*(211) +144 + j*(334) +329 + j*(72) +173 + j*(-104) +86 + j*(-20) +187 + j*(-28) +176 + j*(-183) +21 + j*(-251) +-116 + j*(-192) +-187 + j*(-69) +-146 + j*(75) +-13 + j*(116) +58 + j*(46) +50 + j*(-4) +40 + j*(-40) +-24 + j*(-63) +-74 + j*(33) +59 + j*(116) +192 + j*(-36) +55 + j*(-223) +-163 + j*(-145) +-164 + j*(65) +-1 + j*(142) +137 + j*(43) +119 + j*(-133) +-65 + j*(-199) +-193 + j*(-47) +-95 + j*(98) +14 + j*(49) +-11 + j*(-2) +-1 + j*(20) +31 + j*(-43) +-79 + j*(-95) +-156 + j*(33) +-37 + j*(119) +28 + j*(18) +-74 + j*(-13) +-95 + j*(91) +-21 + j*(122) +-11 + j*(119) +47 + j*(191) +222 + j*(151) +265 + j*(-71) +82 + j*(-185) +-40 + j*(-66) +66 + j*(24) +174 + j*(-113) +35 + j*(-313) +-267 + j*(-271) +-388 + j*(52) +-160 + j*(308) +133 + j*(223) +158 + j*(-12) +13 + j*(-76) +-36 + j*(-8) +-13 + j*(6) +-27 + j*(-4) +-44 + j*(18) +-49 + j*(32) +-75 + j*(81) +-13 + j*(182) +148 + j*(168) +200 + j*(19) +131 + j*(-46) +139 + j*(-54) +121 + j*(-175) +-78 + j*(-204) +-154 + j*(7) +37 + j*(87) +86 + j*(-81) +-64 + j*(-85) +-6 + j*(43) +111 + j*(-93) +-103 + j*(-233) +-294 + j*(11) +-91 + j*(235) +106 + j*(117) +64 + j*(27) +110 + j*(53) +191 + j*(-95) +31 + j*(-250) +-144 + j*(-170) +-157 + j*(-76) +-209 + j*(-36) +-236 + j*(128) +-69 + j*(251) +84 + j*(177) +125 + j*(95) +177 + j*(-8) +71 + j*(-192) +-204 + j*(-117) +-164 + j*(200) +153 + j*(187) +148 + j*(-98) +-88 + j*(-79) +-40 + j*(113) +110 + j*(35) +11 + j*(-76) +-71 + j*(46) +70 + j*(124) +175 + j*(-5) +114 + j*(-146) +-22 + j*(-192) +-167 + j*(-117) +-182 + j*(71) +-16 + j*(154) +81 + j*(30) +-27 + j*(-45) +-94 + j*(90) +71 + j*(202) +274 + j*(52) +215 + j*(-234) +-93 + j*(-301) +-268 + j*(-52) +-110 + j*(161) +73 + j*(81) +32 + j*(-45) +-45 + j*(-16) +-29 + j*(23) +-31 + j*(35) +9 + j*(85) +100 + j*(33) +43 + j*(-78) +-61 + j*(1) +64 + j*(94) +168 + j*(-78) +-13 + j*(-205) +-144 + j*(-61) +-56 + j*(13) +-86 + j*(-42) +-156 + j*(94) +42 + j*(208) +191 + j*(-6) +-13 + j*(-153) +-127 + j*(37) +59 + j*(109) +88 + j*(-75) +-93 + j*(-64) +-45 + j*(118) +148 + j*(40) +61 + j*(-171) +-164 + j*(-104) +-133 + j*(106) +27 + j*(103) +9 + j*(1) +-65 + j*(74) +59 + j*(178) +222 + j*(57) +158 + j*(-132) +12 + j*(-125) +33 + j*(-59) +55 + j*(-160) +-129 + j*(-214) +-256 + j*(-8) +-85 + j*(175) +112 + j*(47) +15 + j*(-156) +-210 + j*(-97) +-221 + j*(140) +-15 + j*(230) +112 + j*(87) +8 + j*(-23) +-72 + j*(98) +100 + j*(187) +235 + j*(-24) +18 + j*(-221) +-236 + j*(-31) +-109 + j*(274) +211 + j*(248) +299 + j*(-25) +122 + j*(-179) +-27 + j*(-86) +56 + j*(40) +208 + j*(-78) +81 + j*(-318) +-235 + j*(-260) +-277 + j*(49) +-59 + j*(149) +13 + j*(44) +-18 + j*(52) +71 + j*(60) +81 + j*(-71) +-65 + j*(-76) +-45 + j*(76) +122 + j*(35) +91 + j*(-156) +-100 + j*(-170) +-175 + j*(-18) +-83 + j*(103) +70 + j*(66) +72 + j*(-126) +-162 + j*(-174) +-268 + j*(81) +-34 + j*(223) +95 + j*(27) +-81 + j*(-58) +-129 + j*(103) +-10 + j*(121) +-62 + j*(67) +-89 + j*(242) +182 + j*(332) +387 + j*(71) +248 + j*(-204) +-4 + j*(-214) +-124 + j*(-41) +-28 + j*(148) +207 + j*(115) +240 + j*(-131) +43 + j*(-199) +14 + j*(-80) +99 + j*(-156) +-59 + j*(-278) +-228 + j*(-122) +-134 + j*(25) +-71 + j*(-31) +-134 + j*(-13) +-91 + j*(50) +-78 + j*(2) +-161 + j*(66) +-52 + j*(206) +125 + j*(95) +28 + j*(-72) +-110 + j*(14) +-52 + j*(128) +25 + j*(127) +94 + j*(114) +146 + j*(-5) +-8 + j*(-91) +-98 + j*(117) +173 + j*(220) +301 + j*(-74) +52 + j*(-197) +16 + j*(-13) +180 + j*(-112) +-13 + j*(-313) +-245 + j*(-104) +-64 + j*(89) +49 + j*(-84) +-145 + j*(-141) +-194 + j*(45) +-72 + j*(105) +-32 + j*(76) +17 + j*(74) +37 + j*(-18) +-81 + j*(-42) +-104 + j*(80) +-23 + j*(100) +-51 + j*(107) +42 + j*(243) +305 + j*(128) +233 + j*(-210) +-93 + j*(-184) +-76 + j*(74) +112 + j*(35) +50 + j*(-95) +-22 + j*(-21) +63 + j*(-1) +66 + j*(-93) +1 + j*(-117) +-45 + j*(-119) +-119 + j*(-73) +-69 + j*(36) +47 + j*(-61) +-136 + j*(-212) +-364 + j*(19) +-169 + j*(305) +76 + j*(196) +14 + j*(92) +61 + j*(190) +235 + j*(61) +98 + j*(-155) +-96 + j*(-29) +35 + j*(119) +154 + j*(-23) +37 + j*(-140) +-79 + j*(-98) +-150 + j*(-16) +-151 + j*(161) +73 + j*(278) +285 + j*(93) +202 + j*(-139) +32 + j*(-159) +-49 + j*(-87) +-57 + j*(21) +84 + j*(85) +197 + j*(-92) +2 + j*(-245) +-152 + j*(-64) +23 + j*(43) +71 + j*(-156) +-158 + j*(-175) +-177 + j*(49) +2 + j*(60) +-1 + j*(-68) +-82 + j*(-66) +-103 + j*(-56) +-190 + j*(-33) +-222 + j*(119) +-102 + j*(221) +-3 + j*(219) +112 + j*(226) +266 + j*(72) +149 + j*(-171) +-91 + j*(-102) +-21 + j*(69) +61 + j*(-51) +-136 + j*(-63) +-110 + j*(204) +182 + j*(163) +125 + j*(-103) +-85 + j*(6) +95 + j*(177) +266 + j*(-32) +110 + j*(-194) +34 + j*(-147) +1 + j*(-245) +-282 + j*(-225) +-354 + j*(159) +15 + j*(309) +162 + j*(33) +-21 + j*(-33) +23 + j*(92) +115 + j*(-56) +-123 + j*(-117) +-177 + j*(212) +219 + j*(306) +383 + j*(-83) +90 + j*(-290) +-67 + j*(-128) +14 + j*(-94) +-74 + j*(-182) +-212 + j*(-44) +-86 + j*(112) +40 + j*(11) +-71 + j*(-66) +-117 + j*(74) +45 + j*(103) +53 + j*(-76) +-162 + j*(-62) +-153 + j*(212) +172 + j*(257) +296 + j*(-73) +11 + j*(-260) +-197 + j*(-38) +-28 + j*(155) +134 + j*(14) +11 + j*(-101) +-45 + j*(18) +98 + j*(8) +37 + j*(-184) +-190 + j*(-105) +-107 + j*(119) +73 + j*(1) +-116 + j*(-134) +-236 + j*(137) +83 + j*(258) +188 + j*(-74) +-141 + j*(-133) +-141 + j*(196) +178 + j*(144) +77 + j*(-153) +-197 + j*(-9) +-36 + j*(248) +184 + j*(119) +115 + j*(-14) +110 + j*(16) +146 + j*(-99) +-31 + j*(-158) +-87 + j*(29) +91 + j*(44) +52 + j*(-133) +-122 + j*(-55) +-30 + j*(98) +74 + j*(4) +-31 + j*(-33) +-4 + j*(100) +165 + j*(47) +131 + j*(-136) +-23 + j*(-144) +-62 + j*(-45) +-7 + j*(18) +103 + j*(-16) +102 + j*(-202) +-154 + j*(-264) +-269 + j*(8) +-14 + j*(118) +39 + j*(-144) +-268 + j*(-148) +-272 + j*(185) +19 + j*(200) +-1 + j*(0) +-125 + j*(96) +30 + j*(173) +55 + j*(-4) +-146 + j*(56) +-10 + j*(319) +322 + j*(182) +257 + j*(-162) +-13 + j*(-180) +-65 + j*(-35) +-40 + j*(-1) +-58 + j*(54) +21 + j*(128) +138 + j*(82) +168 + j*(-33) +116 + j*(-145) +-39 + j*(-184) +-156 + j*(-38) +-47 + j*(105) +68 + j*(25) +-13 + j*(-14) +35 + j*(111) +247 + j*(3) +142 + j*(-295) +-182 + j*(-240) +-173 + j*(28) +1 + j*(16) +-51 + j*(-80) +-89 + j*(-8) +-27 + j*(-38) +-166 + j*(-100) +-269 + j*(147) +30 + j*(319) +247 + j*(24) +-16 + j*(-187) +-190 + j*(47) +23 + j*(173) +90 + j*(-25) +-108 + j*(-33) +-93 + j*(188) +130 + j*(202) +206 + j*(45) +183 + j*(-49) +161 + j*(-170) +-33 + j*(-283) +-267 + j*(-117) +-189 + j*(159) +41 + j*(152) +41 + j*(3) +-54 + j*(52) +41 + j*(136) +129 + j*(34) +35 + j*(-28) +20 + j*(85) +183 + j*(83) +219 + j*(-107) +69 + j*(-186) +3 + j*(-112) +37 + j*(-106) +4 + j*(-153) +-51 + j*(-147) +-91 + j*(-144) +-175 + j*(-95) +-158 + j*(46) +-6 + j*(42) +-35 + j*(-116) +-227 + j*(-52) +-151 + j*(165) +64 + j*(83) +-52 + j*(-116) +-252 + j*(39) +-90 + j*(250) +103 + j*(104) +-49 + j*(-39) +-174 + j*(150) +37 + j*(317) +267 + j*(153) +196 + j*(-101) +-31 + j*(-114) +-81 + j*(76) +90 + j*(135) +138 + j*(-33) +-36 + j*(-49) +-8 + j*(163) +263 + j*(107) +215 + j*(-211) +-100 + j*(-178) +-57 + j*(99) +180 + j*(23) +81 + j*(-173) +-51 + j*(-57) +98 + j*(-8) +91 + j*(-219) +-158 + j*(-207) +-163 + j*(16) +-11 + j*(6) +-74 + j*(-83) +-141 + j*(24) +-35 + j*(77) +-21 + j*(10) +-57 + j*(75) +102 + j*(112) +183 + j*(-119) +-65 + j*(-275) +-282 + j*(-79) +-187 + j*(134) +-65 + j*(109) +-110 + j*(112) +-45 + j*(265) +230 + j*(242) +305 + j*(-80) +11 + j*(-239) +-171 + j*(6) +42 + j*(171) +181 + j*(-25) +2 + j*(-136) +-69 + j*(27) +86 + j*(60) +97 + j*(-74) +13 + j*(-67) +77 + j*(-61) +39 + j*(-223) +-218 + j*(-214) +-292 + j*(66) +-76 + j*(206) +69 + j*(94) +37 + j*(-4) +-6 + j*(-4) +2 + j*(16) +38 + j*(-16) +-6 + j*(-115) +-191 + j*(-93) +-235 + j*(159) +21 + j*(279) +175 + j*(70) +17 + j*(-56) +-59 + j*(85) +85 + j*(141) +148 + j*(23) +102 + j*(-33) +99 + j*(-64) +39 + j*(-146) +-107 + j*(-110) +-124 + j*(42) +-4 + j*(92) +40 + j*(16) +-25 + j*(-8) +-51 + j*(77) +54 + j*(139) +168 + j*(46) +113 + j*(-96) +-28 + j*(-76) +-30 + j*(47) +65 + j*(81) +136 + j*(57) +230 + j*(-17) +228 + j*(-216) +7 + j*(-314) +-117 + j*(-148) +7 + j*(-106) +-64 + j*(-285) +-361 + j*(-161) +-272 + j*(223) +129 + j*(195) +146 + j*(-167) +-153 + j*(-218) +-223 + j*(-16) +-141 + j*(37) +-156 + j*(42) +-127 + j*(127) +-32 + j*(117) +-32 + j*(57) +-54 + j*(74) +-26 + j*(62) +-93 + j*(35) +-158 + j*(176) +22 + j*(332) +271 + j*(197) +228 + j*(-80) +-19 + j*(-112) +-82 + j*(104) +122 + j*(197) +270 + j*(11) +146 + j*(-187) +-59 + j*(-143) +-78 + j*(24) +31 + j*(86) +126 + j*(44) +180 + j*(-72) +92 + j*(-243) +-170 + j*(-241) +-284 + j*(40) +-55 + j*(232) +149 + j*(73) +33 + j*(-94) +-103 + j*(19) +11 + j*(149) +144 + j*(65) +103 + j*(-41) +56 + j*(-19) +107 + j*(-18) +112 + j*(-110) +12 + j*(-151) +-49 + j*(-78) +7 + j*(-21) +65 + j*(-89) +-4 + j*(-190) +-156 + j*(-168) +-218 + j*(-20) +-136 + j*(106) +-19 + j*(116) +57 + j*(67) +105 + j*(-18) +68 + j*(-156) +-119 + j*(-213) +-281 + j*(-46) +-193 + j*(177) +11 + j*(179) +53 + j*(48) +-5 + j*(34) +45 + j*(67) +104 + j*(-28) +14 + j*(-131) +-103 + j*(-93) +-124 + j*(-23) +-140 + j*(9) +-147 + j*(88) +-59 + j*(136) +-20 + j*(49) +-163 + j*(47) +-187 + j*(293) +126 + j*(425) +369 + j*(152) +197 + j*(-113) +-4 + j*(-4) +114 + j*(127) +217 + j*(-8) +110 + j*(-86) +119 + j*(-16) +207 + j*(-158) +-29 + j*(-351) +-351 + j*(-115) +-214 + j*(274) +127 + j*(270) +202 + j*(71) +164 + j*(25) +209 + j*(-23) +180 + j*(-123) +125 + j*(-127) +163 + j*(-175) +66 + j*(-309) +-121 + j*(-241) +-70 + j*(-93) +13 + j*(-209) +-196 + j*(-296) +-332 + j*(-61) +-144 + j*(71) +-88 + j*(-83) +-279 + j*(-66) +-269 + j*(167) +-64 + j*(204) +-10 + j*(82) +-59 + j*(57) +-69 + j*(72) +-88 + j*(90) +-69 + j*(161) +24 + j*(179) +76 + j*(122) +96 + j*(81) +103 + j*(7) +4 + j*(-44) +-62 + j*(68) +54 + j*(134) +95 + j*(29) +12 + j*(61) +164 + j*(158) +338 + j*(-107) +28 + j*(-395) +-340 + j*(-124) +-163 + j*(250) +137 + j*(159) +92 + j*(-22) +24 + j*(29) +103 + j*(35) +98 + j*(-47) +66 + j*(-48) +89 + j*(-93) +-3 + j*(-174) +-129 + j*(-92) +-98 + j*(28) +-38 + j*(42) +-7 + j*(63) +78 + j*(34) +50 + j*(-86) +-81 + j*(-46) +-16 + j*(85) +103 + j*(-8) +-16 + j*(-98) +-54 + j*(54) +149 + j*(39) +102 + j*(-221) +-192 + j*(-181) +-167 + j*(105) +78 + j*(81) +42 + j*(-127) +-145 + j*(-88) +-132 + j*(79) +8 + j*(108) +81 + j*(4) +7 + j*(-110) +-141 + j*(-67) +-123 + j*(97) +32 + j*(84) +-13 + j*(-54) +-156 + j*(39) +-35 + j*(213) +158 + j*(103) +86 + j*(-72) +-36 + j*(-31) +-8 + j*(33) +12 + j*(3) +-18 + j*(3) +-26 + j*(21) +-40 + j*(49) +-1 + j*(110) +91 + j*(77) +57 + j*(-6) +1 + j*(72) +150 + j*(144) +295 + j*(-41) +176 + j*(-265) +-59 + j*(-291) +-229 + j*(-135) +-201 + j*(130) +114 + j*(213) +281 + j*(-125) +-55 + j*(-348) +-282 + j*(-45) +-9 + j*(112) +31 + j*(-186) +-354 + j*(-137) +-294 + j*(325) +173 + j*(303) +168 + j*(-91) +-138 + j*(-62) +-81 + j*(177) +95 + j*(133) +79 + j*(59) +144 + j*(83) +242 + j*(-95) +37 + j*(-299) +-247 + j*(-161) +-223 + j*(132) +5 + j*(216) +146 + j*(88) +110 + j*(-48) +15 + j*(-57) +13 + j*(1) +62 + j*(-21) +42 + j*(-80) +-10 + j*(-93) +-57 + j*(-95) +-132 + j*(-48) +-117 + j*(71) +-4 + j*(81) +-21 + j*(-1) +-98 + j*(76) +10 + j*(199) +175 + j*(142) +238 + j*(12) +245 + j*(-152) +62 + j*(-344) +-260 + j*(-221) +-199 + j*(131) +117 + j*(80) +23 + j*(-192) +-208 + j*(-39) +-1 + j*(132) +88 + j*(-134) +-250 + j*(-153) +-228 + j*(236) +160 + j*(183) +52 + j*(-163) +-254 + j*(30) +9 + j*(329) +326 + j*(51) +100 + j*(-272) +-187 + j*(-156) +-197 + j*(35) +-144 + j*(139) +-6 + j*(221) +158 + j*(98) +41 + j*(-88) +-153 + j*(50) +-9 + j*(281) +256 + j*(204) +310 + j*(-22) +224 + j*(-184) +53 + j*(-279) +-167 + j*(-194) +-196 + j*(51) +-12 + j*(165) +132 + j*(88) +176 + j*(-17) +170 + j*(-149) +28 + j*(-263) +-156 + j*(-184) +-144 + j*(-11) +-22 + j*(-8) +-47 + j*(-112) +-171 + j*(-77) +-164 + j*(60) +-51 + j*(81) +-47 + j*(-8) +-152 + j*(21) +-140 + j*(176) +28 + j*(229) +139 + j*(130) +151 + j*(42) +165 + j*(-37) +103 + j*(-161) +-70 + j*(-179) +-158 + j*(-38) +-97 + j*(66) +-30 + j*(76) +13 + j*(75) +59 + j*(37) +47 + j*(-21) +20 + j*(-23) +34 + j*(-53) +-50 + j*(-124) +-206 + j*(-18) +-139 + j*(218) +118 + j*(235) +202 + j*(41) +112 + j*(-37) +115 + j*(-7) +166 + j*(-97) +34 + j*(-267) +-239 + j*(-119) +-108 + j*(65) +-68 + j*(-85) +-296 + j*(1) +-157 + j*(327) +224 + j*(201) +135 + j*(-182) +-231 + j*(-141) +-275 + j*(192) +-20 + j*(354) +240 + j*(245) +291 + j*(-37) +54 + j*(-195) +-135 + j*(-11) +25 + j*(170) +205 + j*(23) +100 + j*(-162) +-71 + j*(-133) +-131 + j*(-20) +-115 + j*(113) +40 + j*(216) +250 + j*(104) +235 + j*(-154) +15 + j*(-248) +-147 + j*(-132) +-148 + j*(35) +-17 + j*(121) +110 + j*(30) +44 + j*(-112) +-106 + j*(-56) +-55 + j*(97) +101 + j*(49) +62 + j*(-112) +-109 + j*(-88) +-120 + j*(91) +51 + j*(150) +152 + j*(11) +57 + j*(-103) +-35 + j*(-41) +23 + j*(16) +52 + j*(-61) +-41 + j*(-70) +-28 + j*(37) +96 + j*(8) +76 + j*(-127) +-33 + j*(-134) +-47 + j*(-99) +-90 + j*(-128) +-177 + j*(-52) +-112 + j*(59) +-25 + j*(-8) +-124 + j*(-69) +-187 + j*(62) +-61 + j*(129) +-21 + j*(21) +-146 + j*(18) +-155 + j*(183) +16 + j*(247) +124 + j*(129) +52 + j*(31) +-17 + j*(124) +143 + j*(221) +337 + j*(25) +185 + j*(-251) +-93 + j*(-180) +-52 + j*(13) +37 + j*(-83) +-168 + j*(-117) +-214 + j*(187) +127 + j*(282) +261 + j*(-25) +44 + j*(-146) +-10 + j*(-31) +24 + j*(-95) +-183 + j*(-95) +-222 + j*(240) +168 + j*(390) +433 + j*(71) +298 + j*(-221) +113 + j*(-276) +-38 + j*(-285) +-211 + j*(-148) +-129 + j*(102) +140 + j*(42) +71 + j*(-243) +-246 + j*(-169) +-197 + j*(172) +141 + j*(163) +176 + j*(-131) +-39 + j*(-188) +-71 + j*(-68) +-6 + j*(-113) +-122 + j*(-194) +-250 + j*(-72) +-182 + j*(49) +-130 + j*(2) +-233 + j*(1) +-279 + j*(167) +-152 + j*(306) +4 + j*(311) +115 + j*(258) +196 + j*(161) +183 + j*(35) +96 + j*(2) +91 + j*(52) +163 + j*(17) +135 + j*(-98) +13 + j*(-98) +6 + j*(10) +126 + j*(-1) +124 + j*(-168) +-72 + j*(-218) +-180 + j*(-43) +-50 + j*(76) +38 + j*(-34) +-102 + j*(-103) +-193 + j*(77) +-8 + j*(222) +180 + j*(76) +91 + j*(-114) +-70 + j*(-62) +-25 + j*(64) +83 + j*(8) +17 + j*(-104) +-108 + j*(-43) +-68 + j*(95) +66 + j*(85) +87 + j*(-28) +7 + j*(-65) +-32 + j*(-13) +8 + j*(21) +50 + j*(-14) +21 + j*(-77) +-58 + j*(-66) +-64 + j*(24) +18 + j*(32) +10 + j*(-45) +-84 + j*(0) +-7 + j*(138) +182 + j*(66) +154 + j*(-149) +-35 + j*(-161) +-43 + j*(-35) +47 + j*(-86) +-53 + j*(-212) +-228 + j*(-121) +-199 + j*(75) +-38 + j*(105) +-4 + j*(0) +-91 + j*(-20) +-118 + j*(69) +-45 + j*(129) +31 + j*(110) +70 + j*(59) +72 + j*(-11) +1 + j*(-50) +-55 + j*(21) +40 + j*(91) +129 + j*(-38) +-18 + j*(-161) +-184 + j*(-22) +-86 + j*(154) +49 + j*(109) +23 + j*(70) +81 + j*(145) +249 + j*(54) +211 + j*(-182) +-6 + j*(-238) +-119 + j*(-112) +-94 + j*(-16) +-45 + j*(4) +-40 + j*(-24) +-111 + j*(-7) +-115 + j*(140) +83 + j*(215) +242 + j*(36) +144 + j*(-174) +-55 + j*(-186) +-177 + j*(-56) +-151 + j*(151) +97 + j*(248) +300 + j*(8) +105 + j*(-250) +-141 + j*(-107) +-28 + j*(91) +112 + j*(-6) +44 + j*(-77) +77 + j*(-43) +118 + j*(-206) +-136 + j*(-317) +-323 + j*(-78) +-179 + j*(105) +-104 + j*(43) +-173 + j*(98) +-71 + j*(229) +88 + j*(177) +116 + j*(83) +140 + j*(18) +84 + j*(-103) +-86 + j*(-54) +-16 + j*(139) +209 + j*(42) +120 + j*(-204) +-91 + j*(-161) +-88 + j*(-69) +-161 + j*(-97) +-286 + j*(111) +-36 + j*(347) +242 + j*(135) +69 + j*(-81) +-37 + j*(124) +262 + j*(174) +354 + j*(-204) +2 + j*(-390) +-237 + j*(-170) +-171 + j*(34) +-58 + j*(66) +-5 + j*(24) +-40 + j*(-21) +-98 + j*(57) +17 + j*(168) +192 + j*(62) +145 + j*(-131) +6 + j*(-157) +-46 + j*(-134) +-132 + j*(-122) +-197 + j*(14) +-73 + j*(123) +19 + j*(25) +-85 + j*(-29) +-125 + j*(93) +-18 + j*(140) +16 + j*(88) +4 + j*(108) +71 + j*(125) +114 + j*(65) +103 + j*(39) +145 + j*(17) +142 + j*(-93) +8 + j*(-139) +-78 + j*(-27) +-11 + j*(73) +76 + j*(73) +147 + j*(40) +218 + j*(-68) +157 + j*(-252) +-81 + j*(-305) +-247 + j*(-103) +-129 + j*(117) +89 + j*(69) +76 + j*(-133) +-103 + j*(-138) +-116 + j*(15) +-3 + j*(2) +-71 + j*(-87) +-168 + j*(54) +42 + j*(187) +231 + j*(-71) +-33 + j*(-334) +-361 + j*(-124) +-255 + j*(204) +-13 + j*(185) +-21 + j*(64) +-66 + j*(123) +37 + j*(165) +95 + j*(77) +58 + j*(33) +67 + j*(37) +74 + j*(-26) +-30 + j*(-59) +-108 + j*(63) +1 + j*(209) +211 + j*(170) +277 + j*(-49) +127 + j*(-202) +-37 + j*(-149) +-49 + j*(-40) +-4 + j*(-18) +2 + j*(-22) +18 + j*(-16) +25 + j*(-37) +17 + j*(-31) +79 + j*(-47) +69 + j*(-206) +-183 + j*(-267) +-346 + j*(2) +-140 + j*(216) +21 + j*(79) +-124 + j*(21) +-123 + j*(237) +144 + j*(259) +203 + j*(23) +47 + j*(-21) +65 + j*(90) +180 + j*(37) +152 + j*(-79) +76 + j*(-94) +55 + j*(-66) +95 + j*(-49) +170 + j*(-146) +53 + j*(-356) +-285 + j*(-315) +-371 + j*(47) +-97 + j*(212) +49 + j*(59) +-17 + j*(-6) +-7 + j*(9) +-35 + j*(-49) +-129 + j*(38) +21 + j*(176) +208 + j*(-23) +5 + j*(-260) +-254 + j*(-107) +-191 + j*(100) +-117 + j*(107) +-118 + j*(190) +64 + j*(272) +217 + j*(83) +73 + j*(-70) +-32 + j*(52) +101 + j*(117) +176 + j*(-16) +87 + j*(-118) +-18 + j*(-108) +-82 + j*(-35) +-58 + j*(65) +35 + j*(84) +73 + j*(41) +102 + j*(31) +163 + j*(-49) +85 + j*(-190) +-89 + j*(-156) +-95 + j*(-13) +-11 + j*(-6) +-22 + j*(-48) +-49 + j*(-43) +-93 + j*(-39) +-145 + j*(78) +29 + j*(209) +235 + j*(17) +60 + j*(-231) +-168 + j*(-93) +-69 + j*(47) +-81 + j*(-54) +-246 + j*(132) +73 + j*(419) +487 + j*(60) +174 + j*(-421) +-269 + j*(-190) +-85 + j*(129) +81 + j*(-65) +-154 + j*(-115) +-136 + j*(141) +96 + j*(64) +-59 + j*(-118) +-215 + j*(124) +84 + j*(286) +255 + j*(-15) +-16 + j*(-170) +-146 + j*(68) +57 + j*(194) +195 + j*(58) +163 + j*(-68) +100 + j*(-120) +36 + j*(-140) +-8 + j*(-136) +-66 + j*(-155) +-198 + j*(-103) +-226 + j*(107) +-17 + j*(230) +150 + j*(91) +87 + j*(-49) +8 + j*(-22) +44 + j*(16) +93 + j*(-31) +83 + j*(-126) +-42 + j*(-206) +-228 + j*(-101) +-180 + j*(163) +112 + j*(176) +170 + j*(-102) +-66 + j*(-179) +-119 + j*(-8) +2 + j*(-32) +-122 + j*(-159) +-315 + j*(13) +-185 + j*(263) +39 + j*(226) +61 + j*(107) +42 + j*(103) +80 + j*(82) +66 + j*(42) +73 + j*(47) +92 + j*(-11) +-8 + j*(-42) +-36 + j*(92) +136 + j*(116) +161 + j*(-85) +-52 + j*(-107) +-78 + j*(107) +115 + j*(158) +198 + j*(37) +206 + j*(-30) +233 + j*(-147) +105 + j*(-296) +-91 + j*(-243) +-107 + j*(-116) +-93 + j*(-111) +-156 + j*(-58) +-100 + j*(51) +-8 + j*(5) +-76 + j*(-36) +-76 + j*(80) +89 + j*(67) +88 + j*(-130) +-109 + j*(-154) +-163 + j*(4) +-71 + j*(72) +-11 + j*(50) +28 + j*(6) +4 + j*(-98) +-163 + j*(-115) +-266 + j*(84) +-107 + j*(284) +148 + j*(235) +229 + j*(-1) +65 + j*(-182) +-173 + j*(-113) +-206 + j*(139) +15 + j*(269) +215 + j*(127) +177 + j*(-83) +16 + j*(-129) +-66 + j*(-47) +-53 + j*(12) +-54 + j*(39) +-33 + j*(121) +116 + j*(142) +199 + j*(-38) +25 + j*(-173) +-127 + j*(-29) +-23 + j*(112) +71 + j*(55) +71 + j*(41) +174 + j*(1) +127 + j*(-229) +-209 + j*(-211) +-235 + j*(178) +154 + j*(242) +226 + j*(-96) +-25 + j*(-138) +-1 + j*(19) +86 + j*(-87) +-87 + j*(-129) +-107 + j*(76) +92 + j*(91) +117 + j*(-59) +75 + j*(-100) +46 + j*(-206) +-205 + j*(-226) +-292 + j*(119) +88 + j*(243) +202 + j*(-139) +-165 + j*(-208) +-170 + j*(136) +146 + j*(70) +25 + j*(-223) +-239 + j*(-89) +-125 + j*(107) +-38 + j*(11) +-151 + j*(28) +-81 + j*(168) +54 + j*(91) +-25 + j*(-14) +-119 + j*(71) +-67 + j*(187) +62 + j*(231) +211 + j*(141) +182 + j*(-53) +4 + j*(-33) +92 + j*(132) +301 + j*(-38) +110 + j*(-316) +-187 + j*(-183) +-132 + j*(46) +-33 + j*(34) +-54 + j*(67) +66 + j*(127) +159 + j*(-26) +22 + j*(-117) +-34 + j*(-18) +18 + j*(-16) +-23 + j*(-11) +64 + j*(69) +196 + j*(-114) +-57 + j*(-320) +-330 + j*(-72) +-152 + j*(192) +-2 + j*(98) +-83 + j*(132) +121 + j*(293) +404 + j*(18) +167 + j*(-352) +-204 + j*(-215) +-169 + j*(91) +43 + j*(148) +187 + j*(39) +197 + j*(-179) +-52 + j*(-305) +-244 + j*(-71) +-23 + j*(115) +124 + j*(-132) +-166 + j*(-276) +-333 + j*(7) +-122 + j*(169) +-35 + j*(35) +-150 + j*(45) +-89 + j*(186) +71 + j*(132) +36 + j*(-23) +-124 + j*(-6) +-153 + j*(177) +23 + j*(295) +215 + j*(187) +194 + j*(6) +92 + j*(1) +140 + j*(35) +164 + j*(-89) +0 + j*(-136) +-56 + j*(47) +154 + j*(107) +251 + j*(-138) +10 + j*(-301) +-205 + j*(-109) +-66 + j*(111) +130 + j*(-16) +-21 + j*(-204) +-230 + j*(-14) +-6 + j*(218) +248 + j*(-33) +-30 + j*(-313) +-336 + j*(-28) +-74 + j*(287) +214 + j*(66) +23 + j*(-171) +-169 + j*(6) +-18 + j*(186) +165 + j*(110) +215 + j*(-51) +141 + j*(-221) +-84 + j*(-267) +-209 + j*(-71) +-64 + j*(42) +-12 + j*(-101) +-207 + j*(-122) +-271 + j*(94) +-121 + j*(217) +-10 + j*(194) +59 + j*(175) +134 + j*(99) +99 + j*(0) +27 + j*(18) +67 + j*(83) +180 + j*(54) +252 + j*(-110) +118 + j*(-344) +-245 + j*(-345) +-413 + j*(30) +-139 + j*(291) +91 + j*(139) +-4 + j*(32) +15 + j*(153) +206 + j*(59) +92 + j*(-194) +-200 + j*(-92) +-145 + j*(218) +156 + j*(247) +284 + j*(16) +176 + j*(-186) +-37 + j*(-201) +-136 + j*(-23) +21 + j*(102) +150 + j*(-71) +-67 + j*(-228) +-292 + j*(19) +-73 + j*(336) +310 + j*(216) +332 + j*(-157) +56 + j*(-287) +-94 + j*(-136) +-10 + j*(-37) +43 + j*(-132) +-78 + j*(-206) +-198 + j*(-115) +-190 + j*(-6) +-173 + j*(41) +-153 + j*(139) +8 + j*(206) +163 + j*(44) +36 + j*(-164) +-196 + j*(-98) +-203 + j*(114) +-78 + j*(181) +-26 + j*(182) +62 + j*(232) +237 + j*(156) +251 + j*(-74) +62 + j*(-168) +-41 + j*(-62) +3 + j*(-13) +-21 + j*(-46) +-76 + j*(36) +42 + j*(139) +205 + j*(18) +135 + j*(-199) +-91 + j*(-214) +-186 + j*(-43) +-100 + j*(76) +-15 + j*(37) +-72 + j*(-13) +-146 + j*(102) +-11 + j*(252) +202 + j*(170) +194 + j*(-18) +103 + j*(-23) +181 + j*(-23) +166 + j*(-228) +-115 + j*(-272) +-225 + j*(10) +1 + j*(140) +100 + j*(-16) +-1 + j*(-50) +47 + j*(25) +138 + j*(-90) +16 + j*(-223) +-127 + j*(-161) +-138 + j*(-84) +-164 + j*(-64) +-204 + j*(10) +-188 + j*(89) +-175 + j*(176) +-53 + j*(317) +230 + j*(272) +305 + j*(-43) +55 + j*(-187) +-64 + j*(-13) +90 + j*(30) +88 + j*(-156) +-129 + j*(-174) +-196 + j*(16) +-98 + j*(94) +-83 + j*(88) +-60 + j*(185) +122 + j*(215) +223 + j*(18) +56 + j*(-102) +-25 + j*(59) +197 + j*(101) +256 + j*(-204) +-93 + j*(-337) +-296 + j*(-22) +-63 + j*(194) +100 + j*(45) +-1 + j*(-23) +26 + j*(77) +159 + j*(-20) +41 + j*(-190) +-141 + j*(-94) +-85 + j*(64) +17 + j*(31) +-13 + j*(-13) +-18 + j*(30) +35 + j*(13) +6 + j*(-37) +-47 + j*(8) +11 + j*(77) +110 + j*(32) +112 + j*(-88) +20 + j*(-143) +-46 + j*(-119) +-78 + j*(-110) +-158 + j*(-88) +-196 + j*(45) +-78 + j*(132) +3 + j*(45) +-91 + j*(6) +-100 + j*(129) +20 + j*(136) +-5 + j*(57) +-52 + j*(176) +173 + j*(255) +332 + j*(-16) +96 + j*(-234) +-121 + j*(-66) +-5 + j*(100) +100 + j*(18) +38 + j*(-21) +70 + j*(42) +169 + j*(-37) +86 + j*(-180) +-71 + j*(-134) +-54 + j*(-3) +48 + j*(-19) +24 + j*(-111) +-67 + j*(-94) +-61 + j*(-22) +-18 + j*(-33) +-43 + j*(-50) +-28 + j*(-21) +10 + j*(-98) +-150 + j*(-191) +-346 + j*(9) +-187 + j*(305) +134 + j*(229) +122 + j*(-38) +-75 + j*(-45) +-81 + j*(108) +35 + j*(128) +87 + j*(60) +73 + j*(-12) +-1 + j*(-37) +-43 + j*(38) +37 + j*(85) +69 + j*(6) +-5 + j*(9) +47 + j*(98) +168 + j*(11) +84 + j*(-131) +-36 + j*(-69) +14 + j*(-11) +0 + j*(-80) +-106 + j*(-10) +-7 + j*(136) +168 + j*(38) +94 + j*(-140) +-55 + j*(-88) +1 + j*(16) +88 + j*(-73) +-23 + j*(-194) +-198 + j*(-105) +-177 + j*(92) +-8 + j*(129) +30 + j*(16) +-53 + j*(25) +8 + j*(119) +132 + j*(45) +78 + j*(-69) +28 + j*(-37) +82 + j*(-84) +-40 + j*(-209) +-239 + j*(-71) +-139 + j*(154) +50 + j*(103) +24 + j*(-12) +-9 + j*(5) +-3 + j*(-36) +-116 + j*(-28) +-100 + j*(141) +89 + j*(119) +43 + j*(-52) +-103 + j*(43) +37 + j*(163) +112 + j*(13) +-36 + j*(25) +91 + j*(203) +330 + j*(-5) +105 + j*(-291) +-171 + j*(-92) +3 + j*(132) +169 + j*(-21) +66 + j*(-124) +59 + j*(-92) +61 + j*(-216) +-166 + j*(-260) +-288 + j*(-28) +-144 + j*(124) +-42 + j*(82) +-34 + j*(65) +1 + j*(53) +-16 + j*(18) +-38 + j*(60) +28 + j*(83) +56 + j*(20) +27 + j*(11) +66 + j*(15) +75 + j*(-78) +-39 + j*(-118) +-107 + j*(-30) +-64 + j*(39) +-19 + j*(25) +-37 + j*(-17) +-118 + j*(4) +-134 + j*(147) +31 + j*(228) +143 + j*(97) +49 + j*(32) +76 + j*(151) +277 + j*(72) +225 + j*(-197) +-33 + j*(-203) +-60 + j*(-19) +44 + j*(-20) +-1 + j*(-74) +-28 + j*(-5) +49 + j*(11) +67 + j*(-62) +25 + j*(-95) +-18 + j*(-107) +-86 + j*(-66) +-52 + j*(37) +77 + j*(2) +51 + j*(-151) +-102 + j*(-160) +-155 + j*(-52) +-123 + j*(10) +-77 + j*(35) +-37 + j*(-19) +-151 + j*(-78) +-279 + j*(107) +-80 + j*(320) +166 + j*(162) +40 + j*(-37) +-87 + j*(115) +116 + j*(214) +234 + j*(-7) +59 + j*(-147) +-79 + j*(-52) +-74 + j*(62) +0 + j*(154) +177 + j*(139) +238 + j*(-76) +45 + j*(-194) +-65 + j*(-65) +10 + j*(-18) +-23 + j*(-69) +-79 + j*(30) +66 + j*(104) +166 + j*(-57) +38 + j*(-192) +-109 + j*(-149) +-170 + j*(-40) +-140 + j*(96) +20 + j*(132) +81 + j*(-31) +-105 + j*(-83) +-165 + j*(148) +92 + j*(245) +236 + j*(13) +61 + j*(-146) +-80 + j*(-19) +27 + j*(107) +159 + j*(11) +81 + j*(-136) +-73 + j*(-70) +13 + j*(98) +228 + j*(-10) +141 + j*(-288) +-147 + j*(-269) +-175 + j*(-65) +-96 + j*(-78) +-225 + j*(-78) +-224 + j*(160) +59 + j*(181) +83 + j*(-113) +-226 + j*(-141) +-305 + j*(163) +-93 + j*(317) +67 + j*(287) +216 + j*(245) +365 + j*(32) +216 + j*(-264) +-116 + j*(-228) +-151 + j*(48) +54 + j*(88) +63 + j*(-82) +-107 + j*(-66) +-95 + j*(116) +88 + j*(127) +116 + j*(-40) +-36 + j*(-79) +-89 + j*(66) +40 + j*(155) +170 + j*(84) +196 + j*(-43) +141 + j*(-147) +37 + j*(-197) +-66 + j*(-172) +-134 + j*(-96) +-136 + j*(9) +-40 + j*(70) +35 + j*(-16) +-76 + j*(-89) +-170 + j*(64) +11 + j*(190) +152 + j*(13) +-12 + j*(-109) +-90 + j*(52) +77 + j*(80) +54 + j*(-91) +-123 + j*(-16) +-5 + j*(180) +223 + j*(46) +123 + j*(-204) +-119 + j*(-177) +-174 + j*(16) +-52 + j*(139) +118 + j*(87) +125 + j*(-110) +-74 + j*(-159) +-132 + j*(8) +-10 + j*(21) +-101 + j*(-79) +-238 + j*(122) +15 + j*(330) +260 + j*(115) +121 + j*(-69) +85 + j*(38) +250 + j*(-74) +77 + j*(-341) +-238 + j*(-199) +-146 + j*(61) +8 + j*(-41) +-161 + j*(-130) +-271 + j*(75) +-132 + j*(226) +-8 + j*(225) +101 + j*(228) +247 + j*(119) +230 + j*(-91) +74 + j*(-165) +-19 + j*(-128) +-75 + j*(-95) +-127 + j*(-25) +-117 + j*(65) +-79 + j*(142) +49 + j*(235) +298 + j*(139) +308 + j*(-222) +-73 + j*(-368) +-323 + j*(-56) +-135 + j*(231) +115 + j*(166) +129 + j*(3) +47 + j*(-31) +39 + j*(25) +129 + j*(23) +165 + j*(-124) +3 + j*(-222) +-131 + j*(-92) +-35 + j*(14) +15 + j*(-88) +-119 + j*(-105) +-146 + j*(41) +-48 + j*(86) +-21 + j*(86) +78 + j*(122) +211 + j*(-35) +49 + j*(-244) +-173 + j*(-111) +-52 + j*(62) +48 + j*(-91) +-158 + j*(-151) +-210 + j*(82) +1 + j*(119) +-11 + j*(-60) +-188 + j*(6) +-103 + j*(201) +93 + j*(146) +90 + j*(-23) +-31 + j*(-64) +-115 + j*(-6) +-129 + j*(91) +-73 + j*(156) +-34 + j*(175) +8 + j*(250) +199 + j*(287) +373 + j*(81) +259 + j*(-160) +71 + j*(-150) +55 + j*(-83) +28 + j*(-115) +-59 + j*(-50) +13 + j*(64) +136 + j*(-8) +74 + j*(-134) +-45 + j*(-95) +-34 + j*(8) +62 + j*(33) +138 + j*(-57) +73 + j*(-204) +-126 + j*(-192) +-165 + j*(19) +34 + j*(80) +88 + j*(-112) +-105 + j*(-161) +-154 + j*(27) +13 + j*(75) +53 + j*(-72) +-76 + j*(-108) +-110 + j*(0) +-18 + j*(25) +4 + j*(-70) +-103 + j*(-115) +-195 + j*(-31) +-182 + j*(82) +-122 + j*(148) +-19 + j*(197) +145 + j*(121) +130 + j*(-141) +-204 + j*(-209) +-380 + j*(159) +-49 + j*(431) +254 + j*(199) +109 + j*(-46) +-40 + j*(69) +76 + j*(146) +103 + j*(42) +23 + j*(88) +150 + j*(185) +306 + j*(30) +202 + j*(-156) +64 + j*(-117) +97 + j*(-59) +127 + j*(-127) +59 + j*(-185) +-7 + j*(-177) +-52 + j*(-165) +-100 + j*(-148) +-152 + j*(-111) +-204 + j*(-42) +-206 + j*(82) +-100 + j*(183) +35 + j*(167) +95 + j*(85) +105 + j*(21) +103 + j*(-40) +58 + j*(-119) +-71 + j*(-144) +-182 + j*(-22) +-114 + j*(151) +64 + j*(158) +118 + j*(35) +75 + j*(-1) +117 + j*(-11) +117 + j*(-136) +-44 + j*(-187) +-122 + j*(-53) +-40 + j*(-3) +-56 + j*(-62) +-124 + j*(5) +-46 + j*(85) +11 + j*(18) +-49 + j*(7) +-18 + j*(71) +37 + j*(21) +-21 + j*(4) +23 + j*(83) +139 + j*(-21) +6 + j*(-177) +-162 + j*(-49) +-58 + j*(91) +13 + j*(4) +-66 + j*(15) +26 + j*(85) +84 + j*(-81) +-144 + j*(-136) +-197 + j*(111) +9 + j*(126) +-88 + j*(-19) +-234 + j*(235) +132 + j*(465) +454 + j*(116) +223 + j*(-209) +18 + j*(-98) +71 + j*(-66) +-54 + j*(-120) +-129 + j*(120) +187 + j*(238) +367 + j*(-93) +122 + j*(-313) +-61 + j*(-222) +-101 + j*(-175) +-223 + j*(-97) +-185 + j*(135) +59 + j*(154) +94 + j*(-38) +-36 + j*(-45) +-3 + j*(41) +57 + j*(-8) +19 + j*(-36) +42 + j*(-23) +47 + j*(-97) +-47 + j*(-107) +-39 + j*(-42) +-11 + j*(-113) +-172 + j*(-134) +-220 + j*(83) +5 + j*(147) +57 + j*(-65) +-144 + j*(-103) +-192 + j*(58) +-134 + j*(111) +-146 + j*(188) +15 + j*(324) +254 + j*(173) +148 + j*(-80) +-52 + j*(23) +94 + j*(183) +257 + j*(17) +134 + j*(-141) +34 + j*(-82) +66 + j*(-64) +51 + j*(-109) +25 + j*(-139) +-74 + j*(-213) +-311 + j*(-86) +-231 + j*(309) +259 + j*(319) +364 + j*(-181) +-62 + j*(-348) +-226 + j*(-56) +-77 + j*(29) +-122 + j*(-21) +-134 + j*(138) +69 + j*(139) +33 + j*(-44) +-113 + j*(81) +110 + j*(214) +250 + j*(-69) +-32 + j*(-199) +-103 + j*(50) +117 + j*(23) +-11 + j*(-203) +-255 + j*(-18) +-77 + j*(229) +121 + j*(95) +27 + j*(-4) +33 + j*(86) +142 + j*(11) +57 + j*(-103) +-25 + j*(-51) +-18 + j*(-39) +-105 + j*(-1) +-42 + j*(191) +243 + j*(138) +227 + j*(-188) +-71 + j*(-205) +-73 + j*(17) +75 + j*(-42) +-54 + j*(-156) +-165 + j*(5) +-11 + j*(103) +47 + j*(-25) +-75 + j*(-35) +-68 + j*(111) +99 + j*(136) +199 + j*(-17) +103 + j*(-174) +-64 + j*(-142) +-41 + j*(-4) +87 + j*(-76) +-41 + j*(-238) +-248 + j*(-98) +-129 + j*(101) +1 + j*(-13) +-146 + j*(-62) +-127 + j*(126) +78 + j*(33) +-100 + j*(-194) +-372 + j*(47) +-139 + j*(343) +95 + j*(155) +-95 + j*(54) +-81 + j*(323) +264 + j*(278) +234 + j*(-66) +-50 + j*(-19) +48 + j*(223) +284 + j*(112) +224 + j*(-91) +134 + j*(-91) +138 + j*(-142) +-8 + j*(-211) +-136 + j*(-45) +19 + j*(98) +153 + j*(-49) +11 + j*(-176) +-105 + j*(-61) +-22 + j*(21) +2 + j*(-51) +-99 + j*(-24) +-56 + j*(127) +128 + j*(113) +160 + j*(-46) +81 + j*(-84) +115 + j*(-97) +65 + j*(-268) +-238 + j*(-262) +-328 + j*(115) +54 + j*(303) +318 + j*(-23) +104 + j*(-321) +-145 + j*(-260) +-211 + j*(-163) +-313 + j*(-78) +-312 + j*(160) +-65 + j*(249) +25 + j*(66) +-114 + j*(55) +-45 + j*(205) +119 + j*(95) +-11 + j*(-44) +-98 + j*(122) +107 + j*(158) +88 + j*(-76) +-170 + j*(13) +-18 + j*(310) +313 + j*(129) +136 + j*(-189) +-126 + j*(-7) +83 + j*(190) +230 + j*(-31) +31 + j*(-122) +38 + j*(31) +165 + j*(-95) +-62 + j*(-211) +-161 + j*(81) +185 + j*(142) +208 + j*(-250) +-206 + j*(-253) +-192 + j*(141) +153 + j*(92) +63 + j*(-202) +-186 + j*(-95) +-95 + j*(91) +0 + j*(26) +-43 + j*(40) +65 + j*(83) +115 + j*(-91) +-76 + j*(-152) +-131 + j*(6) +-35 + j*(12) +-111 + j*(-40) +-175 + j*(98) +-62 + j*(197) +20 + j*(194) +148 + j*(226) +348 + j*(36) +168 + j*(-298) +-222 + j*(-152) +-85 + j*(243) +297 + j*(108) +188 + j*(-240) +-70 + j*(-167) +7 + j*(-41) +28 + j*(-183) +-185 + j*(-180) +-223 + j*(41) +-71 + j*(119) +10 + j*(57) +11 + j*(-16) +-75 + j*(-59) +-168 + j*(67) +-23 + j*(224) +180 + j*(88) +67 + j*(-110) +-99 + j*(-6) +11 + j*(132) +138 + j*(37) +91 + j*(-74) +19 + j*(-91) +-42 + j*(-75) +-66 + j*(5) +25 + j*(30) +19 + j*(-80) +-114 + j*(-31) +-13 + j*(120) +162 + j*(-45) +-66 + j*(-266) +-356 + j*(-14) +-152 + j*(330) +183 + j*(220) +167 + j*(-35) +26 + j*(-68) +-13 + j*(-28) +-38 + j*(4) +-9 + j*(59) +47 + j*(23) +-9 + j*(-20) +-32 + j*(76) +98 + j*(88) +107 + j*(-59) +-37 + j*(-49) +12 + j*(94) +174 + j*(8) +88 + j*(-179) +-100 + j*(-131) +-91 + j*(10) +-30 + j*(9) +-70 + j*(28) +-10 + j*(131) +158 + j*(77) +141 + j*(-124) +-57 + j*(-151) +-112 + j*(18) +19 + j*(88) +95 + j*(-1) +59 + j*(-68) +23 + j*(-81) +-15 + j*(-88) +-47 + j*(-52) +-13 + j*(-25) +2 + j*(-80) +-78 + j*(-100) +-107 + j*(-23) +-51 + j*(-14) +-87 + j*(-75) +-187 + j*(-18) +-170 + j*(98) +-112 + j*(129) +-97 + j*(177) +15 + j*(250) +170 + j*(165) +148 + j*(12) +64 + j*(20) +124 + j*(47) +161 + j*(-74) +35 + j*(-153) +-64 + j*(-81) +-49 + j*(-13) +-33 + j*(-3) +-28 + j*(11) +-21 + j*(12) +-44 + j*(30) +-15 + j*(107) +117 + j*(91) +134 + j*(-70) +-36 + j*(-107) +-75 + j*(66) +117 + j*(116) +204 + j*(-89) +24 + j*(-230) +-148 + j*(-127) +-139 + j*(30) +-41 + j*(98) +69 + j*(69) +103 + j*(-61) +-25 + j*(-137) +-119 + j*(-23) +-18 + j*(52) +8 + j*(-64) +-153 + j*(-33) +-83 + j*(189) +197 + j*(93) +86 + j*(-235) +-293 + j*(-129) +-226 + j*(281) +158 + j*(278) +195 + j*(-12) +13 + j*(-35) +42 + j*(86) +158 + j*(42) +163 + j*(-66) +129 + j*(-132) +66 + j*(-199) +-32 + j*(-218) +-116 + j*(-207) +-245 + j*(-177) +-373 + j*(11) +-266 + j*(280) +18 + j*(331) +182 + j*(159) +158 + j*(-23) +15 + j*(-107) +-128 + j*(-4) +-47 + j*(170) +136 + j*(105) +69 + j*(-54) +-55 + j*(49) +98 + j*(155) +208 + j*(-11) +83 + j*(-102) +73 + j*(-41) +92 + j*(-145) +-116 + j*(-157) +-128 + j*(124) +205 + j*(135) +236 + j*(-214) +-62 + j*(-278) +-117 + j*(-98) +-63 + j*(-123) +-197 + j*(-114) +-185 + j*(81) +-5 + j*(66) +-50 + j*(-69) +-143 + j*(8) +-59 + j*(42) +-122 + j*(-60) +-296 + j*(93) +-145 + j*(368) +175 + j*(320) +255 + j*(62) +122 + j*(-95) +-64 + j*(-74) +-113 + j*(142) +149 + j*(253) +330 + j*(-47) +31 + j*(-283) +-222 + j*(-14) +6 + j*(216) +192 + j*(39) +72 + j*(-78) +43 + j*(-16) +64 + j*(-79) +-71 + j*(-67) +-28 + j*(125) +212 + j*(54) +131 + j*(-217) +-133 + j*(-146) +-68 + j*(70) +76 + j*(-16) +-59 + j*(-91) +-95 + j*(104) +144 + j*(139) +205 + j*(-93) +36 + j*(-150) +50 + j*(-59) +124 + j*(-183) +-73 + j*(-305) +-228 + j*(-122) +-81 + j*(-23) +-100 + j*(-214) +-424 + j*(-128) +-380 + j*(317) +73 + j*(366) +153 + j*(8) +-98 + j*(-6) +-1 + j*(191) +185 + j*(2) +-50 + j*(-177) +-202 + j*(67) +40 + j*(162) +50 + j*(-89) +-235 + j*(-28) +-160 + j*(301) +161 + j*(273) +180 + j*(40) +69 + j*(28) +107 + j*(59) +119 + j*(-6) +87 + j*(-18) +110 + j*(-49) +35 + j*(-127) +-82 + j*(-34) +22 + j*(100) +173 + j*(-21) +50 + j*(-208) +-171 + j*(-125) +-165 + j*(105) +37 + j*(181) +170 + j*(35) +77 + j*(-113) +-60 + j*(-45) +16 + j*(80) +151 + j*(-3) +94 + j*(-148) +-14 + j*(-153) +-68 + j*(-142) +-179 + j*(-107) +-211 + j*(71) +-58 + j*(149) +-26 + j*(57) +-117 + j*(155) +84 + j*(344) +407 + j*(170) +378 + j*(-184) +158 + j*(-296) +35 + j*(-284) +-87 + j*(-274) +-168 + j*(-157) +-114 + j*(-103) +-168 + j*(-168) +-328 + j*(-48) +-250 + j*(185) +-42 + j*(190) +-8 + j*(85) +-21 + j*(76) +-8 + j*(45) +-76 + j*(54) +-27 + j*(190) +190 + j*(132) +170 + j*(-142) +-105 + j*(-183) +-204 + j*(33) +-92 + j*(165) +28 + j*(173) +127 + j*(103) +102 + j*(-33) +-23 + j*(-9) +51 + j*(109) +190 + j*(-38) +-11 + j*(-218) +-225 + j*(-1) +-25 + j*(212) +148 + j*(43) +-7 + j*(-45) +1 + j*(132) +233 + j*(62) +165 + j*(-228) +-132 + j*(-211) +-180 + j*(21) +-56 + j*(96) +-8 + j*(82) +44 + j*(94) +104 + j*(25) +35 + j*(-51) +-43 + j*(27) +45 + j*(134) +209 + j*(76) +254 + j*(-117) +107 + j*(-292) +-150 + j*(-268) +-263 + j*(-11) +-60 + j*(197) +191 + j*(55) +93 + j*(-218) +-197 + j*(-148) +-148 + j*(162) +184 + j*(128) +178 + j*(-226) +-180 + j*(-267) +-271 + j*(51) +-34 + j*(158) +41 + j*(13) +-38 + j*(0) +1 + j*(40) +6 + j*(-18) +-59 + j*(40) +88 + j*(136) +261 + j*(-80) +59 + j*(-350) +-248 + j*(-250) +-266 + j*(-21) +-182 + j*(36) +-177 + j*(53) +-161 + j*(85) +-193 + j*(107) +-207 + j*(268) +27 + j*(402) +247 + j*(209) +129 + j*(17) +56 + j*(136) +258 + j*(120) +229 + j*(-168) +-78 + j*(-160) +-64 + j*(113) +170 + j*(59) +77 + j*(-148) +-108 + j*(-31) +15 + j*(130) +151 + j*(8) +51 + j*(-105) +-40 + j*(-45) +-42 + j*(8) +-46 + j*(79) +69 + j*(174) +252 + j*(73) +219 + j*(-144) +48 + j*(-170) +27 + j*(-79) +76 + j*(-110) +14 + j*(-173) +-57 + j*(-125) +-37 + j*(-83) +-28 + j*(-112) +-76 + j*(-127) +-127 + j*(-107) +-182 + j*(-55) +-190 + j*(67) +-52 + j*(153) +88 + j*(37) +-12 + j*(-134) +-209 + j*(-48) +-156 + j*(166) +36 + j*(158) +42 + j*(40) +16 + j*(83) +163 + j*(47) +121 + j*(-222) +-246 + j*(-230) +-334 + j*(179) +50 + j*(338) +243 + j*(25) +16 + j*(-159) +-142 + j*(-8) +-72 + j*(122) +25 + j*(144) +138 + j*(94) +143 + j*(-86) +-79 + j*(-124) +-121 + j*(132) +185 + j*(173) +239 + j*(-182) +-132 + j*(-284) +-294 + j*(43) +-78 + j*(240) +91 + j*(185) +195 + j*(122) +308 + j*(-75) +124 + j*(-369) +-279 + j*(-296) +-353 + j*(95) +-79 + j*(262) +76 + j*(132) +30 + j*(67) +55 + j*(129) +194 + j*(81) +192 + j*(-132) +-52 + j*(-206) +-191 + j*(40) +42 + j*(218) +232 + j*(6) +36 + j*(-152) +-55 + j*(59) +214 + j*(88) +226 + j*(-250) +-139 + j*(-286) +-190 + j*(41) +70 + j*(71) +55 + j*(-124) +-89 + j*(-54) +37 + j*(49) +132 + j*(-125) +-43 + j*(-244) +-177 + j*(-129) +-149 + j*(-38) +-137 + j*(-24) +-142 + j*(4) +-150 + j*(25) +-171 + j*(105) +-52 + j*(214) +131 + j*(100) +37 + j*(-120) +-204 + j*(-43) +-158 + j*(200) +51 + j*(194) +59 + j*(61) +1 + j*(87) +82 + j*(112) +108 + j*(1) +-3 + j*(-28) +-23 + j*(77) +76 + j*(83) +66 + j*(-2) +-14 + j*(46) +72 + j*(158) +244 + j*(79) +236 + j*(-113) +114 + j*(-178) +60 + j*(-178) +-21 + j*(-221) +-165 + j*(-146) +-140 + j*(19) +-21 + j*(2) +-102 + j*(-72) +-185 + j*(98) +42 + j*(233) +225 + j*(3) +28 + j*(-192) +-140 + j*(-33) +-7 + j*(78) +38 + j*(-54) +-113 + j*(-42) +-71 + j*(146) +151 + j*(107) +143 + j*(-125) +-66 + j*(-162) +-119 + j*(-9) +-29 + j*(5) +-102 + j*(-79) +-268 + j*(76) +-108 + j*(378) +293 + j*(308) +334 + j*(-91) +11 + j*(-167) +0 + j*(102) +304 + j*(29) +221 + j*(-356) +-197 + j*(-358) +-294 + j*(-16) +-108 + j*(108) +-43 + j*(82) +37 + j*(127) +197 + j*(-4) +68 + j*(-255) +-235 + j*(-165) +-197 + j*(137) +63 + j*(132) +61 + j*(-66) +-91 + j*(-42) +-37 + j*(91) +100 + j*(26) +60 + j*(-134) +-96 + j*(-156) +-182 + j*(-64) +-192 + j*(13) +-215 + j*(84) +-202 + j*(231) +-19 + j*(366) +247 + j*(267) +278 + j*(-31) +21 + j*(-142) +-112 + j*(76) +100 + j*(225) +283 + j*(19) +115 + j*(-186) +-77 + j*(-58) +45 + j*(105) +199 + j*(-28) +84 + j*(-192) +-70 + j*(-128) +-62 + j*(-35) +-59 + j*(-8) +-18 + j*(86) +176 + j*(46) +160 + j*(-254) +-221 + j*(-291) +-323 + j*(122) +72 + j*(262) +206 + j*(-103) +-147 + j*(-211) +-238 + j*(141) +100 + j*(235) +200 + j*(-59) +-37 + j*(-152) +-114 + j*(34) +33 + j*(107) +126 + j*(5) +100 + j*(-115) +-15 + j*(-191) +-179 + j*(-140) +-224 + j*(51) +-86 + j*(173) +54 + j*(123) +80 + j*(24) +42 + j*(-43) +-30 + j*(-70) +-118 + j*(-21) +-136 + j*(110) +-18 + j*(228) +181 + j*(202) +283 + j*(4) +170 + j*(-181) +2 + j*(-163) +-1 + j*(-71) +43 + j*(-122) +-56 + j*(-192) +-161 + j*(-115) +-156 + j*(-45) +-197 + j*(-29) +-255 + j*(115) +-100 + j*(283) +112 + j*(202) +103 + j*(40) +40 + j*(46) +104 + j*(28) +45 + j*(-110) +-158 + j*(-43) +-114 + j*(212) +162 + j*(218) +224 + j*(-30) +39 + j*(-115) +-30 + j*(13) +65 + j*(57) +101 + j*(-19) +54 + j*(-53) +42 + j*(-27) +81 + j*(-44) +65 + j*(-117) +-36 + j*(-137) +-88 + j*(-47) +-27 + j*(-2) +-19 + j*(-59) +-105 + j*(-21) +-44 + j*(110) +124 + j*(50) +86 + j*(-128) +-64 + j*(-110) +-41 + j*(-31) +-33 + j*(-107) +-197 + j*(-87) +-207 + j*(129) +-13 + j*(190) +45 + j*(83) +28 + j*(101) +155 + j*(90) +182 + j*(-108) +-11 + j*(-187) +-96 + j*(-67) +-54 + j*(-40) +-118 + j*(-52) +-151 + j*(76) +-30 + j*(140) +28 + j*(68) +-1 + j*(66) +59 + j*(91) +106 + j*(13) +63 + j*(-46) +30 + j*(-65) +-52 + j*(-95) +-160 + j*(30) +-26 + j*(209) +195 + j*(98) +116 + j*(-109) +-30 + j*(-35) +85 + j*(37) +122 + j*(-138) +-80 + j*(-183) +-139 + j*(-16) +-52 + j*(21) +-83 + j*(8) +-54 + j*(124) +121 + j*(78) +69 + j*(-126) +-141 + j*(-68) +-84 + j*(131) +74 + j*(79) +15 + j*(-7) +12 + j*(95) +184 + j*(45) +122 + j*(-194) +-146 + j*(-146) +-102 + j*(121) +168 + j*(62) +98 + j*(-232) +-227 + j*(-185) +-233 + j*(142) +51 + j*(192) +104 + j*(-26) +-62 + j*(-37) +-11 + j*(115) +159 + j*(13) +35 + j*(-194) +-204 + j*(-81) +-124 + j*(170) +105 + j*(130) +91 + j*(-57) +-46 + j*(-47) +-34 + j*(46) +18 + j*(25) +-19 + j*(13) +-1 + j*(90) +125 + j*(73) +142 + j*(-82) +-7 + j*(-134) +-57 + j*(-12) +56 + j*(1) +25 + j*(-146) +-174 + j*(-100) +-139 + j*(134) +93 + j*(115) +64 + j*(-90) +-108 + j*(-28) +-1 + j*(120) +132 + j*(-34) +-59 + j*(-165) +-207 + j*(35) +-47 + j*(202) +100 + j*(136) +141 + j*(77) +220 + j*(-18) +155 + j*(-210) +-57 + j*(-214) +-86 + j*(-76) +-43 + j*(-117) +-204 + j*(-126) +-249 + j*(128) +28 + j*(229) +165 + j*(-16) +-25 + j*(-170) +-192 + j*(-66) +-209 + j*(88) +-129 + j*(233) +81 + j*(271) +209 + j*(80) +72 + j*(-46) +18 + j*(77) +187 + j*(63) +157 + j*(-168) +-95 + j*(-155) +-91 + j*(73) +98 + j*(53) +54 + j*(-110) +-90 + j*(-47) +-23 + j*(76) +80 + j*(1) +1 + j*(-93) +-100 + j*(-33) +-98 + j*(78) +-21 + j*(166) +151 + j*(190) +321 + j*(1) +203 + j*(-288) +-123 + j*(-281) +-194 + j*(-1) +13 + j*(88) +78 + j*(-65) +-23 + j*(-102) +-22 + j*(-69) +-57 + j*(-141) +-228 + j*(-72) +-181 + j*(177) +86 + j*(182) +119 + j*(-33) +4 + j*(-56) +50 + j*(-43) +-4 + j*(-202) +-270 + j*(-153) +-286 + j*(146) +-64 + j*(211) +-37 + j*(127) +-25 + j*(225) +196 + j*(214) +241 + j*(-38) +58 + j*(-103) +51 + j*(-18) +80 + j*(-117) +-96 + j*(-141) +-125 + j*(45) +23 + j*(34) +-79 + j*(-83) +-216 + j*(120) +38 + j*(322) +293 + j*(91) +132 + j*(-173) +-103 + j*(-79) +-69 + j*(127) +124 + j*(176) +286 + j*(19) +222 + j*(-245) +-86 + j*(-308) +-252 + j*(-31) +-45 + j*(192) +200 + j*(66) +170 + j*(-175) +-29 + j*(-252) +-189 + j*(-151) +-204 + j*(22) +-84 + j*(115) +18 + j*(67) +18 + j*(1) +-2 + j*(-13) +-11 + j*(-31) +-57 + j*(-40) +-103 + j*(17) +-69 + j*(106) +46 + j*(123) +122 + j*(16) +49 + j*(-89) +-46 + j*(-57) +-28 + j*(-10) +-50 + j*(-45) +-136 + j*(37) +-18 + j*(188) +182 + j*(63) +70 + j*(-157) +-140 + j*(-64) +-78 + j*(111) +35 + j*(95) +66 + j*(81) +185 + j*(32) +162 + j*(-202) +-117 + j*(-233) +-161 + j*(8) +6 + j*(-26) +-165 + j*(-170) +-362 + j*(101) +-98 + j*(355) +115 + j*(180) +-6 + j*(114) +75 + j*(283) +329 + j*(164) +286 + j*(-95) +141 + j*(-126) +104 + j*(-136) +-6 + j*(-132) +7 + j*(22) +205 + j*(-46) +93 + j*(-307) +-196 + j*(-183) +-59 + j*(74) +151 + j*(-113) +-83 + j*(-315) +-296 + j*(-106) +-171 + j*(77) +-71 + j*(35) +-72 + j*(4) +-87 + j*(-40) +-209 + j*(-25) +-231 + j*(175) +-37 + j*(239) +-9 + j*(131) +-40 + j*(248) +265 + j*(286) +378 + j*(-141) +-78 + j*(-327) +-289 + j*(93) +57 + j*(281) +181 + j*(31) +14 + j*(23) +139 + j*(173) +344 + j*(-11) +225 + j*(-270) +10 + j*(-289) +-103 + j*(-218) +-167 + j*(-113) +-125 + j*(-10) +-69 + j*(-30) +-124 + j*(-33) +-103 + j*(62) +4 + j*(15) +-92 + j*(-112) +-288 + j*(6) +-251 + j*(276) +4 + j*(411) +286 + j*(305) +386 + j*(-4) +161 + j*(-228) +-64 + j*(-95) +54 + j*(63) +171 + j*(-109) +-41 + j*(-246) +-227 + j*(-56) +-119 + j*(155) +76 + j*(156) +170 + j*(5) +58 + j*(-159) +-158 + j*(-61) +-49 + j*(208) +276 + j*(100) +196 + j*(-252) +-112 + j*(-204) +-63 + j*(-6) +14 + j*(-114) +-177 + j*(-100) +-102 + j*(158) +188 + j*(33) +34 + j*(-267) +-239 + j*(-119) +-108 + j*(65) +-68 + j*(-85) +-296 + j*(1) +-157 + j*(327) +224 + j*(201) +135 + j*(-182) +-231 + j*(-141) +-275 + j*(192) +-20 + j*(354) +240 + j*(245) +291 + j*(-37) +54 + j*(-195) +-135 + j*(-11) +25 + j*(170) +205 + j*(23) +100 + j*(-162) +-71 + j*(-133) +-131 + j*(-20) +-115 + j*(113) +40 + j*(216) +250 + j*(104) +235 + j*(-154) +15 + j*(-248) +-147 + j*(-132) +-148 + j*(35) +-17 + j*(121) +110 + j*(30) +44 + j*(-112) +-106 + j*(-56) +-55 + j*(97) +101 + j*(49) +62 + j*(-112) +-109 + j*(-88) +-120 + j*(91) +51 + j*(150) +152 + j*(11) +57 + j*(-103) +-35 + j*(-41) +23 + j*(16) +52 + j*(-61) +-41 + j*(-70) +-28 + j*(37) +96 + j*(8) +76 + j*(-127) +-33 + j*(-134) +-47 + j*(-99) +-90 + j*(-128) +-177 + j*(-52) +-112 + j*(59) +-25 + j*(-8) +-124 + j*(-69) +-187 + j*(62) +-61 + j*(129) +-21 + j*(21) +-146 + j*(18) +-155 + j*(183) +16 + j*(247) +124 + j*(129) +52 + j*(31) +-17 + j*(124) +143 + j*(221) +337 + j*(25) +185 + j*(-251) +-93 + j*(-180) +-52 + j*(13) +37 + j*(-83) +-168 + j*(-117) +-214 + j*(187) +127 + j*(282) +261 + j*(-25) +44 + j*(-146) +-10 + j*(-31) +24 + j*(-95) +-183 + j*(-95) +-222 + j*(240) +168 + j*(390) +433 + j*(71) +298 + j*(-221) +113 + j*(-276) +-38 + j*(-285) +-211 + j*(-148) +-129 + j*(102) +140 + j*(42) +71 + j*(-243) +-246 + j*(-169) +-197 + j*(172) +141 + j*(163) +176 + j*(-131) +-39 + j*(-188) +-71 + j*(-68) +-6 + j*(-113) +-122 + j*(-194) +-250 + j*(-72) +-182 + j*(49) +-130 + j*(2) +-233 + j*(1) +-279 + j*(167) +-152 + j*(306) +4 + j*(311) +115 + j*(258) +196 + j*(161) +183 + j*(35) +96 + j*(2) +91 + j*(52) +163 + j*(17) +135 + j*(-98) +13 + j*(-98) +6 + j*(10) +126 + j*(-1) +124 + j*(-168) +-72 + j*(-218) +-180 + j*(-43) +-50 + j*(76) +38 + j*(-34) +-102 + j*(-103) +-193 + j*(77) +-8 + j*(222) +180 + j*(76) +91 + j*(-114) +-70 + j*(-62) +-25 + j*(64) +83 + j*(8) +17 + j*(-104) +-108 + j*(-43) +-68 + j*(95) +66 + j*(85) +87 + j*(-28) +7 + j*(-65) +-32 + j*(-13) +8 + j*(21) +50 + j*(-14) +21 + j*(-77) +-58 + j*(-66) +-64 + j*(24) +18 + j*(32) +10 + j*(-45) +-84 + j*(0) +-7 + j*(138) +182 + j*(66) +154 + j*(-149) +-35 + j*(-161) +-43 + j*(-35) +289 + j*(-105) +48 + j*(-267) +-117 + j*(-80) +29 + j*(9) +35 + j*(-146) +-147 + j*(-115) +-127 + j*(57) +-21 + j*(53) +-33 + j*(38) +35 + j*(74) +91 + j*(-54) +-83 + j*(-115) +-143 + j*(86) +59 + j*(139) +90 + j*(-30) +-27 + j*(-8) +72 + j*(67) +134 + j*(-110) +-86 + j*(-178) +-147 + j*(43) +63 + j*(65) +36 + j*(-163) +-241 + j*(-127) +-261 + j*(175) +-10 + j*(271) +105 + j*(127) +33 + j*(82) +76 + j*(185) +282 + j*(139) +342 + j*(-134) +117 + j*(-313) +-91 + j*(-217) +-93 + j*(-85) +-62 + j*(-66) +-66 + j*(-48) +-45 + j*(-54) +-103 + j*(-93) +-198 + j*(10) +-96 + j*(158) +62 + j*(83) +-5 + j*(-36) +-83 + j*(56) +40 + j*(118) +115 + j*(-21) +-5 + j*(-117) +-124 + j*(-46) +-124 + j*(76) +-24 + j*(152) +101 + j*(85) +59 + j*(-54) +-82 + j*(-16) +-40 + j*(128) +96 + j*(98) +89 + j*(8) +78 + j*(14) +117 + j*(-49) +11 + j*(-134) +-95 + j*(-16) +24 + j*(91) +124 + j*(-26) +34 + j*(-121) +-38 + j*(-86) +-65 + j*(-70) +-132 + j*(-6) +-73 + j*(136) +105 + j*(129) +165 + j*(-20) +114 + j*(-127) +27 + j*(-206) +-149 + j*(-214) +-279 + j*(-35) +-199 + j*(165) +-30 + j*(222) +127 + j*(180) +237 + j*(3) +117 + j*(-216) +-130 + j*(-172) +-134 + j*(24) +-23 + j*(24) +-66 + j*(-16) +-55 + j*(66) +30 + j*(5) +-110 + j*(-68) +-191 + j*(171) +123 + j*(295) +298 + j*(-30) +11 + j*(-223) +-153 + j*(-2) +4 + j*(105) +43 + j*(1) +-23 + j*(31) +62 + j*(81) +114 + j*(-18) +42 + j*(-70) +21 + j*(-55) +-17 + j*(-88) +-118 + j*(-25) +-51 + j*(135) +152 + j*(98) +173 + j*(-116) +-1 + j*(-206) +-134 + j*(-121) +-135 + j*(-4) +-72 + j*(30) +-74 + j*(0) +-143 + j*(57) +-77 + j*(211) +144 + j*(200) +202 + j*(-10) +59 + j*(-81) +58 + j*(10) +178 + j*(-93) +22 + j*(-322) +-337 + j*(-206) +-330 + j*(221) +78 + j*(327) +239 + j*(-14) +-35 + j*(-155) +-123 + j*(98) +151 + j*(136) +168 + j*(-165) +-141 + j*(-185) +-166 + j*(93) +47 + j*(113) +43 + j*(-6) +30 + j*(49) +165 + j*(-33) +17 + j*(-255) +-269 + j*(-81) +-86 + j*(231) +225 + j*(40) +30 + j*(-259) +-252 + j*(-91) +-139 + j*(146) +13 + j*(98) +14 + j*(58) +77 + j*(35) +42 + j*(-102) +-147 + j*(-42) +-55 + j*(191) +230 + j*(76) +115 + j*(-262) +-256 + j*(-185) +-249 + j*(168) +25 + j*(216) +93 + j*(48) +23 + j*(21) +58 + j*(40) +56 + j*(-28) +-37 + j*(-1) +32 + j*(119) +198 + j*(11) +76 + j*(-219) +-213 + j*(-105) +-132 + j*(235) +230 + j*(217) +286 + j*(-113) +52 + j*(-210) +-11 + j*(-78) +75 + j*(-99) +-7 + j*(-212) +-186 + j*(-150) +-212 + j*(49) +-55 + j*(184) +151 + j*(121) +186 + j*(-97) +4 + j*(-198) +-103 + j*(-67) +1 + j*(5) +44 + j*(-101) +-55 + j*(-142) +-87 + j*(-94) +-101 + j*(-129) +-243 + j*(-112) +-301 + j*(93) +-132 + j*(234) +18 + j*(151) +-12 + j*(62) +-49 + j*(107) +35 + j*(147) +117 + j*(44) +16 + j*(-88) +-175 + j*(0) +-128 + j*(248) +146 + j*(272) +226 + j*(30) +36 + j*(-52) +-14 + j*(125) +177 + j*(180) +288 + j*(15) +226 + j*(-129) +146 + j*(-189) +43 + j*(-238) +-108 + j*(-192) +-154 + j*(-26) +-35 + j*(66) +40 + j*(-11) +-47 + j*(-35) +-35 + j*(124) +231 + j*(130) +330 + j*(-210) +6 + j*(-432) +-267 + j*(-223) +-188 + j*(-30) +-155 + j*(-62) +-239 + j*(41) +-90 + j*(183) +37 + j*(34) +-144 + j*(-7) +-110 + j*(267) +263 + j*(215) +240 + j*(-197) +-127 + j*(-203) +-124 + j*(60) +16 + j*(-4) +-152 + j*(-30) +-110 + j*(262) +289 + j*(213) +280 + j*(-238) +-146 + j*(-282) +-222 + j*(64) +23 + j*(141) +82 + j*(-6) +25 + j*(-49) +6 + j*(-81) +-108 + j*(-105) +-194 + j*(47) +-64 + j*(187) +83 + j*(114) +59 + j*(8) +0 + j*(14) +-1 + j*(57) +37 + j*(90) +122 + j*(75) +168 + j*(-39) +73 + j*(-146) +-55 + j*(-95) +-36 + j*(14) +54 + j*(-6) +14 + j*(-96) +-99 + j*(-51) +-68 + j*(88) +85 + j*(91) +134 + j*(-51) +41 + j*(-154) +-95 + j*(-151) +-206 + j*(-25) +-144 + j*(183) +107 + j*(202) +188 + j*(-37) +-20 + j*(-119) +-62 + j*(71) +147 + j*(68) +124 + j*(-173) +-122 + j*(-161) +-127 + j*(53) +21 + j*(59) +6 + j*(-20) +-13 + j*(25) +59 + j*(1) +4 + j*(-86) +-95 + j*(-6) +8 + j*(105) +144 + j*(-4) +68 + j*(-172) +-110 + j*(-169) +-196 + j*(-29) +-133 + j*(106) +-3 + j*(113) +34 + j*(15) +-41 + j*(-21) +-91 + j*(33) +-90 + j*(110) +-18 + j*(216) +197 + j*(218) +314 + j*(-42) +87 + j*(-242) +-115 + j*(-71) +33 + j*(80) +140 + j*(-82) +-29 + j*(-170) +-99 + j*(-30) +-1 + j*(-6) +-40 + j*(-76) +-98 + j*(8) +1 + j*(52) +15 + j*(-54) +-93 + j*(-42) +-65 + j*(50) +-20 + j*(-1) +-129 + j*(8) +-103 + j*(194) +134 + j*(193) +154 + j*(-35) +-39 + j*(-37) +11 + j*(146) +216 + j*(68) +156 + j*(-149) +-17 + j*(-116) +37 + j*(-21) +90 + j*(-150) +-112 + j*(-232) +-263 + j*(-30) +-138 + j*(153) +8 + j*(112) +-6 + j*(47) +-35 + j*(86) +14 + j*(156) +151 + j*(177) +316 + j*(31) +255 + j*(-251) +-49 + j*(-311) +-167 + j*(-69) +13 + j*(4) +6 + j*(-192) +-267 + j*(-154) +-273 + j*(182) +54 + j*(267) +185 + j*(0) +-18 + j*(-135) +-144 + j*(32) +2 + j*(172) +166 + j*(59) +109 + j*(-117) +-37 + j*(-109) +-45 + j*(-27) +-28 + j*(-60) +-139 + j*(-47) +-143 + j*(141) +78 + j*(190) +168 + j*(-18) +1 + j*(-113) +-71 + j*(6) +6 + j*(42) +5 + j*(3) +-3 + j*(49) +91 + j*(45) +108 + j*(-82) +-16 + j*(-148) +-133 + j*(-73) +-136 + j*(76) +23 + j*(173) +211 + j*(23) +102 + j*(-249) +-216 + j*(-225) +-303 + j*(62) +-138 + j*(218) +-2 + j*(214) +100 + j*(173) +144 + j*(47) +25 + j*(-8) +6 + j*(151) +246 + j*(177) +357 + j*(-109) +131 + j*(-318) +-112 + j*(-233) +-158 + j*(-30) +-19 + j*(103) +180 + j*(0) +107 + j*(-271) +-215 + j*(-262) +-282 + j*(39) +-81 + j*(137) +-29 + j*(65) +1 + j*(115) +158 + j*(27) +47 + j*(-217) +-241 + j*(-107) +-150 + j*(170) +54 + j*(88) +-59 + j*(-16) +-83 + j*(154) +124 + j*(134) +70 + j*(-66) +-105 + j*(45) +65 + j*(219) +265 + j*(42) +152 + j*(-168) +-22 + j*(-149) +-83 + j*(-40) +-25 + j*(85) +170 + j*(56) +179 + j*(-217) +-138 + j*(-293) +-273 + j*(-1) +-75 + j*(133) +-13 + j*(32) +-70 + j*(78) +46 + j*(151) +146 + j*(57) +153 + j*(-16) +195 + j*(-137) +28 + j*(-334) +-276 + j*(-197) +-188 + j*(105) +34 + j*(-1) +-150 + j*(-147) +-267 + j*(112) +5 + j*(197) +16 + j*(-44) +-216 + j*(57) +-28 + j*(312) +238 + j*(98) +31 + j*(-144) +-156 + j*(45) +-7 + j*(180) +56 + j*(98) +30 + j*(136) +173 + j*(168) +258 + j*(-6) +145 + j*(-132) +42 + j*(-111) +1 + j*(-65) +16 + j*(-4) +90 + j*(-25) +50 + j*(-115) +-30 + j*(-59) +59 + j*(-30) +15 + j*(-192) +-250 + j*(-86) +-112 + j*(277) +327 + j*(137) +206 + j*(-332) +-237 + j*(-243) +-171 + j*(117) +79 + j*(52) +-7 + j*(-91) +-53 + j*(17) +75 + j*(-9) +6 + j*(-153) +-129 + j*(-91) +-99 + j*(-10) +-106 + j*(-25) +-136 + j*(52) +-40 + j*(88) +-48 + j*(1) +-161 + j*(84) +-45 + j*(264) +179 + j*(209) +245 + j*(39) +233 + j*(-105) +105 + j*(-275) +-171 + j*(-233) +-192 + j*(54) +74 + j*(65) +41 + j*(-211) +-262 + j*(-182) +-293 + j*(94) +-141 + j*(161) +-134 + j*(158) +-73 + j*(276) +132 + j*(254) +175 + j*(54) +16 + j*(-18) +-84 + j*(126) +39 + j*(310) +330 + j*(296) +501 + j*(-6) +334 + j*(-305) +71 + j*(-325) +-45 + j*(-229) +-115 + j*(-142) +-98 + j*(11) +86 + j*(33) +119 + j*(-179) +-106 + j*(-235) +-180 + j*(-46) +-73 + j*(-6) +-128 + j*(-57) +-189 + j*(103) +11 + j*(227) +194 + j*(70) +141 + j*(-124) +-1 + j*(-195) +-173 + j*(-159) +-265 + j*(54) +-91 + j*(255) +147 + j*(177) +175 + j*(-4) +122 + j*(-93) +39 + j*(-185) +-155 + j*(-162) +-191 + j*(64) +11 + j*(116) +21 + j*(-49) +-126 + j*(13) +-3 + j*(163) +136 + j*(6) +-46 + j*(-89) +-78 + j*(132) +209 + j*(125) +206 + j*(-209) +-115 + j*(-246) +-169 + j*(-5) +-25 + j*(13) +-78 + j*(-70) +-147 + j*(35) +-38 + j*(98) +-1 + j*(-1) +-103 + j*(-11) +-120 + j*(90) +-57 + j*(137) +-13 + j*(147) +47 + j*(153) +107 + j*(101) +100 + j*(24) +37 + j*(-1) +-18 + j*(52) +26 + j*(156) +185 + j*(162) +270 + j*(-8) +148 + j*(-137) +51 + j*(-60) +148 + j*(-20) +189 + j*(-180) +4 + j*(-284) +-164 + j*(-153) +-118 + j*(13) +3 + j*(23) +24 + j*(-56) +-43 + j*(-78) +-88 + j*(-6) +-18 + j*(78) +110 + j*(32) +114 + j*(-117) +-15 + j*(-175) +-87 + j*(-96) +-46 + j*(-64) +-71 + j*(-127) +-206 + j*(-91) +-226 + j*(105) +-23 + j*(203) +134 + j*(45) +30 + j*(-124) +-115 + j*(-62) +-65 + j*(28) +-31 + j*(-54) +-179 + j*(-63) +-210 + j*(136) +-16 + j*(198) +36 + j*(40) +-106 + j*(38) +-68 + j*(192) +78 + j*(156) +47 + j*(64) +39 + j*(136) +185 + j*(86) +110 + j*(-131) +-153 + j*(-52) +-91 + j*(232) +165 + j*(208) +156 + j*(53) +134 + j*(125) +352 + j*(78) +346 + j*(-262) +-13 + j*(-349) +-147 + j*(-60) +64 + j*(48) +127 + j*(-127) +-36 + j*(-159) +-47 + j*(2) +148 + j*(4) +195 + j*(-245) +-71 + j*(-416) +-358 + j*(-235) +-324 + j*(68) +-119 + j*(122) +-91 + j*(37) +-129 + j*(89) +-40 + j*(146) +21 + j*(93) +28 + j*(99) +151 + j*(76) +176 + j*(-152) +-89 + j*(-262) +-268 + j*(-39) +-136 + j*(136) +-42 + j*(90) +-69 + j*(110) +40 + j*(185) +185 + j*(63) +122 + j*(-134) +-73 + j*(-173) +-218 + j*(-44) +-208 + j*(163) +-20 + j*(275) +141 + j*(173) +112 + j*(64) +101 + j*(95) +206 + j*(52) +184 + j*(-124) +-6 + j*(-166) +-108 + j*(-8) +-1 + j*(148) +205 + j*(106) +245 + j*(-127) +27 + j*(-231) +-72 + j*(-45) +124 + j*(-6) +107 + j*(-274) +-233 + j*(-255) +-246 + j*(96) +51 + j*(117) +33 + j*(-96) +-96 + j*(-16) +52 + j*(31) +20 + j*(-190) +-269 + j*(-102) +-158 + j*(219) +146 + j*(103) +16 + j*(-148) +-162 + j*(-1) +-6 + j*(86) +-26 + j*(-93) +-250 + j*(21) +-105 + j*(300) +186 + j*(184) +116 + j*(-55) +-38 + j*(-11) +-4 + j*(71) +16 + j*(56) +22 + j*(95) +110 + j*(95) +133 + j*(8) +105 + j*(-18) +121 + j*(-63) +32 + j*(-133) +-62 + j*(-13) +107 + j*(81) +227 + j*(-165) +-63 + j*(-356) +-326 + j*(-103) +-173 + j*(166) +21 + j*(103) +-13 + j*(16) +-28 + j*(69) +35 + j*(64) +17 + j*(31) +24 + j*(100) +172 + j*(95) +235 + j*(-98) +76 + j*(-238) +-76 + j*(-169) +-74 + j*(-90) +-94 + j*(-104) +-181 + j*(-21) +-91 + j*(144) +133 + j*(70) +83 + j*(-201) +-218 + j*(-201) +-285 + j*(86) +-70 + j*(182) +-14 + j*(47) +-133 + j*(74) +-64 + j*(236) +134 + j*(196) +145 + j*(21) +33 + j*(-3) +31 + j*(71) +93 + j*(63) +103 + j*(27) +136 + j*(8) +159 + j*(-101) +6 + j*(-204) +-166 + j*(-51) +-32 + j*(163) +197 + j*(45) +89 + j*(-181) +-113 + j*(-66) +34 + j*(115) +224 + j*(-70) +40 + j*(-300) +-203 + j*(-174) +-153 + j*(20) +-46 + j*(-1) +-86 + j*(-54) +-144 + j*(-4) +-142 + j*(78) +-77 + j*(152) +35 + j*(143) +64 + j*(58) +30 + j*(57) +103 + j*(73) +147 + j*(-69) +-13 + j*(-156) +-113 + j*(-19) +-8 + j*(49) +1 + j*(-51) +-122 + j*(-18) +-88 + j*(131) +46 + j*(125) +52 + j*(45) +18 + j*(74) +99 + j*(122) +229 + j*(40) +226 + j*(-179) +-26 + j*(-305) +-270 + j*(-82) +-103 + j*(228) +225 + j*(115) +159 + j*(-190) +-81 + j*(-153) +-35 + j*(-6) +34 + j*(-107) +-125 + j*(-144) +-168 + j*(22) +-47 + j*(45) +-95 + j*(-20) +-159 + j*(114) +14 + j*(233) +197 + j*(102) +174 + j*(-106) +-4 + j*(-222) +-247 + j*(-124) +-266 + j*(206) +88 + j*(342) +296 + j*(18) +17 + j*(-190) +-146 + j*(75) +149 + j*(204) +288 + j*(-123) +-25 + j*(-312) +-264 + j*(-69) +-137 + j*(181) +74 + j*(180) +169 + j*(55) +150 + j*(-76) +47 + j*(-137) +-26 + j*(-86) +4 + j*(-62) +-24 + j*(-129) +-163 + j*(-97) +-177 + j*(95) +24 + j*(166) +134 + j*(-13) +-17 + j*(-141) +-153 + j*(-25) +-85 + j*(95) +-29 + j*(76) +-37 + j*(125) +110 + j*(194) +278 + j*(7) +135 + j*(-240) +-113 + j*(-179) +-115 + j*(-4) +-42 + j*(2) +-67 + j*(11) +-9 + j*(69) +59 + j*(-32) +-93 + j*(-112) +-205 + j*(74) +-33 + j*(229) +126 + j*(125) +100 + j*(23) +87 + j*(9) +70 + j*(-52) +-30 + j*(-29) +18 + j*(99) +185 + j*(21) +101 + j*(-180) +-99 + j*(-108) +-31 + j*(54) +78 + j*(-33) +-46 + j*(-89) +-52 + j*(81) +185 + j*(49) +157 + j*(-255) +-177 + j*(-282) +-271 + j*(8) +-87 + j*(125) +-6 + j*(40) +-25 + j*(14) +-21 + j*(-10) +-103 + j*(-24) +-145 + j*(128) +56 + j*(224) +201 + j*(26) +47 + j*(-132) +-82 + j*(-22) +-1 + j*(52) +16 + j*(-13) +-42 + j*(16) +16 + j*(66) +49 + j*(-5) +-40 + j*(-9) +-18 + j*(112) +144 + j*(107) +204 + j*(-70) +72 + j*(-212) +-123 + j*(-176) +-181 + j*(23) +-6 + j*(134) +121 + j*(-31) +-50 + j*(-162) +-195 + j*(7) +-65 + j*(153) +37 + j*(91) +40 + j*(92) +170 + j*(61) +163 + j*(-193) +-170 + j*(-240) +-288 + j*(107) +-1 + j*(282) +185 + j*(114) +162 + j*(-13) +153 + j*(-107) +-3 + j*(-224) +-206 + j*(-63) +-57 + j*(169) +165 + j*(22) +11 + j*(-170) +-147 + j*(-13) +1 + j*(107) +85 + j*(-23) +-13 + j*(-83) +-57 + j*(-38) +-77 + j*(-19) +-95 + j*(47) +-35 + j*(86) +-41 + j*(71) +-32 + j*(205) +263 + j*(254) +446 + j*(-144) +64 + j*(-469) +-317 + j*(-196) +-170 + j*(134) +43 + j*(57) +-21 + j*(-52) +-77 + j*(8) +-59 + j*(57) +-23 + j*(123) +140 + j*(134) +221 + j*(-90) +-5 + j*(-235) +-171 + j*(-45) +-26 + j*(109) +98 + j*(6) +53 + j*(-85) +20 + j*(-107) +-38 + j*(-162) +-164 + j*(-141) +-222 + j*(-29) +-217 + j*(60) +-197 + j*(170) +-65 + j*(260) +76 + j*(199) +81 + j*(114) +95 + j*(112) +139 + j*(42) +67 + j*(-21) +35 + j*(58) +151 + j*(43) +117 + j*(-108) +-39 + j*(-65) +33 + j*(71) +153 + j*(-46) +3 + j*(-164) +-120 + j*(-2) +28 + j*(127) +170 + j*(25) +165 + j*(-112) +88 + j*(-227) +-107 + j*(-260) +-238 + j*(-64) +-82 + j*(87) +16 + j*(-58) +-175 + j*(-95) +-187 + j*(146) +65 + j*(148) +33 + j*(-88) +-204 + j*(-8) +-112 + j*(245) +112 + j*(188) +80 + j*(72) +94 + j*(163) +308 + j*(91) +301 + j*(-218) +12 + j*(-330) +-177 + j*(-164) +-170 + j*(13) +-62 + j*(122) +107 + j*(92) +132 + j*(-90) +-40 + j*(-125) +-41 + j*(42) +165 + j*(-6) +113 + j*(-285) +-213 + j*(-308) +-335 + j*(-26) +-180 + j*(148) +-30 + j*(113) +8 + j*(11) +-77 + j*(-79) +-247 + j*(-12) +-247 + j*(233) +-6 + j*(336) +141 + j*(191) +93 + j*(113) +146 + j*(161) +292 + j*(35) +192 + j*(-216) +-88 + j*(-197) +-121 + j*(41) +64 + j*(60) +31 + j*(-109) +-173 + j*(-31) +-81 + j*(224) +200 + j*(147) +132 + j*(-132) +-136 + j*(-41) +-18 + j*(240) +288 + j*(127) +226 + j*(-165) +8 + j*(-162) +-4 + j*(-52) +6 + j*(-53) +-10 + j*(20) +144 + j*(53) +215 + j*(-162) +6 + j*(-276) +-84 + j*(-134) +16 + j*(-155) +-129 + j*(-308) +-391 + j*(-144) +-329 + j*(155) +-134 + j*(208) +-63 + j*(195) +69 + j*(210) +174 + j*(31) +-1 + j*(-110) +-136 + j*(81) +98 + j*(218) +280 + j*(-43) +37 + j*(-285) +-244 + j*(-103) +-130 + j*(182) +132 + j*(116) +78 + j*(-113) +-134 + j*(-38) +-12 + j*(190) +277 + j*(32) +137 + j*(-336) +-269 + j*(-279) +-306 + j*(73) +-84 + j*(141) +-79 + j*(33) +-160 + j*(114) +-60 + j*(229) +64 + j*(197) +116 + j*(135) +141 + j*(62) +92 + j*(-4) +40 + j*(38) +105 + j*(69) +138 + j*(-11) +86 + j*(-39) +103 + j*(-30) +90 + j*(-114) +-45 + j*(-99) +-21 + j*(61) +155 + j*(28) +143 + j*(-152) +14 + j*(-182) +-38 + j*(-177) +-177 + j*(-168) +-257 + j*(71) +22 + j*(226) +203 + j*(-59) +-80 + j*(-229) +-218 + j*(40) +30 + j*(115) +11 + j*(-123) +-260 + j*(-18) +-127 + j*(306) +204 + j*(222) +184 + j*(-29) +74 + j*(-21) +145 + j*(-28) +97 + j*(-173) +-65 + j*(-141) +-32 + j*(-24) +42 + j*(-103) +-76 + j*(-190) +-200 + j*(-114) +-247 + j*(-19) +-295 + j*(141) +-132 + j*(388) +254 + j*(333) +330 + j*(-62) +25 + j*(-201) +-71 + j*(1) +73 + j*(-6) +-41 + j*(-155) +-235 + j*(30) +-35 + j*(269) +218 + j*(110) +127 + j*(-100) +16 + j*(-71) +24 + j*(-86) +-116 + j*(-117) +-199 + j*(104) +41 + j*(250) +223 + j*(57) +123 + j*(-101) +54 + j*(-88) +33 + j*(-143) +-110 + j*(-144) +-150 + j*(2) +-69 + j*(37) +-112 + j*(37) +-70 + j*(188) +166 + j*(158) +164 + j*(-104) +-70 + j*(-116) +-74 + j*(55) +14 + j*(47) +-10 + j*(61) +119 + j*(114) +215 + j*(-118) +-82 + j*(-257) +-247 + j*(54) +39 + j*(202) +122 + j*(-38) +-81 + j*(-23) +25 + j*(167) +210 + j*(18) +73 + j*(-124) +33 + j*(-14) +141 + j*(-105) +-53 + j*(-239) +-199 + j*(8) +69 + j*(123) +135 + j*(-160) +-154 + j*(-180) +-127 + j*(86) +100 + j*(2) +-37 + j*(-207) +-245 + j*(-57) +-139 + j*(126) +-26 + j*(81) +-37 + j*(59) +4 + j*(56) +-21 + j*(-15) +-119 + j*(55) +-18 + j*(194) +148 + j*(102) +82 + j*(-47) +-7 + j*(17) +97 + j*(55) +132 + j*(-103) +-51 + j*(-179) +-177 + j*(-28) +-92 + j*(119) +30 + j*(105) +57 + j*(37) +43 + j*(4) +25 + j*(-22) +-23 + j*(-17) +-28 + j*(54) +62 + j*(68) +92 + j*(-38) +-19 + j*(-83) +-71 + j*(21) +14 + j*(81) +79 + j*(25) +70 + j*(-34) +31 + j*(-78) +-53 + j*(-79) +-98 + j*(21) +-20 + j*(96) +56 + j*(66) +81 + j*(31) +117 + j*(-33) +43 + j*(-134) +-94 + j*(-61) +-4 + j*(74) +112 + j*(-68) +-100 + j*(-173) +-209 + j*(107) +116 + j*(230) +250 + j*(-109) +-65 + j*(-243) +-179 + j*(18) +12 + j*(88) +21 + j*(-33) +-46 + j*(14) +36 + j*(38) +23 + j*(-49) +-44 + j*(4) +50 + j*(33) +29 + j*(-98) +-134 + j*(-14) +22 + j*(192) +293 + j*(-10) +109 + j*(-337) +-204 + j*(-235) +-176 + j*(-43) +-158 + j*(-93) +-324 + j*(-2) +-251 + j*(276) +33 + j*(293) +100 + j*(108) +23 + j*(74) +47 + j*(98) +50 + j*(59) +31 + j*(103) +155 + j*(132) +241 + j*(-50) +63 + j*(-202) +-117 + j*(-78) +-51 + j*(88) +74 + j*(75) +110 + j*(15) +144 + j*(-58) +79 + j*(-200) +-139 + j*(-191) +-190 + j*(33) +-8 + j*(96) +7 + j*(-53) +-159 + j*(1) +-78 + j*(213) +152 + j*(168) +161 + j*(-13) +86 + j*(-45) +86 + j*(-71) +-5 + j*(-117) +-72 + j*(0) +64 + j*(57) +101 + j*(-98) +-54 + j*(-114) +-33 + j*(19) +74 + j*(-61) +-57 + j*(-158) +-146 + j*(-16) +-35 + j*(30) +-71 + j*(-45) +-130 + j*(91) +86 + j*(144) +123 + j*(-132) +-199 + j*(-146) +-197 + j*(214) +173 + j*(206) +166 + j*(-143) +-147 + j*(-138) +-156 + j*(122) +28 + j*(158) +74 + j*(79) +92 + j*(67) +139 + j*(16) +139 + j*(-55) +127 + j*(-139) +9 + j*(-258) +-230 + j*(-187) +-246 + j*(93) +-12 + j*(165) +50 + j*(8) +-50 + j*(1) +4 + j*(67) +45 + j*(-31) +-97 + j*(-49) +-100 + j*(129) +100 + j*(128) +93 + j*(-74) +-117 + j*(-50) +-92 + j*(185) +175 + j*(204) +278 + j*(-47) +117 + j*(-231) +-79 + j*(-203) +-175 + j*(-86) +-193 + j*(62) +-84 + j*(206) +129 + j*(198) +231 + j*(-6) +102 + j*(-179) +-88 + j*(-148) +-156 + j*(2) +-88 + j*(147) +98 + j*(192) +267 + j*(23) +168 + j*(-235) +-110 + j*(-236) +-180 + j*(1) +-2 + j*(80) +46 + j*(-66) +-109 + j*(-97) +-160 + j*(77) +1 + j*(176) +139 + j*(74) +117 + j*(-64) +33 + j*(-117) +-59 + j*(-117) +-161 + j*(-37) +-133 + j*(150) +104 + j*(219) +291 + j*(-16) +139 + j*(-310) +-199 + j*(-314) +-378 + j*(-46) +-284 + j*(239) +-25 + j*(341) +194 + j*(214) +214 + j*(10) +110 + j*(-87) +23 + j*(-93) +-47 + j*(-53) +-41 + j*(39) +58 + j*(28) +17 + j*(-89) +-136 + j*(-11) +-37 + j*(188) +182 + j*(91) +91 + j*(-105) +-46 + j*(6) +108 + j*(94) +180 + j*(-86) +37 + j*(-130) +85 + j*(-60) +135 + j*(-260) +-185 + j*(-387) +-421 + j*(-73) +-231 + j*(197) +-42 + j*(148) +-9 + j*(95) +47 + j*(28) +-54 + j*(-99) +-247 + j*(40) +-104 + j*(290) +146 + j*(186) +71 + j*(12) +3 + j*(115) +165 + j*(115) +146 + j*(-84) +-47 + j*(-49) +16 + j*(131) +212 + j*(54) +180 + j*(-160) +-13 + j*(-214) +-140 + j*(-92) +-93 + j*(52) +25 + j*(36) +-27 + j*(-58) +-121 + j*(58) +49 + j*(178) +180 + j*(-21) +-45 + j*(-127) +-101 + j*(151) +255 + j*(185) +320 + j*(-228) +-79 + j*(-355) +-247 + j*(-40) +-45 + j*(126) +95 + j*(31) +101 + j*(-80) +32 + j*(-185) +-139 + j*(-178) +-192 + j*(-7) +-73 + j*(47) +-81 + j*(-33) +-180 + j*(51) +-69 + j*(201) +110 + j*(124) +83 + j*(-42) +-50 + j*(-42) +-71 + j*(80) +69 + j*(144) +213 + j*(-8) +88 + j*(-250) +-221 + j*(-203) +-274 + j*(106) +-42 + j*(234) +100 + j*(119) +87 + j*(26) +66 + j*(-14) +21 + j*(-45) +-20 + j*(-9) +13 + j*(8) +4 + j*(-40) +-59 + j*(-20) +-49 + j*(38) +-25 + j*(42) +-22 + j*(71) +52 + j*(76) +53 + j*(-28) +-86 + j*(-1) +-26 + j*(194) +226 + j*(132) +187 + j*(-146) +-77 + j*(-126) +-53 + j*(110) +164 + j*(88) +166 + j*(-105) +30 + j*(-148) +-29 + j*(-98) +-57 + j*(-61) +-66 + j*(14) +28 + j*(76) +149 + j*(-6) +115 + j*(-182) +-88 + j*(-221) +-185 + j*(-33) +-21 + j*(79) +82 + j*(-96) +-125 + j*(-214) +-287 + j*(-10) +-146 + j*(173) +-12 + j*(116) +-25 + j*(76) +11 + j*(93) +31 + j*(28) +-45 + j*(43) +14 + j*(156) +173 + j*(86) +139 + j*(-89) +6 + j*(-100) +-23 + j*(-38) +-27 + j*(-8) +13 + j*(44) +117 + j*(-16) +51 + j*(-180) +-146 + j*(-136) +-134 + j*(37) +-23 + j*(21) +-78 + j*(-34) +-112 + j*(47) +-48 + j*(56) +-108 + j*(28) +-144 + j*(182) +54 + j*(279) +195 + j*(128) +129 + j*(27) +136 + j*(62) +218 + j*(-19) +161 + j*(-156) +49 + j*(-178) +-12 + j*(-179) +-121 + j*(-172) +-220 + j*(-45) +-171 + j*(123) +-26 + j*(193) +110 + j*(132) +129 + j*(3) +39 + j*(-29) +65 + j*(55) +211 + j*(-35) +109 + j*(-274) +-185 + j*(-220) +-183 + j*(54) +26 + j*(59) +-7 + j*(-98) +-143 + j*(-27) +-61 + j*(94) +26 + j*(10) +-83 + j*(-47) +-158 + j*(103) +-2 + j*(258) +251 + j*(173) +300 + j*(-131) +28 + j*(-305) +-199 + j*(-117) +-73 + j*(78) +47 + j*(-50) +-134 + j*(-120) +-199 + j*(110) +38 + j*(192) +126 + j*(-15) +-35 + j*(-98) +-124 + j*(2) +-126 + j*(100) +-49 + j*(239) +209 + j*(235) +294 + j*(-68) +13 + j*(-176) +-31 + j*(79) +262 + j*(23) +144 + j*(-357) +-298 + j*(-252) +-250 + j*(172) +72 + j*(168) +68 + j*(1) +73 + j*(57) +232 + j*(-107) +-36 + j*(-400) +-446 + j*(-110) +-196 + j*(342) +204 + j*(129) +-45 + j*(-166) +-267 + j*(185) +194 + j*(424) +521 + j*(-70) +105 + j*(-478) +-304 + j*(-208) +-165 + j*(102) +0 + j*(15) +-111 + j*(-33) +-99 + j*(129) +104 + j*(97) +68 + j*(-135) +-190 + j*(-107) +-194 + j*(148) +14 + j*(179) +18 + j*(48) +-71 + j*(122) +74 + j*(238) +245 + j*(97) +179 + j*(-89) +52 + j*(-107) +-18 + j*(-81) +-87 + j*(2) +-12 + j*(144) +167 + j*(89) +122 + j*(-79) +-1 + j*(-8) +138 + j*(82) +232 + j*(-118) +33 + j*(-228) +-41 + j*(-73) +85 + j*(-91) +-19 + j*(-235) +-194 + j*(-97) +-62 + j*(70) +66 + j*(-56) +-55 + j*(-144) +-111 + j*(-49) +-57 + j*(-36) +-92 + j*(-65) +-105 + j*(-19) +-88 + j*(-44) +-190 + j*(-34) +-196 + j*(132) +-33 + j*(165) +-22 + j*(61) +-68 + j*(141) +124 + j*(167) +168 + j*(-108) +-149 + j*(-180) +-244 + j*(127) +-2 + j*(221) +33 + j*(65) +-71 + j*(139) +95 + j*(257) +263 + j*(78) +151 + j*(-98) +33 + j*(-74) +5 + j*(-63) +-97 + j*(-25) +-93 + j*(167) +140 + j*(245) +302 + j*(45) +200 + j*(-151) +46 + j*(-136) +48 + j*(-49) +122 + j*(-85) +79 + j*(-211) +-98 + j*(-222) +-182 + j*(-57) +-70 + j*(57) +24 + j*(-21) +-59 + j*(-98) +-161 + j*(4) +-69 + j*(160) +134 + j*(116) +154 + j*(-108) +-57 + j*(-182) +-161 + j*(-10) +-42 + j*(93) +23 + j*(33) +18 + j*(42) +133 + j*(21) +133 + j*(-211) +-172 + j*(-284) +-332 + j*(1) +-152 + j*(195) +-28 + j*(141) +-17 + j*(161) +130 + j*(177) +220 + j*(-8) +100 + j*(-139) +10 + j*(-124) +-48 + j*(-148) +-190 + j*(-85) +-171 + j*(121) +27 + j*(141) +56 + j*(-9) +-40 + j*(-22) +-37 + j*(16) +-66 + j*(1) +-113 + j*(91) +0 + j*(174) +98 + j*(89) +57 + j*(23) +44 + j*(35) +30 + j*(5) +-23 + j*(73) +120 + j*(161) +271 + j*(-38) +64 + j*(-243) +-151 + j*(-73) +-24 + j*(100) +72 + j*(12) +13 + j*(2) +74 + j*(50) +113 + j*(-50) +20 + j*(-53) +93 + j*(24) +184 + j*(-129) +-1 + j*(-242) +-82 + j*(-81) +67 + j*(-92) +-29 + j*(-284) +-260 + j*(-185) +-206 + j*(-7) +-161 + j*(-64) +-305 + j*(-4) +-243 + j*(209) +-74 + j*(191) +-119 + j*(148) +-81 + j*(298) +144 + j*(272) +154 + j*(89) +76 + j*(119) +211 + j*(135) +238 + j*(-69) +45 + j*(-116) +28 + j*(28) +146 + j*(1) +110 + j*(-107) +45 + j*(-105) +16 + j*(-117) +-69 + j*(-81) +-28 + j*(48) +132 + j*(-17) +42 + j*(-207) +-167 + j*(-116) +-84 + j*(81) +78 + j*(-4) +-19 + j*(-136) +-136 + j*(-39) +-55 + j*(69) +43 + j*(12) +22 + j*(-86) +-69 + j*(-117) +-155 + j*(-61) +-162 + j*(35) +-115 + j*(83) +-90 + j*(102) +-52 + j*(128) +-16 + j*(120) +-25 + j*(138) +55 + j*(226) +257 + j*(161) +288 + j*(-102) +76 + j*(-227) +-66 + j*(-138) +-85 + j*(-68) +-132 + j*(-14) +-106 + j*(112) +21 + j*(136) +40 + j*(70) +32 + j*(154) +274 + j*(192) +470 + j*(-161) +147 + j*(-558) +-358 + j*(-407) +-404 + j*(30) +-165 + j*(161) +-110 + j*(119) +-52 + j*(228) +209 + j*(174) +204 + j*(-175) +-187 + j*(-217) +-269 + j*(175) +78 + j*(296) +209 + j*(49) +89 + j*(-22) +134 + j*(-6) +108 + j*(-174) +-145 + j*(-147) +-117 + j*(135) +160 + j*(94) +94 + j*(-165) +-141 + j*(-80) +-43 + j*(127) +132 + j*(31) +54 + j*(-102) +-30 + j*(-47) +19 + j*(-6) +48 + j*(-57) +17 + j*(-117) +-84 + j*(-141) +-181 + j*(-30) +-98 + j*(112) +36 + j*(63) +11 + j*(-26) +-16 + j*(-16) +-29 + j*(-71) +-196 + j*(-40) +-182 + j*(252) +190 + j*(307) +325 + j*(-54) +77 + j*(-206) +13 + j*(-109) +13 + j*(-216) +-254 + j*(-208) +-281 + j*(120) +9 + j*(128) +-92 + j*(-108) +-335 + j*(128) +-39 + j*(413) +235 + j*(158) +40 + j*(-4) +47 + j*(185) +272 + j*(43) +58 + j*(-199) +-151 + j*(68) +185 + j*(223) +320 + j*(-168) +-80 + j*(-320) +-244 + j*(13) +-34 + j*(158) +46 + j*(89) +90 + j*(115) +222 + j*(21) +141 + j*(-165) +-11 + j*(-110) +69 + j*(-47) +57 + j*(-207) +-177 + j*(-183) +-182 + j*(69) +19 + j*(83) +4 + j*(-45) +-62 + j*(29) +73 + j*(46) +56 + j*(-146) +-194 + j*(-108) +-160 + j*(185) +148 + j*(170) +151 + j*(-126) +-126 + j*(-132) +-126 + j*(131) +123 + j*(138) +142 + j*(-78) +-23 + j*(-88) +12 + j*(37) +146 + j*(-54) +37 + j*(-241) +-188 + j*(-173) +-185 + j*(35) +-38 + j*(55) +-45 + j*(-38) +-124 + j*(16) +-33 + j*(112) +83 + j*(-2) +-41 + j*(-153) +-229 + j*(-45) +-171 + j*(152) +-30 + j*(144) +-42 + j*(91) +-32 + j*(158) +83 + j*(134) +56 + j*(16) +-47 + j*(80) +69 + j*(199) +236 + j*(71) +161 + j*(-123) +-4 + j*(-136) +-93 + j*(-64) +-148 + j*(62) +-47 + j*(245) +218 + j*(224) +298 + j*(-30) +145 + j*(-163) +47 + j*(-138) +-21 + j*(-137) +-120 + j*(-38) +-23 + j*(128) +176 + j*(43) +117 + j*(-156) +-56 + j*(-127) +-53 + j*(-14) +-11 + j*(-1) +14 + j*(35) +124 + j*(-1) +84 + j*(-180) +-141 + j*(-144) +-107 + j*(107) +157 + j*(79) +155 + j*(-175) +-37 + j*(-204) +-59 + j*(-121) +-61 + j*(-178) +-214 + j*(-185) +-306 + j*(-16) +-241 + j*(144) +-115 + j*(222) +52 + j*(216) +165 + j*(67) +101 + j*(-112) +-72 + j*(-145) +-185 + j*(-23) +-122 + j*(134) +55 + j*(108) +33 + j*(-105) +-250 + j*(-77) +-265 + j*(286) +128 + j*(386) +296 + j*(48) +64 + j*(-122) +-53 + j*(13) +15 + j*(66) +23 + j*(66) +108 + j*(94) +180 + j*(-81) +-65 + j*(-205) +-232 + j*(86) +78 + j*(267) +239 + j*(-42) +-71 + j*(-153) +-117 + j*(177) +238 + j*(168) +198 + j*(-204) +-176 + j*(-141) +-97 + j*(228) +262 + j*(150) +208 + j*(-185) +-86 + j*(-157) +-82 + j*(98) +142 + j*(136) +242 + j*(-37) +164 + j*(-181) +35 + j*(-193) +2 + j*(-112) +82 + j*(-119) +57 + j*(-270) +-162 + j*(-302) +-274 + j*(-95) +-132 + j*(29) +-64 + j*(-79) +-197 + j*(-99) +-213 + j*(50) +-98 + j*(53) +-172 + j*(-28) +-287 + j*(146) +-75 + j*(344) +168 + j*(168) +29 + j*(-42) +-130 + j*(121) +88 + j*(276) +290 + j*(46) +116 + j*(-192) +-108 + j*(-100) +-81 + j*(66) +20 + j*(63) +8 + j*(11) +-29 + j*(52) +40 + j*(115) +158 + j*(41) +110 + j*(-136) +-104 + j*(-132) +-139 + j*(93) +78 + j*(148) +141 + j*(-59) +-54 + j*(-121) +-123 + j*(51) +1 + j*(128) +66 + j*(78) +93 + j*(68) +163 + j*(-1) +104 + j*(-146) +-76 + j*(-124) +-93 + j*(61) +79 + j*(119) +188 + j*(-23) +113 + j*(-179) +-43 + j*(-187) +-100 + j*(-78) +-45 + j*(-51) +-98 + j*(-113) +-233 + j*(1) +-123 + j*(232) +156 + j*(174) +148 + j*(-90) +-66 + j*(-91) +-35 + j*(91) +155 + j*(33) +121 + j*(-197) +-119 + j*(-256) +-310 + j*(-78) +-269 + j*(197) +3 + j*(300) +182 + j*(91) +19 + j*(-75) +-105 + j*(106) +130 + j*(225) +284 + j*(-35) +54 + j*(-224) +-133 + j*(-47) +-6 + j*(124) +160 + j*(51) +171 + j*(-109) +57 + j*(-223) +-130 + j*(-194) +-180 + j*(4) +-11 + j*(92) +74 + j*(-50) +-52 + j*(-118) +-97 + j*(-11) +-3 + j*(7) +8 + j*(-91) +-86 + j*(-139) +-194 + j*(-109) +-279 + j*(10) +-231 + j*(179) +-83 + j*(216) +-47 + j*(160) +-45 + j*(217) +106 + j*(235) +167 + j*(57) +-2 + j*(1) +-26 + j*(185) +186 + j*(215) +257 + j*(21) +141 + j*(-59) +119 + j*(-13) +165 + j*(-59) +110 + j*(-144) +8 + j*(-139) +-33 + j*(-65) +11 + j*(-12) +63 + j*(-57) +-11 + j*(-122) +-100 + j*(-14) +40 + j*(100) +182 + j*(-69) +-8 + j*(-233) +-179 + j*(-41) +19 + j*(117) +161 + j*(-88) +-35 + j*(-218) +-136 + j*(-60) +-17 + j*(-28) +-75 + j*(-149) +-241 + j*(-43) +-153 + j*(168) +45 + j*(142) +80 + j*(20) +69 + j*(-28) +76 + j*(-134) +-96 + j*(-247) +-325 + j*(-105) +-283 + j*(164) +-85 + j*(204) +-66 + j*(121) +-98 + j*(215) +92 + j*(301) +265 + j*(112) +143 + j*(-83) +3 + j*(-4) +103 + j*(76) +180 + j*(-63) +59 + j*(-177) +-62 + j*(-136) +-111 + j*(-74) +-144 + j*(11) +-81 + j*(103) +1 + j*(78) +-28 + j*(57) +13 + j*(127) +128 + j*(42) +-3 + j*(-99) +-172 + j*(89) +55 + j*(308) +307 + j*(102) +168 + j*(-109) +77 + j*(-8) +207 + j*(-42) +105 + j*(-216) +-57 + j*(-90) +122 + j*(7) +168 + j*(-257) +-159 + j*(-298) +-193 + j*(23) +97 + j*(0) +6 + j*(-298) +-320 + j*(-202) +-291 + j*(93) +-113 + j*(110) +-132 + j*(59) +-149 + j*(163) +-18 + j*(245) +150 + j*(180) +192 + j*(-21) +-12 + j*(-139) +-167 + j*(93) +133 + j*(296) +422 + j*(-64) +78 + j*(-441) +-328 + j*(-182) +-164 + j*(155) +32 + j*(40) +-94 + j*(-28) +-88 + j*(132) +64 + j*(98) +8 + j*(21) +30 + j*(139) +245 + j*(49) +146 + j*(-260) +-206 + j*(-195) +-180 + j*(150) +134 + j*(155) +177 + j*(-130) +-66 + j*(-232) +-235 + j*(-58) +-152 + j*(147) +47 + j*(132) +57 + j*(-49) +-119 + j*(-60) +-140 + j*(104) +-33 + j*(127) +-69 + j*(110) +-46 + j*(278) +240 + j*(312) +383 + j*(20) +192 + j*(-167) +70 + j*(-82) +132 + j*(-64) +102 + j*(-156) +2 + j*(-146) +-12 + j*(-86) +6 + j*(-78) +10 + j*(-89) +1 + j*(-121) +-66 + j*(-136) +-112 + j*(-70) +-74 + j*(-28) +-65 + j*(-53) +-93 + j*(-38) +-75 + j*(-33) +-134 + j*(-76) +-257 + j*(40) +-152 + j*(264) +122 + j*(228) +159 + j*(-25) +-31 + j*(-98) +-112 + j*(28) +-53 + j*(109) +6 + j*(115) +55 + j*(113) +119 + j*(81) +160 + j*(-12) +98 + j*(-134) +-69 + j*(-132) +-108 + j*(42) +71 + j*(84) +102 + j*(-123) +-149 + j*(-164) +-233 + j*(99) +-30 + j*(226) +82 + j*(144) +124 + j*(140) +285 + j*(53) +253 + j*(-241) +-65 + j*(-312) +-187 + j*(-81) +-78 + j*(-13) +-146 + j*(-58) +-225 + j*(144) +30 + j*(315) +274 + j*(113) +185 + j*(-124) +39 + j*(-122) +31 + j*(-100) +-21 + j*(-143) +-119 + j*(-92) +-108 + j*(5) +-59 + j*(8) +-90 + j*(-4) +-119 + j*(73) +-38 + j*(153) +69 + j*(119) +79 + j*(35) +44 + j*(34) +98 + j*(56) +162 + j*(-49) +58 + j*(-182) +-121 + j*(-129) +-134 + j*(50) +6 + j*(117) +101 + j*(33) +76 + j*(-61) +10 + j*(-74) +-4 + j*(-46) +1 + j*(-69) +-63 + j*(-79) +-99 + j*(14) +19 + j*(67) +86 + j*(-82) +-101 + j*(-184) +-262 + j*(23) +-74 + j*(246) +199 + j*(108) +130 + j*(-200) +-197 + j*(-220) +-322 + j*(87) +-86 + j*(292) +134 + j*(148) +47 + j*(-25) +-66 + j*(71) +64 + j*(151) +130 + j*(-6) +-42 + j*(-47) +-55 + j*(150) +165 + j*(156) +183 + j*(-57) +16 + j*(-71) +38 + j*(48) +134 + j*(-11) +57 + j*(-99) +-16 + j*(-20) +64 + j*(59) +183 + j*(12) +243 + j*(-139) +146 + j*(-344) +-136 + j*(-390) +-310 + j*(-160) +-190 + j*(20) +-101 + j*(-61) +-244 + j*(-89) +-314 + j*(119) +-135 + j*(274) +37 + j*(193) +9 + j*(93) +-30 + j*(167) +136 + j*(244) +330 + j*(52) +206 + j*(-245) +-100 + j*(-232) +-156 + j*(-1) +-20 + j*(57) +-2 + j*(-8) +-21 + j*(8) +9 + j*(-23) +-84 + j*(-71) +-172 + j*(70) +-40 + j*(197) +71 + j*(134) +69 + j*(122) +204 + j*(131) +289 + j*(-105) +48 + j*(-267) +-117 + j*(-80) +29 + j*(9) +35 + j*(-146) +-147 + j*(-115) +-127 + j*(57) +-21 + j*(53) +-33 + j*(38) +35 + j*(74) +91 + j*(-54) +-83 + j*(-115) +-143 + j*(86) +59 + j*(139) +90 + j*(-30) +-27 + j*(-8) +72 + j*(67) +134 + j*(-110) +-86 + j*(-178) +-147 + j*(43) +63 + j*(65) +36 + j*(-163) +-241 + j*(-127) +-261 + j*(175) +-10 + j*(271) +105 + j*(127) +33 + j*(82) +76 + j*(185) +282 + j*(139) +342 + j*(-134) +117 + j*(-313) +-91 + j*(-217) +-93 + j*(-85) +-62 + j*(-66) +-66 + j*(-48) +-45 + j*(-54) +-103 + j*(-93) +-198 + j*(10) +-96 + j*(158) +62 + j*(83) +-5 + j*(-36) +-83 + j*(56) +40 + j*(118) +115 + j*(-21) +-5 + j*(-117) +-124 + j*(-46) +-124 + j*(76) +-24 + j*(152) +101 + j*(85) +59 + j*(-54) +-82 + j*(-16) +-40 + j*(128) +96 + j*(98) +89 + j*(8) +78 + j*(14) +117 + j*(-49) +11 + j*(-134) +-95 + j*(-16) +24 + j*(91) +124 + j*(-26) +34 + j*(-121) +-38 + j*(-86) +-65 + j*(-70) +-132 + j*(-6) +-73 + j*(136) +105 + j*(129) +165 + j*(-20) +114 + j*(-127) +27 + j*(-206) +-149 + j*(-214) +-279 + j*(-35) +-199 + j*(165) +-30 + j*(222) +127 + j*(180) +237 + j*(3) +117 + j*(-216) +-130 + j*(-172) +-134 + j*(24) +-23 + j*(24) +-66 + j*(-16) +-55 + j*(66) +30 + j*(5) +-110 + j*(-68) +-191 + j*(171) +123 + j*(295) +298 + j*(-30) +11 + j*(-223) +-153 + j*(-2) +4 + j*(105) +43 + j*(1) +-23 + j*(31) +62 + j*(81) +114 + j*(-18) +42 + j*(-70) +21 + j*(-55) +-17 + j*(-88) +-118 + j*(-25) +-51 + j*(135) +152 + j*(98) +173 + j*(-116) +-1 + j*(-206) +-134 + j*(-121) +-135 + j*(-4) +-72 + j*(30) +-74 + j*(0) +-143 + j*(57) +-77 + j*(211) +144 + j*(200) +202 + j*(-10) +59 + j*(-81) +58 + j*(10) +178 + j*(-93) +22 + j*(-322) +-337 + j*(-206) +-330 + j*(221) +78 + j*(327) +239 + j*(-14) +-35 + j*(-155) +-123 + j*(98) +151 + j*(136) +168 + j*(-165) +-141 + j*(-185) +-166 + j*(93) +47 + j*(113) +43 + j*(-6) +30 + j*(49) +165 + j*(-33) +17 + j*(-255) +-269 + j*(-81) +-86 + j*(231) +225 + j*(40) +30 + j*(-259) +-252 + j*(-91) +-139 + j*(146) +13 + j*(98) +14 + j*(58) +77 + j*(35) +42 + j*(-102) +-147 + j*(-42) +-55 + j*(191) +230 + j*(76) +115 + j*(-262) +-256 + j*(-185) +-249 + j*(168) +-23 + j*(28) +142 + j*(89) +243 + j*(-152) +-11 + j*(-301) +-160 + j*(-95) +-9 + j*(-13) +-18 + j*(-156) +-180 + j*(-100) +-137 + j*(49) +-59 + j*(32) +-93 + j*(57) +9 + j*(139) +139 + j*(30) +85 + j*(-95) +49 + j*(-113) +-1 + j*(-236) +-292 + j*(-232) +-390 + j*(163) +18 + j*(347) +232 + j*(-16) +-69 + j*(-199) +-178 + j*(31) +-9 + j*(29) +-153 + j*(-123) +-350 + j*(132) +-78 + j*(395) +177 + j*(175) +-3 + j*(17) +-54 + j*(233) +233 + j*(250) +274 + j*(-47) +47 + j*(-99) +62 + j*(39) +161 + j*(-92) +-80 + j*(-226) +-301 + j*(77) +-18 + j*(404) +385 + j*(230) +369 + j*(-156) +106 + j*(-264) +-22 + j*(-159) +-18 + j*(-98) +-25 + j*(-91) +-62 + j*(-67) +-71 + j*(3) +14 + j*(64) +128 + j*(-19) +71 + j*(-185) +-119 + j*(-175) +-159 + j*(-13) +-60 + j*(39) +-55 + j*(-1) +-75 + j*(60) +33 + j*(105) +115 + j*(1) +66 + j*(-100) +3 + j*(-122) +-59 + j*(-150) +-186 + j*(-126) +-264 + j*(36) +-168 + j*(209) +22 + j*(231) +126 + j*(107) +83 + j*(4) +36 + j*(27) +107 + j*(28) +112 + j*(-110) +-60 + j*(-147) +-120 + j*(21) +26 + j*(76) +58 + j*(-45) +-23 + j*(-40) +44 + j*(-8) +48 + j*(-170) +-195 + j*(-199) +-287 + j*(54) +-105 + j*(174) +-40 + j*(91) +-74 + j*(122) +21 + j*(158) +40 + j*(59) +-60 + j*(115) +76 + j*(275) +334 + j*(137) +289 + j*(-160) +68 + j*(-228) +-31 + j*(-156) +-88 + j*(-124) +-161 + j*(-33) +-124 + j*(107) +8 + j*(153) +107 + j*(76) +85 + j*(-28) +-11 + j*(-13) +36 + j*(100) +209 + j*(28) +150 + j*(-202) +-91 + j*(-184) +-93 + j*(16) +47 + j*(-1) +-6 + j*(-98) +-74 + j*(-21) +4 + j*(15) +9 + j*(-45) +-18 + j*(-18) +45 + j*(-42) +-28 + j*(-154) +-188 + j*(-57) +-95 + j*(119) +54 + j*(37) +-26 + j*(-59) +-64 + j*(36) +48 + j*(21) +4 + j*(-108) +-123 + j*(-68) +-115 + j*(13) +-122 + j*(18) +-150 + j*(101) +-64 + j*(182) +11 + j*(168) +74 + j*(197) +255 + j*(128) +258 + j*(-156) +-20 + j*(-245) +-132 + j*(-64) +-83 + j*(-25) +-188 + j*(30) +-97 + j*(302) +292 + j*(246) +298 + j*(-159) +-21 + j*(-179) +32 + j*(19) +153 + j*(-161) +-119 + j*(-269) +-227 + j*(11) +1 + j*(71) +-40 + j*(-97) +-175 + j*(52) +53 + j*(170) +153 + j*(-105) +-145 + j*(-195) +-250 + j*(85) +-49 + j*(207) +48 + j*(129) +69 + j*(92) +109 + j*(19) +41 + j*(-40) +16 + j*(28) +91 + j*(10) +21 + j*(-59) +-27 + j*(63) +158 + j*(100) +209 + j*(-114) +35 + j*(-167) +47 + j*(-66) +111 + j*(-199) +-112 + j*(-295) +-257 + j*(-64) +-81 + j*(86) +22 + j*(-27) +-33 + j*(-78) +-40 + j*(-95) +-135 + j*(-163) +-308 + j*(-43) +-243 + j*(182) +-76 + j*(193) +-74 + j*(161) +-16 + j*(262) +194 + j*(226) +250 + j*(6) +122 + j*(-113) +16 + j*(-117) +-87 + j*(-83) +-140 + j*(62) +-11 + j*(180) +116 + j*(110) +89 + j*(40) +112 + j*(82) +233 + j*(13) +198 + j*(-182) +-1 + j*(-221) +-87 + j*(-75) +7 + j*(4) +69 + j*(-75) +-1 + j*(-138) +-55 + j*(-95) +-35 + j*(-101) +-127 + j*(-163) +-291 + j*(-27) +-199 + j*(238) +83 + j*(233) +132 + j*(16) +-4 + j*(-6) +42 + j*(98) +173 + j*(21) +136 + j*(-142) +4 + j*(-189) +-103 + j*(-150) +-156 + j*(-56) +-114 + j*(25) +-72 + j*(-2) +-146 + j*(-1) +-158 + j*(125) +-50 + j*(185) +4 + j*(173) +88 + j*(221) +277 + j*(117) +223 + j*(-158) +-43 + j*(-142) +3 + j*(74) +201 + j*(-54) +4 + j*(-277) +-254 + j*(-63) +-64 + j*(196) +165 + j*(43) +50 + j*(-132) +-64 + j*(-62) +-34 + j*(-21) +-73 + j*(-23) +-63 + j*(88) +105 + j*(88) +138 + j*(-120) +-75 + j*(-207) +-221 + j*(-44) +-150 + j*(121) +-31 + j*(136) +4 + j*(95) +-1 + j*(103) +50 + j*(145) +151 + j*(125) +222 + j*(25) +218 + j*(-111) +110 + j*(-235) +-87 + j*(-225) +-169 + j*(-39) +-33 + j*(73) +58 + j*(-28) +-32 + j*(-81) +-56 + j*(-4) +0 + j*(-13) +-52 + j*(-40) +-47 + j*(54) +88 + j*(6) +-13 + j*(-171) +-248 + j*(-30) +-103 + j*(257) +195 + j*(141) +110 + j*(-98) +-19 + j*(-1) +159 + j*(16) +120 + j*(-291) +-305 + j*(-276) +-378 + j*(201) +63 + j*(371) +286 + j*(28) +67 + j*(-182) +-76 + j*(-67) +-17 + j*(-21) +-61 + j*(-85) +-170 + j*(4) +-101 + j*(160) +56 + j*(147) +92 + j*(47) +78 + j*(16) +103 + j*(-33) +47 + j*(-131) +-84 + j*(-116) +-113 + j*(-16) +-83 + j*(1) +-139 + j*(10) +-166 + j*(136) +-43 + j*(240) +93 + j*(202) +138 + j*(125) +150 + j*(73) +153 + j*(25) +153 + j*(-23) +118 + j*(-97) +-18 + j*(-105) +-68 + j*(83) +180 + j*(184) +353 + j*(-104) +77 + j*(-334) +-151 + j*(-103) +63 + j*(66) +168 + j*(-168) +-89 + j*(-233) +-119 + j*(25) +132 + j*(16) +107 + j*(-228) +-86 + j*(-214) +-54 + j*(-138) +-92 + j*(-265) +-349 + j*(-207) +-356 + j*(107) +-93 + j*(160) +-73 + j*(-28) +-248 + j*(10) +-212 + j*(209) +-37 + j*(228) +18 + j*(128) +-33 + j*(85) +-90 + j*(137) +-46 + j*(281) +199 + j*(336) +417 + j*(77) +261 + j*(-259) +-77 + j*(-247) +-156 + j*(1) +-24 + j*(88) +17 + j*(42) +16 + j*(64) +92 + j*(48) +74 + j*(-57) +-51 + j*(-31) +-7 + j*(107) +146 + j*(42) +68 + j*(-126) +-114 + j*(-33) +-16 + j*(158) +170 + j*(69) +87 + j*(-78) +-1 + j*(31) +176 + j*(82) +247 + j*(-149) +19 + j*(-266) +-98 + j*(-95) +27 + j*(-35) +33 + j*(-168) +-127 + j*(-173) +-180 + j*(-40) +-136 + j*(45) +-74 + j*(109) +67 + j*(114) +138 + j*(-57) +-23 + j*(-173) +-140 + j*(-45) +-43 + j*(23) +-66 + j*(-90) +-259 + j*(13) +-144 + j*(330) +278 + j*(287) +363 + j*(-161) +-17 + j*(-372) +-299 + j*(-127) +-216 + j*(142) +-33 + j*(185) +62 + j*(124) +99 + j*(53) +91 + j*(-22) +33 + j*(-68) +-33 + j*(-50) +-51 + j*(11) +7 + j*(47) +59 + j*(-15) +-10 + j*(-90) +-110 + j*(-23) +-59 + j*(87) +34 + j*(46) +-17 + j*(-21) +-74 + j*(53) +9 + j*(121) +81 + j*(61) +57 + j*(22) +82 + j*(31) +119 + j*(-49) +18 + j*(-129) +-86 + j*(-42) +-18 + j*(55) +60 + j*(-11) +-16 + j*(-70) +-66 + j*(14) +22 + j*(47) +23 + j*(-51) +-113 + j*(-11) +-48 + j*(196) +238 + j*(147) +247 + j*(-192) +-85 + j*(-257) +-155 + j*(30) +103 + j*(41) +40 + j*(-253) +-333 + j*(-172) +-313 + j*(243) +45 + j*(299) +109 + j*(74) +-7 + j*(95) +122 + j*(183) +224 + j*(11) +69 + j*(-73) +57 + j*(95) +303 + j*(52) +310 + j*(-268) +7 + j*(-387) +-173 + j*(-211) +-130 + j*(-76) +-92 + j*(-74) +-115 + j*(-60) +-124 + j*(-13) +-91 + j*(41) +-10 + j*(51) +42 + j*(-41) +-47 + j*(-139) +-182 + j*(-78) +-173 + j*(54) +-92 + j*(66) +-122 + j*(40) +-153 + j*(150) +-4 + j*(240) +147 + j*(111) +57 + j*(-50) +-78 + j*(25) +3 + j*(144) +118 + j*(59) +32 + j*(-44) +-53 + j*(49) +57 + j*(134) +166 + j*(28) +100 + j*(-100) +-23 + j*(-94) +-69 + j*(-5) +-24 + j*(75) +73 + j*(71) +105 + j*(-28) +19 + j*(-87) +-48 + j*(-28) +-14 + j*(33) +34 + j*(14) +28 + j*(-35) +-40 + j*(-55) +-118 + j*(28) +-57 + j*(181) +138 + j*(190) +226 + j*(35) +182 + j*(-69) +153 + j*(-136) +42 + j*(-231) +-151 + j*(-138) +-90 + j*(93) +134 + j*(37) +58 + j*(-165) +-120 + j*(-41) +66 + j*(122) +249 + j*(-115) +25 + j*(-331) +-183 + j*(-188) +-133 + j*(-76) +-165 + j*(-93) +-202 + j*(42) +-27 + j*(93) +-12 + j*(-100) +-242 + j*(-66) +-185 + j*(194) +54 + j*(130) +-50 + j*(-53) +-193 + j*(125) +37 + j*(274) +191 + j*(54) +31 + j*(-66) +-7 + j*(38) +71 + j*(-16) +-44 + j*(-88) +-101 + j*(44) +20 + j*(53) +-57 + j*(-65) +-210 + j*(97) +-16 + j*(304) +215 + j*(141) +97 + j*(-46) +-6 + j*(60) +120 + j*(99) +136 + j*(-38) +18 + j*(-38) +42 + j*(48) +107 + j*(1) +57 + j*(-47) +26 + j*(5) +81 + j*(33) +141 + j*(0) +173 + j*(-95) +95 + j*(-210) +-70 + j*(-194) +-105 + j*(-44) +3 + j*(1) +30 + j*(-78) +-32 + j*(-98) +-53 + j*(-66) +-62 + j*(-49) +-61 + j*(-18) +-31 + j*(-13) +-39 + j*(-23) +-13 + j*(19) +91 + j*(-51) +-1 + j*(-260) +-320 + j*(-216) +-397 + j*(143) +-115 + j*(337) +115 + j*(214) +139 + j*(40) +49 + j*(-75) +-118 + j*(-44) +-129 + j*(173) +124 + j*(238) +250 + j*(3) +105 + j*(-143) +11 + j*(-124) +-68 + j*(-156) +-247 + j*(-36) +-146 + j*(260) +207 + j*(206) +195 + j*(-151) +-132 + j*(-167) +-176 + j*(112) +36 + j*(192) +151 + j*(66) +110 + j*(-78) +-63 + j*(-106) +-148 + j*(112) +112 + j*(264) +325 + j*(5) +118 + j*(-218) +-31 + j*(-66) +116 + j*(-28) +83 + j*(-211) +-91 + j*(-182) +-86 + j*(-112) +-183 + j*(-161) +-344 + j*(81) +-52 + j*(357) +272 + j*(78) +11 + j*(-212) +-203 + j*(57) +82 + j*(208) +194 + j*(-78) +-54 + j*(-166) +-121 + j*(7) +-37 + j*(44) +-34 + j*(38) +3 + j*(48) +-25 + j*(-1) +-94 + j*(120) +136 + j*(245) +339 + j*(-54) +30 + j*(-305) +-209 + j*(-25) +49 + j*(156) +170 + j*(-87) +-35 + j*(-169) +-88 + j*(-43) +-66 + j*(-39) +-115 + j*(36) +23 + j*(114) +80 + j*(-83) +-192 + j*(-81) +-143 + j*(287) +305 + j*(229) +269 + j*(-241) +-158 + j*(-226) +-134 + j*(123) +133 + j*(91) +112 + j*(-100) +21 + j*(-112) +-12 + j*(-141) +-151 + j*(-126) +-176 + j*(70) +25 + j*(135) +128 + j*(-49) +-12 + j*(-217) +-269 + j*(-181) +-410 + j*(129) +-139 + j*(447) +255 + j*(280) +152 + j*(-53) +-63 + j*(101) +237 + j*(246) +395 + j*(-192) +-105 + j*(-402) +-348 + j*(83) +75 + j*(325) +288 + j*(1) +97 + j*(-154) +42 + j*(-95) +8 + j*(-169) +-168 + j*(-93) +-78 + j*(130) +153 + j*(20) +26 + j*(-214) +-209 + j*(-102) +-149 + j*(105) +-20 + j*(105) +6 + j*(71) +43 + j*(59) +47 + j*(8) +25 + j*(18) +91 + j*(8) +78 + j*(-132) +-117 + j*(-150) +-182 + j*(47) +-35 + j*(133) +28 + j*(59) +6 + j*(62) +74 + j*(63) +69 + j*(-37) +-41 + j*(-14) +18 + j*(109) +173 + j*(21) +81 + j*(-160) +-103 + j*(-80) +-34 + j*(78) +88 + j*(11) +18 + j*(-66) +-6 + j*(19) +110 + j*(-4) +63 + j*(-157) +-106 + j*(-113) +-64 + j*(42) +68 + j*(-10) +10 + j*(-130) +-93 + j*(-92) +-92 + j*(-38) +-109 + j*(-23) +-107 + j*(44) +-27 + j*(44) +-62 + j*(-31) +-153 + j*(49) +-58 + j*(158) +23 + j*(69) +-84 + j*(64) +-25 + j*(244) +223 + j*(180) +191 + j*(-71) +10 + j*(-33) +115 + j*(78) +214 + j*(-107) +6 + j*(-233) +-123 + j*(-74) +-34 + j*(-1) +-45 + j*(-49) +-81 + j*(33) +39 + j*(55) +24 + j*(-92) +-163 + j*(-40) +-100 + j*(196) +172 + j*(156) +171 + j*(-119) +-78 + j*(-161) +-156 + j*(51) +6 + j*(148) +101 + j*(45) +38 + j*(-13) +35 + j*(58) +165 + j*(34) +175 + j*(-161) +-36 + j*(-250) +-189 + j*(-88) +-101 + j*(69) +21 + j*(22) +-23 + j*(-78) +-138 + j*(-33) +-126 + j*(103) +-8 + j*(134) +12 + j*(66) +-43 + j*(127) +112 + j*(260) +383 + j*(100) +330 + j*(-258) +23 + j*(-337) +-91 + j*(-199) +-110 + j*(-185) +-264 + j*(-117) +-245 + j*(149) +30 + j*(205) +112 + j*(-11) +-33 + j*(-68) +-39 + j*(21) +15 + j*(-33) +-98 + j*(-83) +-180 + j*(64) +-58 + j*(203) +113 + j*(162) +166 + j*(11) +74 + j*(-98) +-35 + j*(-45) +30 + j*(42) +125 + j*(-70) +-13 + j*(-211) +-194 + j*(-110) +-166 + j*(54) +-81 + j*(71) +-74 + j*(62) +-68 + j*(71) +-101 + j*(92) +-91 + j*(233) +141 + j*(305) +310 + j*(66) +131 + j*(-126) +1 + j*(6) +140 + j*(49) +129 + j*(-116) +-45 + j*(-67) +49 + j*(110) +257 + j*(-18) +165 + j*(-269) +-75 + j*(-278) +-187 + j*(-138) +-194 + j*(9) +-90 + j*(130) +77 + j*(91) +92 + j*(-62) +-18 + j*(-95) +-43 + j*(-37) +-19 + j*(-49) +-71 + j*(-74) +-126 + j*(-21) +-115 + j*(54) +-66 + j*(91) +-29 + j*(91) +-13 + j*(107) +62 + j*(142) +178 + j*(54) +115 + j*(-120) +-73 + j*(-76) +-18 + j*(118) +209 + j*(47) +165 + j*(-208) +-64 + j*(-236) +-146 + j*(-114) +-171 + j*(-52) +-197 + j*(86) +-19 + j*(215) +181 + j*(56) +65 + j*(-170) +-143 + j*(-106) +-127 + j*(49) +-51 + j*(53) +-61 + j*(43) +-43 + j*(68) +-45 + j*(40) +-124 + j*(97) +-59 + j*(291) +234 + j*(317) +419 + j*(34) +269 + j*(-258) +0 + j*(-274) +-101 + j*(-117) +-46 + j*(-37) +-21 + j*(-72) +-90 + j*(-83) +-137 + j*(1) +-93 + j*(83) +-21 + j*(95) +9 + j*(76) +27 + j*(77) +75 + j*(76) +117 + j*(24) +112 + j*(-40) +88 + j*(-76) +69 + j*(-136) +-57 + j*(-201) +-231 + j*(-71) +-143 + j*(190) +165 + j*(153) +162 + j*(-180) +-190 + j*(-209) +-260 + j*(144) +57 + j*(249) +159 + j*(-2) +-35 + j*(-54) +-25 + j*(131) +188 + j*(100) +193 + j*(-130) +9 + j*(-199) +-107 + j*(-110) +-122 + j*(3) +-39 + j*(104) +126 + j*(49) +95 + j*(-164) +-158 + j*(-164) +-190 + j*(103) +61 + j*(153) +91 + j*(-58) +-81 + j*(-35) +20 + j*(119) +177 + j*(-62) +-69 + j*(-240) +-276 + j*(49) +34 + j*(281) +285 + j*(-22) +19 + j*(-272) +-194 + j*(-66) +-27 + j*(69) +28 + j*(-104) +-188 + j*(-129) +-248 + j*(105) +-57 + j*(221) +81 + j*(108) +33 + j*(-18) +-84 + j*(-7) +-110 + j*(110) +-21 + j*(176) +41 + j*(153) +64 + j*(177) +202 + j*(193) +331 + j*(9) +216 + j*(-207) +10 + j*(-214) +-82 + j*(-117) +-124 + j*(-12) +-60 + j*(143) +165 + j*(153) +257 + j*(-86) +69 + j*(-237) +-88 + j*(-146) +-94 + j*(-47) +-86 + j*(23) +16 + j*(106) +173 + j*(-12) +57 + j*(-231) +-211 + j*(-134) +-149 + j*(158) +141 + j*(144) +181 + j*(-113) +-13 + j*(-198) +-105 + j*(-86) +-56 + j*(-25) +-36 + j*(-57) +-80 + j*(-63) +-96 + j*(-18) +-71 + j*(-6) +-88 + j*(-24) +-124 + j*(11) +-108 + j*(51) +-127 + j*(59) +-153 + j*(185) +56 + j*(325) +334 + j*(108) +181 + j*(-267) +-224 + j*(-204) +-241 + j*(168) +48 + j*(234) +113 + j*(47) +2 + j*(36) +62 + j*(136) +213 + j*(46) +154 + j*(-175) +-127 + j*(-190) +-233 + j*(129) +107 + j*(342) +432 + j*(21) +193 + j*(-389) +-214 + j*(-258) +-167 + j*(44) +-10 + j*(-9) +-145 + j*(-54) +-161 + j*(165) +77 + j*(206) +124 + j*(30) +33 + j*(39) +134 + j*(86) +187 + j*(-78) +29 + j*(-138) +6 + j*(-11) +123 + j*(-55) +44 + j*(-189) +-88 + j*(-116) +-22 + j*(-35) +0 + j*(-133) +-151 + j*(-132) +-167 + j*(40) +-13 + j*(62) +-16 + j*(-68) +-141 + j*(-30) +-83 + j*(93) +20 + j*(7) +-124 + j*(-78) +-226 + j*(129) +3 + j*(272) +150 + j*(62) +-44 + j*(-34) +-73 + j*(190) +191 + j*(197) +207 + j*(-57) +29 + j*(-50) +119 + j*(46) +187 + j*(-148) +-65 + j*(-232) +-148 + j*(8) +50 + j*(37) +-4 + j*(-137) +-182 + j*(-20) +-45 + j*(158) +105 + j*(30) +-4 + j*(-66) +-45 + j*(23) +9 + j*(13) +-52 + j*(4) +-19 + j*(126) +153 + j*(77) +108 + j*(-109) +-53 + j*(-69) +4 + j*(52) +96 + j*(-33) +2 + j*(-112) +-69 + j*(-32) +-9 + j*(22) +33 + j*(-21) +0 + j*(-68) +-62 + j*(-46) +-46 + j*(37) +66 + j*(11) +30 + j*(-150) +-177 + j*(-118) +-157 + j*(100) +45 + j*(60) +-61 + j*(-139) +-303 + j*(23) +-157 + j*(322) +144 + j*(255) +147 + j*(33) +25 + j*(8) +7 + j*(61) +13 + j*(86) +44 + j*(142) +145 + j*(150) +210 + j*(77) +241 + j*(18) +287 + j*(-81) +238 + j*(-244) +66 + j*(-323) +-96 + j*(-256) +-141 + j*(-104) +-23 + j*(-13) +90 + j*(-146) +-77 + j*(-325) +-341 + j*(-188) +-293 + j*(81) +-135 + j*(83) +-202 + j*(64) +-162 + j*(275) +168 + j*(275) +245 + j*(-84) +-76 + j*(-218) +-229 + j*(35) +-60 + j*(180) +47 + j*(89) +11 + j*(42) +16 + j*(64) +44 + j*(25) +-13 + j*(-21) +-99 + j*(47) +-55 + j*(198) +146 + j*(237) +291 + j*(61) +218 + j*(-129) +86 + j*(-161) +35 + j*(-143) +-24 + j*(-154) +-101 + j*(-112) +-124 + j*(-42) +-135 + j*(21) +-102 + j*(127) +57 + j*(161) +150 + j*(1) +18 + j*(-112) +-95 + j*(-10) +-21 + j*(100) +87 + j*(67) +116 + j*(-28) +54 + j*(-124) +-98 + j*(-109) +-133 + j*(77) +69 + j*(161) +203 + j*(-35) +54 + j*(-216) +-146 + j*(-167) +-224 + j*(-10) +-188 + j*(171) +14 + j*(291) +250 + j*(158) +218 + j*(-100) +19 + j*(-132) +-16 + j*(-2) +76 + j*(18) +112 + j*(-52) +95 + j*(-116) +40 + j*(-169) +-35 + j*(-170) +-69 + j*(-151) +-129 + j*(-165) +-239 + j*(-93) +-221 + j*(59) +-125 + j*(80) +-156 + j*(69) +-143 + j*(208) +67 + j*(241) +147 + j*(46) +19 + j*(-22) +22 + j*(44) +44 + j*(-50) +-145 + j*(-43) +-127 + j*(237) +229 + j*(223) +235 + j*(-165) +-151 + j*(-180) +-155 + j*(177) +153 + j*(168) +124 + j*(-74) +-42 + j*(-8) +70 + j*(91) +132 + j*(-57) +-16 + j*(-89) +-14 + j*(28) +62 + j*(-24) +-44 + j*(-62) +-59 + j*(84) +106 + j*(90) +103 + j*(-62) +-1 + j*(-36) +63 + j*(8) +52 + j*(-102) +-98 + j*(-39) +11 + j*(155) +250 + j*(24) +140 + j*(-243) +-105 + j*(-181) +-74 + j*(-2) +33 + j*(-24) +21 + j*(-81) +16 + j*(-94) +-13 + j*(-163) +-137 + j*(-158) +-172 + j*(-35) +-105 + j*(8) +-95 + j*(-8) +-82 + j*(9) +-61 + j*(-47) +-184 + j*(-91) +-302 + j*(69) +-197 + j*(250) +-46 + j*(255) +18 + j*(230) +116 + j*(202) +153 + j*(69) +47 + j*(14) +29 + j*(103) +125 + j*(91) +109 + j*(3) +63 + j*(23) +106 + j*(21) +71 + j*(-32) +40 + j*(49) +194 + j*(54) +204 + j*(-183) +-79 + j*(-221) +-124 + j*(70) +163 + j*(100) +186 + j*(-181) +-60 + j*(-213) +-83 + j*(-37) +16 + j*(-55) +-47 + j*(-115) +-82 + j*(-51) +-53 + j*(-66) +-161 + j*(-73) +-185 + j*(126) +58 + j*(189) +151 + j*(-55) +-72 + j*(-164) +-196 + j*(13) +-115 + j*(155) +0 + j*(219) +228 + j*(195) +358 + j*(-156) +-49 + j*(-463) +-512 + j*(-72) +-199 + j*(486) +371 + j*(288) +278 + j*(-197) +-54 + j*(-151) +15 + j*(26) +78 + j*(-95) +-64 + j*(-87) +24 + j*(35) +124 + j*(-163) +-172 + j*(-277) +-321 + j*(49) +-28 + j*(185) +27 + j*(-65) +-226 + j*(-18) +-119 + j*(266) +170 + j*(151) +62 + j*(-108) +-163 + j*(-12) +-113 + j*(191) +39 + j*(240) +192 + j*(206) +313 + j*(23) +193 + j*(-197) +-11 + j*(-159) +4 + j*(-62) +-11 + j*(-136) +-180 + j*(-67) +-119 + j*(165) +107 + j*(136) +76 + j*(-18) +13 + j*(76) +216 + j*(109) +313 + j*(-185) +30 + j*(-404) +-285 + j*(-245) +-296 + j*(75) +-49 + j*(220) +146 + j*(54) +26 + j*(-124) +-112 + j*(8) +83 + j*(111) +186 + j*(-162) +-133 + j*(-306) +-315 + j*(-18) +-127 + j*(135) +-94 + j*(33) +-190 + j*(153) +16 + j*(314) +231 + j*(128) +124 + j*(-67) +6 + j*(-33) +-10 + j*(6) +-33 + j*(81) +122 + j*(173) +308 + j*(-51) +71 + j*(-327) +-252 + j*(-132) +-125 + j*(173) +107 + j*(110) +95 + j*(-14) +96 + j*(-24) +103 + j*(-139) +-78 + j*(-181) +-139 + j*(-2) +4 + j*(33) +-23 + j*(-80) +-119 + j*(13) +23 + j*(93) +81 + j*(-90) +-136 + j*(-134) +-177 + j*(100) +45 + j*(131) +47 + j*(-78) +-180 + j*(-56) +-181 + j*(211) +100 + j*(286) +260 + j*(47) +89 + j*(-166) +-144 + j*(-52) +-66 + j*(201) +208 + j*(168) +238 + j*(-100) +21 + j*(-173) +-49 + j*(-18) +68 + j*(19) +83 + j*(-82) +11 + j*(-84) +57 + j*(-57) +86 + j*(-197) +-140 + j*(-319) +-407 + j*(-100) +-293 + j*(264) +62 + j*(272) +123 + j*(-11) +-105 + j*(-58) +-134 + j*(163) +80 + j*(209) +155 + j*(46) +71 + j*(-19) +59 + j*(8) +74 + j*(-35) +5 + j*(-65) +-40 + j*(6) +34 + j*(63) +116 + j*(-18) +32 + j*(-153) +-170 + j*(-86) +-151 + j*(177) +139 + j*(230) +243 + j*(-25) +66 + j*(-116) +74 + j*(6) +221 + j*(-123) +40 + j*(-356) +-243 + j*(-229) +-197 + j*(-8) +-124 + j*(-42) +-238 + j*(3) +-178 + j*(206) +31 + j*(197) +49 + j*(81) +47 + j*(99) +131 + j*(35) +40 + j*(-76) +-39 + j*(45) +158 + j*(82) +191 + j*(-202) +-130 + j*(-276) +-243 + j*(3) +-60 + j*(94) +-45 + j*(-2) +-97 + j*(67) +23 + j*(94) +18 + j*(-47) +-141 + j*(-11) +-109 + j*(154) +14 + j*(155) +25 + j*(129) +100 + j*(160) +185 + j*(37) +62 + j*(-59) +3 + j*(79) +188 + j*(106) +227 + j*(-115) +23 + j*(-181) +-41 + j*(-38) +45 + j*(1) +62 + j*(-45) +61 + j*(-53) +73 + j*(-99) +13 + j*(-140) +-21 + j*(-116) +-33 + j*(-151) +-171 + j*(-154) +-229 + j*(52) +-4 + j*(153) +103 + j*(-88) +-177 + j*(-197) +-326 + j*(118) +-32 + j*(326) +197 + j*(108) +51 + j*(-71) +-46 + j*(61) +132 + j*(113) +211 + j*(-117) +-11 + j*(-269) +-214 + j*(-139) +-204 + j*(35) +-146 + j*(99) +-97 + j*(165) +25 + j*(192) +98 + j*(83) +19 + j*(37) +25 + j*(147) +209 + j*(139) +269 + j*(-86) +95 + j*(-238) +-99 + j*(-180) +-173 + j*(-10) +-62 + j*(173) +209 + j*(134) +254 + j*(-197) +-91 + j*(-333) +-283 + j*(-34) +-62 + j*(144) +40 + j*(-25) +-119 + j*(-35) +-71 + j*(138) +100 + j*(65) +6 + j*(-73) +-84 + j*(53) +74 + j*(112) +125 + j*(-59) +-14 + j*(-108) +-41 + j*(-36) +-42 + j*(-70) +-158 + j*(-33) +-133 + j*(139) +28 + j*(144) +23 + j*(42) +-23 + j*(112) +120 + j*(163) +221 + j*(-5) +98 + j*(-145) +-37 + j*(-106) +-77 + j*(-18) +-59 + j*(86) +88 + j*(149) +236 + j*(-10) +112 + j*(-234) +-153 + j*(-170) +-163 + j*(105) +103 + j*(191) +279 + j*(-30) +151 + j*(-290) +-133 + j*(-298) +-257 + j*(-75) +-139 + j*(90) +-11 + j*(49) +-37 + j*(-28) +-92 + j*(16) +-48 + j*(84) +35 + j*(72) +73 + j*(-1) +42 + j*(-86) +-60 + j*(-117) +-154 + j*(-37) +-120 + j*(92) +1 + j*(97) +3 + j*(-5) +-102 + j*(25) +-38 + j*(170) +160 + j*(95) +95 + j*(-149) +-180 + j*(-106) +-170 + j*(175) +74 + j*(199) +105 + j*(33) +28 + j*(47) +117 + j*(69) +129 + j*(-82) +-30 + j*(-98) +-29 + j*(21) +37 + j*(-44) +-129 + j*(-81) +-194 + j*(180) +102 + j*(317) +298 + j*(81) +173 + j*(-95) +102 + j*(-45) +161 + j*(-87) +81 + j*(-207) +-82 + j*(-163) +-88 + j*(-7) +56 + j*(30) +127 + j*(-134) +-72 + j*(-274) +-305 + j*(-72) +-132 + j*(230) +192 + j*(95) +82 + j*(-211) +-176 + j*(-114) +-77 + j*(59) +-11 + j*(-83) +-235 + j*(-65) +-198 + j*(243) +132 + j*(240) +163 + j*(-30) +12 + j*(-59) +31 + j*(-41) +-71 + j*(-137) +-261 + j*(53) +-30 + j*(332) +298 + j*(107) +107 + j*(-206) +-142 + j*(-31) +54 + j*(141) +179 + j*(-92) +-74 + j*(-200) +-170 + j*(34) +23 + j*(98) +40 + j*(-74) +-140 + j*(-59) +-141 + j*(135) +32 + j*(186) +118 + j*(77) +79 + j*(4) +48 + j*(21) +94 + j*(35) +141 + j*(-46) +68 + j*(-148) +-57 + j*(-112) +-39 + j*(-5) +47 + j*(-55) +-49 + j*(-160) +-205 + j*(-52) +-132 + j*(129) +9 + j*(98) +-30 + j*(44) +-6 + j*(156) +211 + j*(107) +202 + j*(-187) +-104 + j*(-248) +-214 + j*(-8) +-91 + j*(83) +-95 + j*(62) +-86 + j*(191) +116 + j*(219) +183 + j*(42) +83 + j*(14) +173 + j*(68) +264 + j*(-135) +28 + j*(-305) +-180 + j*(-119) +-67 + j*(59) +47 + j*(-4) +14 + j*(-62) +-4 + j*(-70) +-54 + j*(-95) +-126 + j*(-25) +-64 + j*(67) +6 + j*(30) +-21 + j*(11) +15 + j*(41) +45 + j*(-38) +-64 + j*(-52) +-44 + j*(86) +132 + j*(28) +57 + j*(-187) +-176 + j*(-132) +-165 + j*(63) +-75 + j*(78) +-80 + j*(124) +78 + j*(195) +228 + j*(-22) +-4 + j*(-223) +-209 + j*(0) +10 + j*(181) +164 + j*(-49) +-78 + j*(-202) +-262 + j*(8) +-151 + j*(211) +1 + j*(238) +120 + j*(220) +247 + j*(115) +237 + j*(-69) +106 + j*(-139) +52 + j*(-100) +54 + j*(-134) +-59 + j*(-187) +-202 + j*(-62) +-113 + j*(153) +134 + j*(106) +117 + j*(-168) +-192 + j*(-185) +-261 + j*(141) +46 + j*(265) +199 + j*(12) +1 + j*(-146) +-157 + j*(-1) +-92 + j*(164) +56 + j*(206) +194 + j*(130) +205 + j*(-42) +58 + j*(-83) +63 + j*(59) +267 + j*(-2) +223 + j*(-295) +-92 + j*(-331) +-177 + j*(-91) +-37 + j*(-39) +-65 + j*(-134) +-171 + j*(-64) +-117 + j*(47) +-39 + j*(30) +-30 + j*(-4) +-33 + j*(-50) +-153 + j*(-89) +-280 + j*(112) +-45 + j*(370) +330 + j*(176) +233 + j*(-250) +-165 + j*(-257) +-235 + j*(44) +-67 + j*(118) +-48 + j*(67) +-37 + j*(130) +82 + j*(110) +69 + j*(-7) +-2 + j*(18) +66 + j*(23) +4 + j*(-115) +-230 + j*(-1) +-110 + j*(342) +310 + j*(286) +354 + j*(-125) +48 + j*(-234) +-42 + j*(-73) +11 + j*(-70) +-78 + j*(-76) +-73 + j*(71) +103 + j*(57) +84 + j*(-134) +-106 + j*(-129) +-124 + j*(27) +-36 + j*(40) +-80 + j*(10) +-114 + j*(134) +54 + j*(240) +247 + j*(107) +209 + j*(-124) +13 + j*(-175) +-80 + j*(-55) +-42 + j*(37) +24 + j*(83) +164 + j*(77) +269 + j*(-146) +24 + j*(-402) +-358 + j*(-215) +-275 + j*(216) +124 + j*(223) +179 + j*(-100) +-56 + j*(-172) +-129 + j*(-26) +-68 + j*(35) +-28 + j*(37) +10 + j*(16) +-11 + j*(-30) +-37 + j*(6) +37 + j*(-8) +-33 + j*(-153) +-266 + j*(-46) +-162 + j*(266) +182 + j*(187) +122 + j*(-136) +-151 + j*(-84) +-108 + j*(118) +-5 + j*(82) +-60 + j*(91) +23 + j*(199) +167 + j*(116) +136 + j*(15) +152 + j*(13) +181 + j*(-128) +-24 + j*(-211) +-124 + j*(-5) +68 + j*(65) +100 + j*(-121) +-51 + j*(-142) +-59 + j*(-98) +-165 + j*(-158) +-366 + j*(54) +-148 + j*(388) +223 + j*(250) +158 + j*(-40) +1 + j*(21) +99 + j*(75) +97 + j*(-37) +21 + j*(12) +141 + j*(35) +142 + j*(-153) +-66 + j*(-161) +-83 + j*(11) +17 + j*(23) +25 + j*(18) +141 + j*(21) +177 + j*(-226) +-158 + j*(-329) +-309 + j*(18) +6 + j*(153) +71 + j*(-148) +-248 + j*(-166) +-279 + j*(146) +-52 + j*(199) +-49 + j*(99) +-93 + j*(208) +93 + j*(319) +321 + j*(184) +340 + j*(-88) +131 + j*(-234) +-27 + j*(-103) +121 + j*(-9) +181 + j*(-267) +-188 + j*(-376) +-365 + j*(25) +10 + j*(214) +159 + j*(-136) +-173 + j*(-258) +-288 + j*(6) +-164 + j*(73) +-237 + j*(85) +-181 + j*(339) +178 + j*(332) +226 + j*(-12) +-47 + j*(-44) +-12 + j*(185) +211 + j*(103) +128 + j*(-105) +-33 + j*(-25) +66 + j*(81) +156 + j*(-54) +0 + j*(-157) +-127 + j*(-10) +-4 + j*(132) +139 + j*(40) +79 + j*(-74) +23 + j*(-24) +107 + j*(-37) +53 + j*(-196) +-178 + j*(-147) +-179 + j*(122) +74 + j*(182) +185 + j*(-1) +119 + j*(-127) +28 + j*(-185) +-113 + j*(-173) +-170 + j*(-17) +-35 + j*(49) +-16 + j*(-71) +-151 + j*(-37) +-85 + j*(115) +68 + j*(21) +-51 + j*(-130) +-218 + j*(-13) +-162 + j*(153) +-63 + j*(190) +18 + j*(219) +161 + j*(182) +217 + j*(19) +130 + j*(-104) +2 + j*(-137) +-141 + j*(-49) +-119 + j*(186) +168 + j*(240) +290 + j*(-35) +86 + j*(-157) +57 + j*(-26) +190 + j*(-136) +-6 + j*(-339) +-279 + j*(-161) +-187 + j*(89) +-35 + j*(71) +-34 + j*(38) +9 + j*(36) +-21 + j*(-38) +-119 + j*(59) +58 + j*(194) +231 + j*(-33) +-16 + j*(-212) +-141 + j*(44) +158 + j*(81) +125 + j*(-313) +-374 + j*(-289) +-446 + j*(250) +17 + j*(442) +265 + j*(146) +147 + j*(-57) +49 + j*(-35) +74 + j*(-35) +49 + j*(-120) +-98 + j*(-146) +-208 + j*(21) +-69 + j*(197) +124 + j*(98) +37 + j*(-71) +-103 + j*(37) +32 + j*(169) +162 + j*(35) +54 + j*(-69) +-1 + j*(23) +96 + j*(36) +104 + j*(-56) +58 + j*(-69) +78 + j*(-97) +1 + j*(-203) +-190 + j*(-150) +-219 + j*(67) +-55 + j*(164) +41 + j*(95) +35 + j*(70) +101 + j*(92) +202 + j*(-23) +112 + j*(-209) +-103 + j*(-188) +-135 + j*(-6) +-16 + j*(25) +-25 + j*(-49) +-83 + j*(2) +-8 + j*(53) +23 + j*(-26) +-57 + j*(-25) +-11 + j*(57) +82 + j*(-37) +-43 + j*(-152) +-170 + j*(-37) +-93 + j*(54) +-96 + j*(-8) +-214 + j*(91) +-90 + j*(313) +190 + j*(255) +225 + j*(22) +115 + j*(-39) +119 + j*(-33) +105 + j*(-135) +-41 + j*(-175) +-135 + j*(-68) +-116 + j*(19) +-103 + j*(53) +-94 + j*(129) +4 + j*(206) +153 + j*(180) +245 + j*(44) +206 + j*(-132) +28 + j*(-211) +-133 + j*(-80) +-57 + j*(109) +135 + j*(76) +141 + j*(-91) +40 + j*(-116) +51 + j*(-105) +4 + j*(-216) +-210 + j*(-176) +-216 + j*(76) +6 + j*(90) +-40 + j*(-96) +-239 + j*(27) +-95 + j*(268) +145 + j*(173) +111 + j*(28) +119 + j*(60) +221 + j*(-74) +40 + j*(-259) +-171 + j*(-100) +-47 + j*(68) +50 + j*(-38) +-37 + j*(-72) +-7 + j*(-37) +-42 + j*(-154) +-260 + j*(-73) +-182 + j*(211) +93 + j*(139) +1 + j*(-67) +-121 + j*(69) +54 + j*(108) +-10 + j*(-86) +-221 + j*(101) +77 + j*(344) +349 + j*(-26) +-51 + j*(-301) +-306 + j*(91) +35 + j*(310) +177 + j*(62) +26 + j*(54) +174 + j*(157) +295 + j*(-98) +20 + j*(-240) +-98 + j*(-3) +103 + j*(49) +100 + j*(-137) +-69 + j*(-115) +-49 + j*(13) +22 + j*(-11) +-23 + j*(-35) +-29 + j*(40) +65 + j*(64) +139 + j*(-15) +112 + j*(-129) +4 + j*(-163) +-49 + j*(-100) +-20 + j*(-83) +-41 + j*(-118) +-83 + j*(-96) +-82 + j*(-107) +-192 + j*(-139) +-315 + j*(43) +-140 + j*(250) +73 + j*(127) +-40 + j*(-17) +-107 + j*(146) +124 + j*(192) +196 + j*(-69) +-19 + j*(-176) +-128 + j*(-65) +-133 + j*(-17) +-197 + j*(58) +-139 + j*(213) +13 + j*(219) +35 + j*(163) +75 + j*(223) +249 + j*(183) +296 + j*(-32) +154 + j*(-146) +62 + j*(-116) +40 + j*(-108) +-14 + j*(-113) +-75 + j*(-64) +-81 + j*(28) +11 + j*(87) +102 + j*(11) +26 + j*(-83) +-47 + j*(13) +97 + j*(66) +144 + j*(-139) +-105 + j*(-196) +-170 + j*(65) +74 + j*(124) +102 + j*(-91) +-80 + j*(-80) +-29 + j*(71) +97 + j*(2) +42 + j*(-81) +35 + j*(-62) +48 + j*(-177) +-178 + j*(-238) +-325 + j*(26) +-100 + j*(229) +79 + j*(75) +-45 + j*(-35) +-101 + j*(106) +62 + j*(166) +164 + j*(25) +97 + j*(-110) +-28 + j*(-144) +-144 + j*(-75) +-161 + j*(84) +-7 + j*(173) +120 + j*(52) +18 + j*(-78) +-114 + j*(42) +45 + j*(204) +273 + j*(22) +107 + j*(-272) +-217 + j*(-142) +-112 + j*(176) +195 + j*(71) +88 + j*(-234) +-211 + j*(-156) +-177 + j*(99) +-6 + j*(92) +-29 + j*(5) +-69 + j*(59) +-11 + j*(93) +20 + j*(63) +31 + j*(49) +30 + j*(6) +-49 + j*(11) +-37 + j*(144) +149 + j*(153) +198 + j*(-51) +23 + j*(-128) +-43 + j*(4) +64 + j*(35) +70 + j*(-76) +-52 + j*(-81) +-86 + j*(45) +15 + j*(118) +117 + j*(75) +143 + j*(-13) +119 + j*(-71) +87 + j*(-121) +4 + j*(-158) +-98 + j*(-84) +-44 + j*(57) +132 + j*(25) +141 + j*(-175) +-33 + j*(-253) +-145 + j*(-178) +-187 + j*(-118) +-250 + j*(-28) +-211 + j*(132) +-40 + j*(179) +53 + j*(59) +-20 + j*(-36) +-122 + j*(10) +-110 + j*(148) +61 + j*(212) +224 + j*(52) +129 + j*(-190) +-135 + j*(-187) +-214 + j*(35) +-81 + j*(148) +1 + j*(98) +-6 + j*(98) +69 + j*(136) +181 + j*(28) +91 + j*(-155) +-130 + j*(-107) +-113 + j*(127) +132 + j*(112) +103 + j*(-163) +-225 + j*(-134) +-235 + j*(238) +124 + j*(314) +231 + j*(42) +78 + j*(-9) +156 + j*(80) +275 + j*(-119) +40 + j*(-315) +-192 + j*(-129) +-70 + j*(52) +16 + j*(-64) +-165 + j*(-95) +-232 + j*(161) +25 + j*(338) +308 + j*(185) +317 + j*(-112) +103 + j*(-245) +-50 + j*(-148) +-11 + j*(-56) +17 + j*(-116) +-97 + j*(-125) +-129 + j*(23) +25 + j*(85) +115 + j*(-62) +-6 + j*(-184) +-159 + j*(-110) +-139 + j*(45) +-1 + j*(64) +28 + j*(-65) +-100 + j*(-98) +-138 + j*(18) +-51 + j*(27) +-122 + j*(-42) +-230 + j*(123) +-16 + j*(313) +245 + j*(122) +118 + j*(-151) +-115 + j*(-88) +-102 + j*(78) +-15 + j*(105) +45 + j*(103) +127 + j*(21) +37 + j*(-133) +-170 + j*(-50) +-119 + j*(180) +85 + j*(175) +108 + j*(61) +115 + j*(46) +151 + j*(-66) +-31 + j*(-154) +-152 + j*(68) +88 + j*(200) +204 + j*(-35) +-8 + j*(-97) +10 + j*(114) +246 + j*(33) +162 + j*(-222) +-52 + j*(-168) +-8 + j*(-47) +22 + j*(-113) +-56 + j*(-87) +23 + j*(-35) +49 + j*(-194) +-185 + j*(-232) +-262 + j*(21) +-47 + j*(101) +8 + j*(-89) +-191 + j*(-145) +-322 + j*(28) +-266 + j*(245) +-43 + j*(359) +177 + j*(213) +93 + j*(-14) +-114 + j*(91) +46 + j*(342) +381 + j*(202) +356 + j*(-164) +76 + j*(-260) +-67 + j*(-126) +-42 + j*(-6) +54 + j*(9) +84 + j*(-112) +-93 + j*(-175) +-216 + j*(41) +-4 + j*(220) +187 + j*(48) +62 + j*(-99) +-8 + j*(18) +151 + j*(32) +170 + j*(-167) +1 + j*(-237) +-81 + j*(-171) +-116 + j*(-170) +-235 + j*(-134) +-296 + j*(37) +-192 + j*(194) +-21 + j*(214) +74 + j*(98) +-1 + j*(-1) +-93 + j*(92) +38 + j*(225) +244 + j*(106) +206 + j*(-135) +13 + j*(-202) +-122 + j*(-124) +-175 + j*(12) +-77 + j*(171) +138 + j*(122) +132 + j*(-113) +-93 + j*(-131) +-113 + j*(52) +14 + j*(35) +-81 + j*(-54) +-184 + j*(119) +7 + j*(270) +177 + j*(148) +148 + j*(47) +192 + j*(47) +250 + j*(-116) +63 + j*(-264) +-123 + j*(-127) +-39 + j*(22) +52 + j*(-51) +-25 + j*(-103) +-47 + j*(-40) +-6 + j*(-68) +-97 + j*(-120) +-204 + j*(-2) +-122 + j*(153) +33 + j*(144) +76 + j*(43) +42 + j*(-7) +21 + j*(-5) +32 + j*(-12) +24 + j*(-70) +-91 + j*(-107) +-226 + j*(40) +-106 + j*(296) +238 + j*(284) +373 + j*(-71) +105 + j*(-325) +-190 + j*(-192) +-182 + j*(65) +-12 + j*(129) +65 + j*(48) +39 + j*(-4) +18 + j*(13) +54 + j*(33) +107 + j*(-6) +110 + j*(-91) +38 + j*(-165) +-86 + j*(-168) +-182 + j*(-47) +-103 + j*(130) +128 + j*(115) +190 + j*(-144) +-47 + j*(-298) +-258 + j*(-156) +-246 + j*(28) +-178 + j*(105) +-101 + j*(175) +53 + j*(149) +76 + j*(-33) +-113 + j*(-80) +-179 + j*(104) +-24 + j*(184) +38 + j*(68) +-64 + j*(44) +-83 + j*(166) +38 + j*(235) +155 + j*(177) +173 + j*(84) +158 + j*(74) +257 + j*(64) +337 + j*(-165) +70 + j*(-406) +-300 + j*(-202) +-197 + j*(201) +158 + j*(170) +151 + j*(-98) +-24 + j*(-82) +13 + j*(11) +29 + j*(-41) +-23 + j*(28) +142 + j*(89) +243 + j*(-152) +-11 + j*(-301) +-160 + j*(-95) +-9 + j*(-13) +-18 + j*(-156) +-180 + j*(-100) +-137 + j*(49) +-59 + j*(32) +-93 + j*(57) +9 + j*(139) +139 + j*(30) +85 + j*(-95) +49 + j*(-113) +-1 + j*(-236) +-292 + j*(-232) +-390 + j*(163) +18 + j*(347) +232 + j*(-16) +-69 + j*(-199) +-178 + j*(31) +-9 + j*(29) +-153 + j*(-123) +-350 + j*(132) +-78 + j*(395) +177 + j*(175) +-3 + j*(17) +-54 + j*(233) +233 + j*(250) +274 + j*(-47) +47 + j*(-99) +62 + j*(39) +161 + j*(-92) +-80 + j*(-226) +-301 + j*(77) +-18 + j*(404) +385 + j*(230) +369 + j*(-156) +106 + j*(-264) +-22 + j*(-159) +-18 + j*(-98) +-25 + j*(-91) +-62 + j*(-67) +-71 + j*(3) +14 + j*(64) +128 + j*(-19) +71 + j*(-185) +-119 + j*(-175) +-159 + j*(-13) +-60 + j*(39) +-55 + j*(-1) +-75 + j*(60) +33 + j*(105) +115 + j*(1) +66 + j*(-100) +3 + j*(-122) +-59 + j*(-150) +-186 + j*(-126) +-264 + j*(36) +-168 + j*(209) +22 + j*(231) +126 + j*(107) +83 + j*(4) +36 + j*(27) +107 + j*(28) +112 + j*(-110) +-60 + j*(-147) +-120 + j*(21) +26 + j*(76) +58 + j*(-45) +-23 + j*(-40) +44 + j*(-8) +48 + j*(-170) +-195 + j*(-199) +-287 + j*(54) +-105 + j*(174) +-40 + j*(91) +-74 + j*(122) +21 + j*(158) +40 + j*(59) +-60 + j*(115) +76 + j*(275) +334 + j*(137) +289 + j*(-160) +68 + j*(-228) +-31 + j*(-156) +-88 + j*(-124) +-161 + j*(-33) +-124 + j*(107) +8 + j*(153) +107 + j*(76) +85 + j*(-28) +-11 + j*(-13) +36 + j*(100) +209 + j*(28) +150 + j*(-202) +-91 + j*(-184) +-93 + j*(16) +47 + j*(-1) +-6 + j*(-98) +-74 + j*(-21) +4 + j*(15) +9 + j*(-45) +-18 + j*(-18) +45 + j*(-42) +-28 + j*(-154) +-188 + j*(-57) +-95 + j*(119) +54 + j*(37) +-26 + j*(-59) +-64 + j*(36) +48 + j*(21) +4 + j*(-108) +-123 + j*(-68) +-115 + j*(13) +-122 + j*(18) +-150 + j*(101) +-64 + j*(182) +11 + j*(168) +74 + j*(197) +255 + j*(128) +258 + j*(-156) +-20 + j*(-245) +-132 + j*(-64) +-83 + j*(-25) +-188 + j*(30) +-97 + j*(302) +292 + j*(246) +298 + j*(-159) +-21 + j*(-179) +32 + j*(19) +153 + j*(-161) +-119 + j*(-269) +-227 + j*(11) +1 + j*(71) +-40 + j*(-97) +-175 + j*(52) +53 + j*(170) +153 + j*(-105) +-145 + j*(-195) +-250 + j*(85) +-49 + j*(207) +48 + j*(129) +20 + j*(-16) +-153 + j*(39) +-67 + j*(248) +168 + j*(204) +190 + j*(6) +79 + j*(-42) +55 + j*(11) +116 + j*(11) +151 + j*(-91) +37 + j*(-217) +-189 + j*(-141) +-180 + j*(150) +139 + j*(216) +272 + j*(-98) +0 + j*(-273) +-162 + j*(-72) +-13 + j*(18) +-18 + j*(-144) +-253 + j*(-80) +-201 + j*(224) +119 + j*(223) +158 + j*(-62) +-76 + j*(-111) +-123 + j*(72) +-8 + j*(115) +5 + j*(85) +42 + j*(146) +187 + j*(103) +190 + j*(-75) +51 + j*(-117) +18 + j*(-45) +43 + j*(-53) +4 + j*(-48) +48 + j*(8) +132 + j*(-81) +28 + j*(-197) +-75 + j*(-110) +22 + j*(-79) +-21 + j*(-257) +-312 + j*(-221) +-363 + j*(127) +-65 + j*(267) +102 + j*(74) +8 + j*(-53) +-57 + j*(-21) +-49 + j*(-23) +-98 + j*(-45) +-168 + j*(1) +-192 + j*(103) +-134 + j*(218) +10 + j*(260) +124 + j*(185) +151 + j*(85) +132 + j*(1) +42 + j*(-52) +-50 + j*(34) +49 + j*(156) +209 + j*(53) +132 + j*(-117) +2 + j*(-72) +53 + j*(-21) +35 + j*(-124) +-127 + j*(-79) +-94 + j*(112) +71 + j*(101) +65 + j*(6) +58 + j*(45) +162 + j*(-21) +55 + j*(-196) +-175 + j*(-70) +-47 + j*(199) +252 + j*(92) +190 + j*(-209) +-69 + j*(-199) +-71 + j*(-8) +73 + j*(-34) +11 + j*(-181) +-168 + j*(-110) +-112 + j*(105) +133 + j*(71) +139 + j*(-204) +-138 + j*(-275) +-276 + j*(-60) +-179 + j*(93) +-94 + j*(119) +18 + j*(148) +162 + j*(6) +26 + j*(-228) +-247 + j*(-132) +-196 + j*(110) +-56 + j*(52) +-201 + j*(25) +-186 + j*(303) +185 + j*(322) +255 + j*(-55) +-76 + j*(-139) +-141 + j*(135) +88 + j*(190) +140 + j*(19) +35 + j*(-28) +-6 + j*(30) +34 + j*(95) +163 + j*(86) +219 + j*(-117) +-15 + j*(-264) +-230 + j*(-56) +-86 + j*(169) +83 + j*(84) +21 + j*(7) +28 + j*(96) +162 + j*(54) +146 + j*(-94) +45 + j*(-119) +13 + j*(-106) +-49 + j*(-112) +-103 + j*(-21) +-24 + j*(58) +58 + j*(6) +44 + j*(-64) +-5 + j*(-103) +-108 + j*(-93) +-155 + j*(63) +35 + j*(171) +190 + j*(-23) +7 + j*(-206) +-175 + j*(-45) +-35 + j*(121) +113 + j*(-3) +18 + j*(-146) +-119 + j*(-103) +-148 + j*(11) +-88 + j*(97) +18 + j*(88) +26 + j*(-2) +-47 + j*(23) +50 + j*(112) +197 + j*(-47) +23 + j*(-272) +-256 + j*(-141) +-197 + j*(119) +-28 + j*(103) +-75 + j*(49) +-61 + j*(182) +146 + j*(168) +159 + j*(-66) +-41 + j*(-97) +-52 + j*(81) +131 + j*(78) +152 + j*(-101) +-6 + j*(-171) +-116 + j*(-80) +-110 + j*(36) +-23 + j*(101) +86 + j*(69) +116 + j*(-40) +59 + j*(-113) +-4 + j*(-137) +-81 + j*(-152) +-188 + j*(-98) +-225 + j*(40) +-157 + j*(156) +-58 + j*(203) +49 + j*(203) +142 + j*(134) +159 + j*(27) +109 + j*(-42) +33 + j*(-64) +-49 + j*(4) +13 + j*(147) +227 + j*(116) +262 + j*(-137) +35 + j*(-221) +-35 + j*(-57) +105 + j*(-54) +57 + j*(-218) +-124 + j*(-179) +-112 + j*(-45) +-62 + j*(-72) +-150 + j*(-71) +-165 + j*(53) +-93 + j*(107) +-51 + j*(159) +119 + j*(214) +309 + j*(1) +148 + j*(-280) +-118 + j*(-215) +-103 + j*(-68) +-106 + j*(-115) +-245 + j*(-18) +-124 + j*(192) +93 + j*(70) +-49 + j*(-119) +-227 + j*(47) +-80 + j*(221) +50 + j*(139) +16 + j*(105) +64 + j*(148) +132 + j*(102) +154 + j*(76) +253 + j*(1) +211 + j*(-228) +-62 + j*(-268) +-141 + j*(-52) +-21 + j*(-23) +-99 + j*(-81) +-146 + j*(102) +98 + j*(163) +176 + j*(-89) +-30 + j*(-168) +-74 + j*(-58) +-72 + j*(-105) +-255 + j*(-44) +-206 + j*(249) +106 + j*(258) +140 + j*(19) +6 + j*(35) +111 + j*(107) +173 + j*(-62) +7 + j*(-121) +-20 + j*(1) +59 + j*(-44) +-64 + j*(-100) +-124 + j*(90) +105 + j*(177) +235 + j*(-37) +90 + j*(-192) +-28 + j*(-144) +-42 + j*(-128) +-148 + j*(-137) +-256 + j*(38) +-103 + j*(261) +194 + j*(200) +233 + j*(-95) +-8 + j*(-198) +-115 + j*(-16) +40 + j*(62) +106 + j*(-97) +-47 + j*(-189) +-173 + j*(-98) +-190 + j*(20) +-149 + j*(123) +-37 + j*(182) +63 + j*(129) +74 + j*(73) +105 + j*(53) +122 + j*(-39) +19 + j*(-87) +-16 + j*(11) +98 + j*(8) +78 + j*(-145) +-92 + j*(-151) +-136 + j*(-19) +-94 + j*(37) +-70 + j*(81) +18 + j*(103) +47 + j*(9) +-56 + j*(27) +33 + j*(182) +274 + j*(57) +168 + j*(-253) +-151 + j*(-201) +-143 + j*(74) +79 + j*(80) +96 + j*(-104) +-49 + j*(-161) +-158 + j*(-77) +-153 + j*(47) +-65 + j*(85) +-58 + j*(42) +-104 + j*(119) +37 + j*(215) +175 + j*(63) +37 + j*(-49) +5 + j*(101) +208 + j*(50) +102 + j*(-205) +-168 + j*(-50) +47 + j*(210) +306 + j*(-73) +-16 + j*(-332) +-255 + j*(-18) +41 + j*(160) +139 + j*(-130) +-158 + j*(-171) +-180 + j*(115) +55 + j*(134) +56 + j*(-25) +-40 + j*(18) +54 + j*(101) +173 + j*(-6) +116 + j*(-182) +-86 + j*(-226) +-232 + j*(-57) +-132 + j*(143) +54 + j*(100) +23 + j*(-40) +-83 + j*(20) +1 + j*(123) +117 + j*(54) +103 + j*(-50) +57 + j*(-96) +-11 + j*(-141) +-128 + j*(-109) +-163 + j*(13) +-107 + j*(88) +-53 + j*(115) +16 + j*(123) +62 + j*(72) +40 + j*(47) +73 + j*(71) +129 + j*(-10) +32 + j*(-91) +-40 + j*(18) +92 + j*(69) +134 + j*(-86) +-20 + j*(-116) +-22 + j*(19) +113 + j*(-21) +64 + j*(-169) +-74 + j*(-158) +-113 + j*(-92) +-147 + j*(-40) +-122 + j*(71) +29 + j*(62) +12 + j*(-122) +-220 + j*(-116) +-272 + j*(134) +-90 + j*(245) +-1 + j*(192) +25 + j*(218) +171 + j*(227) +279 + j*(64) +198 + j*(-95) +87 + j*(-100) +73 + j*(-67) +80 + j*(-100) +35 + j*(-149) +-53 + j*(-163) +-153 + j*(-111) +-209 + j*(27) +-129 + j*(186) +68 + j*(223) +205 + j*(86) +179 + j*(-74) +88 + j*(-138) +5 + j*(-157) +-96 + j*(-119) +-115 + j*(1) +-16 + j*(38) +-15 + j*(-49) +-125 + j*(6) +-32 + j*(174) +199 + j*(79) +140 + j*(-194) +-129 + j*(-188) +-168 + j*(26) +-37 + j*(71) +-35 + j*(20) +-45 + j*(83) +76 + j*(84) +86 + j*(-76) +-113 + j*(-103) +-179 + j*(133) +62 + j*(269) +273 + j*(88) +204 + j*(-132) +66 + j*(-167) +2 + j*(-162) +-103 + j*(-144) +-148 + j*(13) +28 + j*(86) +103 + j*(-114) +-116 + j*(-188) +-182 + j*(15) +-18 + j*(18) +-134 + j*(-136) +-347 + j*(89) +-95 + j*(383) +220 + j*(180) +69 + j*(-60) +-48 + j*(91) +146 + j*(103) +101 + j*(-139) +-162 + j*(-80) +-118 + j*(158) +24 + j*(144) +-9 + j*(153) +144 + j*(295) +445 + j*(102) +343 + j*(-304) +-41 + j*(-339) +-161 + j*(-82) +-35 + j*(47) +82 + j*(1) +88 + j*(-138) +-106 + j*(-212) +-285 + j*(14) +-85 + j*(303) +262 + j*(192) +267 + j*(-119) +84 + j*(-187) +59 + j*(-170) +-18 + j*(-281) +-279 + j*(-235) +-345 + j*(93) +-56 + j*(264) +149 + j*(54) +-6 + j*(-124) +-141 + j*(19) +14 + j*(121) +86 + j*(-53) +-107 + j*(-88) +-104 + j*(133) +148 + j*(91) +79 + j*(-190) +-215 + j*(-110) +-141 + j*(163) +71 + j*(98) +-9 + j*(-30) +-50 + j*(76) +74 + j*(47) +-21 + j*(-69) +-111 + j*(97) +124 + j*(161) +175 + j*(-124) +-117 + j*(-168) +-140 + j*(79) +18 + j*(42) +-129 + j*(-30) +-170 + j*(247) +187 + j*(317) +292 + j*(-23) +37 + j*(-107) +30 + j*(71) +175 + j*(-1) +69 + j*(-127) +-26 + j*(-14) +93 + j*(53) +172 + j*(-49) +153 + j*(-153) +76 + j*(-268) +-137 + j*(-300) +-285 + j*(-99) +-179 + j*(86) +-56 + j*(67) +-50 + j*(33) +-41 + j*(37) +-47 + j*(40) +-22 + j*(98) +101 + j*(63) +71 + j*(-103) +-99 + j*(-73) +-39 + j*(54) +16 + j*(-78) +-238 + j*(-69) +-216 + j*(317) +238 + j*(336) +301 + j*(-74) +30 + j*(-109) +119 + j*(-5) +102 + j*(-274) +-336 + j*(-198) +-234 + j*(338) +317 + j*(203) +107 + j*(-310) +-373 + j*(9) +39 + j*(494) +548 + j*(83) +259 + j*(-392) +-59 + j*(-276) +-50 + j*(-222) +-245 + j*(-243) +-345 + j*(76) +-46 + j*(217) +41 + j*(0) +-101 + j*(28) +41 + j*(107) +47 + j*(-132) +-296 + j*(-61) +-186 + j*(387) +322 + j*(310) +317 + j*(-164) +-23 + j*(-210) +-63 + j*(-51) +-68 + j*(-73) +-175 + j*(40) +-20 + j*(210) +158 + j*(66) +35 + j*(-66) +-25 + j*(49) +91 + j*(58) +83 + j*(-30) +75 + j*(-8) +147 + j*(-103) +-15 + j*(-257) +-227 + j*(-94) +-94 + j*(96) +3 + j*(-42) +-209 + j*(-49) +-199 + j*(257) +140 + j*(306) +250 + j*(40) +117 + j*(-65) +97 + j*(-48) +59 + j*(-125) +-77 + j*(-87) +-37 + j*(62) +100 + j*(11) +37 + j*(-114) +-59 + j*(-43) +25 + j*(4) +25 + j*(-114) +-153 + j*(-93) +-145 + j*(137) +109 + j*(171) +191 + j*(-75) +-13 + j*(-193) +-144 + j*(-52) +-71 + j*(59) +-11 + j*(46) +20 + j*(59) +115 + j*(11) +86 + j*(-164) +-141 + j*(-180) +-206 + j*(53) +-4 + j*(141) +72 + j*(-33) +-84 + j*(-98) +-161 + j*(37) +-96 + j*(133) +-21 + j*(173) +110 + j*(175) +214 + j*(13) +74 + j*(-158) +-111 + j*(-55) +-28 + j*(112) +115 + j*(41) +57 + j*(-75) +-24 + j*(-36) +-1 + j*(-3) +-20 + j*(-16) +-31 + j*(53) +78 + j*(77) +124 + j*(-49) +11 + j*(-101) +-12 + j*(-10) +84 + j*(-37) +29 + j*(-175) +-149 + j*(-140) +-162 + j*(32) +-39 + j*(63) +-34 + j*(-16) +-105 + j*(19) +-59 + j*(109) +41 + j*(71) +3 + j*(-23) +-98 + j*(30) +-42 + j*(162) +121 + j*(127) +112 + j*(-46) +-64 + j*(-49) +-78 + j*(147) +136 + j*(196) +232 + j*(0) +93 + j*(-115) +-5 + j*(-24) +59 + j*(53) +144 + j*(33) +218 + j*(-44) +221 + j*(-222) +6 + j*(-361) +-238 + j*(-199) +-153 + j*(69) +88 + j*(24) +55 + j*(-197) +-150 + j*(-198) +-190 + j*(-41) +-102 + j*(-2) +-101 + j*(-59) +-194 + j*(-53) +-261 + j*(78) +-156 + j*(254) +87 + j*(235) +144 + j*(-18) +-100 + j*(-113) +-231 + j*(132) +-11 + j*(312) +197 + j*(161) +122 + j*(-5) +43 + j*(53) +148 + j*(74) +173 + j*(-95) +-18 + j*(-148) +-86 + j*(41) +116 + j*(92) +151 + j*(-148) +-134 + j*(-187) +-187 + j*(127) +143 + j*(188) +202 + j*(-142) +-109 + j*(-194) +-141 + j*(74) +67 + j*(52) +-37 + j*(-107) +-177 + j*(85) +66 + j*(231) +214 + j*(-20) +-19 + j*(-139) +-97 + j*(74) +100 + j*(126) +143 + j*(-30) +59 + j*(-60) +67 + j*(-48) +49 + j*(-99) +-6 + j*(-85) +2 + j*(-83) +-78 + j*(-118) +-170 + j*(35) +22 + j*(202) +261 + j*(16) +144 + j*(-269) +-115 + j*(-267) +-222 + j*(-120) +-230 + j*(24) +-117 + j*(153) +61 + j*(76) +-21 + j*(-107) +-218 + j*(6) +-86 + j*(230) +141 + j*(103) +21 + j*(-98) +-153 + j*(20) +-58 + j*(168) +37 + j*(133) +56 + j*(142) +192 + j*(128) +230 + j*(-85) +17 + j*(-165) +-42 + j*(20) +144 + j*(10) +78 + j*(-226) +-221 + j*(-146) +-165 + j*(190) +173 + j*(174) +194 + j*(-137) +-57 + j*(-189) +-112 + j*(-10) +4 + j*(12) +-13 + j*(-78) +-116 + j*(-51) +-128 + j*(61) +-35 + j*(141) +119 + j*(104) +158 + j*(-125) +-125 + j*(-265) +-395 + j*(30) +-168 + j*(416) +249 + j*(329) +288 + j*(0) +127 + j*(-76) +122 + j*(-61) +76 + j*(-166) +-107 + j*(-134) +-115 + j*(67) +70 + j*(103) +136 + j*(-47) +35 + j*(-147) +-89 + j*(-117) +-135 + j*(0) +-57 + j*(94) +35 + j*(58) +16 + j*(11) +26 + j*(54) +121 + j*(8) +77 + j*(-132) +-66 + j*(-115) +-62 + j*(-21) +-44 + j*(-54) +-147 + j*(-11) +-90 + j*(163) +119 + j*(127) +98 + j*(-64) +-51 + j*(-28) +23 + j*(93) +136 + j*(-2) +59 + j*(-98) +25 + j*(-46) +92 + j*(-109) +-35 + j*(-244) +-247 + j*(-124) +-176 + j*(107) +21 + j*(59) +-58 + j*(-110) +-253 + j*(-2) +-168 + j*(241) +71 + j*(222) +96 + j*(59) +28 + j*(57) +93 + j*(68) +86 + j*(-60) +-78 + j*(-46) +-54 + j*(137) +134 + j*(111) +105 + j*(-52) +-15 + j*(-2) +73 + j*(86) +153 + j*(-13) +109 + j*(-70) +141 + j*(-113) +49 + j*(-303) +-291 + j*(-239) +-296 + j*(175) +111 + j*(217) +139 + j*(-158) +-216 + j*(-148) +-193 + j*(179) +64 + j*(148) +-6 + j*(-11) +-98 + j*(140) +112 + j*(226) +215 + j*(31) +93 + j*(-42) +110 + j*(34) +212 + j*(-61) +122 + j*(-230) +-73 + j*(-220) +-151 + j*(-72) +-80 + j*(49) +42 + j*(33) +48 + j*(-71) +-34 + j*(-74) +-5 + j*(-15) +45 + j*(-105) +-96 + j*(-188) +-226 + j*(-47) +-139 + j*(88) +-63 + j*(54) +-95 + j*(61) +-36 + j*(117) +24 + j*(41) +-85 + j*(0) +-132 + j*(162) +52 + j*(274) +237 + j*(158) +254 + j*(-29) +160 + j*(-160) +0 + j*(-185) +-93 + j*(-59) +9 + j*(45) +118 + j*(-73) +-11 + j*(-226) +-217 + j*(-146) +-233 + j*(57) +-114 + j*(142) +-49 + j*(125) +-33 + j*(145) +49 + j*(185) +175 + j*(114) +163 + j*(-51) +4 + j*(-78) +-24 + j*(78) +165 + j*(107) +232 + j*(-113) +29 + j*(-233) +-103 + j*(-90) +-6 + j*(2) +33 + j*(-94) +-83 + j*(-117) +-119 + j*(-3) +-40 + j*(37) +-17 + j*(-3) +-37 + j*(-3) +-30 + j*(6) +-42 + j*(1) +-52 + j*(42) +6 + j*(63) +35 + j*(1) +-27 + j*(-25) +-57 + j*(37) +-6 + j*(85) +65 + j*(64) +93 + j*(-26) +-6 + j*(-112) +-162 + j*(-6) +-62 + j*(223) +232 + j*(156) +214 + j*(-170) +-101 + j*(-198) +-153 + j*(74) +57 + j*(127) +87 + j*(-12) +13 + j*(11) +103 + j*(54) +158 + j*(-85) +23 + j*(-167) +-68 + j*(-73) +-16 + j*(6) +66 + j*(-13) +106 + j*(-112) +16 + j*(-253) +-206 + j*(-235) +-287 + j*(-20) +-161 + j*(94) +-115 + j*(45) +-179 + j*(110) +-66 + j*(265) +177 + j*(206) +229 + j*(-56) +29 + j*(-212) +-180 + j*(-122) +-211 + j*(67) +-111 + j*(175) +-7 + j*(196) +98 + j*(174) +173 + j*(52) +76 + j*(-78) +-70 + j*(-5) +-7 + j*(144) +130 + j*(100) +120 + j*(18) +137 + j*(25) +191 + j*(-89) +27 + j*(-209) +-123 + j*(-37) +49 + j*(95) +144 + j*(-89) +-53 + j*(-139) +-40 + j*(62) +180 + j*(-23) +50 + j*(-293) +-267 + j*(-175) +-211 + j*(141) +48 + j*(148) +93 + j*(-32) +-21 + j*(-88) +-88 + j*(-21) +-52 + j*(52) +20 + j*(28) +-15 + j*(-39) +-94 + j*(19) +-23 + j*(121) +88 + j*(68) +71 + j*(-22) +28 + j*(-31) +0 + j*(-36) +-36 + j*(21) +67 + j*(81) +156 + j*(-72) +-31 + j*(-177) +-110 + j*(28) +133 + j*(40) +74 + j*(-280) +-330 + j*(-195) +-272 + j*(250) +146 + j*(238) +168 + j*(-88) +-37 + j*(-124) +-72 + j*(-48) +-106 + j*(-19) +-66 + j*(86) +80 + j*(-11) +-115 + j*(-216) +-410 + j*(63) +-127 + j*(443) +249 + j*(223) +89 + j*(-33) +8 + j*(133) +240 + j*(65) +91 + j*(-233) +-233 + j*(-70) +-98 + j*(220) +87 + j*(124) +2 + j*(88) +93 + j*(220) +280 + j*(86) +178 + j*(-92) +82 + j*(-25) +150 + j*(-11) +131 + j*(-62) +169 + j*(-24) +284 + j*(-177) +86 + j*(-409) +-194 + j*(-261) +-110 + j*(-54) +-40 + j*(-146) +-190 + j*(-113) +-112 + j*(75) +57 + j*(-34) +-89 + j*(-157) +-156 + j*(21) +44 + j*(25) +-8 + j*(-208) +-265 + j*(-150) +-250 + j*(71) +-143 + j*(82) +-176 + j*(101) +-104 + j*(218) +48 + j*(175) +52 + j*(69) +42 + j*(62) +76 + j*(-13) +-42 + j*(-117) +-218 + j*(-21) +-216 + j*(183) +-65 + j*(296) +95 + j*(268) +155 + j*(155) +118 + j*(115) +166 + j*(144) +257 + j*(42) +170 + j*(-81) +105 + j*(-21) +202 + j*(-64) +71 + j*(-257) +-216 + j*(-83) +-33 + j*(272) +344 + j*(103) +203 + j*(-236) +-35 + j*(-91) +180 + j*(45) +285 + j*(-255) +-16 + j*(-395) +-144 + j*(-194) +-54 + j*(-185) +-204 + j*(-263) +-358 + j*(-25) +-134 + j*(192) +87 + j*(17) +-61 + j*(-190) +-274 + j*(-67) +-202 + j*(146) +-24 + j*(114) +-71 + j*(-14) +-197 + j*(93) +-50 + j*(267) +165 + j*(129) +54 + j*(-76) +-102 + j*(35) +39 + j*(137) +101 + j*(-47) +-115 + j*(-85) +-144 + j*(139) +53 + j*(161) +45 + j*(17) +-57 + j*(78) +47 + j*(170) +136 + j*(62) +45 + j*(-3) +9 + j*(91) +122 + j*(133) +210 + j*(30) +152 + j*(-102) +6 + j*(-80) +28 + j*(83) +249 + j*(54) +253 + j*(-223) +-12 + j*(-285) +-82 + j*(-117) +-32 + j*(-133) +-198 + j*(-104) +-148 + j*(222) +318 + j*(199) +364 + j*(-360) +-198 + j*(-505) +-407 + j*(-36) +-81 + j*(146) +15 + j*(-82) +-185 + j*(-115) +-231 + j*(62) +-135 + j*(154) +-32 + j*(180) +85 + j*(121) +83 + j*(-10) +-6 + j*(-30) +-6 + j*(5) +-22 + j*(-37) +-99 + j*(20) +-8 + j*(119) +107 + j*(-13) +-62 + j*(-148) +-233 + j*(29) +-110 + j*(229) +69 + j*(205) +139 + j*(107) +148 + j*(-12) +15 + j*(-99) +-117 + j*(44) +35 + j*(213) +230 + j*(81) +153 + j*(-101) +45 + j*(-81) +46 + j*(-70) +-18 + j*(-79) +-33 + j*(27) +107 + j*(33) +115 + j*(-139) +-54 + j*(-181) +-138 + j*(-85) +-167 + j*(-8) +-170 + j*(141) +24 + j*(254) +207 + j*(93) +97 + j*(-66) +15 + j*(45) +188 + j*(88) +281 + j*(-124) +144 + j*(-306) +-56 + j*(-351) +-270 + j*(-260) +-339 + j*(7) +-134 + j*(148) +-58 + j*(4) +-243 + j*(64) +-98 + j*(387) +372 + j*(268) +358 + j*(-269) +-140 + j*(-374) +-326 + j*(1) +-108 + j*(205) +54 + j*(144) +113 + j*(67) +145 + j*(-55) +17 + j*(-186) +-179 + j*(-106) +-173 + j*(105) +6 + j*(173) +120 + j*(52) +62 + j*(-79) +-54 + j*(-76) +-91 + j*(-2) +-81 + j*(37) +-84 + j*(86) +-18 + j*(156) +94 + j*(109) +66 + j*(1) +-30 + j*(43) +35 + j*(156) +177 + j*(122) +224 + j*(-8) +184 + j*(-121) +73 + j*(-189) +-50 + j*(-130) +-21 + j*(-18) +64 + j*(-62) +3 + j*(-136) +-38 + j*(-88) +1 + j*(-141) +-177 + j*(-245) +-417 + j*(-3) +-223 + j*(356) +144 + j*(274) +133 + j*(2) +-23 + j*(29) +54 + j*(130) +156 + j*(40) +117 + j*(-54) +80 + j*(-83) +22 + j*(-125) +-69 + j*(-81) +-42 + j*(8) +26 + j*(-35) +-51 + j*(-103) +-154 + j*(-21) +-129 + j*(120) +-1 + j*(198) +175 + j*(153) +254 + j*(-54) +97 + j*(-231) +-97 + j*(-167) +-103 + j*(-42) +-78 + j*(-31) +-126 + j*(18) +-64 + j*(139) +108 + j*(125) +172 + j*(-43) +69 + j*(-180) +-100 + j*(-182) +-194 + j*(-36) +-94 + j*(103) +51 + j*(16) +-61 + j*(-156) +-307 + j*(-35) +-250 + j*(295) +100 + j*(351) +247 + j*(54) +11 + j*(-116) +-156 + j*(104) +71 + j*(301) +324 + j*(105) +209 + j*(-163) +2 + j*(-124) +25 + j*(-20) +53 + j*(-74) +-29 + j*(-71) +-11 + j*(-1) +18 + j*(-50) +-83 + j*(-41) +-61 + j*(117) +119 + j*(110) +141 + j*(-40) +78 + j*(-63) +103 + j*(-100) +-4 + j*(-199) +-146 + j*(-67) +11 + j*(60) +96 + j*(-160) +-206 + j*(-229) +-296 + j*(124) +49 + j*(225) +127 + j*(-81) +-148 + j*(-121) +-178 + j*(133) +12 + j*(196) +109 + j*(129) +199 + j*(47) +197 + j*(-168) +-59 + j*(-260) +-194 + j*(-43) +-33 + j*(56) +-24 + j*(-89) +-209 + j*(-33) +-154 + j*(204) +91 + j*(205) +155 + j*(6) +28 + j*(-95) +-91 + j*(-32) +-73 + j*(102) +71 + j*(110) +86 + j*(-47) +-96 + j*(-49) +-97 + j*(175) +162 + j*(208) +236 + j*(-28) +86 + j*(-104) +83 + j*(-31) +144 + j*(-143) +-41 + j*(-261) +-227 + j*(-84) +-100 + j*(122) +78 + j*(37) +5 + j*(-104) +-107 + j*(-34) +-36 + j*(46) +-1 + j*(-52) +-163 + j*(-68) +-221 + j*(161) +13 + j*(306) +222 + j*(154) +190 + j*(-35) +95 + j*(-87) +23 + j*(-92) +-39 + j*(-25) +51 + j*(57) +160 + j*(-88) +-40 + j*(-257) +-277 + j*(-37) +-72 + j*(240) +201 + j*(61) +33 + j*(-181) +-167 + j*(-4) +23 + j*(164) +177 + j*(-35) +-9 + j*(-182) +-146 + j*(-37) +-55 + j*(64) +-23 + j*(12) +-80 + j*(59) +23 + j*(174) +213 + j*(78) +189 + j*(-164) +-45 + j*(-227) +-160 + j*(-63) +-71 + j*(49) +1 + j*(5) +-30 + j*(-38) +-71 + j*(-27) +-113 + j*(4) +-131 + j*(110) +4 + j*(221) +197 + j*(117) +167 + j*(-107) +-25 + j*(-143) +-84 + j*(-18) +-26 + j*(17) +-46 + j*(-12) +-90 + j*(59) +-5 + j*(156) +136 + j*(110) +164 + j*(-22) +103 + j*(-94) +66 + j*(-124) +-8 + j*(-197) +-194 + j*(-173) +-287 + j*(54) +-124 + j*(237) +52 + j*(200) +112 + j*(145) +231 + j*(81) +262 + j*(-181) +-52 + j*(-349) +-326 + j*(-77) +-149 + j*(221) +91 + j*(129) +30 + j*(-11) +-32 + j*(62) +56 + j*(96) +81 + j*(35) +79 + j*(51) +174 + j*(16) +170 + j*(-146) +-2 + j*(-214) +-122 + j*(-100) +-80 + j*(30) +39 + j*(37) +77 + j*(-76) +-37 + j*(-143) +-120 + j*(-40) +-34 + j*(30) +1 + j*(-59) +-99 + j*(-75) +-117 + j*(10) +-101 + j*(12) +-173 + j*(83) +-59 + j*(276) +235 + j*(181) +185 + j*(-144) +-124 + j*(-111) +-71 + j*(191) +264 + j*(134) +277 + j*(-245) +-90 + j*(-402) +-404 + j*(-138) +-311 + j*(268) +90 + j*(347) +272 + j*(21) +45 + j*(-173) +-86 + j*(-25) +25 + j*(-8) +-83 + j*(-120) +-233 + j*(86) +33 + j*(272) +226 + j*(-22) +-98 + j*(-202) +-271 + j*(151) +78 + j*(340) +279 + j*(57) +95 + j*(-117) +-16 + j*(-28) +-4 + j*(8) +-40 + j*(69) +78 + j*(198) +313 + j*(81) +272 + j*(-214) +9 + j*(-281) +-112 + j*(-127) +-78 + j*(-23) +-30 + j*(23) +56 + j*(36) +119 + j*(-63) +35 + j*(-156) +-47 + j*(-92) +40 + j*(-49) +76 + j*(-214) +-148 + j*(-326) +-365 + j*(-142) +-317 + j*(88) +-206 + j*(148) +-161 + j*(208) +-7 + j*(267) +136 + j*(120) +17 + j*(-25) +-86 + j*(106) +84 + j*(185) +154 + j*(1) +-25 + j*(-38) +-8 + j*(156) +233 + j*(115) +233 + j*(-157) +8 + j*(-231) +-100 + j*(-129) +-130 + j*(-64) +-159 + j*(37) +-62 + j*(146) +66 + j*(83) +18 + j*(-22) +-67 + j*(44) +8 + j*(146) +142 + j*(98) +158 + j*(-36) +64 + j*(-110) +-27 + j*(-71) +-23 + j*(11) +54 + j*(26) +107 + j*(-57) +52 + j*(-185) +-147 + j*(-221) +-330 + j*(-16) +-221 + j*(300) +131 + j*(345) +312 + j*(74) +192 + j*(-150) +23 + j*(-168) +-71 + j*(-105) +-102 + j*(1) +-19 + j*(91) +97 + j*(45) +91 + j*(-66) +22 + j*(-88) +5 + j*(-83) +-33 + j*(-119) +-137 + j*(-95) +-184 + j*(43) +-74 + j*(170) +91 + j*(133) +119 + j*(-13) +25 + j*(-51) +32 + j*(11) +110 + j*(-62) +6 + j*(-186) +-143 + j*(-97) +-69 + j*(28) +4 + j*(-74) +-153 + j*(-144) +-278 + j*(28) +-190 + j*(209) +-28 + j*(267) +151 + j*(206) +205 + j*(-18) +-10 + j*(-141) +-157 + j*(59) +28 + j*(205) +158 + j*(63) +80 + j*(-13) +98 + j*(9) +91 + j*(-105) +-86 + j*(-76) +-18 + j*(132) +211 + j*(1) +16 + j*(-245) +-234 + j*(1) +52 + j*(231) +251 + j*(-89) +-86 + j*(-255) +-217 + j*(79) +84 + j*(165) +110 + j*(-91) +-110 + j*(-47) +-6 + j*(163) +218 + j*(46) +154 + j*(-189) +-40 + j*(-220) +-156 + j*(-128) +-184 + j*(17) +-69 + j*(131) +78 + j*(55) +26 + j*(-98) +-136 + j*(-69) +-156 + j*(100) +-10 + j*(195) +146 + j*(112) +135 + j*(-62) +-30 + j*(-98) +-86 + j*(69) +99 + j*(153) +250 + j*(-33) +122 + j*(-255) +-124 + j*(-231) +-188 + j*(-32) +-55 + j*(51) +-4 + j*(-64) +-158 + j*(-104) +-240 + j*(84) +-83 + j*(220) +44 + j*(142) +14 + j*(95) +55 + j*(151) +163 + j*(98) +175 + j*(-11) +154 + j*(-71) +121 + j*(-178) +-61 + j*(-245) +-223 + j*(-83) +-134 + j*(109) +23 + j*(90) +40 + j*(-26) +-63 + j*(-75) +-184 + j*(28) +-112 + j*(262) +214 + j*(273) +328 + j*(-78) +25 + j*(-257) +-150 + j*(-34) +-2 + j*(88) +49 + j*(14) +53 + j*(50) +209 + j*(-34) +84 + j*(-334) +-343 + j*(-233) +-317 + j*(254) +139 + j*(308) +239 + j*(-45) +21 + j*(-132) +0 + j*(-38) +14 + j*(-110) +-142 + j*(-103) +-156 + j*(95) +34 + j*(137) +92 + j*(-17) +-23 + j*(-77) +-86 + j*(4) +-31 + j*(71) +35 + j*(28) +-18 + j*(-49) +-136 + j*(23) +-76 + j*(206) +143 + j*(209) +216 + j*(33) +142 + j*(-41) +165 + j*(-47) +182 + j*(-200) +-25 + j*(-333) +-278 + j*(-192) +-284 + j*(89) +-81 + j*(228) +116 + j*(163) +187 + j*(-5) +106 + j*(-158) +-52 + j*(-189) +-170 + j*(-98) +-185 + j*(35) +-110 + j*(132) +-6 + j*(145) +54 + j*(98) +74 + j*(59) +112 + j*(23) +127 + j*(-89) +-16 + j*(-196) +-223 + j*(-80) +-173 + j*(192) +114 + j*(220) +196 + j*(-34) +-5 + j*(-118) +-51 + j*(45) +115 + j*(42) +88 + j*(-138) +-77 + j*(-112) +-34 + j*(0) +28 + j*(-119) +-189 + j*(-197) +-359 + j*(57) +-176 + j*(310) +58 + j*(261) +83 + j*(140) +59 + j*(148) +132 + j*(187) +263 + j*(144) +366 + j*(-21) +301 + j*(-267) +38 + j*(-374) +-177 + j*(-218) +-143 + j*(-13) +6 + j*(8) +45 + j*(-118) +-83 + j*(-208) +-263 + j*(-126) +-303 + j*(107) +-120 + j*(285) +124 + j*(221) +164 + j*(6) +16 + j*(-66) +-30 + j*(45) +92 + j*(52) +81 + j*(-104) +-105 + j*(-95) +-105 + j*(107) +95 + j*(117) +110 + j*(-64) +-30 + j*(-69) +-7 + j*(24) +49 + j*(-38) +-51 + j*(-72) +-76 + j*(49) +45 + j*(69) +59 + j*(-28) +1 + j*(-32) +18 + j*(-15) +1 + j*(-49) +-28 + j*(1) +68 + j*(8) +63 + j*(-148) +-140 + j*(-156) +-158 + j*(49) +18 + j*(35) +-69 + j*(-136) +-291 + j*(12) +-151 + j*(303) +156 + j*(231) +154 + j*(-16) +4 + j*(-32) +25 + j*(35) +49 + j*(-44) +-81 + j*(-60) +-117 + j*(100) +45 + j*(158) +107 + j*(18) +-14 + j*(-22) +-25 + j*(106) +119 + j*(108) +124 + j*(-33) +1 + j*(-24) +39 + j*(105) +204 + j*(71) +243 + j*(-117) +103 + j*(-262) +-107 + j*(-233) +-186 + j*(-18) +9 + j*(117) +169 + j*(-78) +-38 + j*(-264) +-255 + j*(-65) +-93 + j*(146) +71 + j*(24) +-35 + j*(-64) +-45 + j*(53) +103 + j*(7) +45 + j*(-185) +-169 + j*(-179) +-259 + j*(-13) +-221 + j*(146) +-75 + j*(259) +122 + j*(190) +117 + j*(1) +-24 + j*(11) +30 + j*(129) +163 + j*(53) +115 + j*(-79) +39 + j*(-78) +24 + j*(-94) +-67 + j*(-115) +-146 + j*(-1) +-71 + j*(117) +44 + j*(117) +119 + j*(50) +122 + j*(-75) +-22 + j*(-142) +-129 + j*(-4) +-5 + j*(119) +114 + j*(24) +69 + j*(-62) +50 + j*(-61) +43 + j*(-132) +-81 + j*(-155) +-127 + j*(-49) +-80 + j*(-35) +-148 + j*(-53) +-191 + j*(80) +-61 + j*(153) +-11 + j*(72) +-51 + j*(94) +46 + j*(123) +75 + j*(-23) +-107 + j*(-56) +-169 + j*(133) +-46 + j*(234) +39 + j*(260) +209 + j*(301) +429 + j*(98) +305 + j*(-234) +-11 + j*(-199) +-4 + j*(39) +181 + j*(17) +167 + j*(-130) +95 + j*(-141) +110 + j*(-161) +57 + j*(-264) +-107 + j*(-279) +-221 + j*(-151) +-187 + j*(2) +-64 + j*(31) +-30 + j*(-67) +-136 + j*(-105) +-219 + j*(-16) +-222 + j*(110) +-134 + j*(257) +118 + j*(292) +275 + j*(26) +51 + j*(-173) +-101 + j*(43) +176 + j*(127) +243 + j*(-247) +-187 + j*(-356) +-349 + j*(45) +-35 + j*(218) +104 + j*(-2) +-42 + j*(-104) +-130 + j*(-30) +-140 + j*(59) +-53 + j*(153) +100 + j*(58) +-21 + j*(-139) +-265 + j*(11) +-124 + j*(286) +123 + j*(177) +21 + j*(18) +-54 + j*(158) +110 + j*(206) +146 + j*(98) +148 + j*(144) +346 + j*(78) +331 + j*(-241) +21 + j*(-313) +-62 + j*(-134) +-5 + j*(-163) +-192 + j*(-202) +-315 + j*(64) +-100 + j*(282) +128 + j*(213) +204 + j*(84) +226 + j*(-52) +133 + j*(-189) +-13 + j*(-185) +-60 + j*(-127) +-117 + j*(-110) +-192 + j*(11) +-81 + j*(163) +76 + j*(117) +71 + j*(33) +98 + j*(65) +218 + j*(-32) +136 + j*(-245) +-103 + j*(-230) +-140 + j*(-43) +-17 + j*(-5) +2 + j*(-107) +-103 + j*(-146) +-204 + j*(-68) +-201 + j*(74) +-77 + j*(156) +43 + j*(87) +18 + j*(-26) +-78 + j*(-23) +-92 + j*(71) +-6 + j*(110) +65 + j*(51) +54 + j*(-28) +3 + j*(-69) +-63 + j*(-95) +-188 + j*(-63) +-260 + j*(119) +-112 + j*(305) +105 + j*(266) +153 + j*(124) +122 + j*(88) +158 + j*(67) +161 + j*(-8) +119 + j*(-23) +158 + j*(-27) +180 + j*(-141) +59 + j*(-246) +-91 + j*(-214) +-161 + j*(-121) +-182 + j*(-28) +-158 + j*(57) +-108 + j*(107) +-62 + j*(150) +40 + j*(182) +164 + j*(95) +141 + j*(-78) +-38 + j*(-122) +-150 + j*(40) +-28 + j*(221) +210 + j*(173) +235 + j*(-68) +36 + j*(-117) +44 + j*(62) +269 + j*(-25) +148 + j*(-341) +-221 + j*(-246) +-154 + j*(107) +140 + j*(24) +11 + j*(-214) +-194 + j*(-41) +-2 + j*(136) +152 + j*(-42) +34 + j*(-159) +0 + j*(-144) +-70 + j*(-254) +-342 + j*(-173) +-310 + j*(194) +59 + j*(204) +55 + j*(-135) +-282 + j*(-95) +-249 + j*(260) +87 + j*(286) +177 + j*(19) +3 + j*(-105) +-130 + j*(-4) +-79 + j*(127) +51 + j*(107) +32 + j*(-21) +-107 + j*(11) +-69 + j*(170) +93 + j*(142) +66 + j*(13) +-25 + j*(60) +45 + j*(134) +104 + j*(72) +62 + j*(64) +124 + j*(116) +233 + j*(27) +179 + j*(-120) +54 + j*(-121) +39 + j*(-40) +120 + j*(-28) +174 + j*(-146) +57 + j*(-303) +-192 + j*(-267) +-262 + j*(-21) +-100 + j*(103) +-4 + j*(28) +-45 + j*(-1) +-27 + j*(39) +15 + j*(4) +-26 + j*(-27) +-45 + j*(16) +-8 + j*(23) +-14 + j*(3) +-22 + j*(30) +24 + j*(40) +49 + j*(-11) +18 + j*(-54) +-32 + j*(-62) +-83 + j*(-26) +-80 + j*(49) +-13 + j*(76) +18 + j*(38) +1 + j*(34) +29 + j*(61) +78 + j*(30) +78 + j*(-23) +62 + j*(-53) +33 + j*(-89) +-33 + j*(-95) +-72 + j*(-38) +-35 + j*(1) +-16 + j*(-37) +-78 + j*(-54) +-124 + j*(26) +-56 + j*(110) +44 + j*(68) +13 + j*(-25) +-82 + j*(21) +-27 + j*(143) +125 + j*(108) +138 + j*(-32) +62 + j*(-75) +40 + j*(-86) +-35 + j*(-128) +-145 + j*(-28) +-37 + j*(131) +164 + j*(13) +54 + j*(-241) +-240 + j*(-185) +-275 + j*(87) +-105 + j*(175) +-54 + j*(129) +-41 + j*(175) +83 + j*(185) +124 + j*(48) +2 + j*(26) +26 + j*(180) +254 + j*(150) +280 + j*(-119) +47 + j*(-206) +-38 + j*(-61) +35 + j*(-46) +-37 + j*(-86) +-65 + j*(52) +115 + j*(58) +78 + j*(-153) +-162 + j*(-54) +6 + j*(223) +328 + j*(5) +98 + j*(-344) +-228 + j*(-127) +-13 + j*(134) +175 + j*(-97) +-51 + j*(-226) +-109 + j*(-45) +19 + j*(-105) +-165 + j*(-229) +-330 + j*(17) +-105 + j*(196) +25 + j*(25) +-117 + j*(-30) +-136 + j*(91) +-75 + j*(111) +-64 + j*(157) +81 + j*(193) +156 + j*(-6) +-69 + j*(-76) +-107 + j*(180) +178 + j*(200) +199 + j*(-71) +-4 + j*(-74) +49 + j*(42) +105 + j*(-75) +-48 + j*(-87) +-8 + j*(64) +129 + j*(-42) +-34 + j*(-173) +-140 + j*(16) +51 + j*(69) +30 + j*(-128) +-188 + j*(-42) +-73 + j*(185) +127 + j*(80) +44 + j*(-42) +45 + j*(36) +153 + j*(-95) +-71 + j*(-272) +-311 + j*(-13) +-74 + j*(242) +141 + j*(32) +-62 + j*(-125) +-179 + j*(77) +-16 + j*(167) +16 + j*(71) +-38 + j*(141) +119 + j*(219) +250 + j*(59) +155 + j*(-83) +79 + j*(-50) +105 + j*(-57) +56 + j*(-115) +-28 + j*(-63) +15 + j*(38) +155 + j*(28) +233 + j*(-149) +82 + j*(-362) +-228 + j*(-315) +-295 + j*(-9) +-49 + j*(83) +-19 + j*(-139) +-301 + j*(-110) +-281 + j*(252) +97 + j*(297) +186 + j*(-23) +-48 + j*(-92) +-55 + j*(87) +105 + j*(33) +14 + j*(-136) +-166 + j*(-42) +-105 + j*(145) +69 + j*(142) +126 + j*(14) +69 + j*(-76) +-10 + j*(-82) +-33 + j*(-52) +-43 + j*(-77) +-158 + j*(-76) +-227 + j*(112) +-27 + j*(276) +199 + j*(119) +109 + j*(-119) +-103 + j*(-88) +-129 + j*(78) +-34 + j*(158) +71 + j*(153) +141 + j*(63) +81 + j*(-21) +36 + j*(50) +183 + j*(53) +187 + j*(-201) +-153 + j*(-245) +-253 + j*(144) +149 + j*(292) +339 + j*(-86) +25 + j*(-294) +-154 + j*(-68) +-1 + j*(33) +15 + j*(-88) +-103 + j*(-47) +-32 + j*(57) +37 + j*(-40) +-107 + j*(-82) +-166 + j*(107) +23 + j*(222) +186 + j*(107) +190 + j*(-50) +103 + j*(-158) +-57 + j*(-165) +-136 + j*(8) +44 + j*(134) +214 + j*(-54) +40 + j*(-269) +-199 + j*(-137) +-110 + j*(89) +91 + j*(24) +50 + j*(-169) +-138 + j*(-184) +-230 + j*(-40) +-163 + j*(98) +-31 + j*(94) +-35 + j*(-19) +-166 + j*(23) +-93 + j*(205) +140 + j*(119) +37 + j*(-144) +-257 + j*(-19) +-130 + j*(305) +187 + j*(207) +112 + j*(-46) +-50 + j*(41) +73 + j*(127) +92 + j*(-15) +-51 + j*(43) +88 + j*(204) +276 + j*(23) +107 + j*(-150) +25 + j*(11) +241 + j*(-28) +145 + j*(-346) +-242 + j*(-277) +-223 + j*(87) +62 + j*(66) +-9 + j*(-175) +-272 + j*(-85) +-260 + j*(204) +-30 + j*(338) +209 + j*(269) +321 + j*(43) +205 + j*(-158) +29 + j*(-143) +21 + j*(-46) +69 + j*(-63) +43 + j*(-95) +40 + j*(-97) +26 + j*(-156) +-83 + j*(-180) +-163 + j*(-90) +-137 + j*(-2) +-98 + j*(28) +-65 + j*(42) +-40 + j*(33) +-45 + j*(40) +2 + j*(71) +71 + j*(3) +12 + j*(-86) +-49 + j*(-52) +-18 + j*(-75) +-158 + j*(-172) +-394 + j*(39) +-216 + j*(417) +215 + j*(356) +267 + j*(-4) +39 + j*(-91) +-21 + j*(19) +14 + j*(40) +23 + j*(61) +95 + j*(56) +98 + j*(-49) +4 + j*(-43) +59 + j*(7) +77 + j*(-148) +-192 + j*(-173) +-273 + j*(172) +69 + j*(319) +239 + j*(54) +88 + j*(-60) +86 + j*(-1) +102 + j*(-127) +-129 + j*(-129) +-141 + j*(173) +198 + j*(213) +281 + j*(-101) +58 + j*(-202) +4 + j*(-91) +53 + j*(-126) +-39 + j*(-185) +-129 + j*(-119) +-148 + j*(-39) +-126 + j*(63) +30 + j*(96) +95 + j*(-108) +-163 + j*(-204) +-314 + j*(91) +-50 + j*(296) +163 + j*(134) +129 + j*(0) +139 + j*(-59) +47 + j*(-234) +-250 + j*(-158) +-202 + j*(202) +178 + j*(155) +110 + j*(-235) +-288 + j*(-155) +-218 + j*(224) +96 + j*(153) +-20 + j*(-86) +-237 + j*(98) +-28 + j*(359) +277 + j*(214) +241 + j*(-70) +39 + j*(-107) +-6 + j*(23) +114 + j*(50) +146 + j*(-100) +-25 + j*(-165) +-116 + j*(1) +40 + j*(86) +90 + j*(-74) +-91 + j*(-78) +-48 + j*(143) +234 + j*(71) +175 + j*(-279) +-200 + j*(-285) +-286 + j*(40) +-75 + j*(151) +-17 + j*(57) +-71 + j*(105) +59 + j*(202) +235 + j*(68) +175 + j*(-158) +-39 + j*(-190) +-136 + j*(-37) +-61 + j*(75) +27 + j*(76) +87 + j*(53) +165 + j*(-28) +125 + j*(-212) +-119 + j*(-264) +-262 + j*(-40) +-106 + j*(139) +42 + j*(45) +-30 + j*(-46) +-74 + j*(23) +-8 + j*(40) +-19 + j*(-18) +-76 + j*(11) +-53 + j*(69) +-13 + j*(94) +71 + j*(114) +192 + j*(-9) +81 + j*(-239) +-222 + j*(-189) +-243 + j*(119) +6 + j*(170) +20 + j*(-16) +-153 + j*(39) +-67 + j*(248) +168 + j*(204) +190 + j*(6) +79 + j*(-42) +55 + j*(11) +116 + j*(11) +151 + j*(-91) +37 + j*(-217) +-189 + j*(-141) +-180 + j*(150) +139 + j*(216) +272 + j*(-98) +0 + j*(-273) +-162 + j*(-72) +-13 + j*(18) +-18 + j*(-144) +-253 + j*(-80) +-201 + j*(224) +119 + j*(223) +158 + j*(-62) +-76 + j*(-111) +-123 + j*(72) +-8 + j*(115) +5 + j*(85) +42 + j*(146) +187 + j*(103) +190 + j*(-75) +51 + j*(-117) +18 + j*(-45) +43 + j*(-53) +4 + j*(-48) +48 + j*(8) +132 + j*(-81) +28 + j*(-197) +-75 + j*(-110) +22 + j*(-79) +-21 + j*(-257) +-312 + j*(-221) +-363 + j*(127) +-65 + j*(267) +102 + j*(74) +8 + j*(-53) +-57 + j*(-21) +-49 + j*(-23) +-98 + j*(-45) +-168 + j*(1) +-192 + j*(103) +-134 + j*(218) +10 + j*(260) +124 + j*(185) +151 + j*(85) +132 + j*(1) +42 + j*(-52) +-50 + j*(34) +49 + j*(156) +209 + j*(53) +132 + j*(-117) +2 + j*(-72) +53 + j*(-21) +35 + j*(-124) +-127 + j*(-79) +-94 + j*(112) +71 + j*(101) +65 + j*(6) +58 + j*(45) +162 + j*(-21) +55 + j*(-196) +-175 + j*(-70) +-47 + j*(199) +252 + j*(92) +190 + j*(-209) +-69 + j*(-199) +-71 + j*(-8) +73 + j*(-34) +11 + j*(-181) +-168 + j*(-110) +-112 + j*(105) +133 + j*(71) +139 + j*(-204) +-138 + j*(-275) +-276 + j*(-60) +-179 + j*(93) +-94 + j*(119) +18 + j*(148) +162 + j*(6) +26 + j*(-228) +-247 + j*(-132) +-196 + j*(110) +-56 + j*(52) +-201 + j*(25) +-186 + j*(303) +185 + j*(322) +255 + j*(-55) +-76 + j*(-139) +-141 + j*(135) +88 + j*(190) +140 + j*(19) +35 + j*(-28) +-6 + j*(30) +34 + j*(95) +163 + j*(86) +219 + j*(-117) +-15 + j*(-264) +-230 + j*(-56) +-86 + j*(169) +83 + j*(84) +21 + j*(7) +28 + j*(96) +162 + j*(54) +146 + j*(-94) +45 + j*(-119) +13 + j*(-106) +-49 + j*(-112) +-103 + j*(-21) +-24 + j*(58) +58 + j*(6) +44 + j*(-64) +-5 + j*(-103) +-108 + j*(-93) +-155 + j*(63) +35 + j*(171) +190 + j*(-23) +7 + j*(-206) +-175 + j*(-45) +-35 + j*(121) +113 + j*(-3) +18 + j*(-146) +-119 + j*(-103) +-148 + j*(11) +-88 + j*(97) +18 + j*(88) +26 + j*(-2) +-47 + j*(23) +50 + j*(112) +197 + j*(-47) +23 + j*(-272) +-256 + j*(-141) +-197 + j*(119) +-28 + j*(103) +-75 + j*(49) +-61 + j*(182) +146 + j*(168) +223 + j*(-352) +-117 + j*(-362) +-214 + j*(-116) +-118 + j*(-18) +-79 + j*(3) +4 + j*(16) +34 + j*(-110) +-133 + j*(-130) +-123 + j*(67) +101 + j*(-2) +-35 + j*(-277) +-377 + j*(-114) +-243 + j*(260) +86 + j*(173) +13 + j*(-74) +-164 + j*(1) +-120 + j*(128) +-76 + j*(166) +41 + j*(252) +271 + j*(109) +152 + j*(-218) +-205 + j*(-132) +-139 + j*(202) +138 + j*(141) +63 + j*(-48) +-29 + j*(73) +163 + j*(103) +194 + j*(-156) +-71 + j*(-252) +-256 + j*(-65) +-218 + j*(179) +21 + j*(313) +284 + j*(127) +158 + j*(-184) +-140 + j*(-66) +32 + j*(200) +288 + j*(-52) +-25 + j*(-322) +-303 + j*(11) +8 + j*(266) +199 + j*(1) +-21 + j*(-95) +-13 + j*(100) +170 + j*(16) +52 + j*(-146) +-64 + j*(-15) +80 + j*(44) +100 + j*(-100) +-12 + j*(-95) +40 + j*(-29) +87 + j*(-139) +-32 + j*(-217) +-127 + j*(-185) +-219 + j*(-163) +-351 + j*(-13) +-260 + j*(244) +8 + j*(251) +52 + j*(61) +-82 + j*(55) +-55 + j*(198) +103 + j*(207) +172 + j*(102) +163 + j*(34) +175 + j*(-6) +187 + j*(-92) +112 + j*(-191) +-13 + j*(-187) +-48 + j*(-117) +-37 + j*(-129) +-129 + j*(-146) +-194 + j*(-21) +-95 + j*(64) +-56 + j*(-2) +-133 + j*(26) +-59 + j*(139) +74 + j*(41) +-53 + j*(-100) +-219 + j*(56) +-78 + j*(266) +144 + j*(188) +136 + j*(12) +25 + j*(2) +35 + j*(95) +173 + j*(95) +249 + j*(-93) +69 + j*(-274) +-174 + j*(-158) +-117 + j*(83) +91 + j*(48) +60 + j*(-139) +-109 + j*(-133) +-146 + j*(-28) +-153 + j*(18) +-174 + j*(133) +-21 + j*(262) +191 + j*(147) +131 + j*(-84) +-91 + j*(-60) +-91 + j*(168) +141 + j*(219) +254 + j*(37) +179 + j*(-83) +151 + j*(-97) +132 + j*(-204) +-59 + j*(-262) +-197 + j*(-70) +-52 + j*(82) +57 + j*(-21) +-24 + j*(-64) +4 + j*(2) +58 + j*(-95) +-100 + j*(-137) +-112 + j*(71) +148 + j*(45) +110 + j*(-274) +-224 + j*(-282) +-287 + j*(-44) +-231 + j*(-8) +-341 + j*(89) +-217 + j*(372) +134 + j*(326) +149 + j*(50) +1 + j*(65) +110 + j*(130) +159 + j*(-41) +-1 + j*(-98) +-35 + j*(-6) +-40 + j*(-34) +-161 + j*(46) +-49 + j*(272) +239 + j*(190) +215 + j*(-86) +18 + j*(-94) +22 + j*(13) +71 + j*(-9) +58 + j*(-19) +90 + j*(-33) +60 + j*(-100) +-13 + j*(-57) +71 + j*(-2) +117 + j*(-132) +-30 + j*(-194) +-86 + j*(-75) +-5 + j*(-81) +-77 + j*(-177) +-211 + j*(-114) +-216 + j*(12) +-179 + j*(95) +-92 + j*(181) +43 + j*(148) +42 + j*(47) +11 + j*(85) +128 + j*(83) +135 + j*(-89) +-26 + j*(-108) +-13 + j*(-4) +34 + j*(-100) +-165 + j*(-124) +-202 + j*(153) +97 + j*(221) +173 + j*(-41) +-33 + j*(-90) +-23 + j*(67) +114 + j*(-3) +16 + j*(-141) +-141 + j*(-59) +-120 + j*(104) +6 + j*(171) +139 + j*(124) +180 + j*(-7) +117 + j*(-78) +108 + j*(-89) +84 + j*(-193) +-108 + j*(-221) +-190 + j*(-8) +10 + j*(79) +62 + j*(-123) +-175 + j*(-160) +-235 + j*(95) +-3 + j*(199) +134 + j*(30) +48 + j*(-132) +-129 + j*(-153) +-287 + j*(-12) +-277 + j*(249) +-39 + j*(432) +274 + j*(365) +433 + j*(85) +322 + j*(-204) +59 + j*(-260) +-57 + j*(-103) +18 + j*(-27) +33 + j*(-77) +-15 + j*(-50) +49 + j*(-8) +103 + j*(-109) +4 + j*(-202) +-118 + j*(-167) +-178 + j*(-77) +-171 + j*(42) +-45 + j*(113) +62 + j*(-1) +-47 + j*(-123) +-185 + j*(-22) +-116 + j*(124) +4 + j*(99) +1 + j*(15) +-64 + j*(18) +-69 + j*(95) +28 + j*(132) +93 + j*(33) +-4 + j*(-34) +-49 + j*(76) +84 + j*(90) +58 + j*(-60) +-105 + j*(33) +72 + j*(223) +306 + j*(-32) +3 + j*(-308) +-298 + j*(17) +28 + j*(320) +315 + j*(13) +51 + j*(-237) +-146 + j*(-25) +-1 + j*(113) +62 + j*(49) +73 + j*(97) +251 + j*(71) +310 + j*(-189) +95 + j*(-368) +-134 + j*(-315) +-258 + j*(-168) +-263 + j*(39) +-74 + j*(165) +98 + j*(18) +-33 + j*(-171) +-260 + j*(-57) +-216 + j*(215) +39 + j*(288) +199 + j*(135) +175 + j*(-11) +128 + j*(-47) +139 + j*(-87) +107 + j*(-184) +-12 + j*(-233) +-125 + j*(-194) +-191 + j*(-104) +-168 + j*(8) +-58 + j*(2) +-112 + j*(-141) +-364 + j*(-62) +-354 + j*(296) +-7 + j*(395) +122 + j*(168) +4 + j*(133) +89 + j*(241) +245 + j*(127) +202 + j*(-16) +177 + j*(-44) +158 + j*(-179) +-78 + j*(-233) +-194 + j*(-3) +-25 + j*(98) +-21 + j*(-19) +-141 + j*(86) +23 + j*(247) +190 + j*(107) +105 + j*(16) +142 + j*(83) +241 + j*(-56) +65 + j*(-168) +5 + j*(20) +246 + j*(1) +198 + j*(-315) +-134 + j*(-306) +-176 + j*(-57) +-74 + j*(-21) +-92 + j*(25) +76 + j*(118) +253 + j*(-148) +-59 + j*(-423) +-412 + j*(-146) +-233 + j*(209) +33 + j*(124) +-13 + j*(-18) +-54 + j*(36) +2 + j*(25) +-38 + j*(-10) +-30 + j*(65) +95 + j*(10) +16 + j*(-184) +-251 + j*(-123) +-256 + j*(179) +20 + j*(262) +134 + j*(60) +3 + j*(-25) +-24 + j*(76) +87 + j*(51) +25 + j*(-78) +-124 + j*(8) +-28 + j*(175) +152 + j*(83) +81 + j*(-86) +-64 + j*(-41) +-49 + j*(65) +-4 + j*(88) +44 + j*(122) +156 + j*(86) +158 + j*(-56) +40 + j*(-72) +57 + j*(4) +123 + j*(-68) +23 + j*(-143) +-40 + j*(-57) +34 + j*(-45) +-11 + j*(-144) +-154 + j*(-81) +-125 + j*(83) +10 + j*(102) +62 + j*(28) +48 + j*(-32) +-8 + j*(-69) +-83 + j*(-17) +-49 + j*(91) +76 + j*(95) +133 + j*(-16) +76 + j*(-117) +-46 + j*(-124) +-100 + j*(-6) +15 + j*(78) +121 + j*(-42) +18 + j*(-172) +-105 + j*(-120) +-112 + j*(-68) +-171 + j*(-49) +-202 + j*(98) +-40 + j*(182) +48 + j*(47) +-74 + j*(1) +-91 + j*(130) +13 + j*(153) +28 + j*(134) +112 + j*(191) +283 + j*(66) +190 + j*(-181) +-50 + j*(-140) +-25 + j*(47) +116 + j*(8) +77 + j*(-105) +-1 + j*(-88) +-8 + j*(-64) +-26 + j*(-51) +-6 + j*(-22) +13 + j*(-75) +-98 + j*(-91) +-134 + j*(87) +96 + j*(171) +262 + j*(-78) +49 + j*(-341) +-283 + j*(-235) +-309 + j*(95) +-49 + j*(218) +96 + j*(40) +-30 + j*(-72) +-94 + j*(37) +9 + j*(51) +-33 + j*(-47) +-124 + j*(53) +39 + j*(127) +79 + j*(-116) +-263 + j*(-139) +-325 + j*(289) +103 + j*(416) +244 + j*(88) +29 + j*(35) +117 + j*(213) +332 + j*(40) +176 + j*(-206) +-27 + j*(-109) +34 + j*(4) +69 + j*(-52) +26 + j*(-38) +86 + j*(-21) +98 + j*(-133) +-35 + j*(-187) +-146 + j*(-99) +-163 + j*(30) +-75 + j*(153) +102 + j*(144) +151 + j*(-22) +29 + j*(-74) +21 + j*(30) +142 + j*(8) +147 + j*(-128) +60 + j*(-193) +-25 + j*(-213) +-138 + j*(-165) +-137 + j*(-36) +-25 + j*(-57) +-117 + j*(-185) +-313 + j*(-41) +-186 + j*(215) +73 + j*(129) +10 + j*(-91) +-188 + j*(-33) +-156 + j*(150) +-1 + j*(170) +66 + j*(65) +9 + j*(-28) +-105 + j*(-4) +-117 + j*(129) +7 + j*(177) +62 + j*(92) +2 + j*(70) +-1 + j*(146) +91 + j*(202) +249 + j*(173) +368 + j*(-40) +200 + j*(-308) +-124 + j*(-233) +-95 + j*(58) +148 + j*(-4) +25 + j*(-247) +-243 + j*(-95) +-110 + j*(173) +111 + j*(69) +13 + j*(-80) +-71 + j*(30) +45 + j*(75) +62 + j*(-25) +-4 + j*(-7) +66 + j*(32) +112 + j*(-86) +-21 + j*(-180) +-173 + j*(-95) +-192 + j*(79) +-62 + j*(213) +132 + j*(177) +175 + j*(3) +57 + j*(-47) +61 + j*(55) +217 + j*(21) +240 + j*(-191) +69 + j*(-334) +-145 + j*(-303) +-267 + j*(-139) +-214 + j*(37) +-87 + j*(57) +-81 + j*(0) +-100 + j*(49) +-11 + j*(47) +-57 + j*(-75) +-234 + j*(18) +-134 + j*(261) +125 + j*(190) +74 + j*(-13) +-49 + j*(70) +92 + j*(134) +115 + j*(-39) +-58 + j*(3) +84 + j*(188) +326 + j*(-57) +28 + j*(-380) +-365 + j*(-95) +-148 + j*(321) +235 + j*(210) +224 + j*(-69) +118 + j*(-110) +112 + j*(-178) +-54 + j*(-281) +-257 + j*(-122) +-157 + j*(101) +25 + j*(32) +-56 + j*(-122) +-231 + j*(-43) +-213 + j*(147) +-79 + j*(205) +-19 + j*(182) +27 + j*(203) +136 + j*(184) +176 + j*(63) +98 + j*(25) +138 + j*(98) +284 + j*(-20) +152 + j*(-266) +-157 + j*(-163) +-75 + j*(167) +272 + j*(98) +243 + j*(-262) +-79 + j*(-310) +-180 + j*(-104) +-121 + j*(-22) +-129 + j*(17) +-73 + j*(122) +73 + j*(115) +127 + j*(-4) +89 + j*(-89) +13 + j*(-136) +-88 + j*(-99) +-75 + j*(14) +24 + j*(-11) +-43 + j*(-105) +-148 + j*(16) +12 + j*(148) +184 + j*(-37) +13 + j*(-256) +-235 + j*(-158) +-253 + j*(63) +-132 + j*(175) +7 + j*(188) +121 + j*(86) +82 + j*(-61) +-48 + j*(-65) +-71 + j*(22) +-37 + j*(45) +-30 + j*(61) +25 + j*(79) +67 + j*(5) +-13 + j*(-47) +-65 + j*(34) +18 + j*(83) +67 + j*(-1) +-18 + j*(-66) +-122 + j*(-3) +-121 + j*(146) +42 + j*(250) +243 + j*(139) +220 + j*(-100) +18 + j*(-141) +-32 + j*(-6) +63 + j*(11) +41 + j*(-72) +-39 + j*(-31) +7 + j*(40) +64 + j*(-4) +33 + j*(-47) +13 + j*(-38) +-11 + j*(-57) +-86 + j*(-13) +-52 + j*(140) +160 + j*(158) +261 + j*(-52) +122 + j*(-205) +4 + j*(-161) +17 + j*(-146) +-57 + j*(-216) +-218 + j*(-132) +-185 + j*(71) +6 + j*(81) +26 + j*(-89) +-151 + j*(-119) +-225 + j*(56) +-95 + j*(184) +45 + j*(132) +45 + j*(26) +-18 + j*(23) +0 + j*(76) +54 + j*(44) +15 + j*(1) +-4 + j*(78) +135 + j*(101) +208 + j*(-83) +43 + j*(-216) +-100 + j*(-126) +-80 + j*(-51) +-107 + j*(-56) +-152 + j*(42) +-45 + j*(132) +49 + j*(54) +0 + j*(1) +0 + j*(45) +58 + j*(7) +15 + j*(-72) +-64 + j*(-62) +-104 + j*(-23) +-142 + j*(49) +-80 + j*(156) +31 + j*(118) +-28 + j*(48) +-75 + j*(192) +141 + j*(274) +272 + j*(69) +136 + j*(-35) +148 + j*(63) +301 + j*(-52) +177 + j*(-295) +-89 + j*(-259) +-163 + j*(-65) +-95 + j*(74) +64 + j*(137) +232 + j*(-18) +102 + j*(-238) +-108 + j*(-122) +47 + j*(31) +162 + j*(-208) +-146 + j*(-344) +-315 + j*(-50) +-107 + j*(96) +-50 + j*(-24) +-119 + j*(23) +-1 + j*(54) +-10 + j*(-113) +-206 + j*(-80) +-172 + j*(90) +-112 + j*(31) +-278 + j*(105) +-152 + j*(428) +272 + j*(356) +274 + j*(-40) +-8 + j*(-49) +43 + j*(140) +188 + j*(39) +100 + j*(-66) +71 + j*(-19) +104 + j*(-89) +-40 + j*(-136) +-99 + j*(35) +70 + j*(86) +100 + j*(-71) +-41 + j*(-81) +-35 + j*(41) +64 + j*(29) +54 + j*(-48) +4 + j*(-39) +16 + j*(-15) +30 + j*(-28) +23 + j*(-38) +37 + j*(-33) +69 + j*(-82) +5 + j*(-177) +-146 + j*(-139) +-141 + j*(26) +6 + j*(3) +-82 + j*(-157) +-302 + j*(-16) +-176 + j*(260) +77 + j*(187) +21 + j*(42) +0 + j*(155) +213 + j*(106) +161 + j*(-171) +-105 + j*(-142) +-74 + j*(41) +-6 + j*(-48) +-200 + j*(-20) +-127 + j*(281) +233 + j*(215) +174 + j*(-139) +-139 + j*(-53) +-16 + j*(238) +275 + j*(110) +204 + j*(-158) +18 + j*(-156) +-12 + j*(-95) +-54 + j*(-97) +-115 + j*(-15) +-56 + j*(88) +47 + j*(91) +103 + j*(29) +100 + j*(-44) +52 + j*(-76) +48 + j*(-64) +62 + j*(-144) +-107 + j*(-223) +-295 + j*(-20) +-124 + j*(269) +211 + j*(180) +210 + j*(-136) +-30 + j*(-187) +-75 + j*(-37) +23 + j*(-43) +-26 + j*(-152) +-160 + j*(-112) +-173 + j*(-1) +-141 + j*(27) +-179 + j*(72) +-134 + j*(211) +62 + j*(235) +153 + j*(57) +18 + j*(-49) +-91 + j*(59) +-9 + j*(190) +154 + j*(190) +287 + j*(50) +264 + j*(-194) +-6 + j*(-338) +-285 + j*(-137) +-204 + j*(201) +122 + j*(242) +264 + j*(-21) +90 + j*(-225) +-133 + j*(-137) +-104 + j*(73) +94 + j*(60) +81 + j*(-141) +-124 + j*(-130) +-107 + j*(52) +30 + j*(-14) +-123 + j*(-132) +-267 + j*(105) +-4 + j*(286) +173 + j*(42) +-68 + j*(-75) +-126 + j*(203) +191 + j*(258) +284 + j*(-37) +79 + j*(-140) +24 + j*(-43) +53 + j*(-62) +-16 + j*(-51) +40 + j*(43) +168 + j*(-70) +23 + j*(-254) +-206 + j*(-125) +-115 + j*(107) +86 + j*(30) +-8 + j*(-153) +-216 + j*(-48) +-146 + j*(204) +122 + j*(213) +206 + j*(-9) +70 + j*(-124) +-12 + j*(-57) +35 + j*(-30) +35 + j*(-92) +-35 + j*(-102) +-54 + j*(-55) +-30 + j*(-59) +-64 + j*(-103) +-161 + j*(-87) +-221 + j*(37) +-135 + j*(186) +44 + j*(175) +94 + j*(25) +1 + j*(-35) +-40 + j*(4) +-54 + j*(4) +-107 + j*(71) +4 + j*(193) +194 + j*(51) +24 + j*(-204) +-309 + j*(-17) +-148 + j*(399) +307 + j*(319) +320 + j*(-84) +30 + j*(-134) +13 + j*(58) +161 + j*(40) +166 + j*(-69) +151 + j*(-122) +107 + j*(-256) +-153 + j*(-310) +-333 + j*(-22) +-107 + j*(238) +148 + j*(95) +56 + j*(-95) +-53 + j*(-16) +44 + j*(20) +18 + j*(-106) +-148 + j*(-36) +-59 + j*(171) +180 + j*(93) +134 + j*(-147) +-69 + j*(-138) +-74 + j*(8) +19 + j*(6) +6 + j*(-56) +-35 + j*(-47) +-35 + j*(-32) +-45 + j*(-34) +-56 + j*(-30) +-88 + j*(-30) +-137 + j*(29) +-98 + j*(129) +4 + j*(142) +40 + j*(108) +86 + j*(119) +192 + j*(45) +163 + j*(-137) +-23 + j*(-178) +-109 + j*(-47) +-45 + j*(38) +23 + j*(16) +29 + j*(-38) +-18 + j*(-78) +-82 + j*(-54) +-97 + j*(-8) +-124 + j*(24) +-136 + j*(148) +54 + j*(250) +238 + j*(50) +54 + j*(-159) +-132 + j*(24) +81 + j*(172) +197 + j*(-84) +-91 + j*(-178) +-169 + j*(130) +138 + j*(212) +238 + j*(-50) +71 + j*(-148) +27 + j*(-93) +21 + j*(-141) +-101 + j*(-151) +-175 + j*(-35) +-143 + j*(88) +-20 + j*(175) +168 + j*(91) +126 + j*(-157) +-150 + j*(-144) +-145 + j*(139) +122 + j*(133) +107 + j*(-90) +-35 + j*(-45) +81 + j*(3) +63 + j*(-230) +-289 + j*(-218) +-350 + j*(189) +14 + j*(330) +170 + j*(72) +-1 + j*(-24) +-21 + j*(124) +160 + j*(117) +177 + j*(-96) +-41 + j*(-163) +-151 + j*(40) +27 + j*(177) +166 + j*(32) +45 + j*(-67) +13 + j*(75) +225 + j*(71) +252 + j*(-197) +13 + j*(-288) +-76 + j*(-163) +-52 + j*(-177) +-203 + j*(-203) +-318 + j*(5) +-170 + j*(200) +23 + j*(168) +77 + j*(37) +5 + j*(-57) +-119 + j*(-8) +-84 + j*(159) +120 + j*(156) +163 + j*(-39) +38 + j*(-105) +2 + j*(-85) +-69 + j*(-130) +-208 + j*(-8) +-69 + j*(190) +144 + j*(28) +-67 + j*(-190) +-315 + j*(65) +-78 + j*(351) +194 + j*(199) +129 + j*(35) +116 + j*(79) +212 + j*(-13) +105 + j*(-165) +-42 + j*(-103) +-18 + j*(-26) +-33 + j*(-53) +-98 + j*(36) +28 + j*(151) +187 + j*(27) +95 + j*(-152) +-76 + j*(-102) +-53 + j*(45) +81 + j*(30) +79 + j*(-110) +-73 + j*(-139) +-142 + j*(-1) +-56 + j*(91) +11 + j*(70) +44 + j*(74) +137 + j*(27) +115 + j*(-141) +-91 + j*(-153) +-125 + j*(53) +66 + j*(93) +107 + j*(-72) +-11 + j*(-115) +-41 + j*(-74) +-77 + j*(-88) +-153 + j*(-8) +-74 + j*(104) +13 + j*(44) +-59 + j*(32) +12 + j*(166) +238 + j*(53) +144 + j*(-252) +-177 + j*(-214) +-190 + j*(52) +-13 + j*(71) +-35 + j*(-33) +-102 + j*(30) +-28 + j*(89) +14 + j*(33) +-23 + j*(18) +-9 + j*(43) +12 + j*(16) +-22 + j*(-2) +-42 + j*(20) +-49 + j*(36) +-61 + j*(78) +-13 + j*(137) +71 + j*(127) +106 + j*(69) +105 + j*(23) +86 + j*(-14) +47 + j*(-19) +42 + j*(12) +81 + j*(4) +81 + j*(-41) +54 + j*(-64) +29 + j*(-87) +-44 + j*(-96) +-117 + j*(-6) +-57 + j*(128) +97 + j*(144) +198 + j*(35) +192 + j*(-114) +61 + j*(-221) +-120 + j*(-144) +-91 + j*(68) +144 + j*(69) +187 + j*(-185) +-45 + j*(-290) +-186 + j*(-134) +-126 + j*(-23) +-78 + j*(-33) +-77 + j*(-47) +-109 + j*(-83) +-236 + j*(-37) +-226 + j*(202) +79 + j*(271) +223 + j*(-45) +-52 + j*(-234) +-246 + j*(-39) +-148 + j*(95) +-148 + j*(66) +-197 + j*(212) +18 + j*(345) +206 + j*(161) +88 + j*(6) +4 + j*(106) +112 + j*(158) +176 + j*(88) +209 + j*(41) +247 + j*(-77) +134 + j*(-211) +-4 + j*(-175) +-25 + j*(-144) +-153 + j*(-154) +-265 + j*(98) +23 + j*(327) +317 + j*(71) +131 + j*(-193) +-20 + j*(-42) +173 + j*(-32) +96 + j*(-317) +-264 + j*(-239) +-225 + j*(116) +62 + j*(96) +35 + j*(-115) +-110 + j*(-95) +-129 + j*(-40) +-211 + j*(5) +-209 + j*(233) +86 + j*(327) +258 + j*(68) +91 + j*(-89) +32 + j*(23) +170 + j*(-24) +79 + j*(-250) +-222 + j*(-204) +-284 + j*(109) +-35 + j*(264) +156 + j*(127) +106 + j*(-33) +9 + j*(1) +76 + j*(74) +187 + j*(-17) +138 + j*(-182) +-18 + j*(-234) +-148 + j*(-174) +-220 + j*(-49) +-185 + j*(90) +-85 + j*(149) +-6 + j*(161) +112 + j*(158) +230 + j*(0) +107 + j*(-209) +-117 + j*(-146) +-82 + j*(18) +-1 + j*(-53) +-151 + j*(-81) +-170 + j*(132) +49 + j*(147) +28 + j*(-42) +-135 + j*(54) +24 + j*(213) +176 + j*(22) +-32 + j*(-86) +-86 + j*(156) +201 + j*(181) +238 + j*(-119) +-22 + j*(-173) +-73 + j*(19) +60 + j*(59) +112 + j*(-21) +105 + j*(-103) +6 + j*(-199) +-177 + j*(-119) +-129 + j*(101) +83 + j*(54) +-2 + j*(-140) +-205 + j*(7) +-2 + j*(243) +291 + j*(10) +77 + j*(-358) +-356 + j*(-235) +-397 + j*(187) +-103 + j*(388) +156 + j*(310) +265 + j*(131) +234 + j*(-39) +114 + j*(-98) +68 + j*(-42) +121 + j*(-46) +118 + j*(-134) +43 + j*(-175) +-6 + j*(-183) +-94 + j*(-211) +-239 + j*(-127) +-238 + j*(78) +-62 + j*(156) +25 + j*(55) +-22 + j*(17) +-8 + j*(59) +60 + j*(25) +52 + j*(-66) +-31 + j*(-122) +-165 + j*(-97) +-246 + j*(84) +-81 + j*(274) +169 + j*(173) +129 + j*(-61) +-41 + j*(-42) +-1 + j*(53) +28 + j*(-37) +-127 + j*(-18) +-95 + j*(196) +140 + j*(185) +142 + j*(-6) +23 + j*(27) +132 + j*(103) +218 + j*(-57) +79 + j*(-162) +8 + j*(-87) +34 + j*(-99) +-49 + j*(-119) +-70 + j*(-13) +31 + j*(-25) +-42 + j*(-132) +-174 + j*(-13) +-49 + j*(132) +66 + j*(23) +-40 + j*(-21) +-6 + j*(108) +163 + j*(21) +55 + j*(-175) +-128 + j*(-65) +-13 + j*(71) +65 + j*(-69) +-99 + j*(-96) +-74 + j*(76) +100 + j*(-28) +-100 + j*(-233) +-386 + j*(34) +-129 + j*(409) +279 + j*(222) +163 + j*(-144) +-134 + j*(-53) +-40 + j*(199) +188 + j*(122) +153 + j*(-63) +43 + j*(-46) +86 + j*(-2) +121 + j*(-87) +28 + j*(-152) +-52 + j*(-89) +-8 + j*(-25) +50 + j*(-85) +-23 + j*(-180) +-165 + j*(-146) +-204 + j*(-16) +-154 + j*(54) +-144 + j*(88) +-98 + j*(173) +43 + j*(182) +98 + j*(55) +8 + j*(6) +-11 + j*(95) +104 + j*(115) +175 + j*(6) +135 + j*(-130) +-28 + j*(-204) +-218 + j*(-63) +-127 + j*(205) +177 + j*(165) +170 + j*(-130) +-81 + j*(-122) +-25 + j*(62) +99 + j*(-93) +-175 + j*(-198) +-305 + j*(164) +71 + j*(327) +210 + j*(6) +-46 + j*(-25) +81 + j*(217) +372 + j*(-47) +49 + j*(-410) +-353 + j*(-103) +-105 + j*(274) +185 + j*(89) +45 + j*(-71) +21 + j*(68) +194 + j*(-9) +76 + j*(-224) +-145 + j*(-120) +-81 + j*(67) +43 + j*(45) +63 + j*(8) +141 + j*(-40) +125 + j*(-245) +-159 + j*(-333) +-387 + j*(-76) +-262 + j*(242) +52 + j*(285) +228 + j*(51) +97 + j*(-194) +-165 + j*(-156) +-192 + j*(86) +6 + j*(148) +72 + j*(6) +-21 + j*(-44) +-42 + j*(8) +-21 + j*(-8) +-69 + j*(-26) +-122 + j*(25) +-125 + j*(115) +-47 + j*(216) +127 + j*(212) +209 + j*(37) +93 + j*(-69) +43 + j*(0) +126 + j*(-35) +35 + j*(-187) +-184 + j*(-109) +-168 + j*(132) +25 + j*(175) +89 + j*(71) +62 + j*(46) +91 + j*(54) +129 + j*(8) +129 + j*(-59) +84 + j*(-127) +-25 + j*(-149) +-112 + j*(-56) +-74 + j*(61) +32 + j*(75) +75 + j*(9) +45 + j*(-30) +35 + j*(-6) +99 + j*(-19) +99 + j*(-148) +-78 + j*(-198) +-180 + j*(-15) +-16 + j*(105) +88 + j*(-45) +-67 + j*(-121) +-122 + j*(45) +47 + j*(96) +112 + j*(-54) +18 + j*(-138) +-59 + j*(-147) +-173 + j*(-126) +-249 + j*(50) +-78 + j*(206) +102 + j*(76) +4 + j*(-79) +-115 + j*(8) +-25 + j*(96) +45 + j*(4) +-52 + j*(-67) +-154 + j*(13) +-117 + j*(154) +38 + j*(181) +104 + j*(40) +-29 + j*(-26) +-80 + j*(121) +78 + j*(172) +119 + j*(44) +52 + j*(59) +178 + j*(81) +203 + j*(-158) +-105 + j*(-211) +-176 + j*(105) +100 + j*(158) +86 + j*(-57) +-78 + j*(70) +170 + j*(234) +381 + j*(-73) +115 + j*(-324) +-103 + j*(-158) +-21 + j*(-47) +-13 + j*(-86) +-24 + j*(-48) +26 + j*(-95) +-98 + j*(-156) +-170 + j*(23) +34 + j*(74) +33 + j*(-156) +-228 + j*(-105) +-163 + j*(162) +49 + j*(91) +-55 + j*(-23) +-78 + j*(143) +136 + j*(117) +88 + j*(-100) +-74 + j*(-24) +45 + j*(58) +47 + j*(-107) +-160 + j*(-49) +-60 + j*(171) +133 + j*(49) +-1 + j*(-78) +-38 + j*(78) +146 + j*(24) +27 + j*(-180) +-169 + j*(-9) +54 + j*(150) +183 + j*(-133) +-143 + j*(-261) +-291 + j*(56) +-34 + j*(204) +76 + j*(14) +-81 + j*(-49) +-136 + j*(98) +-8 + j*(189) +109 + j*(116) +85 + j*(4) +-1 + j*(27) +54 + j*(110) +161 + j*(28) +81 + j*(-88) +-9 + j*(-13) +81 + j*(32) +89 + j*(-84) +-42 + j*(-56) +25 + j*(90) +211 + j*(2) +165 + j*(-228) +-50 + j*(-291) +-224 + j*(-180) +-269 + j*(36) +-84 + j*(199) +123 + j*(67) +13 + j*(-132) +-170 + j*(-20) +-52 + j*(141) +76 + j*(28) +-49 + j*(-59) +-116 + j*(81) +17 + j*(170) +146 + j*(95) +168 + j*(-48) +49 + j*(-161) +-111 + j*(-78) +-35 + j*(81) +108 + j*(-36) +-85 + j*(-177) +-255 + j*(91) +52 + j*(313) +323 + j*(22) +112 + j*(-261) +-116 + j*(-156) +-99 + j*(-52) +-137 + j*(-53) +-193 + j*(76) +-76 + j*(194) +32 + j*(173) +106 + j*(176) +270 + j*(93) +274 + j*(-181) +8 + j*(-296) +-151 + j*(-134) +-101 + j*(-42) +-129 + j*(-54) +-191 + j*(64) +-76 + j*(199) +84 + j*(156) +115 + j*(51) +105 + j*(1) +103 + j*(-62) +23 + j*(-135) +-111 + j*(-93) +-134 + j*(71) +18 + j*(165) +168 + j*(69) +170 + j*(-89) +86 + j*(-190) +-62 + j*(-257) +-286 + j*(-156) +-298 + j*(162) +30 + j*(271) +175 + j*(-34) +-128 + j*(-179) +-298 + j*(134) +-25 + j*(361) +221 + j*(213) +233 + j*(49) +245 + j*(-49) +184 + j*(-243) +-98 + j*(-312) +-303 + j*(-71) +-190 + j*(200) +52 + j*(226) +160 + j*(67) +76 + j*(-42) +1 + j*(37) +141 + j*(112) +286 + j*(-86) +103 + j*(-325) +-180 + j*(-226) +-165 + j*(12) +-15 + j*(30) +-6 + j*(-50) +-42 + j*(-57) +-66 + j*(-71) +-141 + j*(-52) +-167 + j*(64) +-81 + j*(138) +-5 + j*(130) +53 + j*(117) +122 + j*(42) +70 + j*(-81) +-72 + j*(-55) +-62 + j*(87) +76 + j*(93) +98 + j*(-37) +-18 + j*(-68) +-57 + j*(47) +69 + j*(101) +165 + j*(-36) +36 + j*(-178) +-132 + j*(-77) +-51 + j*(88) +105 + j*(7) +21 + j*(-148) +-135 + j*(-89) +-132 + j*(34) +-95 + j*(84) +-34 + j*(168) +147 + j*(148) +190 + j*(-71) +-7 + j*(-144) +-42 + j*(10) +92 + j*(-43) +-45 + j*(-206) +-257 + j*(-30) +-90 + j*(206) +115 + j*(66) +-11 + j*(-71) +-69 + j*(61) +85 + j*(42) +-3 + j*(-151) +-255 + j*(-30) +-164 + j*(272) +136 + j*(253) +180 + j*(23) +35 + j*(-36) +-21 + j*(70) +77 + j*(161) +246 + j*(105) +296 + j*(-127) +86 + j*(-293) +-139 + j*(-175) +-122 + j*(16) +-23 + j*(62) +29 + j*(76) +148 + j*(69) +228 + j*(-103) +88 + j*(-265) +-78 + j*(-213) +-85 + j*(-136) +-115 + j*(-165) +-247 + j*(-107) +-253 + j*(92) +-76 + j*(185) +58 + j*(76) +3 + j*(-54) +-125 + j*(-25) +-125 + j*(115) +2 + j*(161) +76 + j*(91) +89 + j*(49) +140 + j*(-18) +88 + j*(-181) +-148 + j*(-204) +-255 + j*(20) +-112 + j*(158) +-23 + j*(98) +-56 + j*(100) +-4 + j*(156) +62 + j*(124) +68 + j*(116) +159 + j*(119) +223 + j*(-42) +63 + j*(-168) +-75 + j*(-52) +-2 + j*(51) +45 + j*(11) +22 + j*(23) +86 + j*(39) +112 + j*(-45) +52 + j*(-62) +90 + j*(-48) +91 + j*(-175) +-97 + j*(-210) +-167 + j*(-32) +-47 + j*(19) +-75 + j*(-48) +-134 + j*(64) +28 + j*(141) +114 + j*(-26) +-23 + j*(-104) +-72 + j*(-25) +-67 + j*(-39) +-186 + j*(16) +-132 + j*(243) +148 + j*(263) +255 + j*(40) +181 + j*(-93) +116 + j*(-193) +-99 + j*(-260) +-295 + j*(-11) +-73 + j*(253) +186 + j*(70) +24 + j*(-122) +-80 + j*(49) +122 + j*(68) +71 + j*(-155) +-151 + j*(-36) +57 + j*(177) +284 + j*(-136) +-108 + j*(-418) +-460 + j*(-14) +-102 + j*(373) +259 + j*(76) +0 + j*(-238) +-278 + j*(4) +-77 + j*(258) +132 + j*(125) +50 + j*(5) +30 + j*(89) +156 + j*(59) +136 + j*(-91) +25 + j*(-89) +60 + j*(-50) +67 + j*(-173) +-136 + j*(-235) +-296 + j*(-33) +-186 + j*(202) +47 + j*(213) +152 + j*(32) +25 + j*(-130) +-182 + j*(-38) +-134 + j*(219) +156 + j*(234) +235 + j*(-38) +19 + j*(-140) +-61 + j*(23) +84 + j*(67) +126 + j*(-87) +-25 + j*(-165) +-162 + j*(-55) +-124 + j*(133) +90 + j*(179) +211 + j*(-38) +13 + j*(-212) +-182 + j*(-48) +-60 + j*(128) +51 + j*(36) +-46 + j*(10) +-1 + j*(147) +177 + j*(74) +106 + j*(-110) +-42 + j*(-34) +55 + j*(71) +138 + j*(-32) +71 + j*(-79) +117 + j*(-62) +138 + j*(-248) +-153 + j*(-356) +-378 + j*(-59) +-158 + j*(226) +103 + j*(93) +21 + j*(-108) +-128 + j*(-50) +-100 + j*(57) +-52 + j*(62) +-37 + j*(88) +56 + j*(103) +120 + j*(-14) +18 + j*(-119) +-86 + j*(-52) +-49 + j*(19) +-28 + j*(-16) +-78 + j*(4) +-28 + j*(66) +40 + j*(-21) +-94 + j*(-110) +-235 + j*(46) +-122 + j*(244) +82 + j*(224) +149 + j*(86) +103 + j*(-18) +2 + j*(-36) +-35 + j*(56) +57 + j*(84) +52 + j*(-11) +-54 + j*(59) +101 + j*(197) +290 + j*(-27) +21 + j*(-250) +-200 + j*(57) +144 + j*(256) +317 + j*(-111) +-35 + j*(-231) +-62 + j*(93) +255 + j*(8) +97 + j*(-315) +-196 + j*(-134) +-5 + j*(62) +65 + j*(-169) +-229 + j*(-138) +-146 + j*(197) +177 + j*(89) +48 + j*(-173) +-131 + j*(-8) +79 + j*(94) +136 + j*(-148) +-89 + j*(-189) +-98 + j*(-37) +-33 + j*(-115) +-235 + j*(-156) +-340 + j*(135) +-59 + j*(346) +229 + j*(163) +170 + j*(-139) +-100 + j*(-177) +-182 + j*(55) +35 + j*(134) +83 + j*(-104) +-205 + j*(-132) +-235 + j*(199) +92 + j*(236) +101 + j*(-49) +-137 + j*(12) +4 + j*(226) +203 + j*(23) +-34 + j*(-153) +-190 + j*(95) +35 + j*(227) +117 + j*(71) +25 + j*(83) +146 + j*(158) +243 + j*(-14) +93 + j*(-117) +33 + j*(-8) +132 + j*(-5) +119 + j*(-95) +81 + j*(-100) +89 + j*(-154) +-29 + j*(-220) +-136 + j*(-104) +-52 + j*(-29) +-68 + j*(-131) +-256 + j*(-42) +-174 + j*(246) +167 + j*(237) +245 + j*(-77) +22 + j*(-215) +-128 + j*(-107) +-121 + j*(9) +-64 + j*(64) +8 + j*(53) +4 + j*(-2) +-37 + j*(31) +57 + j*(78) +134 + j*(-76) +-64 + j*(-196) +-221 + j*(20) +-8 + j*(187) +134 + j*(-31) +-113 + j*(-128) +-178 + j*(175) +181 + j*(239) +266 + j*(-146) +-107 + j*(-251) +-209 + j*(91) +103 + j*(182) +199 + j*(-104) +-37 + j*(-228) +-179 + j*(-75) +-117 + j*(39) +-67 + j*(19) +-123 + j*(6) +-182 + j*(136) +-29 + j*(314) +270 + j*(224) +297 + j*(-118) +5 + j*(-243) +-147 + j*(-53) +-59 + j*(62) +-13 + j*(42) +6 + j*(65) +78 + j*(22) +16 + j*(-84) +-120 + j*(-11) +-54 + j*(141) +86 + j*(102) +69 + j*(6) +18 + j*(23) +39 + j*(59) +78 + j*(63) +129 + j*(35) +130 + j*(-42) +67 + j*(-43) +124 + j*(16) +233 + j*(-110) +101 + j*(-299) +-107 + j*(-228) +-93 + j*(-87) +-44 + j*(-103) +-73 + j*(-93) +-12 + j*(-100) +-74 + j*(-272) +-402 + j*(-230) +-477 + j*(182) +-138 + j*(373) +49 + j*(196) +-4 + j*(135) +72 + j*(177) +160 + j*(41) +48 + j*(-70) +-42 + j*(-15) +-48 + j*(32) +-59 + j*(100) +64 + j*(181) +217 + j*(40) +97 + j*(-146) +-69 + j*(-56) +16 + j*(49) +51 + j*(-58) +-100 + j*(-43) +-62 + j*(161) +190 + j*(142) +240 + j*(-128) +1 + j*(-267) +-202 + j*(-106) +-123 + j*(113) +81 + j*(69) +27 + j*(-138) +-227 + j*(-65) +-180 + j*(252) +156 + j*(284) +272 + j*(17) +142 + j*(-124) +55 + j*(-136) +-46 + j*(-150) +-151 + j*(-18) +-26 + j*(148) +173 + j*(47) +125 + j*(-160) +-49 + j*(-190) +-146 + j*(-95) +-146 + j*(23) +-39 + j*(73) +-4 + j*(-42) +-192 + j*(-47) +-214 + j*(250) +153 + j*(349) +335 + j*(-4) +52 + j*(-206) +-117 + j*(13) +78 + j*(148) +223 + j*(-25) +107 + j*(-204) +-91 + j*(-177) +-137 + j*(24) +80 + j*(119) +240 + j*(-135) +-16 + j*(-385) +-337 + j*(-204) +-276 + j*(81) +-131 + j*(95) +-144 + j*(98) +-69 + j*(190) +58 + j*(122) +11 + j*(36) +-13 + j*(97) +72 + j*(85) +51 + j*(5) +15 + j*(36) +71 + j*(20) +8 + j*(-52) +-58 + j*(57) +110 + j*(100) +132 + j*(-136) +-168 + j*(-152) +-199 + j*(187) +130 + j*(242) +191 + j*(-30) +-13 + j*(-49) +32 + j*(131) +248 + j*(64) +243 + j*(-201) +-5 + j*(-322) +-230 + j*(-169) +-196 + j*(75) +-16 + j*(98) +-35 + j*(-2) +-109 + j*(129) +127 + j*(247) +310 + j*(-20) +88 + j*(-214) +-17 + j*(-38) +181 + j*(-79) +35 + j*(-376) +-369 + j*(-230) +-305 + j*(204) +51 + j*(236) +142 + j*(31) +117 + j*(-63) +76 + j*(-205) +-181 + j*(-262) +-340 + j*(21) +-110 + j*(234) +94 + j*(80) +-3 + j*(-83) +-133 + j*(-50) +-197 + j*(47) +-180 + j*(219) +45 + j*(315) +223 + j*(128) +105 + j*(-37) +23 + j*(57) +156 + j*(66) +145 + j*(-112) +-32 + j*(-117) +-41 + j*(13) +35 + j*(-1) +-9 + j*(-37) +-20 + j*(28) +58 + j*(18) +37 + j*(-65) +-47 + j*(-47) +-27 + j*(33) +58 + j*(1) +15 + j*(-119) +-175 + j*(-94) +-216 + j*(169) +78 + j*(308) +295 + j*(36) +76 + j*(-201) +-128 + j*(-14) +61 + j*(145) +202 + j*(-52) +37 + j*(-194) +-88 + j*(-111) +-111 + j*(-56) +-168 + j*(45) +-43 + j*(217) +190 + j*(112) +100 + j*(-115) +-81 + j*(7) +115 + j*(171) +320 + j*(-76) +110 + j*(-345) +-170 + j*(-251) +-202 + j*(-48) +-118 + j*(45) +-31 + j*(53) +4 + j*(-3) +-32 + j*(0) +56 + j*(38) +139 + j*(-158) +-148 + j*(-346) +-462 + j*(-49) +-251 + j*(342) +106 + j*(250) +93 + j*(13) +-2 + j*(1) +-17 + j*(-29) +-165 + j*(-13) +-170 + j*(245) +145 + j*(297) +227 + j*(16) +27 + j*(-17) +124 + j*(132) +296 + j*(-95) +11 + j*(-325) +-241 + j*(-57) +-6 + j*(150) +126 + j*(-81) +-124 + j*(-161) +-195 + j*(89) +9 + j*(161) +58 + j*(30) +-7 + j*(32) +46 + j*(65) +68 + j*(-27) +-42 + j*(-48) +-82 + j*(63) +6 + j*(127) +64 + j*(95) +73 + j*(83) +127 + j*(93) +195 + j*(22) +158 + j*(-81) +71 + j*(-58) +144 + j*(21) +292 + j*(-108) +192 + j*(-371) +-107 + j*(-387) +-221 + j*(-170) +-129 + j*(-66) +-102 + j*(-100) +-140 + j*(-81) +-131 + j*(-42) +-135 + j*(-43) +-150 + j*(-1) +-105 + j*(19) +-119 + j*(-37) +-231 + j*(11) +-203 + j*(185) +-24 + j*(214) +26 + j*(82) +-66 + j*(65) +-45 + j*(161) +74 + j*(134) +50 + j*(-1) +-112 + j*(23) +-123 + j*(243) +134 + j*(355) +374 + j*(153) +311 + j*(-141) +69 + j*(-212) +-59 + j*(-82) +-23 + j*(46) +91 + j*(78) +191 + j*(-21) +141 + j*(-179) +-24 + j*(-198) +-78 + j*(-90) +-41 + j*(-75) +-111 + j*(-91) +-164 + j*(45) +-13 + j*(144) +105 + j*(21) +13 + j*(-90) +-83 + j*(-31) +-72 + j*(54) +-16 + j*(114) +120 + j*(117) +209 + j*(-67) +25 + j*(-232) +-168 + j*(-74) +-19 + j*(94) +112 + j*(-90) +-132 + j*(-218) +-303 + j*(52) +-74 + j*(267) +127 + j*(127) +59 + j*(10) +42 + j*(67) +127 + j*(27) +88 + j*(-70) +38 + j*(-35) +120 + j*(-59) +69 + j*(-244) +-210 + j*(-252) +-332 + j*(38) +-124 + j*(254) +103 + j*(177) +129 + j*(16) +62 + j*(-56) +-5 + j*(-55) +-28 + j*(-5) +31 + j*(23) +71 + j*(-66) +-43 + j*(-142) +-154 + j*(-28) +-56 + j*(91) +49 + j*(-14) +-91 + j*(-120) +-241 + j*(49) +-97 + j*(265) +147 + j*(204) +175 + j*(4) +71 + j*(-74) +1 + j*(-69) +-74 + j*(-44) +-116 + j*(86) +41 + j*(211) +260 + j*(69) +173 + j*(-223) +-151 + j*(-216) +-218 + j*(95) +50 + j*(211) +184 + j*(-8) +11 + j*(-132) +-96 + j*(4) +8 + j*(103) +95 + j*(48) +112 + j*(-3) +138 + j*(-74) +71 + j*(-193) +-90 + j*(-191) +-160 + j*(-76) +-156 + j*(2) +-149 + j*(106) +6 + j*(211) +207 + j*(63) +96 + j*(-185) +-151 + j*(-116) +-106 + j*(91) +28 + j*(43) +-65 + j*(-14) +-70 + j*(153) +167 + j*(157) +202 + j*(-108) +-39 + j*(-171) +-103 + j*(11) +18 + j*(47) +8 + j*(-15) +-13 + j*(47) +106 + j*(54) +124 + j*(-97) +-13 + j*(-128) +-19 + j*(-32) +59 + j*(-93) +-58 + j*(-210) +-235 + j*(-93) +-173 + j*(105) +-12 + j*(91) +-19 + j*(-16) +-87 + j*(3) +-59 + j*(40) +-63 + j*(-13) +-190 + j*(8) +-238 + j*(218) +-28 + j*(414) +288 + j*(330) +379 + j*(11) +155 + j*(-177) +-21 + j*(-29) +142 + j*(110) +308 + j*(-112) +76 + j*(-364) +-228 + j*(-204) +-165 + j*(69) +11 + j*(55) +-9 + j*(-9) +11 + j*(54) +137 + j*(-18) +57 + j*(-210) +-174 + j*(-170) +-202 + j*(40) +-80 + j*(119) +-4 + j*(99) +57 + j*(72) +91 + j*(-23) +2 + j*(-104) +-105 + j*(-46) +-95 + j*(64) +-4 + j*(102) +67 + j*(42) +27 + j*(-38) +-49 + j*(8) +37 + j*(84) +137 + j*(-60) +-59 + j*(-211) +-276 + j*(-4) +-111 + j*(245) +100 + j*(150) +39 + j*(45) +44 + j*(131) +165 + j*(78) +103 + j*(-25) +91 + j*(86) +328 + j*(23) +293 + j*(-351) +-117 + j*(-438) +-303 + j*(-141) +-199 + j*(38) +-134 + j*(95) +3 + j*(163) +148 + j*(17) +15 + j*(-133) +-74 + j*(6) +112 + j*(-8) +0 + j*(-288) +-395 + j*(-139) +-284 + j*(327) +161 + j*(292) +171 + j*(-38) +-12 + j*(-35) +43 + j*(32) +42 + j*(-57) +-28 + j*(-5) +96 + j*(-1) +39 + j*(-228) +-286 + j*(-150) +-209 + j*(217) +135 + j*(122) +-25 + j*(-186) +-325 + j*(42) +-75 + j*(346) +185 + j*(126) +-11 + j*(-35) +-67 + j*(190) +208 + j*(199) +223 + j*(-86) +-15 + j*(-120) +-46 + j*(49) +71 + j*(74) +103 + j*(-5) +66 + j*(-67) +-37 + j*(-75) +-94 + j*(66) +62 + j*(173) +192 + j*(35) +88 + j*(-50) +105 + j*(66) +313 + j*(-35) +223 + j*(-352) +-117 + j*(-362) +-214 + j*(-116) +-118 + j*(-18) +-79 + j*(3) +4 + j*(16) +34 + j*(-110) +-133 + j*(-130) +-123 + j*(67) +101 + j*(-2) +-35 + j*(-277) +-377 + j*(-114) +-243 + j*(260) +86 + j*(173) +13 + j*(-74) +-164 + j*(1) +-120 + j*(128) +-76 + j*(166) +41 + j*(252) +271 + j*(109) +152 + j*(-218) +-205 + j*(-132) +-139 + j*(202) +138 + j*(141) +63 + j*(-48) +-29 + j*(73) +163 + j*(103) +194 + j*(-156) +-71 + j*(-252) +-256 + j*(-65) +-218 + j*(179) +21 + j*(313) +284 + j*(127) +158 + j*(-184) +-140 + j*(-66) +32 + j*(200) +288 + j*(-52) +-25 + j*(-322) +-303 + j*(11) +8 + j*(266) +199 + j*(1) +-21 + j*(-95) +-13 + j*(100) +170 + j*(16) +52 + j*(-146) +-64 + j*(-15) +80 + j*(44) +100 + j*(-100) +-12 + j*(-95) +40 + j*(-29) +87 + j*(-139) +-32 + j*(-217) +-127 + j*(-185) +-219 + j*(-163) +-351 + j*(-13) +-260 + j*(244) +8 + j*(251) +52 + j*(61) +-82 + j*(55) +-55 + j*(198) +103 + j*(207) +172 + j*(102) +163 + j*(34) +175 + j*(-6) +187 + j*(-92) +112 + j*(-191) +-13 + j*(-187) +-48 + j*(-117) +-37 + j*(-129) +-129 + j*(-146) +-194 + j*(-21) +-95 + j*(64) +-56 + j*(-2) +-133 + j*(26) +-59 + j*(139) +74 + j*(41) +-53 + j*(-100) +-219 + j*(56) +-78 + j*(266) +144 + j*(188) +136 + j*(12) +25 + j*(2) +35 + j*(95) +173 + j*(95) +249 + j*(-93) +69 + j*(-274) +-174 + j*(-158) +-117 + j*(83) +91 + j*(48) +60 + j*(-139) +-109 + j*(-133) +-146 + j*(-28) +-153 + j*(18) +-174 + j*(133) +-21 + j*(262) +191 + j*(147) +131 + j*(-84) +-91 + j*(-60) +-91 + j*(168) +141 + j*(219) +254 + j*(37) +179 + j*(-83) +151 + j*(-97) +132 + j*(-204) +-59 + j*(-262) +-197 + j*(-70) +-52 + j*(82) +57 + j*(-21) +-24 + j*(-64) +4 + j*(2) +58 + j*(-95) +-100 + j*(-137) +-112 + j*(71) +148 + j*(45) +110 + j*(-274) +-224 + j*(-282) +-287 + j*(-44) +-231 + j*(-8) +-341 + j*(89) +-217 + j*(372) +134 + j*(326) +149 + j*(50) +1 + j*(65) +110 + j*(130) +159 + j*(-41) +-1 + j*(-98) +-35 + j*(-6) +-40 + j*(-34) +-161 + j*(46) +-49 + j*(272) +239 + j*(190) +215 + j*(-86) +18 + j*(-94) +22 + j*(13) +71 + j*(-9) +58 + j*(-19) +90 + j*(-33) +60 + j*(-100) +-13 + j*(-57) +71 + j*(-2) +117 + j*(-132) +-30 + j*(-194) +-86 + j*(-75) +-5 + j*(-81) +138 + j*(169) +171 + j*(-16) +31 + j*(-37) +76 + j*(78) +231 + j*(-36) +105 + j*(-274) +-192 + j*(-209) +-205 + j*(77) +11 + j*(123) +16 + j*(-23) +-105 + j*(62) +64 + j*(218) +275 + j*(9) +74 + j*(-238) +-168 + j*(-60) +-8 + j*(139) +133 + j*(-11) +-16 + j*(-84) +-25 + j*(78) +161 + j*(52) +138 + j*(-136) +-6 + j*(-127) +21 + j*(-45) +83 + j*(-111) +18 + j*(-208) +-103 + j*(-223) +-221 + j*(-151) +-252 + j*(-1) +-166 + j*(93) +-98 + j*(93) +-58 + j*(98) +-4 + j*(57) +-63 + j*(-6) +-138 + j*(103) +16 + j*(211) +146 + j*(52) +10 + j*(-53) +-27 + j*(73) +110 + j*(28) +-1 + j*(-129) +-175 + j*(21) +-14 + j*(196) +130 + j*(52) +11 + j*(-21) +27 + j*(103) +193 + j*(16) +107 + j*(-202) +-131 + j*(-188) +-225 + j*(0) +-151 + j*(190) +72 + j*(253) +236 + j*(65) +118 + j*(-120) +0 + j*(-57) +58 + j*(-48) +-39 + j*(-142) +-183 + j*(23) +5 + j*(203) +180 + j*(36) +63 + j*(-68) +97 + j*(18) +214 + j*(-175) +-72 + j*(-381) +-351 + j*(-119) +-185 + j*(129) +-79 + j*(41) +-179 + j*(95) +-40 + j*(252) +127 + j*(124) +24 + j*(40) +58 + j*(175) +269 + j*(78) +195 + j*(-171) +1 + j*(-156) +-3 + j*(-79) +-44 + j*(-112) +-129 + j*(-7) +-21 + j*(110) +84 + j*(32) +48 + j*(-4) +119 + j*(15) +174 + j*(-157) +-36 + j*(-284) +-210 + j*(-117) +-117 + j*(38) +-27 + j*(-5) +-57 + j*(-45) +-81 + j*(-31) +-107 + j*(-19) +-129 + j*(36) +-92 + j*(88) +-56 + j*(98) +-28 + j*(129) +60 + j*(140) +129 + j*(58) +108 + j*(-37) +47 + j*(-77) +-11 + j*(-66) +-13 + j*(-17) +44 + j*(-52) +-26 + j*(-168) +-223 + j*(-115) +-238 + j*(111) +-64 + j*(192) +21 + j*(105) +-16 + j*(61) +-45 + j*(96) +-6 + j*(173) +145 + j*(181) +225 + j*(-13) +28 + j*(-133) +-81 + j*(72) +163 + j*(156) +250 + j*(-125) +-13 + j*(-226) +-88 + j*(-43) +2 + j*(-64) +-158 + j*(-110) +-231 + j*(163) +66 + j*(300) +243 + j*(77) +145 + j*(-66) +91 + j*(-82) +-3 + j*(-118) +-97 + j*(46) +150 + j*(188) +357 + j*(-127) +28 + j*(-403) +-263 + j*(-116) +-34 + j*(139) +162 + j*(-49) +13 + j*(-190) +-71 + j*(-94) +-10 + j*(-69) +-17 + j*(-113) +-30 + j*(-117) +-39 + j*(-168) +-137 + j*(-205) +-234 + j*(-144) +-278 + j*(-71) +-324 + j*(36) +-268 + j*(194) +-107 + j*(233) +-40 + j*(147) +-77 + j*(115) +-82 + j*(144) +-68 + j*(184) +1 + j*(250) +151 + j*(223) +182 + j*(59) +47 + j*(4) +1 + j*(134) +144 + j*(217) +321 + j*(108) +336 + j*(-132) +124 + j*(-289) +-108 + j*(-170) +-71 + j*(62) +132 + j*(80) +207 + j*(-77) +137 + j*(-212) +-21 + j*(-270) +-189 + j*(-154) +-143 + j*(55) +40 + j*(48) +29 + j*(-76) +-23 + j*(-30) +86 + j*(-61) +-16 + j*(-259) +-301 + j*(-136) +-191 + j*(176) +76 + j*(64) +-82 + j*(-138) +-248 + j*(69) +-47 + j*(208) +20 + j*(65) +-73 + j*(123) +99 + j*(208) +180 + j*(-16) +-52 + j*(-37) +25 + j*(211) +308 + j*(54) +112 + j*(-242) +-138 + j*(-21) +132 + j*(167) +282 + j*(-146) +-18 + j*(-290) +-132 + j*(-64) +-1 + j*(-25) +-52 + j*(-86) +-66 + j*(31) +93 + j*(6) +41 + j*(-172) +-129 + j*(-120) +-83 + j*(-8) +-58 + j*(-74) +-164 + j*(-30) +-86 + j*(102) +34 + j*(-6) +-129 + j*(-104) +-228 + j*(110) +-2 + j*(228) +122 + j*(19) +-69 + j*(-95) +-194 + j*(75) +-91 + j*(233) +55 + j*(252) +185 + j*(220) +327 + j*(85) +330 + j*(-186) +59 + j*(-378) +-275 + j*(-226) +-273 + j*(152) +69 + j*(266) +235 + j*(-11) +22 + j*(-172) +-91 + j*(0) +83 + j*(44) +72 + j*(-172) +-193 + j*(-160) +-221 + j*(110) +-21 + j*(165) +-10 + j*(71) +-45 + j*(179) +176 + j*(250) +351 + j*(4) +187 + j*(-248) +-58 + j*(-215) +-134 + j*(-49) +-70 + j*(90) +96 + j*(116) +197 + j*(-52) +59 + j*(-202) +-98 + j*(-122) +-70 + j*(-14) +-54 + j*(-15) +-69 + j*(80) +129 + j*(153) +303 + j*(-96) +85 + j*(-378) +-241 + j*(-274) +-278 + j*(-6) +-146 + j*(123) +7 + j*(137) +139 + j*(-3) +30 + j*(-230) +-274 + j*(-177) +-313 + j*(152) +-42 + j*(278) +115 + j*(126) +76 + j*(6) +21 + j*(-25) +-47 + j*(-20) +-79 + j*(77) +37 + j*(151) +155 + j*(52) +115 + j*(-82) +19 + j*(-114) +-53 + j*(-88) +-88 + j*(-23) +-47 + j*(28) +-21 + j*(-10) +-91 + j*(-20) +-108 + j*(88) +8 + j*(125) +48 + j*(22) +-56 + j*(-13) +-115 + j*(101) +-33 + j*(222) +136 + j*(245) +288 + j*(110) +260 + j*(-110) +67 + j*(-175) +-20 + j*(-52) +64 + j*(-1) +83 + j*(-84) +-3 + j*(-98) +-11 + j*(-27) +53 + j*(-38) +29 + j*(-122) +-88 + j*(-127) +-158 + j*(-10) +-103 + j*(127) +46 + j*(177) +194 + j*(92) +219 + j*(-91) +73 + j*(-203) +-47 + j*(-112) +50 + j*(-37) +113 + j*(-226) +-173 + j*(-369) +-459 + j*(-75) +-267 + j*(309) +103 + j*(266) +158 + j*(7) +39 + j*(-69) +-4 + j*(-54) +-42 + j*(-57) +-64 + j*(-7) +-15 + j*(-8) +-68 + j*(-75) +-190 + j*(26) +-75 + j*(214) +159 + j*(127) +119 + j*(-120) +-113 + j*(-125) +-154 + j*(73) +-1 + j*(133) +53 + j*(23) +-35 + j*(-5) +-37 + j*(91) +76 + j*(78) +54 + j*(-48) +-77 + j*(-11) +-22 + j*(120) +104 + j*(47) +5 + j*(-65) +-92 + j*(55) +28 + j*(141) +81 + j*(59) +44 + j*(87) +179 + j*(117) +244 + j*(-84) +56 + j*(-171) +18 + j*(-42) +110 + j*(-112) +-64 + j*(-203) +-151 + j*(35) +129 + j*(78) +115 + j*(-264) +-286 + j*(-228) +-276 + j*(174) +35 + j*(175) +-31 + j*(3) +-115 + j*(204) +204 + j*(310) +392 + j*(-6) +218 + j*(-228) +87 + j*(-224) +16 + j*(-268) +-153 + j*(-245) +-214 + j*(-83) +-144 + j*(-13) +-146 + j*(-17) +-177 + j*(42) +-155 + j*(139) +-41 + j*(238) +184 + j*(183) +202 + j*(-103) +-98 + j*(-148) +-96 + j*(172) +290 + j*(103) +187 + j*(-378) +-361 + j*(-303) +-335 + j*(233) +112 + j*(228) +70 + j*(-117) +-220 + j*(-16) +-105 + j*(269) +175 + j*(218) +240 + j*(-1) +139 + j*(-170) +-76 + j*(-202) +-206 + j*(-1) +-41 + j*(163) +97 + j*(21) +-49 + j*(-71) +-110 + j*(96) +61 + j*(147) +104 + j*(8) +9 + j*(-8) +31 + j*(57) +87 + j*(23) +74 + j*(-18) +83 + j*(-41) +50 + j*(-121) +-93 + j*(-125) +-170 + j*(37) +-49 + j*(194) +160 + j*(169) +248 + j*(-33) +101 + j*(-201) +-77 + j*(-106) +16 + j*(42) +153 + j*(-100) +-37 + j*(-273) +-260 + j*(-90) +-132 + j*(139) +43 + j*(68) +-6 + j*(-21) +-18 + j*(41) +70 + j*(1) +-1 + j*(-109) +-128 + j*(-21) +-35 + j*(126) +136 + j*(49) +116 + j*(-148) +-77 + j*(-223) +-245 + j*(-94) +-228 + j*(111) +-66 + j*(186) +25 + j*(107) +-4 + j*(63) +-1 + j*(93) +39 + j*(82) +38 + j*(65) +63 + j*(76) +94 + j*(30) +45 + j*(6) +70 + j*(89) +226 + j*(30) +187 + j*(-206) +-70 + j*(-217) +-106 + j*(1) +54 + j*(12) +25 + j*(-103) +-43 + j*(-42) +50 + j*(-44) +-26 + j*(-195) +-242 + j*(-65) +-86 + j*(187) +168 + j*(5) +-59 + j*(-237) +-286 + j*(36) +18 + j*(249) +221 + j*(-82) +-111 + j*(-298) +-361 + j*(-28) +-236 + j*(218) +-90 + j*(258) +46 + j*(279) +197 + j*(146) +99 + j*(-45) +-68 + j*(61) +70 + j*(210) +206 + j*(71) +90 + j*(-3) +121 + j*(132) +343 + j*(42) +306 + j*(-258) +44 + j*(-334) +-93 + j*(-221) +-117 + j*(-137) +-129 + j*(-74) +-117 + j*(-31) +-138 + j*(6) +-113 + j*(123) +61 + j*(161) +150 + j*(2) +51 + j*(-83) +28 + j*(-44) +50 + j*(-108) +-72 + j*(-148) +-126 + j*(-25) +-35 + j*(-13) +-116 + j*(-93) +-243 + j*(79) +-44 + j*(286) +213 + j*(133) +146 + j*(-103) +-11 + j*(-98) +-22 + j*(-30) +-7 + j*(-33) +-11 + j*(-42) +-28 + j*(-73) +-112 + j*(-69) +-141 + j*(33) +-66 + j*(71) +-74 + j*(28) +-130 + j*(108) +-23 + j*(220) +121 + j*(146) +100 + j*(47) +80 + j*(74) +177 + j*(49) +192 + j*(-122) +4 + j*(-225) +-177 + j*(-88) +-115 + j*(122) +74 + j*(116) +81 + j*(-32) +-33 + j*(-11) +33 + j*(89) +124 + j*(-4) +15 + j*(-59) +33 + j*(91) +272 + j*(5) +190 + j*(-344) +-204 + j*(-337) +-279 + j*(-7) +-79 + j*(77) +-61 + j*(-11) +-98 + j*(45) +-18 + j*(73) +-5 + j*(12) +-30 + j*(23) +-7 + j*(-3) +-117 + j*(-27) +-175 + j*(190) +113 + j*(332) +339 + j*(58) +153 + j*(-180) +-6 + j*(-69) +95 + j*(-9) +112 + j*(-137) +5 + j*(-180) +-50 + j*(-175) +-165 + j*(-189) +-298 + j*(-45) +-235 + j*(155) +-98 + j*(201) +-30 + j*(216) +103 + j*(233) +236 + j*(89) +165 + j*(-84) +43 + j*(-76) +48 + j*(-39) +39 + j*(-93) +-65 + j*(-92) +-103 + j*(33) +16 + j*(115) +131 + j*(11) +40 + j*(-123) +-109 + j*(-20) +25 + j*(151) +238 + j*(-4) +93 + j*(-249) +-129 + j*(-137) +-25 + j*(4) +26 + j*(-148) +-188 + j*(-151) +-175 + j*(78) +18 + j*(22) +-127 + j*(-142) +-316 + j*(84) +-95 + j*(322) +147 + j*(190) +126 + j*(31) +100 + j*(-28) +6 + j*(-132) +-205 + j*(-31) +-122 + j*(247) +168 + j*(197) +136 + j*(-45) +-29 + j*(11) +76 + j*(120) +163 + j*(-8) +53 + j*(-73) +34 + j*(-1) +80 + j*(-33) +23 + j*(-58) +38 + j*(-1) +97 + j*(-74) +-21 + j*(-153) +-113 + j*(-23) +-6 + j*(59) +35 + j*(-18) +-14 + j*(3) +79 + j*(45) +146 + j*(-105) +-11 + j*(-223) +-163 + j*(-120) +-147 + j*(15) +-73 + j*(63) +-5 + j*(44) +-18 + j*(-26) +-122 + j*(21) +-46 + j*(200) +216 + j*(142) +220 + j*(-159) +-49 + j*(-223) +-127 + j*(-42) +-32 + j*(-11) +-76 + j*(-63) +-124 + j*(33) +-28 + j*(82) +-2 + j*(9) +-49 + j*(31) +21 + j*(60) +26 + j*(-55) +-136 + j*(-30) +-95 + j*(194) +192 + j*(163) +202 + j*(-169) +-139 + j*(-247) +-292 + j*(45) +-106 + j*(243) +64 + j*(181) +78 + j*(105) +98 + j*(102) +156 + j*(51) +143 + j*(-47) +60 + j*(-82) +14 + j*(-37) +42 + j*(-9) +54 + j*(-51) +-11 + j*(-55) +-8 + j*(37) +132 + j*(31) +141 + j*(-167) +-99 + j*(-227) +-214 + j*(21) +16 + j*(170) +176 + j*(-35) +1 + j*(-192) +-143 + j*(-53) +-38 + j*(50) +16 + j*(-36) +-76 + j*(-49) +-75 + j*(47) +4 + j*(50) +15 + j*(9) +35 + j*(7) +62 + j*(-85) +-89 + j*(-181) +-284 + j*(-24) +-200 + j*(250) +75 + j*(296) +235 + j*(119) +209 + j*(-78) +54 + j*(-180) +-109 + j*(-104) +-86 + j*(60) +50 + j*(40) +-7 + j*(-86) +-163 + j*(18) +-50 + j*(236) +219 + j*(178) +261 + j*(-81) +93 + j*(-204) +-46 + j*(-151) +-62 + j*(-53) +9 + j*(-37) +-6 + j*(-150) +-204 + j*(-142) +-251 + j*(129) +44 + j*(235) +179 + j*(-49) +-92 + j*(-185) +-224 + j*(63) +-23 + j*(180) +44 + j*(37) +-61 + j*(49) +11 + j*(160) +138 + j*(74) +73 + j*(-49) +-30 + j*(-4) +-8 + j*(94) +106 + j*(132) +247 + j*(18) +187 + j*(-228) +-112 + j*(-264) +-233 + j*(19) +-22 + j*(182) +129 + j*(60) +98 + j*(-37) +78 + j*(-68) +28 + j*(-122) +-53 + j*(-83) +-20 + j*(-33) +-34 + j*(-88) +-128 + j*(-16) +-5 + j*(105) +121 + j*(-70) +-107 + j*(-190) +-213 + j*(73) +61 + j*(124) +12 + j*(-165) +-330 + j*(-8) +-106 + j*(413) +366 + j*(186) +166 + j*(-272) +-235 + j*(-93) +-61 + j*(252) +247 + j*(101) +165 + j*(-173) +-52 + j*(-185) +-144 + j*(-51) +-87 + j*(78) +44 + j*(53) +-8 + j*(-77) +-158 + j*(33) +-1 + j*(223) +214 + j*(47) +35 + j*(-146) +-105 + j*(49) +132 + j*(135) +194 + j*(-134) +-62 + j*(-203) +-132 + j*(-12) +-42 + j*(33) +-53 + j*(45) +37 + j*(127) +180 + j*(4) +67 + j*(-156) +-43 + j*(-66) +58 + j*(-57) +-21 + j*(-222) +-253 + j*(-117) +-170 + j*(121) +4 + j*(33) +-148 + j*(-78) +-264 + j*(141) +-60 + j*(298) +76 + j*(199) +69 + j*(198) +254 + j*(226) +409 + j*(-74) +118 + j*(-368) +-250 + j*(-156) +-117 + j*(216) +229 + j*(144) +211 + j*(-153) +4 + j*(-170) +17 + j*(-78) +25 + j*(-194) +-210 + j*(-213) +-315 + j*(76) +-71 + j*(266) +132 + j*(136) +108 + j*(-1) +71 + j*(-26) +48 + j*(-62) +-4 + j*(-49) +31 + j*(-17) +52 + j*(-103) +-76 + j*(-139) +-118 + j*(-13) +-18 + j*(-8) +-95 + j*(-107) +-242 + j*(40) +-76 + j*(244) +146 + j*(102) +25 + j*(-105) +-175 + j*(8) +-96 + j*(219) +109 + j*(235) +243 + j*(102) +238 + j*(-103) +35 + j*(-230) +-175 + j*(-71) +-66 + j*(175) +197 + j*(110) +174 + j*(-141) +-46 + j*(-141) +-14 + j*(55) +214 + j*(-29) +127 + j*(-362) +-308 + j*(-368) +-463 + j*(72) +-127 + j*(339) +137 + j*(142) +37 + j*(-33) +-33 + j*(45) +71 + j*(40) +31 + j*(-100) +-148 + j*(-56) +-133 + j*(151) +80 + j*(188) +175 + j*(-13) +-8 + j*(-161) +-218 + j*(16) +-62 + j*(306) +307 + j*(204) +282 + j*(-192) +-77 + j*(-222) +-102 + j*(70) +148 + j*(46) +76 + j*(-195) +-163 + j*(-113) +-102 + j*(98) +49 + j*(60) +26 + j*(-11) +32 + j*(3) +41 + j*(-80) +-122 + j*(-91) +-158 + j*(142) +111 + j*(235) +263 + j*(-9) +100 + j*(-180) +-24 + j*(-112) +-10 + j*(-76) +-56 + j*(-92) +-91 + j*(-4) +8 + j*(40) +39 + j*(-65) +-73 + j*(-80) +-68 + j*(33) +44 + j*(-6) +-33 + j*(-130) +-175 + j*(-30) +-64 + j*(118) +66 + j*(-15) +-110 + j*(-141) +-264 + j*(64) +-81 + j*(255) +96 + j*(142) +45 + j*(30) +16 + j*(57) +28 + j*(26) +-52 + j*(40) +-20 + j*(188) +189 + j*(180) +245 + j*(-30) +107 + j*(-127) +26 + j*(-82) +10 + j*(-51) +16 + j*(-8) +87 + j*(-27) +52 + j*(-146) +-113 + j*(-113) +-96 + j*(65) +66 + j*(48) +40 + j*(-81) +-51 + j*(-44) +-7 + j*(-4) +-27 + j*(-67) +-122 + j*(-4) +-56 + j*(119) +57 + j*(86) +60 + j*(37) +102 + j*(34) +138 + j*(-71) +28 + j*(-156) +-66 + j*(-100) +-81 + j*(-52) +-119 + j*(24) +-2 + j*(164) +234 + j*(32) +120 + j*(-280) +-211 + j*(-208) +-163 + j*(80) +48 + j*(6) +-82 + j*(-158) +-237 + j*(8) +-83 + j*(151) +16 + j*(23) +-105 + j*(-33) +-162 + j*(88) +-88 + j*(173) +-7 + j*(180) +49 + j*(146) +41 + j*(116) +52 + j*(172) +192 + j*(187) +280 + j*(25) +190 + j*(-87) +165 + j*(-76) +192 + j*(-189) +2 + j*(-319) +-212 + j*(-167) +-150 + j*(40) +-28 + j*(29) +-51 + j*(-14) +-64 + j*(33) +-37 + j*(63) +-5 + j*(105) +121 + j*(116) +203 + j*(-59) +33 + j*(-202) +-124 + j*(-63) +-6 + j*(66) +93 + j*(-57) +-46 + j*(-152) +-161 + j*(-16) +-57 + j*(126) +104 + j*(80) +132 + j*(-82) +4 + j*(-183) +-140 + j*(-127) +-165 + j*(3) +-103 + j*(65) +-59 + j*(71) +-27 + j*(72) +-1 + j*(49) +-18 + j*(29) +-30 + j*(56) +-1 + j*(76) +23 + j*(69) +44 + j*(73) +88 + j*(52) +102 + j*(-11) +66 + j*(-52) +34 + j*(-64) +-6 + j*(-72) +-51 + j*(-47) +-64 + j*(-3) +-70 + j*(43) +-40 + j*(127) +103 + j*(165) +236 + j*(36) +203 + j*(-141) +91 + j*(-225) +-43 + j*(-272) +-245 + j*(-207) +-314 + j*(58) +-100 + j*(226) +71 + j*(105) +6 + j*(12) +8 + j*(86) +137 + j*(24) +72 + j*(-169) +-155 + j*(-161) +-243 + j*(38) +-152 + j*(206) +35 + j*(274) +239 + j*(147) +209 + j*(-130) +-77 + j*(-184) +-187 + j*(78) +30 + j*(220) +177 + j*(68) +86 + j*(-40) +37 + j*(33) +138 + j*(57) +199 + j*(-63) +119 + j*(-182) +-6 + j*(-187) +-65 + j*(-117) +-58 + j*(-79) +-84 + j*(-76) +-130 + j*(1) +-47 + j*(105) +95 + j*(50) +74 + j*(-98) +-52 + j*(-102) +-61 + j*(-11) +1 + j*(-19) +-22 + j*(-62) +-42 + j*(-39) +-13 + j*(-65) +-95 + j*(-143) +-254 + j*(-52) +-218 + j*(170) +-1 + j*(207) +68 + j*(42) +-62 + j*(-22) +-127 + j*(99) +-28 + j*(198) +100 + j*(168) +161 + j*(67) +137 + j*(-53) +23 + j*(-115) +-88 + j*(-56) +-102 + j*(47) +-71 + j*(115) +-13 + j*(189) +136 + j*(218) +274 + j*(76) +213 + j*(-101) +94 + j*(-103) +122 + j*(-74) +119 + j*(-194) +-63 + j*(-236) +-153 + j*(-74) +-51 + j*(-9) +-75 + j*(-94) +-219 + j*(11) +-104 + j*(242) +171 + j*(182) +173 + j*(-53) +30 + j*(-60) +84 + j*(1) +123 + j*(-148) +-86 + j*(-216) +-199 + j*(-1) +-18 + j*(121) +79 + j*(-26) +-52 + j*(-82) +-74 + j*(56) +83 + j*(62) +101 + j*(-119) +-90 + j*(-180) +-211 + j*(-8) +-95 + j*(165) +104 + j*(121) +125 + j*(-66) +-21 + j*(-136) +-109 + j*(-46) +-74 + j*(21) +-54 + j*(21) +-50 + j*(49) +8 + j*(59) +33 + j*(-11) +-33 + j*(-55) +-105 + j*(-14) +-122 + j*(79) +-34 + j*(183) +147 + j*(138) +163 + j*(-91) +-69 + j*(-154) +-146 + j*(50) +21 + j*(95) +-13 + j*(-51) +-182 + j*(74) +-1 + j*(296) +258 + j*(112) +97 + j*(-134) +-93 + j*(26) +86 + j*(161) +185 + j*(-30) +3 + j*(-100) +-35 + j*(62) +97 + j*(78) +108 + j*(9) +132 + j*(20) +209 + j*(-88) +66 + j*(-243) +-126 + j*(-114) +-15 + j*(74) +154 + j*(-27) +83 + j*(-182) +-23 + j*(-168) +-54 + j*(-163) +-157 + j*(-145) +-198 + j*(7) +-65 + j*(86) +-8 + j*(4) +-59 + j*(11) +16 + j*(64) +93 + j*(-59) +-44 + j*(-173) +-175 + j*(-67) +-128 + j*(35) +-103 + j*(34) +-101 + j*(98) +22 + j*(112) +37 + j*(-44) +-161 + j*(-40) +-138 + j*(218) +171 + j*(208) +193 + j*(-130) +-136 + j*(-187) +-226 + j*(96) +-24 + j*(198) +43 + j*(97) +25 + j*(105) +112 + j*(83) +74 + j*(-59) +-106 + j*(-1) +-40 + j*(228) +238 + j*(198) +291 + j*(-81) +85 + j*(-223) +-102 + j*(-134) +-134 + j*(42) +-7 + j*(164) +153 + j*(119) +189 + j*(-5) +176 + j*(-74) +160 + j*(-194) +-38 + j*(-299) +-253 + j*(-97) +-90 + j*(166) +163 + j*(25) +18 + j*(-195) +-168 + j*(-37) +6 + j*(115) +129 + j*(-74) +-57 + j*(-192) +-192 + j*(-52) +-152 + j*(83) +-61 + j*(173) +138 + j*(174) +239 + j*(-86) +-32 + j*(-259) +-235 + j*(6) +30 + j*(211) +244 + j*(-52) +16 + j*(-287) +-218 + j*(-146) +-188 + j*(21) +-148 + j*(50) +-149 + j*(127) +-40 + j*(220) +122 + j*(177) +188 + j*(19) +91 + j*(-129) +-91 + j*(-100) +-105 + j*(88) +85 + j*(121) +137 + j*(-74) +-48 + j*(-150) +-143 + j*(8) +-28 + j*(99) +43 + j*(16) +-33 + j*(-38) +-91 + j*(52) +11 + j*(128) +108 + j*(16) +-25 + j*(-107) +-197 + j*(54) +-35 + j*(287) +231 + j*(175) +180 + j*(-54) +37 + j*(-19) +104 + j*(53) +146 + j*(-32) +103 + j*(-37) +197 + j*(-47) +201 + j*(-274) +-88 + j*(-373) +-273 + j*(-151) +-202 + j*(18) +-151 + j*(68) +-64 + j*(161) +115 + j*(89) +55 + j*(-106) +-114 + j*(-28) +2 + j*(107) +102 + j*(-45) +-75 + j*(-107) +-86 + j*(72) +73 + j*(25) +-35 + j*(-103) +-129 + j*(71) +110 + j*(129) +143 + j*(-177) +-216 + j*(-223) +-318 + j*(144) +-21 + j*(317) +190 + j*(157) +169 + j*(-28) +50 + j*(-92) +-35 + j*(-16) +55 + j*(55) +124 + j*(-91) +-76 + j*(-184) +-195 + j*(43) +23 + j*(168) +127 + j*(-21) +-24 + j*(-86) +-48 + j*(16) +-13 + j*(1) +-77 + j*(50) +61 + j*(185) +277 + j*(-13) +76 + j*(-301) +-230 + j*(-147) +-134 + j*(109) +17 + j*(51) +-36 + j*(18) +34 + j*(83) +119 + j*(-69) +-88 + j*(-181) +-231 + j*(35) +-56 + j*(187) +56 + j*(81) +0 + j*(47) +33 + j*(84) +54 + j*(20) +-30 + j*(49) +67 + j*(183) +291 + j*(59) +209 + j*(-247) +-123 + j*(-255) +-218 + j*(47) +18 + j*(204) +210 + j*(45) +127 + j*(-150) +-28 + j*(-127) +-19 + j*(-28) +41 + j*(-64) +-23 + j*(-112) +-67 + j*(-49) +-11 + j*(-40) +-58 + j*(-117) +-178 + j*(-32) +-90 + j*(123) +77 + j*(41) +-18 + j*(-128) +-199 + j*(-32) +-130 + j*(159) +25 + j*(129) +2 + j*(50) +-11 + j*(135) +169 + j*(147) +255 + j*(-99) +20 + j*(-288) +-238 + j*(-140) +-201 + j*(104) +-42 + j*(139) +-18 + j*(82) +-24 + j*(129) +86 + j*(163) +189 + j*(54) +141 + j*(-90) +16 + j*(-121) +-60 + j*(-47) +-37 + j*(35) +34 + j*(42) +54 + j*(-21) +1 + j*(-56) +-64 + j*(-23) +-86 + j*(66) +-4 + j*(176) +185 + j*(168) +293 + j*(-25) +189 + j*(-211) +37 + j*(-234) +-41 + j*(-211) +-153 + j*(-193) +-257 + j*(-36) +-156 + j*(163) +59 + j*(153) +124 + j*(-12) +31 + j*(-100) +-38 + j*(-74) +-36 + j*(-50) +-52 + j*(-71) +-115 + j*(-49) +-112 + j*(33) +-35 + j*(22) +-97 + j*(-69) +-265 + j*(47) +-158 + j*(327) +183 + j*(303) +255 + j*(-6) +49 + j*(-117) +-35 + j*(-29) +-37 + j*(-11) +-100 + j*(52) +-19 + j*(184) +144 + j*(127) +116 + j*(0) +74 + j*(40) +171 + j*(14) +134 + j*(-144) +-31 + j*(-127) +-19 + j*(-9) +37 + j*(-53) +-46 + j*(-69) +-46 + j*(33) +40 + j*(25) +20 + j*(-9) +61 + j*(40) +169 + j*(-71) +25 + j*(-241) +-170 + j*(-106) +-41 + j*(49) +47 + j*(-108) +-164 + j*(-161) +-221 + j*(74) +-23 + j*(134) +0 + j*(1) +-84 + j*(45) +12 + j*(110) +64 + j*(-10) +-69 + j*(-43) +-93 + j*(108) +71 + j*(156) +163 + j*(8) +57 + j*(-125) +-102 + j*(-61) +-56 + j*(121) +161 + j*(79) +127 + j*(-186) +-178 + j*(-166) +-173 + j*(155) +146 + j*(148) +126 + j*(-161) +-166 + j*(-127) +-125 + j*(134) +91 + j*(84) +23 + j*(-89) +-124 + j*(-6) +-51 + j*(129) +67 + j*(97) +84 + j*(18) +59 + j*(-33) +6 + j*(-53) +-37 + j*(-18) +-30 + j*(18) +-25 + j*(32) +-8 + j*(62) +33 + j*(58) +24 + j*(46) +67 + j*(115) +241 + j*(51) +215 + j*(-228) +-107 + j*(-264) +-177 + j*(41) +102 + j*(90) +109 + j*(-188) +-174 + j*(-182) +-178 + j*(73) +10 + j*(71) +-40 + j*(-48) +-136 + j*(58) +-13 + j*(171) +109 + j*(90) +91 + j*(7) +77 + j*(-2) +96 + j*(-32) +83 + j*(-88) +29 + j*(-134) +-59 + j*(-119) +-66 + j*(-29) +28 + j*(-53) +-49 + j*(-205) +-292 + j*(-125) +-271 + j*(165) +-31 + j*(194) +-34 + j*(57) +-119 + j*(175) +101 + j*(296) +293 + j*(71) +163 + j*(-140) +30 + j*(-122) +-22 + j*(-136) +-182 + j*(-74) +-144 + j*(190) +173 + j*(177) +170 + j*(-153) +-148 + j*(-142) +-109 + j*(144) +128 + j*(57) +-21 + j*(-135) +-193 + j*(74) +42 + j*(246) +203 + j*(37) +45 + j*(-69) +21 + j*(54) +144 + j*(16) +93 + j*(-97) +38 + j*(-51) +118 + j*(-80) +45 + j*(-235) +-166 + j*(-204) +-220 + j*(-24) +-149 + j*(75) +-78 + j*(117) +16 + j*(105) +23 + j*(11) +-76 + j*(37) +-7 + j*(185) +194 + j*(125) +190 + j*(-84) +45 + j*(-119) +28 + j*(-83) +-14 + j*(-139) +-162 + j*(-71) +-115 + j*(148) +133 + j*(147) +187 + j*(-83) +16 + j*(-179) +-76 + j*(-82) +-33 + j*(-36) +-30 + j*(-78) +-91 + j*(-79) +-127 + j*(-24) +-125 + j*(30) +-112 + j*(84) +-52 + j*(161) +103 + j*(162) +213 + j*(-22) +71 + j*(-232) +-186 + j*(-186) +-230 + j*(35) +-110 + j*(97) +-126 + j*(50) +-202 + j*(181) +-38 + j*(369) +234 + j*(290) +279 + j*(59) +192 + j*(-30) +180 + j*(-76) +80 + j*(-197) +-156 + j*(-118) +-127 + j*(197) +230 + j*(240) +357 + j*(-110) +89 + j*(-301) +-90 + j*(-158) +-49 + j*(-65) +-64 + j*(-64) +-56 + j*(29) +84 + j*(9) +41 + j*(-170) +-170 + j*(-97) +-65 + j*(140) +202 + j*(-10) +26 + j*(-335) +-357 + j*(-192) +-310 + j*(196) +-2 + j*(245) +78 + j*(64) +8 + j*(8) +-12 + j*(19) +-44 + j*(29) +-33 + j*(104) +85 + j*(107) +105 + j*(-25) +-24 + j*(-45) +-27 + j*(93) +144 + j*(96) +188 + j*(-94) +28 + j*(-198) +-100 + j*(-114) +-93 + j*(-23) +-74 + j*(-4) +-90 + j*(39) +-28 + j*(117) +111 + j*(85) +137 + j*(-92) +-47 + j*(-187) +-205 + j*(-25) +-78 + j*(178) +155 + j*(92) +112 + j*(-166) +-160 + j*(-181) +-235 + j*(68) +-44 + j*(175) +44 + j*(33) +-103 + j*(-21) +-174 + j*(165) +8 + j*(320) +242 + j*(232) +292 + j*(9) +166 + j*(-132) +25 + j*(-111) +-6 + j*(-17) +49 + j*(25) +98 + j*(0) +110 + j*(-52) +78 + j*(-95) +43 + j*(-95) +57 + j*(-105) +17 + j*(-192) +-161 + j*(-177) +-211 + j*(55) +24 + j*(159) +147 + j*(-49) +-27 + j*(-159) +-86 + j*(-21) +30 + j*(-39) +-74 + j*(-160) +-217 + j*(10) +6 + j*(170) +178 + j*(-110) +-146 + j*(-326) +-436 + j*(-13) +-206 + j*(317) +84 + j*(190) +-2 + j*(-10) +-135 + j*(107) +26 + j*(238) +175 + j*(51) +-33 + j*(-112) +-230 + j*(151) +72 + j*(428) +441 + j*(163) +285 + j*(-211) +31 + j*(-141) +122 + j*(-71) +59 + j*(-276) +-257 + j*(-174) +-159 + j*(170) +137 + j*(47) +-65 + j*(-188) +-270 + j*(93) +35 + j*(292) +190 + j*(24) +-17 + j*(-28) +60 + j*(139) +204 + j*(-42) +-46 + j*(-151) +-100 + j*(155) +249 + j*(170) +259 + j*(-165) +19 + j*(-155) +119 + j*(-50) +136 + j*(-286) +-193 + j*(-291) +-197 + j*(45) +93 + j*(-6) +-42 + j*(-261) +-276 + j*(-72) +-58 + j*(115) +63 + j*(-158) +-290 + j*(-265) +-474 + j*(115) +-182 + j*(390) +96 + j*(258) +81 + j*(59) +-41 + j*(51) +-43 + j*(172) +125 + j*(212) +248 + j*(37) +133 + j*(-148) +-28 + j*(-124) +-58 + j*(-66) +-134 + j*(-73) +-265 + j*(95) +-115 + j*(383) +272 + j*(359) +402 + j*(-1) +164 + j*(-211) +-20 + j*(-98) +35 + j*(7) +76 + j*(-46) +15 + j*(-50) +42 + j*(10) +103 + j*(-47) +29 + j*(-105) +1 + j*(-14) +133 + j*(-28) +109 + j*(-211) +-85 + j*(-211) +-73 + j*(-80) +-12 + j*(-185) +-257 + j*(-252) +-415 + j*(74) +-114 + j*(316) +127 + j*(92) +-46 + j*(-83) +-161 + j*(90) +21 + j*(185) +119 + j*(18) +-19 + j*(-86) +-134 + j*(21) +-71 + j*(149) +52 + j*(132) +54 + j*(53) +23 + j*(91) +148 + j*(122) +232 + j*(-80) +6 + j*(-236) +-189 + j*(-35) +-30 + j*(151) +110 + j*(29) +18 + j*(-44) +18 + j*(25) +71 + j*(-54) +-92 + j*(-98) +-150 + j*(140) +132 + j*(248) +313 + j*(-16) +139 + j*(-256) +-113 + j*(-218) +-223 + j*(-1) +-79 + j*(244) +271 + j*(206) +365 + j*(-177) +55 + j*(-370) +-127 + j*(-204) +-74 + j*(-156) +-203 + j*(-210) +-339 + j*(19) +-121 + j*(228) +83 + j*(73) +-7 + j*(-76) +-74 + j*(-42) +-105 + j*(-87) +-296 + j*(-25) +-277 + j*(303) +100 + j*(375) +226 + j*(42) +-40 + j*(-61) +-86 + j*(187) +175 + j*(223) +258 + j*(-19) +107 + j*(-147) +-11 + j*(-129) +-97 + j*(-93) +-180 + j*(18) +-139 + j*(190) +23 + j*(274) +184 + j*(236) +315 + j*(129) +383 + j*(-73) +267 + j*(-321) +-45 + j*(-396) +-294 + j*(-148) +-168 + j*(194) +203 + j*(185) +301 + j*(-173) +-1 + j*(-367) +-240 + j*(-165) +-136 + j*(38) +1 + j*(-26) +-81 + j*(-139) +-235 + j*(-66) +-253 + j*(145) +-54 + j*(307) +235 + j*(204) +265 + j*(-140) +-65 + j*(-286) +-284 + j*(-6) +-80 + j*(246) +168 + j*(127) +129 + j*(-69) +18 + j*(-79) +10 + j*(-55) +-6 + j*(-84) +-62 + j*(-88) +-127 + j*(-64) +-195 + j*(52) +-80 + j*(241) +212 + j*(180) +235 + j*(-160) +-88 + j*(-255) +-211 + j*(1) +-27 + j*(86) +-21 + j*(-64) +-187 + j*(-4) +-112 + j*(192) +86 + j*(136) +46 + j*(-40) +-119 + j*(-14) +-132 + j*(142) +-19 + j*(224) +86 + j*(201) +132 + j*(159) +184 + j*(144) +286 + j*(71) +287 + j*(-121) +101 + j*(-206) +8 + j*(-66) +159 + j*(-26) +183 + j*(-241) +-70 + j*(-322) +-205 + j*(-115) +-80 + j*(1) +-47 + j*(-96) +-193 + j*(-70) +-182 + j*(145) +61 + j*(205) +191 + j*(-12) +30 + j*(-181) +-134 + j*(-75) +-66 + j*(42) +-21 + j*(-38) +-177 + j*(-21) +-162 + j*(250) +190 + j*(324) +389 + j*(-1) +202 + j*(-268) +-9 + j*(-250) +-85 + j*(-190) +-165 + j*(-132) +-175 + j*(-1) +-69 + j*(38) +-55 + j*(-35) +-124 + j*(-18) +-110 + j*(44) +-94 + j*(37) +-130 + j*(83) +-62 + j*(179) +81 + j*(139) +98 + j*(-9) +-30 + j*(-78) +-156 + j*(11) +-132 + j*(190) +69 + j*(250) +196 + j*(72) +58 + j*(-65) +-54 + j*(53) +72 + j*(150) +165 + j*(21) +50 + j*(-70) +-45 + j*(34) +35 + j*(168) +235 + j*(170) +391 + j*(-54) +242 + j*(-366) +-132 + j*(-349) +-209 + j*(-13) +61 + j*(66) +103 + j*(-178) +-140 + j*(-204) +-170 + j*(10) +-18 + j*(20) +-69 + j*(-89) +-191 + j*(18) +-77 + j*(186) +122 + j*(123) +134 + j*(-72) +-21 + j*(-153) +-157 + j*(-62) +-147 + j*(90) +-30 + j*(162) +78 + j*(128) +128 + j*(52) +129 + j*(-39) +54 + j*(-112) +-57 + j*(-70) +-37 + j*(69) +148 + j*(86) +257 + j*(-141) +59 + j*(-385) +-279 + j*(-310) +-349 + j*(4) +-136 + j*(132) +-54 + j*(-13) +-226 + j*(-44) +-296 + j*(187) +-86 + j*(364) +149 + j*(270) +174 + j*(87) +90 + j*(40) +105 + j*(76) +181 + j*(-5) +86 + j*(-147) +-91 + j*(-65) +-9 + j*(110) +159 + j*(-8) +-11 + j*(-176) +-190 + j*(42) +68 + j*(233) +261 + j*(-37) +21 + j*(-206) +-69 + j*(-16) +96 + j*(-71) +-120 + j*(-277) +-433 + j*(43) +-113 + j*(453) +306 + j*(214) +134 + j*(-105) +-35 + j*(83) +228 + j*(158) +294 + j*(-152) +21 + j*(-230) +-8 + j*(-52) +100 + j*(-127) +-74 + j*(-223) +-178 + j*(4) +83 + j*(98) +169 + j*(-205) +-161 + j*(-320) +-317 + j*(-17) +-81 + j*(132) +8 + j*(-56) +-179 + j*(-90) +-199 + j*(103) +-43 + j*(113) +-83 + j*(4) +-197 + j*(112) +-80 + j*(269) +73 + j*(223) +95 + j*(174) +190 + j*(176) +292 + j*(6) +148 + j*(-172) +-16 + j*(-81) +67 + j*(17) +118 + j*(-107) +-34 + j*(-157) +-94 + j*(-16) +16 + j*(43) +71 + j*(-37) +34 + j*(-95) +-16 + j*(-122) +-96 + j*(-127) +-170 + j*(-51) +-168 + j*(58) +-98 + j*(134) +1 + j*(136) +44 + j*(64) +-2 + j*(47) +29 + j*(110) +141 + j*(53) +81 + j*(-95) +-76 + j*(-31) +3 + j*(137) +197 + j*(63) +176 + j*(-136) +30 + j*(-194) +-62 + j*(-160) +-128 + j*(-101) +-132 + j*(-6) +-75 + j*(22) +-81 + j*(8) +-88 + j*(57) +-30 + j*(64) +-62 + j*(31) +-95 + j*(136) +72 + j*(214) +193 + j*(50) +74 + j*(-64) +23 + j*(25) +122 + j*(24) +123 + j*(-87) +58 + j*(-127) +1 + j*(-174) +-169 + j*(-155) +-218 + j*(85) +28 + j*(179) +113 + j*(-44) +-93 + j*(-81) +-86 + j*(119) +101 + j*(91) +65 + j*(-50) +4 + j*(-4) +80 + j*(-27) +-8 + j*(-143) +-153 + j*(-26) +-38 + j*(117) +76 + j*(17) +-6 + j*(-52) +-33 + j*(6) +-18 + j*(-1) +-59 + j*(51) +66 + j*(141) +221 + j*(-31) +57 + j*(-251) +-185 + j*(-149) +-173 + j*(52) +-64 + j*(115) +47 + j*(105) +112 + j*(-37) +-73 + j*(-145) +-216 + j*(90) +59 + j*(261) +247 + j*(-18) +-3 + j*(-190) +-117 + j*(4) +4 + j*(30) +-83 + j*(-12) +-57 + j*(210) +305 + j*(148) +264 + j*(-318) +-233 + j*(-344) +-327 + j*(86) +-46 + j*(213) +59 + j*(112) +123 + j*(61) +132 + j*(-136) +-174 + j*(-194) +-283 + j*(185) +114 + j*(347) +311 + j*(16) +122 + j*(-151) +63 + j*(-121) +-25 + j*(-228) +-282 + j*(-91) +-136 + j*(250) +212 + j*(86) +-5 + j*(-243) +-327 + j*(39) +-32 + j*(371) +282 + j*(131) +129 + j*(-94) +45 + j*(4) +151 + j*(-32) +63 + j*(-173) +-78 + j*(-105) +-53 + j*(-16) +-42 + j*(-6) +-19 + j*(64) +116 + j*(46) +123 + j*(-122) +-24 + j*(-168) +-87 + j*(-91) +-96 + j*(-54) +-105 + j*(11) +-15 + j*(45) +6 + j*(-69) +-151 + j*(-69) +-148 + j*(140) +89 + j*(154) +129 + j*(-83) +-83 + j*(-156) +-197 + j*(5) +-127 + j*(157) +31 + j*(202) +190 + j*(87) +156 + j*(-146) +-85 + j*(-204) +-216 + j*(-30) +-155 + j*(107) +-95 + j*(154) +-13 + j*(214) +136 + j*(175) +153 + j*(21) +40 + j*(-1) +65 + j*(89) +175 + j*(22) +105 + j*(-119) +-43 + j*(-61) +13 + j*(91) +191 + j*(42) +188 + j*(-163) +1 + j*(-242) +-140 + j*(-134) +-145 + j*(11) +-46 + j*(112) +123 + j*(88) +182 + j*(-113) +-4 + j*(-250) +-164 + j*(-119) +-84 + j*(-23) +-111 + j*(-127) +-332 + j*(-11) +-223 + j*(346) +188 + j*(330) +250 + j*(-14) +39 + j*(-63) +91 + j*(49) +187 + j*(-119) +-20 + j*(-245) +-148 + j*(-88) +-70 + j*(-34) +-145 + j*(-76) +-208 + j*(101) +6 + j*(201) +101 + j*(0) +-80 + j*(-46) +-74 + j*(122) +69 + j*(79) +-21 + j*(-8) +-45 + j*(161) +223 + j*(167) +260 + j*(-165) +-73 + j*(-249) +-171 + j*(35) +70 + j*(114) +132 + j*(-117) +-102 + j*(-209) +-268 + j*(-11) +-166 + j*(224) +73 + j*(252) +189 + j*(76) +90 + j*(-40) +28 + j*(37) +148 + j*(68) +208 + j*(-92) +79 + j*(-209) +-41 + j*(-173) +-88 + j*(-124) +-132 + j*(-63) +-104 + j*(26) +-31 + j*(5) +-103 + j*(-40) +-168 + j*(113) +37 + j*(241) +228 + j*(40) +66 + j*(-176) +-133 + j*(-46) +-21 + j*(117) +107 + j*(22) +41 + j*(-64) +28 + j*(-28) +63 + j*(-115) +-113 + j*(-202) +-288 + j*(13) +-102 + j*(262) +165 + j*(146) +112 + j*(-84) +-59 + j*(-62) +-39 + j*(65) +69 + j*(44) +68 + j*(-50) +-1 + j*(-81) +-45 + j*(-60) +-72 + j*(-40) +-107 + j*(0) +-97 + j*(94) +23 + j*(130) +104 + j*(6) +-19 + j*(-107) +-163 + j*(2) +-98 + j*(163) +32 + j*(159) +57 + j*(105) +67 + j*(107) +103 + j*(98) +129 + j*(96) +221 + j*(78) +284 + j*(-74) +160 + j*(-206) +58 + j*(-151) +107 + j*(-152) +34 + j*(-272) +-140 + j*(-206) +-98 + j*(-59) +-9 + j*(-129) +-130 + j*(-213) +-245 + j*(-123) +-288 + j*(-35) +-350 + j*(134) +-155 + j*(395) +218 + j*(272) +158 + j*(-80) +-105 + j*(11) +93 + j*(211) +281 + j*(-88) +-50 + j*(-284) +-209 + j*(13) +38 + j*(69) +-41 + j*(-163) +-296 + j*(27) +-74 + j*(295) +156 + j*(88) +-33 + j*(-39) +-42 + j*(158) +167 + j*(74) +14 + j*(-136) +-183 + j*(77) +65 + j*(263) +221 + j*(14) +-19 + j*(-74) +-25 + j*(204) +338 + j*(187) +400 + j*(-231) +31 + j*(-421) +-223 + j*(-202) +-164 + j*(-1) +-90 + j*(11) +-108 + j*(50) +-28 + j*(141) +110 + j*(79) +81 + j*(-49) +1 + j*(-29) +44 + j*(-4) +22 + j*(-83) +-86 + j*(-19) +19 + j*(105) +155 + j*(-39) +-16 + j*(-174) +-126 + j*(8) +58 + j*(71) +61 + j*(-107) +-94 + j*(-41) +53 + j*(81) +152 + j*(-152) +-134 + j*(-249) +-212 + j*(27) +13 + j*(31) +-108 + j*(-165) +-331 + j*(65) +-63 + j*(331) +197 + j*(100) +23 + j*(-91) +-70 + j*(56) +72 + j*(66) +44 + j*(-62) +-47 + j*(-30) +-16 + j*(-4) +-71 + j*(-36) +-115 + j*(84) +42 + j*(141) +95 + j*(-24) +-60 + j*(-59) +-73 + j*(71) +12 + j*(56) +-54 + j*(25) +-49 + j*(161) +138 + j*(169) +171 + j*(-16) +31 + j*(-37) +76 + j*(78) +231 + j*(-36) +105 + j*(-274) +-192 + j*(-209) +-205 + j*(77) +11 + j*(123) +16 + j*(-23) +-105 + j*(62) +64 + j*(218) +275 + j*(9) +74 + j*(-238) +-168 + j*(-60) +-8 + j*(139) +133 + j*(-11) +-16 + j*(-84) +-25 + j*(78) +161 + j*(52) +138 + j*(-136) +-6 + j*(-127) +21 + j*(-45) +83 + j*(-111) +18 + j*(-208) +-103 + j*(-223) +-221 + j*(-151) +-252 + j*(-1) +-166 + j*(93) +-98 + j*(93) +-58 + j*(98) +-4 + j*(57) +-63 + j*(-6) +-138 + j*(103) +16 + j*(211) +146 + j*(52) +10 + j*(-53) +-27 + j*(73) +110 + j*(28) +-1 + j*(-129) +-175 + j*(21) +-14 + j*(196) +130 + j*(52) +11 + j*(-21) +27 + j*(103) +193 + j*(16) +107 + j*(-202) +-131 + j*(-188) +-225 + j*(0) +-151 + j*(190) +72 + j*(253) +236 + j*(65) +118 + j*(-120) +0 + j*(-57) +58 + j*(-48) +-39 + j*(-142) +-183 + j*(23) +5 + j*(203) +180 + j*(36) +63 + j*(-68) +97 + j*(18) +214 + j*(-175) +-72 + j*(-381) +-351 + j*(-119) +-185 + j*(129) +-79 + j*(41) +-179 + j*(95) +-40 + j*(252) +127 + j*(124) +24 + j*(40) +58 + j*(175) +269 + j*(78) +195 + j*(-171) +1 + j*(-156) +-3 + j*(-79) +-44 + j*(-112) +-129 + j*(-7) +-21 + j*(110) +84 + j*(32) +48 + j*(-4) +119 + j*(15) +174 + j*(-157) +-36 + j*(-284) +-210 + j*(-117) +-117 + j*(38) +-27 + j*(-5) +-57 + j*(-45) +-81 + j*(-31) +-107 + j*(-19) +-129 + j*(36) +-92 + j*(88) +-56 + j*(98) +-28 + j*(129) +60 + j*(140) +129 + j*(58) +108 + j*(-37) +47 + j*(-77) +-11 + j*(-66) +-13 + j*(-17) +44 + j*(-52) +-26 + j*(-168) +-223 + j*(-115) +-238 + j*(111) +-64 + j*(192) +21 + j*(105) +-16 + j*(61) +-45 + j*(96) +-6 + j*(173) +145 + j*(181) +225 + j*(-13) +28 + j*(-133) +-81 + j*(72) +163 + j*(156) +250 + j*(-125) +-13 + j*(-226) +-88 + j*(-43) +2 + j*(-64) +-158 + j*(-110) +-231 + j*(163) +66 + j*(300) +243 + j*(77) +145 + j*(-66) +91 + j*(-82) +-3 + j*(-118) +-97 + j*(46) +150 + j*(188) +357 + j*(-127) +28 + j*(-403) +-263 + j*(-116) +-34 + j*(139) +162 + j*(-49) +13 + j*(-190) +-71 + j*(-94) +-10 + j*(-69) +-17 + j*(-113) +-30 + j*(-117) +-39 + j*(-168) +-137 + j*(-205) +-234 + j*(-144) +-278 + j*(-71) +-324 + j*(36) +-268 + j*(194) +-107 + j*(233) +-40 + j*(147) +144 + j*(100) +114 + j*(-139) +-59 + j*(-81) +41 + j*(-2) +23 + j*(-161) +-189 + j*(-74) +-52 + j*(148) +144 + j*(-46) +-123 + j*(-207) +-264 + j*(122) +91 + j*(254) +206 + j*(-91) +-107 + j*(-187) +-196 + j*(83) +6 + j*(176) +105 + j*(62) +81 + j*(-24) +15 + j*(-57) +-35 + j*(6) +52 + j*(47) +86 + j*(-85) +-80 + j*(-120) +-107 + j*(52) +46 + j*(39) +-36 + j*(-94) +-171 + j*(52) +12 + j*(190) +124 + j*(6) +-62 + j*(-54) +-77 + j*(151) +130 + j*(168) +180 + j*(26) +166 + j*(-25) +178 + j*(-141) +-4 + j*(-233) +-127 + j*(-46) +69 + j*(38) +97 + j*(-207) +-206 + j*(-209) +-213 + j*(114) +80 + j*(118) +58 + j*(-122) +-129 + j*(-64) +-42 + j*(75) +59 + j*(-29) +-37 + j*(-95) +-54 + j*(-34) +-23 + j*(-101) +-174 + j*(-157) +-306 + j*(5) +-240 + j*(180) +-135 + j*(243) +-26 + j*(291) +132 + j*(257) +208 + j*(124) +208 + j*(8) +157 + j*(-139) +-93 + j*(-210) +-298 + j*(95) +19 + j*(426) +450 + j*(151) +264 + j*(-317) +-165 + j*(-221) +-127 + j*(117) +110 + j*(104) +114 + j*(-34) +76 + j*(-50) +64 + j*(-108) +-61 + j*(-112) +-74 + j*(44) +88 + j*(50) +76 + j*(-103) +-59 + j*(-65) +11 + j*(50) +115 + j*(-42) +33 + j*(-141) +-35 + j*(-100) +-25 + j*(-98) +-86 + j*(-113) +-129 + j*(-36) +-80 + j*(10) +-71 + j*(-4) +-76 + j*(33) +-16 + j*(42) +-2 + j*(-22) +-56 + j*(-44) +-93 + j*(-27) +-144 + j*(9) +-151 + j*(122) +-30 + j*(186) +37 + j*(105) +-25 + j*(115) +68 + j*(235) +293 + j*(144) +298 + j*(-127) +99 + j*(-245) +-52 + j*(-191) +-116 + j*(-89) +-85 + j*(19) +25 + j*(21) +33 + j*(-80) +-43 + j*(-100) +-53 + j*(-90) +-119 + j*(-156) +-303 + j*(-93) +-355 + j*(148) +-214 + j*(329) +-27 + j*(395) +199 + j*(349) +314 + j*(112) +151 + j*(-49) +52 + j*(86) +244 + j*(121) +284 + j*(-127) +49 + j*(-185) +27 + j*(2) +211 + j*(-42) +151 + j*(-265) +-82 + j*(-264) +-145 + j*(-88) +-41 + j*(-4) +49 + j*(-73) +-9 + j*(-200) +-190 + j*(-180) +-232 + j*(2) +-119 + j*(68) +-112 + j*(33) +-122 + j*(126) +45 + j*(161) +108 + j*(-21) +-56 + j*(-84) +-106 + j*(52) +-6 + j*(88) +16 + j*(47) +35 + j*(50) +67 + j*(-11) +-2 + j*(-44) +1 + j*(21) +67 + j*(-56) +-99 + j*(-135) +-204 + j*(109) +81 + j*(243) +216 + j*(-44) +-47 + j*(-130) +-43 + j*(114) +233 + j*(11) +84 + j*(-315) +-265 + j*(-170) +-150 + j*(167) +147 + j*(76) +84 + j*(-208) +-208 + j*(-217) +-339 + j*(59) +-137 + j*(312) +177 + j*(216) +168 + j*(-83) +-66 + j*(-107) +-75 + j*(45) +-13 + j*(2) +-144 + j*(21) +-92 + j*(252) +191 + j*(226) +193 + j*(-28) +28 + j*(-5) +127 + j*(87) +182 + j*(-74) +2 + j*(-99) +33 + j*(83) +234 + j*(-5) +139 + j*(-223) +-50 + j*(-148) +25 + j*(-31) +87 + j*(-139) +-49 + j*(-194) +-114 + j*(-74) +-28 + j*(-21) +13 + j*(-83) +-19 + j*(-139) +-81 + j*(-182) +-221 + j*(-189) +-378 + j*(-21) +-302 + j*(275) +32 + j*(345) +192 + j*(62) +-36 + j*(-93) +-155 + j*(137) +107 + j*(244) +225 + j*(-13) +21 + j*(-123) +-39 + j*(11) +32 + j*(-8) +-66 + j*(-26) +-44 + j*(143) +177 + j*(104) +151 + j*(-119) +-4 + j*(-110) +28 + j*(-82) +-83 + j*(-192) +-298 + j*(13) +-53 + j*(310) +272 + j*(63) +35 + j*(-238) +-210 + j*(-17) +-16 + j*(141) +29 + j*(-34) +-162 + j*(33) +-40 + j*(267) +216 + j*(182) +217 + j*(-12) +163 + j*(-77) +107 + j*(-164) +-49 + j*(-154) +-57 + j*(-6) +54 + j*(-30) +-21 + j*(-124) +-98 + j*(-25) +-4 + j*(8) +-48 + j*(-83) +-159 + j*(32) +-23 + j*(166) +86 + j*(62) +21 + j*(54) +163 + j*(147) +370 + j*(-109) +130 + j*(-465) +-307 + j*(-383) +-434 + j*(-24) +-293 + j*(241) +-41 + j*(349) +219 + j*(228) +253 + j*(-38) +90 + j*(-149) +0 + j*(-105) +-21 + j*(-91) +-54 + j*(-76) +-62 + j*(-71) +-137 + j*(-81) +-226 + j*(62) +-79 + j*(230) +105 + j*(127) +32 + j*(-2) +-16 + j*(91) +112 + j*(83) +72 + j*(-52) +-34 + j*(34) +112 + j*(119) +197 + j*(-66) +29 + j*(-139) +23 + j*(-28) +93 + j*(-136) +-129 + j*(-206) +-209 + j*(88) +128 + j*(161) +176 + j*(-214) +-231 + j*(-250) +-276 + j*(163) +103 + j*(216) +162 + j*(-110) +-103 + j*(-170) +-168 + j*(8) +-94 + j*(54) +-115 + j*(67) +-83 + j*(164) +49 + j*(171) +99 + j*(70) +49 + j*(5) +-25 + j*(11) +-71 + j*(113) +41 + j*(254) +279 + j*(206) +356 + j*(-46) +205 + j*(-207) +76 + j*(-194) +20 + j*(-175) +-49 + j*(-140) +-44 + j*(-54) +33 + j*(-76) +-28 + j*(-177) +-183 + j*(-119) +-182 + j*(59) +-43 + j*(129) +66 + j*(73) +86 + j*(-34) +5 + j*(-106) +-82 + j*(-42) +-15 + j*(33) +47 + j*(-59) +-76 + j*(-122) +-139 + j*(6) +-29 + j*(49) +-35 + j*(-45) +-131 + j*(8) +-66 + j*(96) +-30 + j*(40) +-101 + j*(95) +33 + j*(218) +203 + j*(63) +78 + j*(-99) +5 + j*(-5) +102 + j*(-70) +-103 + j*(-209) +-305 + j*(100) +66 + j*(353) +339 + j*(-42) +-57 + j*(-307) +-301 + j*(69) +21 + j*(284) +190 + j*(57) +82 + j*(-44) +60 + j*(-49) +-45 + j*(-98) +-144 + j*(104) +140 + j*(253) +336 + j*(-73) +31 + j*(-284) +-132 + j*(-40) +67 + j*(16) +7 + j*(-181) +-216 + j*(-55) +-95 + j*(177) +87 + j*(103) +58 + j*(34) +124 + j*(73) +238 + j*(-86) +78 + j*(-296) +-180 + j*(-224) +-221 + j*(8) +-57 + j*(126) +105 + j*(9) +-1 + j*(-199) +-282 + j*(-111) +-247 + j*(228) +83 + j*(258) +134 + j*(0) +-55 + j*(-5) +2 + j*(168) +202 + j*(102) +206 + j*(-102) +62 + j*(-202) +-98 + j*(-160) +-134 + j*(5) +27 + j*(59) +62 + j*(-136) +-194 + j*(-168) +-259 + j*(117) +-12 + j*(205) +42 + j*(38) +-71 + j*(74) +40 + j*(184) +169 + j*(58) +74 + j*(-47) +27 + j*(14) +86 + j*(18) +86 + j*(-35) +77 + j*(-62) +31 + j*(-113) +-66 + j*(-48) +53 + j*(76) +242 + j*(-124) +-1 + j*(-432) +-417 + j*(-264) +-421 + j*(142) +-186 + j*(296) +-6 + j*(315) +218 + j*(226) +247 + j*(-93) +-90 + j*(-182) +-182 + j*(164) +179 + j*(245) +259 + j*(-111) +-62 + j*(-174) +-81 + j*(103) +185 + j*(71) +134 + j*(-216) +-175 + j*(-194) +-214 + j*(105) +35 + j*(205) +169 + j*(27) +64 + j*(-98) +-13 + j*(-45) +30 + j*(-47) +-57 + j*(-122) +-204 + j*(22) +-45 + j*(244) +211 + j*(115) +117 + j*(-112) +-33 + j*(-10) +135 + j*(69) +196 + j*(-180) +-95 + j*(-271) +-214 + j*(4) +13 + j*(116) +98 + j*(-71) +-56 + j*(-140) +-122 + j*(-34) +-77 + j*(11) +-88 + j*(7) +-112 + j*(77) +-31 + j*(173) +130 + j*(153) +206 + j*(-4) +139 + j*(-139) +52 + j*(-182) +-37 + j*(-235) +-233 + j*(-211) +-333 + j*(33) +-136 + j*(209) +6 + j*(76) +-130 + j*(20) +-127 + j*(216) +112 + j*(206) +97 + j*(-23) +-114 + j*(33) +-18 + j*(248) +208 + j*(163) +162 + j*(-18) +74 + j*(20) +156 + j*(33) +157 + j*(-88) +54 + j*(-106) +54 + j*(-64) +59 + j*(-120) +-37 + j*(-133) +-66 + j*(-51) +-35 + j*(-43) +-90 + j*(-32) +-62 + j*(88) +112 + j*(53) +64 + j*(-175) +-239 + j*(-116) +-204 + j*(276) +263 + j*(312) +400 + j*(-181) +-59 + j*(-414) +-345 + j*(-23) +-17 + j*(279) +287 + j*(-2) +54 + j*(-317) +-267 + j*(-153) +-187 + j*(132) +25 + j*(112) +10 + j*(-30) +-101 + j*(14) +-50 + j*(140) +96 + j*(128) +144 + j*(-4) +58 + j*(-91) +-30 + j*(-45) +-2 + j*(36) +90 + j*(21) +115 + j*(-74) +66 + j*(-150) +-4 + j*(-198) +-127 + j*(-223) +-272 + j*(-129) +-288 + j*(60) +-172 + j*(156) +-106 + j*(139) +-111 + j*(180) +-2 + j*(269) +180 + j*(195) +193 + j*(-4) +47 + j*(-75) +-20 + j*(1) +14 + j*(30) +-6 + j*(3) +-56 + j*(64) +12 + j*(162) +153 + j*(139) +195 + j*(6) +124 + j*(-74) +64 + j*(-59) +65 + j*(-44) +59 + j*(-62) +30 + j*(-60) +30 + j*(-37) +40 + j*(-38) +44 + j*(-30) +95 + j*(-29) +142 + j*(-123) +58 + j*(-236) +-76 + j*(-217) +-99 + j*(-147) +-112 + j*(-163) +-206 + j*(-144) +-247 + j*(-40) +-233 + j*(20) +-268 + j*(112) +-160 + j*(294) +119 + j*(248) +119 + j*(-46) +-166 + j*(-35) +-129 + j*(279) +225 + j*(253) +252 + j*(-98) +-35 + j*(-184) +-156 + j*(-9) +-127 + j*(107) +-74 + j*(223) +131 + j*(286) +298 + j*(88) +164 + j*(-94) +57 + j*(7) +195 + j*(31) +187 + j*(-161) +-21 + j*(-151) +23 + j*(42) +228 + j*(-50) +130 + j*(-291) +-111 + j*(-240) +-89 + j*(-58) +41 + j*(-115) +-55 + j*(-274) +-294 + j*(-221) +-366 + j*(43) +-172 + j*(231) +43 + j*(133) +-14 + j*(-48) +-181 + j*(25) +-89 + j*(216) +122 + j*(141) +79 + j*(-52) +-66 + j*(-21) +-28 + j*(63) +-8 + j*(-1) +-116 + j*(37) +-42 + j*(202) +159 + j*(124) +83 + j*(-76) +-100 + j*(16) +22 + j*(194) +196 + j*(66) +77 + j*(-83) +-19 + j*(47) +152 + j*(118) +251 + j*(-88) +80 + j*(-239) +-86 + j*(-166) +-109 + j*(-57) +-93 + j*(1) +-73 + j*(54) +-21 + j*(100) +72 + j*(111) +172 + j*(20) +124 + j*(-136) +-50 + j*(-129) +-43 + j*(38) +132 + j*(0) +69 + j*(-211) +-181 + j*(-151) +-145 + j*(109) +105 + j*(105) +136 + j*(-108) +-2 + j*(-182) +-82 + j*(-158) +-173 + j*(-144) +-274 + j*(-18) +-214 + j*(171) +-36 + j*(211) +54 + j*(119) +42 + j*(52) +20 + j*(42) +28 + j*(47) +45 + j*(26) +29 + j*(4) +18 + j*(19) +47 + j*(9) +21 + j*(-30) +-14 + j*(29) +117 + j*(64) +194 + j*(-156) +-80 + j*(-331) +-351 + j*(-86) +-207 + j*(208) +8 + j*(154) +-31 + j*(71) +-18 + j*(165) +136 + j*(132) +124 + j*(-31) +2 + j*(-37) +-8 + j*(30) +4 + j*(45) +24 + j*(95) +135 + j*(85) +139 + j*(-47) +35 + j*(-35) +120 + j*(34) +194 + j*(-156) +-86 + j*(-270) +-250 + j*(62) +107 + j*(274) +376 + j*(-83) +81 + j*(-404) +-240 + j*(-239) +-210 + j*(-13) +-152 + j*(24) +-155 + j*(121) +13 + j*(231) +222 + j*(92) +180 + j*(-144) +1 + j*(-199) +-95 + j*(-138) +-144 + j*(-87) +-191 + j*(10) +-120 + j*(147) +57 + j*(143) +117 + j*(-29) +-23 + j*(-131) +-144 + j*(-45) +-124 + j*(57) +-93 + j*(82) +-83 + j*(140) +27 + j*(192) +135 + j*(89) +48 + j*(-26) +-49 + j*(83) +102 + j*(208) +302 + j*(53) +222 + j*(-209) +-25 + j*(-246) +-151 + j*(-85) +-100 + j*(69) +42 + j*(111) +156 + j*(-3) +81 + j*(-167) +-112 + j*(-141) +-125 + j*(42) +30 + j*(71) +41 + j*(-50) +-55 + j*(-14) +54 + j*(79) +187 + j*(-110) +-51 + j*(-331) +-372 + j*(-107) +-217 + j*(260) +122 + j*(160) +20 + j*(-132) +-268 + j*(17) +-103 + j*(351) +269 + j*(233) +226 + j*(-110) +-33 + j*(-105) +-6 + j*(63) +107 + j*(-15) +-10 + j*(-103) +-88 + j*(27) +31 + j*(91) +69 + j*(8) +44 + j*(25) +150 + j*(0) +107 + j*(-216) +-198 + j*(-200) +-223 + j*(147) +117 + j*(201) +166 + j*(-112) +-123 + j*(-139) +-135 + j*(134) +117 + j*(157) +165 + j*(-52) +25 + j*(-124) +-57 + j*(-50) +-33 + j*(39) +78 + j*(47) +110 + j*(-95) +-59 + j*(-139) +-91 + j*(61) +158 + j*(62) +148 + j*(-249) +-190 + j*(-263) +-224 + j*(35) +-13 + j*(33) +-105 + j*(-115) +-235 + j*(47) +-71 + j*(166) +-21 + j*(40) +-129 + j*(108) +42 + j*(244) +213 + j*(25) +-16 + j*(-142) +-153 + j*(88) +67 + j*(202) +175 + j*(26) +91 + j*(-64) +47 + j*(-93) +-87 + j*(-119) +-182 + j*(95) +90 + j*(248) +279 + j*(-56) +-25 + j*(-264) +-223 + j*(11) +-1 + j*(165) +72 + j*(1) +-47 + j*(19) +42 + j*(117) +108 + j*(-4) +-17 + j*(0) +78 + j*(148) +271 + j*(-11) +112 + j*(-221) +-30 + j*(-89) +124 + j*(-91) +-13 + j*(-344) +-397 + j*(-146) +-210 + j*(320) +266 + j*(155) +98 + j*(-298) +-337 + j*(-121) +-184 + j*(305) +194 + j*(218) +178 + j*(-49) +65 + j*(-50) +132 + j*(-78) +56 + j*(-267) +-237 + j*(-258) +-377 + j*(42) +-192 + j*(322) +141 + j*(327) +325 + j*(55) +189 + j*(-217) +-54 + j*(-221) +-131 + j*(-95) +-144 + j*(-40) +-175 + j*(66) +-47 + j*(191) +121 + j*(77) +18 + j*(-81) +-108 + j*(42) +54 + j*(137) +127 + j*(-64) +-112 + j*(-124) +-172 + j*(144) +100 + j*(218) +187 + j*(-15) +14 + j*(-90) +-21 + j*(30) +62 + j*(21) +18 + j*(-42) +-34 + j*(35) +68 + j*(101) +170 + j*(2) +119 + j*(-130) +6 + j*(-136) +-16 + j*(-76) +10 + j*(-100) +-74 + j*(-148) +-179 + j*(-42) +-91 + j*(98) +42 + j*(25) +-37 + j*(-88) +-147 + j*(-1) +-86 + j*(103) +-18 + j*(102) +36 + j*(106) +126 + j*(17) +11 + j*(-145) +-206 + j*(-6) +-47 + j*(245) +207 + j*(66) +-15 + j*(-161) +-214 + j*(128) +122 + j*(326) +318 + j*(7) +70 + j*(-118) +91 + j*(78) +311 + j*(-99) +57 + j*(-383) +-241 + j*(-135) +-14 + j*(94) +115 + j*(-156) +-186 + j*(-227) +-252 + j*(89) +21 + j*(159) +73 + j*(-37) +-58 + j*(-59) +-62 + j*(23) +-24 + j*(32) +8 + j*(34) +42 + j*(-37) +-79 + j*(-105) +-193 + j*(67) +2 + j*(228) +190 + j*(57) +70 + j*(-106) +-11 + j*(-27) +69 + j*(-54) +-45 + j*(-185) +-231 + j*(-43) +-115 + j*(156) +37 + j*(57) +-93 + j*(-25) +-156 + j*(170) +78 + j*(279) +248 + j*(86) +146 + j*(-98) +6 + j*(-70) +16 + j*(18) +95 + j*(-5) +75 + j*(-119) +-78 + j*(-141) +-161 + j*(25) +-20 + j*(162) +144 + j*(63) +93 + j*(-98) +-44 + j*(-76) +-37 + j*(32) +53 + j*(35) +81 + j*(-43) +35 + j*(-105) +-49 + j*(-117) +-122 + j*(-47) +-89 + j*(52) +-2 + j*(38) +-39 + j*(-33) +-122 + j*(45) +-23 + j*(166) +119 + j*(76) +28 + j*(-49) +-66 + j*(86) +141 + j*(190) +303 + j*(-67) +58 + j*(-293) +-188 + j*(-107) +-60 + j*(103) +87 + j*(5) +-7 + j*(-75) +-25 + j*(29) +105 + j*(-1) +59 + j*(-175) +-141 + j*(-156) +-177 + j*(27) +-63 + j*(100) +4 + j*(71) +35 + j*(47) +62 + j*(-2) +26 + j*(-59) +-28 + j*(-43) +-9 + j*(-8) +21 + j*(-62) +-70 + j*(-139) +-241 + j*(-59) +-252 + j*(199) +17 + j*(357) +298 + j*(173) +252 + j*(-141) +3 + j*(-206) +-95 + j*(-69) +-40 + j*(-15) +-54 + j*(-54) +-133 + j*(-16) +-143 + j*(107) +-35 + j*(205) +133 + j*(177) +202 + j*(1) +71 + j*(-123) +-56 + j*(-41) +13 + j*(59) +94 + j*(-21) +19 + j*(-98) +-47 + j*(-52) +-40 + j*(-37) +-110 + j*(-35) +-149 + j*(111) +23 + j*(215) +165 + j*(74) +76 + j*(-56) +-11 + j*(1) +30 + j*(45) +23 + j*(37) +51 + j*(127) +254 + j*(113) +326 + j*(-168) +64 + j*(-348) +-156 + j*(-192) +-112 + j*(-25) +-44 + j*(-9) +-15 + j*(15) +85 + j*(-18) +57 + j*(-182) +-154 + j*(-184) +-199 + j*(30) +-31 + j*(102) +40 + j*(6) +31 + j*(-35) +49 + j*(-125) +-118 + j*(-252) +-381 + j*(-74) +-271 + j*(275) +63 + j*(257) +85 + j*(16) +-61 + j*(23) +-1 + j*(112) +55 + j*(21) +-43 + j*(4) +-15 + j*(107) +101 + j*(37) +-3 + j*(-95) +-155 + j*(18) +-65 + j*(187) +84 + j*(152) +90 + j*(71) +85 + j*(79) +158 + j*(64) +202 + j*(-56) +105 + j*(-194) +-98 + j*(-185) +-185 + j*(19) +-22 + j*(162) +120 + j*(41) +18 + j*(-66) +-49 + j*(47) +81 + j*(86) +91 + j*(-52) +-56 + j*(-18) +25 + j*(170) +280 + j*(81) +242 + j*(-219) +-45 + j*(-251) +-104 + j*(-11) +115 + j*(41) +188 + j*(-203) +-66 + j*(-356) +-310 + j*(-163) +-231 + j*(110) +-1 + j*(123) +53 + j*(-40) +-52 + j*(-109) +-141 + j*(-64) +-173 + j*(28) +-115 + j*(134) +21 + j*(132) +54 + j*(7) +-55 + j*(-27) +-80 + j*(75) +13 + j*(101) +42 + j*(37) +21 + j*(30) +62 + j*(24) +64 + j*(-76) +-80 + j*(-126) +-209 + j*(16) +-119 + j*(219) +111 + j*(224) +198 + j*(27) +74 + j*(-86) +3 + j*(-23) +49 + j*(-32) +-34 + j*(-107) +-163 + j*(16) +-45 + j*(180) +108 + j*(92) +33 + j*(-2) +5 + j*(95) +135 + j*(96) +144 + j*(-18) +107 + j*(-13) +182 + j*(-74) +67 + j*(-247) +-175 + j*(-125) +-54 + j*(132) +190 + j*(-6) +40 + j*(-233) +-161 + j*(-98) +-61 + j*(39) +-20 + j*(-42) +-102 + j*(4) +-11 + j*(105) +84 + j*(20) +41 + j*(-22) +104 + j*(-15) +120 + j*(-202) +-148 + j*(-276) +-279 + j*(-10) +-69 + j*(116) +-6 + j*(-48) +-163 + j*(-61) +-185 + j*(83) +-119 + j*(146) +-56 + j*(219) +141 + j*(226) +251 + j*(-26) +21 + j*(-221) +-214 + j*(-74) +-190 + j*(148) +-60 + j*(253) +116 + j*(282) +306 + j*(153) +316 + j*(-95) +158 + j*(-246) +-43 + j*(-279) +-268 + j*(-133) +-239 + j*(223) +180 + j*(308) +349 + j*(-122) +-64 + j*(-347) +-322 + j*(26) +-8 + j*(297) +247 + j*(64) +94 + j*(-145) +-49 + j*(-45) +32 + j*(45) +108 + j*(-38) +32 + j*(-130) +-74 + j*(-74) +-28 + j*(23) +49 + j*(-39) +-59 + j*(-112) +-149 + j*(50) +41 + j*(172) +185 + j*(-4) +66 + j*(-120) +44 + j*(-49) +133 + j*(-151) +-36 + j*(-321) +-262 + j*(-193) +-228 + j*(-13) +-184 + j*(-14) +-239 + j*(48) +-181 + j*(162) +-107 + j*(170) +-72 + j*(226) +110 + j*(231) +163 + j*(-16) +-125 + j*(-67) +-160 + j*(276) +224 + j*(334) +330 + j*(-10) +110 + j*(-105) +117 + j*(-16) +158 + j*(-151) +-41 + j*(-218) +-127 + j*(-69) +-90 + j*(-40) +-190 + j*(7) +-132 + j*(233) +139 + j*(206) +105 + j*(-23) +-70 + j*(91) +141 + j*(276) +378 + j*(51) +246 + j*(-183) +138 + j*(-158) +154 + j*(-242) +-54 + j*(-347) +-252 + j*(-144) +-119 + j*(59) +10 + j*(-28) +-83 + j*(-84) +-122 + j*(31) +-16 + j*(100) +103 + j*(54) +160 + j*(-99) +23 + j*(-279) +-250 + j*(-215) +-277 + j*(72) +-40 + j*(152) +33 + j*(-25) +-109 + j*(-80) +-172 + j*(23) +-148 + j*(94) +-120 + j*(180) +33 + j*(251) +209 + j*(100) +108 + j*(-134) +-139 + j*(-85) +-134 + j*(147) +62 + j*(185) +126 + j*(57) +85 + j*(6) +94 + j*(-25) +28 + j*(-120) +-146 + j*(-66) +-144 + j*(151) +54 + j*(213) +146 + j*(105) +148 + j*(69) +239 + j*(5) +206 + j*(-204) +-40 + j*(-253) +-141 + j*(-56) +-26 + j*(25) +-9 + j*(-23) +-25 + j*(31) +88 + j*(24) +68 + j*(-133) +-115 + j*(-102) +-71 + j*(83) +107 + j*(17) +22 + j*(-158) +-146 + j*(-75) +-86 + j*(59) +-18 + j*(10) +-89 + j*(6) +-71 + j*(113) +38 + j*(118) +62 + j*(61) +79 + j*(71) +175 + j*(26) +182 + j*(-141) +27 + j*(-250) +-154 + j*(-200) +-242 + j*(-35) +-169 + j*(148) +28 + j*(182) +119 + j*(23) +-4 + j*(-71) +-80 + j*(55) +78 + j*(136) +201 + j*(-40) +51 + j*(-215) +-136 + j*(-129) +-115 + j*(15) +-48 + j*(14) +-65 + j*(13) +-32 + j*(52) +6 + j*(-6) +-92 + j*(-28) +-108 + j*(125) +95 + j*(154) +145 + j*(-75) +-81 + j*(-149) +-168 + j*(36) +-63 + j*(98) +-88 + j*(78) +-85 + j*(232) +168 + j*(283) +300 + j*(21) +99 + j*(-140) +-28 + j*(1) +87 + j*(86) +153 + j*(6) +146 + j*(-33) +196 + j*(-98) +144 + j*(-267) +-88 + j*(-317) +-242 + j*(-145) +-199 + j*(22) +-127 + j*(65) +-105 + j*(106) +-24 + j*(184) +145 + j*(170) +253 + j*(-1) +181 + j*(-197) +1 + j*(-265) +-160 + j*(-197) +-226 + j*(-42) +-148 + j*(98) +-10 + j*(91) +0 + j*(-11) +-71 + j*(-3) +-41 + j*(52) +-11 + j*(0) +-92 + j*(-5) +-85 + j*(107) +28 + j*(93) +-16 + j*(7) +-84 + j*(111) +69 + j*(193) +167 + j*(37) +43 + j*(-35) +47 + j*(66) +161 + j*(-15) +35 + j*(-163) +-132 + j*(-27) +-15 + j*(130) +108 + j*(49) +64 + j*(-9) +86 + j*(22) +136 + j*(-57) +55 + j*(-124) +25 + j*(-78) +64 + j*(-126) +-51 + j*(-210) +-187 + j*(-104) +-148 + j*(22) +-120 + j*(35) +-128 + j*(148) +94 + j*(257) +345 + j*(11) +172 + j*(-356) +-223 + j*(-314) +-296 + j*(6) +-100 + j*(103) +-70 + j*(-10) +-178 + j*(45) +-81 + j*(194) +84 + j*(86) +-57 + j*(-71) +-226 + j*(136) +33 + j*(346) +279 + j*(84) +23 + j*(-144) +-164 + j*(141) +165 + j*(317) +367 + j*(-18) +89 + j*(-231) +-88 + j*(-35) +35 + j*(93) +132 + j*(57) +219 + j*(1) +264 + j*(-218) +-21 + j*(-406) +-325 + j*(-150) +-140 + j*(187) +168 + j*(58) +76 + j*(-210) +-147 + j*(-161) +-148 + j*(-8) +-74 + j*(6) +-89 + j*(-23) +-144 + j*(18) +-127 + j*(123) +2 + j*(157) +58 + j*(49) +-41 + j*(27) +-10 + j*(156) +165 + j*(92) +88 + j*(-93) +-71 + j*(11) +91 + j*(141) +202 + j*(-65) +-13 + j*(-148) +-18 + j*(62) +214 + j*(-37) +35 + j*(-320) +-281 + j*(-126) +-102 + j*(167) +122 + j*(-16) +-92 + j*(-170) +-205 + j*(63) +10 + j*(156) +71 + j*(-11) +-37 + j*(-30) +-14 + j*(35) +26 + j*(-16) +-26 + j*(-56) +-78 + j*(-49) +-167 + j*(5) +-163 + j*(206) +111 + j*(287) +266 + j*(14) +36 + j*(-153) +-81 + j*(48) +132 + j*(109) +180 + j*(-126) +-32 + j*(-206) +-134 + j*(-86) +-135 + j*(-16) +-150 + j*(71) +-54 + j*(168) +60 + j*(118) +49 + j*(54) +72 + j*(72) +124 + j*(-14) +5 + j*(-96) +-78 + j*(39) +68 + j*(103) +100 + j*(-56) +-78 + j*(-47) +-35 + j*(161) +194 + j*(110) +156 + j*(-115) +-33 + j*(-79) +11 + j*(81) +156 + j*(53) +188 + j*(-41) +220 + j*(-119) +189 + j*(-305) +-71 + j*(-407) +-284 + j*(-194) +-153 + j*(18) +1 + j*(-100) +-168 + j*(-241) +-371 + j*(-59) +-262 + j*(197) +-33 + j*(185) +-1 + j*(25) +-129 + j*(-14) +-205 + j*(121) +-92 + j*(288) +154 + j*(258) +230 + j*(4) +18 + j*(-135) +-125 + j*(29) +9 + j*(150) +98 + j*(33) +-13 + j*(-10) +-10 + j*(112) +136 + j*(90) +122 + j*(-68) +-18 + j*(-75) +-45 + j*(35) +28 + j*(87) +118 + j*(69) +181 + j*(-52) +69 + j*(-202) +-136 + j*(-134) +-113 + j*(66) +42 + j*(57) +8 + j*(-47) +-66 + j*(23) +25 + j*(87) +83 + j*(7) +42 + j*(-22) +74 + j*(-25) +54 + j*(-136) +-122 + j*(-134) +-162 + j*(60) +3 + j*(125) +60 + j*(15) +-7 + j*(-12) +-16 + j*(25) +-18 + j*(44) +15 + j*(123) +188 + j*(107) +230 + j*(-129) +-8 + j*(-223) +-100 + j*(-18) +85 + j*(27) +83 + j*(-168) +-118 + j*(-143) +-72 + j*(44) +106 + j*(-39) +4 + j*(-240) +-216 + j*(-181) +-240 + j*(-13) +-204 + j*(47) +-207 + j*(129) +-109 + j*(250) +64 + j*(228) +132 + j*(100) +86 + j*(10) +14 + j*(3) +-6 + j*(80) +102 + j*(127) +205 + j*(6) +120 + j*(-132) +23 + j*(-95) +71 + j*(-92) +2 + j*(-221) +-213 + j*(-148) +-161 + j*(94) +59 + j*(23) +-74 + j*(-202) +-357 + j*(-33) +-240 + j*(288) +18 + j*(272) +37 + j*(175) +105 + j*(233) +291 + j*(98) +181 + j*(-177) +-100 + j*(-116) +-73 + j*(117) +91 + j*(106) +87 + j*(23) +88 + j*(41) +129 + j*(-18) +35 + j*(-51) +51 + j*(93) +299 + j*(35) +273 + j*(-335) +-156 + j*(-414) +-351 + j*(-25) +-69 + j*(227) +180 + j*(63) +119 + j*(-141) +-9 + j*(-163) +-68 + j*(-130) +-117 + j*(-95) +-148 + j*(-23) +-117 + j*(53) +-54 + j*(87) +18 + j*(79) +74 + j*(8) +27 + j*(-95) +-106 + j*(-81) +-122 + j*(64) +18 + j*(103) +67 + j*(-23) +-38 + j*(-62) +-52 + j*(15) +-5 + j*(-18) +-100 + j*(-43) +-124 + j*(118) +87 + j*(151) +124 + j*(-83) +-111 + j*(-116) +-126 + j*(108) +68 + j*(95) +16 + j*(-65) +-108 + j*(23) +4 + j*(105) +25 + j*(-23) +-137 + j*(26) +-43 + j*(242) +209 + j*(152) +157 + j*(-90) +-29 + j*(-62) +-1 + j*(57) +65 + j*(22) +33 + j*(-6) +37 + j*(25) +71 + j*(4) +57 + j*(-27) +45 + j*(-31) +33 + j*(-45) +14 + j*(-37) +20 + j*(-40) +-26 + j*(-62) +-83 + j*(25) +33 + j*(124) +168 + j*(6) +71 + j*(-131) +-31 + j*(-49) +61 + j*(-3) +76 + j*(-119) +-37 + j*(-129) +-37 + j*(-59) +-21 + j*(-105) +-117 + j*(-103) +-119 + j*(0) +-52 + j*(-21) +-143 + j*(-62) +-216 + j*(88) +-84 + j*(226) +62 + j*(204) +172 + j*(158) +307 + j*(4) +238 + j*(-293) +-97 + j*(-386) +-315 + j*(-170) +-280 + j*(40) +-205 + j*(124) +-131 + j*(193) +-19 + j*(206) +49 + j*(155) +71 + j*(120) +98 + j*(83) +88 + j*(44) +91 + j*(46) +132 + j*(-2) +78 + j*(-77) +6 + j*(-24) +94 + j*(13) +116 + j*(-141) +-91 + j*(-177) +-135 + j*(46) +101 + j*(64) +78 + j*(-226) +-296 + j*(-205) +-355 + j*(235) +74 + j*(406) +328 + j*(66) +108 + j*(-200) +-114 + j*(-77) +-45 + j*(81) +49 + j*(34) +9 + j*(-13) +-10 + j*(21) +1 + j*(23) +-32 + j*(61) +52 + j*(161) +234 + j*(83) +208 + j*(-136) +31 + j*(-148) +47 + j*(-47) +117 + j*(-138) +-10 + j*(-226) +-93 + j*(-142) +-71 + j*(-156) +-241 + j*(-191) +-377 + j*(94) +-81 + j*(344) +216 + j*(110) +48 + j*(-162) +-172 + j*(-31) +-73 + j*(142) +57 + j*(87) +47 + j*(13) +22 + j*(-12) +-25 + j*(-16) +-24 + j*(68) +117 + j*(53) +107 + j*(-164) +-175 + j*(-194) +-265 + j*(111) +1 + j*(253) +161 + j*(64) +62 + j*(-62) +4 + j*(-42) +-28 + j*(-76) +-167 + j*(-33) +-160 + j*(195) +110 + j*(252) +217 + j*(-8) +-30 + j*(-126) +-147 + j*(141) +146 + j*(299) +387 + j*(37) +243 + j*(-246) +35 + j*(-247) +-33 + j*(-213) +-173 + j*(-204) +-295 + j*(11) +-115 + j*(234) +114 + j*(135) +74 + j*(-23) +9 + j*(18) +79 + j*(5) +8 + j*(-88) +-105 + j*(53) +108 + j*(214) +368 + j*(-23) +211 + j*(-374) +-131 + j*(-378) +-259 + j*(-180) +-253 + j*(-60) +-255 + j*(34) +-210 + j*(148) +-110 + j*(215) +11 + j*(240) +160 + j*(177) +216 + j*(-8) +86 + j*(-150) +-68 + j*(-105) +-78 + j*(-5) +-49 + j*(3) +-88 + j*(13) +-98 + j*(117) +33 + j*(196) +191 + j*(102) +180 + j*(-88) +23 + j*(-161) +-81 + j*(-76) +-59 + j*(-5) +-49 + j*(-9) +-93 + j*(25) +-62 + j*(125) +76 + j*(147) +159 + j*(25) +98 + j*(-92) +0 + j*(-98) +-47 + j*(-64) +-97 + j*(-25) +-108 + j*(90) +31 + j*(173) +175 + j*(49) +82 + j*(-114) +-69 + j*(-41) +-1 + j*(96) +131 + j*(36) +105 + j*(-78) +41 + j*(-94) +9 + j*(-105) +-73 + j*(-95) +-102 + j*(18) +3 + j*(81) +83 + j*(25) +106 + j*(-34) +129 + j*(-136) +4 + j*(-281) +-235 + j*(-223) +-278 + j*(6) +-155 + j*(91) +-127 + j*(73) +-122 + j*(136) +-34 + j*(174) +15 + j*(154) +86 + j*(183) +236 + j*(89) +199 + j*(-133) +11 + j*(-152) +20 + j*(-77) +4 + j*(-209) +-286 + j*(-191) +-341 + j*(189) +17 + j*(314) +130 + j*(55) +-38 + j*(45) +91 + j*(190) +264 + j*(-47) +-21 + j*(-260) +-262 + j*(22) +-18 + j*(275) +221 + j*(108) +154 + j*(-83) +52 + j*(-103) +-15 + j*(-94) +-64 + j*(-11) +44 + j*(52) +108 + j*(-109) +-117 + j*(-198) +-267 + j*(60) +-30 + j*(270) +205 + j*(99) +99 + j*(-131) +-123 + j*(-71) +-119 + j*(173) +160 + j*(271) +397 + j*(8) +227 + j*(-342) +-134 + j*(-293) +-158 + j*(-21) +2 + j*(-22) +-86 + j*(-103) +-139 + j*(74) +104 + j*(113) +129 + j*(-175) +-195 + j*(-192) +-213 + j*(151) +124 + j*(177) +165 + j*(-131) +-93 + j*(-189) +-161 + j*(-6) +-66 + j*(54) +-33 + j*(25) +-26 + j*(12) +-36 + j*(-13) +-82 + j*(9) +-55 + j*(66) +-14 + j*(37) +-62 + j*(30) +-41 + j*(111) +63 + j*(80) +17 + j*(-19) +-72 + j*(60) +42 + j*(157) +161 + j*(45) +98 + j*(-74) +28 + j*(-83) +-31 + j*(-104) +-149 + j*(-33) +-94 + j*(147) +101 + j*(103) +35 + j*(-83) +-158 + j*(25) +-26 + j*(250) +224 + j*(148) +187 + j*(-78) +29 + j*(-98) +-18 + j*(-13) +12 + j*(62) +127 + j*(79) +210 + j*(-69) +71 + j*(-202) +-48 + j*(-101) +40 + j*(-66) +-28 + j*(-208) +-261 + j*(-81) +-141 + j*(224) +177 + j*(142) +123 + j*(-127) +-58 + j*(-62) +45 + j*(30) +76 + j*(-122) +-115 + j*(-110) +-59 + j*(100) +177 + j*(4) +77 + j*(-275) +-228 + j*(-226) +-267 + j*(42) +-95 + j*(151) +31 + j*(91) +57 + j*(-20) +-27 + j*(-105) +-147 + j*(-56) +-144 + j*(71) +-50 + j*(106) +-7 + j*(58) +-29 + j*(24) +-67 + j*(45) +-49 + j*(118) +65 + j*(116) +86 + j*(-36) +-112 + j*(-77) +-193 + j*(165) +64 + j*(317) +276 + j*(114) +177 + j*(-104) +25 + j*(-93) +-6 + j*(-34) +-25 + j*(0) +8 + j*(62) +98 + j*(21) +41 + j*(-95) +-111 + j*(-27) +-52 + j*(167) +162 + j*(155) +220 + j*(-29) +118 + j*(-123) +54 + j*(-117) +21 + j*(-127) +-53 + j*(-118) +-95 + j*(-32) +-35 + j*(44) +45 + j*(13) +33 + j*(-52) +-14 + j*(-35) +33 + j*(7) +99 + j*(-81) +2 + j*(-207) +-172 + j*(-160) +-208 + j*(-7) +-146 + j*(72) +-112 + j*(112) +-35 + j*(176) +103 + j*(151) +158 + j*(18) +99 + j*(-81) +11 + j*(-106) +-61 + j*(-59) +-44 + j*(31) +65 + j*(18) +53 + j*(-113) +-81 + j*(-117) +-83 + j*(-16) +-30 + j*(-77) +-202 + j*(-127) +-324 + j*(141) +-44 + j*(362) +228 + j*(146) +90 + j*(-93) +-62 + j*(8) +55 + j*(76) +70 + j*(-87) +-134 + j*(-94) +-181 + j*(119) +-22 + j*(212) +74 + j*(162) +115 + j*(141) +197 + j*(92) +218 + j*(-27) +170 + j*(-106) +127 + j*(-173) +2 + j*(-251) +-190 + j*(-165) +-203 + j*(62) +-20 + j*(153) +93 + j*(51) +58 + j*(-40) +6 + j*(-46) +-22 + j*(-21) +-3 + j*(30) +86 + j*(17) +95 + j*(-126) +-79 + j*(-179) +-173 + j*(-15) +-42 + j*(74) +-4 + j*(-47) +-164 + j*(-27) +-126 + j*(191) +116 + j*(171) +101 + j*(-45) +-76 + j*(13) +52 + j*(183) +247 + j*(13) +79 + j*(-192) +-83 + j*(-44) +78 + j*(41) +103 + j*(-173) +-161 + j*(-172) +-162 + j*(106) +95 + j*(105) +82 + j*(-119) +-99 + j*(-95) +-67 + j*(33) +-4 + j*(-14) +-74 + j*(-21) +-40 + j*(69) +55 + j*(6) +-31 + j*(-93) +-138 + j*(-1) +-71 + j*(106) +7 + j*(80) +4 + j*(54) +16 + j*(66) +38 + j*(67) +89 + j*(71) +165 + j*(-13) +92 + j*(-161) +-76 + j*(-122) +-33 + j*(4) +47 + j*(-105) +-160 + j*(-189) +-305 + j*(81) +-49 + j*(291) +180 + j*(107) +85 + j*(-82) +-24 + j*(-65) +-71 + j*(-59) +-182 + j*(24) +-113 + j*(245) +162 + j*(235) +211 + j*(-2) +82 + j*(-57) +105 + j*(-40) +57 + j*(-190) +-214 + j*(-143) +-218 + j*(195) +119 + j*(257) +211 + j*(-23) +-3 + j*(-104) +-58 + j*(68) +81 + j*(122) +161 + j*(34) +153 + j*(-53) +96 + j*(-107) +34 + j*(-81) +81 + j*(-36) +146 + j*(-136) +33 + j*(-271) +-147 + j*(-221) +-185 + j*(-76) +-133 + j*(-6) +-98 + j*(9) +-80 + j*(22) +-57 + j*(44) +0 + j*(50) +52 + j*(-19) +-2 + j*(-106) +-92 + j*(-95) +-130 + j*(-57) +-187 + j*(-7) +-173 + j*(144) +32 + j*(171) +71 + j*(-71) +-226 + j*(-107) +-287 + j*(241) +47 + j*(349) +146 + j*(107) +4 + j*(114) +156 + j*(236) +326 + j*(-4) +98 + j*(-211) +-76 + j*(-43) +40 + j*(45) +30 + j*(-45) +-41 + j*(55) +136 + j*(119) +220 + j*(-103) +8 + j*(-214) +-111 + j*(-71) +-53 + j*(21) +-6 + j*(43) +85 + j*(30) +97 + j*(-129) +-117 + j*(-163) +-171 + j*(70) +44 + j*(124) +54 + j*(-39) +-52 + j*(37) +140 + j*(110) +220 + j*(-192) +-144 + j*(-316) +-315 + j*(39) +-25 + j*(219) +111 + j*(18) +-19 + j*(-42) +4 + j*(44) +74 + j*(-40) +-48 + j*(-110) +-127 + j*(16) +-18 + j*(100) +57 + j*(18) +-7 + j*(-45) +-74 + j*(11) +-25 + j*(96) +80 + j*(71) +81 + j*(-37) +-18 + j*(-50) +-22 + j*(45) +85 + j*(44) +107 + j*(-78) +-13 + j*(-150) +-145 + j*(-63) +-115 + j*(125) +119 + j*(172) +253 + j*(-79) +37 + j*(-286) +-185 + j*(-141) +-96 + j*(16) +-42 + j*(-79) +-195 + j*(-61) +-161 + j*(144) +57 + j*(105) +-1 + j*(-112) +-246 + j*(-51) +-245 + j*(218) +-22 + j*(330) +162 + j*(235) +211 + j*(70) +119 + j*(-49) +3 + j*(-13) +25 + j*(96) +150 + j*(94) +206 + j*(-46) +86 + j*(-180) +-112 + j*(-100) +-64 + j*(151) +252 + j*(136) +301 + j*(-232) +-54 + j*(-372) +-244 + j*(-119) +-134 + j*(26) +-115 + j*(15) +-107 + j*(129) +71 + j*(166) +145 + j*(18) +98 + j*(-38) +134 + j*(-103) +-1 + j*(-272) +-283 + j*(-120) +-150 + j*(210) +165 + j*(83) +21 + j*(-183) +-189 + j*(-12) +-2 + j*(131) +64 + j*(-58) +-126 + j*(-49) +-59 + j*(136) +103 + j*(37) +-17 + j*(-81) +-87 + j*(56) +59 + j*(99) +103 + j*(-33) +22 + j*(-93) +-52 + j*(-93) +-134 + j*(-23) +-73 + j*(110) +72 + j*(34) +-58 + j*(-106) +-211 + j*(92) +29 + j*(271) +210 + j*(41) +16 + j*(-95) +-42 + j*(75) +119 + j*(57) +55 + j*(-96) +-86 + j*(-13) +-23 + j*(100) +32 + j*(108) +118 + j*(181) +371 + j*(95) +402 + j*(-281) +74 + j*(-475) +-175 + j*(-357) +-277 + j*(-229) +-358 + j*(-48) +-234 + j*(166) +-27 + j*(107) +-109 + j*(-28) +-217 + j*(129) +-30 + j*(271) +136 + j*(125) +71 + j*(-9) +-1 + j*(-15) +-70 + j*(-4) +-133 + j*(132) +42 + j*(294) +303 + j*(142) +223 + j*(-158) +-55 + j*(-142) +-59 + j*(102) +181 + j*(112) +231 + j*(-144) +-11 + j*(-252) +-147 + j*(-62) +1 + j*(39) +33 + j*(-119) +-177 + j*(-115) +-193 + j*(136) +23 + j*(185) +57 + j*(69) +38 + j*(128) +215 + j*(129) +273 + j*(-96) +122 + j*(-198) +69 + j*(-190) +-35 + j*(-276) +-267 + j*(-134) +-122 + j*(179) +229 + j*(28) +83 + j*(-345) +-271 + j*(-250) +-245 + j*(-14) +-210 + j*(-30) +-313 + j*(112) +-86 + j*(327) +173 + j*(93) +-69 + j*(-135) +-255 + j*(141) +42 + j*(303) +182 + j*(20) +-82 + j*(-75) +-145 + j*(193) +121 + j*(270) +237 + j*(54) +108 + j*(-70) +25 + j*(-13) +55 + j*(12) +28 + j*(-23) +-34 + j*(63) +120 + j*(189) +352 + j*(4) +215 + j*(-322) +-115 + j*(-276) +-127 + j*(-49) +-33 + j*(-69) +-134 + j*(-77) +-108 + j*(78) +27 + j*(11) +-137 + j*(-69) +-186 + j*(235) +243 + j*(309) +369 + j*(-182) +-112 + j*(-344) +-274 + j*(80) +69 + j*(216) +162 + j*(-28) +27 + j*(-59) +87 + j*(-18) +86 + j*(-177) +-136 + j*(-192) +-197 + j*(26) +-31 + j*(121) +74 + j*(19) +27 + j*(-87) +-86 + j*(-85) +-127 + j*(34) +-18 + j*(105) +66 + j*(24) +24 + j*(-49) +-16 + j*(-54) +-59 + j*(-66) +-125 + j*(-4) +-54 + j*(88) +26 + j*(-8) +-124 + j*(-73) +-205 + j*(136) +11 + j*(251) +134 + j*(88) +36 + j*(11) +19 + j*(73) +58 + j*(71) +84 + j*(89) +207 + j*(41) +176 + j*(-191) +-116 + j*(-194) +-131 + j*(103) +144 + j*(100) +114 + j*(-139) +-59 + j*(-81) +41 + j*(-2) +23 + j*(-161) +-189 + j*(-74) +-52 + j*(148) +144 + j*(-46) +-123 + j*(-207) +-264 + j*(122) +91 + j*(254) +206 + j*(-91) +-107 + j*(-187) +-196 + j*(83) +6 + j*(176) +105 + j*(62) +81 + j*(-24) +15 + j*(-57) +-35 + j*(6) +52 + j*(47) +86 + j*(-85) +-80 + j*(-120) +-107 + j*(52) +46 + j*(39) +-36 + j*(-94) +-171 + j*(52) +12 + j*(190) +124 + j*(6) +-62 + j*(-54) +-77 + j*(151) +130 + j*(168) +180 + j*(26) +166 + j*(-25) +178 + j*(-141) +-4 + j*(-233) +-127 + j*(-46) +69 + j*(38) +97 + j*(-207) +-206 + j*(-209) +-213 + j*(114) +80 + j*(118) +58 + j*(-122) +-129 + j*(-64) +-42 + j*(75) +59 + j*(-29) +-37 + j*(-95) +-54 + j*(-34) +-23 + j*(-101) +-174 + j*(-157) +-306 + j*(5) +-240 + j*(180) +-135 + j*(243) +-26 + j*(291) +132 + j*(257) +208 + j*(124) +208 + j*(8) +157 + j*(-139) +-93 + j*(-210) +-298 + j*(95) +19 + j*(426) +450 + j*(151) +264 + j*(-317) +-165 + j*(-221) +-127 + j*(117) +110 + j*(104) +114 + j*(-34) +76 + j*(-50) +64 + j*(-108) +-61 + j*(-112) +-74 + j*(44) +88 + j*(50) +76 + j*(-103) +-59 + j*(-65) +11 + j*(50) +115 + j*(-42) +33 + j*(-141) +-35 + j*(-100) +-25 + j*(-98) +-86 + j*(-113) +-129 + j*(-36) +-80 + j*(10) +-71 + j*(-4) +-76 + j*(33) +-16 + j*(42) +-2 + j*(-22) +-56 + j*(-44) +-93 + j*(-27) +-144 + j*(9) +-151 + j*(122) +-30 + j*(186) +37 + j*(105) +-25 + j*(115) +68 + j*(235) +293 + j*(144) +298 + j*(-127) +99 + j*(-245) +-52 + j*(-191) +-116 + j*(-89) +-85 + j*(19) +25 + j*(21) +33 + j*(-80) +-43 + j*(-100) +-53 + j*(-90) +-119 + j*(-156) +-303 + j*(-93) +-355 + j*(148) +-214 + j*(329) +-27 + j*(395) +199 + j*(349) +314 + j*(112) +151 + j*(-49) +52 + j*(86) +244 + j*(121) +284 + j*(-127) +49 + j*(-185) +27 + j*(2) +211 + j*(-42) +151 + j*(-265) +-82 + j*(-264) +-145 + j*(-88) +-41 + j*(-4) +49 + j*(-73) +-9 + j*(-200) +-190 + j*(-180) +-232 + j*(2) +-119 + j*(68) +-112 + j*(33) +-122 + j*(126) +45 + j*(161) +108 + j*(-21) +-56 + j*(-84) +-106 + j*(52) +-6 + j*(88) +16 + j*(47) +35 + j*(50) +67 + j*(-11) +-2 + j*(-44) +1 + j*(21) +67 + j*(-56) +-99 + j*(-135) +-204 + j*(109) +81 + j*(243) +216 + j*(-44) +-47 + j*(-130) +64 + j*(-24) +41 + j*(-137) +-82 + j*(-142) +-141 + j*(-64) +-153 + j*(28) +-67 + j*(131) +93 + j*(62) +26 + j*(-125) +-173 + j*(-42) +-63 + j*(158) +138 + j*(8) +-60 + j*(-206) +-307 + j*(6) +-136 + j*(267) +69 + j*(159) +-29 + j*(66) +-37 + j*(230) +202 + j*(243) +265 + j*(5) +98 + j*(-65) +90 + j*(48) +213 + j*(-6) +160 + j*(-149) +56 + j*(-121) +119 + j*(-106) +91 + j*(-280) +-187 + j*(-302) +-305 + j*(-4) +-69 + j*(175) +116 + j*(18) +30 + j*(-141) +-93 + j*(-135) +-163 + j*(-81) +-216 + j*(28) +-139 + j*(171) +18 + j*(165) +49 + j*(78) +57 + j*(83) +155 + j*(21) +103 + j*(-164) +-122 + j*(-168) +-175 + j*(40) +-28 + j*(109) +23 + j*(23) +-23 + j*(6) +-10 + j*(32) +2 + j*(1) +-35 + j*(-1) +-23 + j*(35) +13 + j*(-4) +-66 + j*(-68) +-210 + j*(28) +-175 + j*(274) +111 + j*(379) +349 + j*(170) +293 + j*(-82) +161 + j*(-128) +151 + j*(-157) +40 + j*(-276) +-187 + j*(-195) +-172 + j*(47) +14 + j*(54) +-13 + j*(-79) +-132 + j*(-13) +-64 + j*(110) +35 + j*(85) +52 + j*(49) +99 + j*(15) +79 + j*(-91) +-39 + j*(-89) +-27 + j*(5) +39 + j*(-52) +-76 + j*(-105) +-136 + j*(44) +11 + j*(106) +51 + j*(-4) +-18 + j*(1) +37 + j*(23) +4 + j*(-74) +-138 + j*(35) +53 + j*(249) +366 + j*(14) +157 + j*(-379) +-248 + j*(-250) +-188 + j*(83) +41 + j*(38) +-22 + j*(-115) +-141 + j*(-55) +-129 + j*(31) +-105 + j*(80) +-28 + j*(122) +49 + j*(49) +-32 + j*(-14) +-62 + j*(99) +91 + j*(110) +94 + j*(-57) +-52 + j*(-32) +41 + j*(77) +134 + j*(-120) +-168 + j*(-247) +-377 + j*(124) +-13 + j*(419) +333 + j*(126) +125 + j*(-203) +-144 + j*(-54) +-21 + j*(157) +153 + j*(50) +77 + j*(-89) +-10 + j*(-42) +33 + j*(-24) +-8 + j*(-95) +-121 + j*(-30) +-54 + j*(96) +50 + j*(21) +-81 + j*(-54) +-167 + j*(165) +110 + j*(319) +340 + j*(62) +156 + j*(-168) +14 + j*(-24) +199 + j*(27) +245 + j*(-236) +-26 + j*(-341) +-163 + j*(-165) +-98 + j*(-92) +-140 + j*(-118) +-202 + j*(-4) +-97 + j*(97) +-11 + j*(29) +-64 + j*(-8) +-75 + j*(61) +6 + j*(84) +62 + j*(32) +72 + j*(-46) +13 + j*(-127) +-112 + j*(-111) +-132 + j*(13) +-25 + j*(25) +-56 + j*(-96) +-250 + j*(-49) +-264 + j*(226) +14 + j*(361) +247 + j*(173) +189 + j*(-72) +2 + j*(-122) +-89 + j*(-29) +-75 + j*(69) +-3 + j*(126) +95 + j*(119) +141 + j*(39) +118 + j*(-20) +115 + j*(-37) +116 + j*(-103) +31 + j*(-166) +-64 + j*(-118) +-65 + j*(-54) +-66 + j*(-45) +-90 + j*(16) +6 + j*(77) +94 + j*(-42) +-61 + j*(-146) +-194 + j*(41) +13 + j*(211) +212 + j*(1) +8 + j*(-216) +-228 + j*(-27) +-75 + j*(230) +174 + j*(141) +160 + j*(-45) +83 + j*(-62) +115 + j*(-94) +39 + j*(-226) +-177 + j*(-192) +-229 + j*(41) +-44 + j*(156) +86 + j*(37) +6 + j*(-76) +-101 + j*(-11) +-45 + j*(110) +105 + j*(72) +92 + j*(-110) +-130 + j*(-128) +-197 + j*(137) +96 + j*(279) +316 + j*(0) +93 + j*(-269) +-172 + j*(-113) +-61 + j*(115) +125 + j*(30) +73 + j*(-115) +4 + j*(-102) +11 + j*(-150) +-149 + j*(-238) +-384 + j*(-59) +-305 + j*(295) +54 + j*(376) +254 + j*(119) +124 + j*(-99) +-45 + j*(-50) +-22 + j*(57) +33 + j*(26) +-25 + j*(24) +21 + j*(144) +226 + j*(79) +194 + j*(-200) +-114 + j*(-233) +-198 + j*(49) +19 + j*(156) +126 + j*(13) +56 + j*(-76) +-11 + j*(-73) +-66 + j*(-25) +-28 + j*(86) +134 + j*(58) +122 + j*(-135) +-61 + j*(-136) +-48 + j*(8) +57 + j*(-56) +-45 + j*(-141) +-107 + j*(-39) +-30 + j*(-52) +-159 + j*(-131) +-292 + j*(89) +-57 + j*(279) +117 + j*(89) +-38 + j*(10) +1 + j*(186) +231 + j*(69) +86 + j*(-197) +-174 + j*(-53) +-38 + j*(173) +136 + j*(46) +21 + j*(-68) +-37 + j*(43) +69 + j*(60) +68 + j*(-39) +-21 + j*(-29) +-25 + j*(62) +76 + j*(116) +218 + j*(29) +185 + j*(-206) +-100 + j*(-251) +-214 + j*(39) +54 + j*(186) +209 + j*(-40) +37 + j*(-188) +-83 + j*(-73) +-18 + j*(6) +35 + j*(-20) +56 + j*(-64) +25 + j*(-142) +-98 + j*(-144) +-122 + j*(-19) +-17 + j*(-11) +-58 + j*(-113) +-182 + j*(-39) +-112 + j*(105) +23 + j*(50) +-20 + j*(-59) +-103 + j*(-37) +-104 + j*(3) +-135 + j*(6) +-189 + j*(83) +-144 + j*(216) +12 + j*(267) +136 + j*(172) +117 + j*(60) +77 + j*(79) +180 + j*(68) +186 + j*(-144) +-102 + j*(-214) +-239 + j*(102) +61 + j*(281) +254 + j*(25) +56 + j*(-141) +-49 + j*(6) +57 + j*(30) +-7 + j*(-59) +-101 + j*(93) +103 + j*(225) +279 + j*(25) +134 + j*(-156) +2 + j*(-59) +90 + j*(11) +130 + j*(-89) +39 + j*(-122) +33 + j*(-61) +78 + j*(-105) +-21 + j*(-170) +-120 + j*(-28) +64 + j*(127) +313 + j*(-81) +153 + j*(-427) +-210 + j*(-384) +-231 + j*(-131) +-118 + j*(-202) +-387 + j*(-298) +-633 + j*(100) +-279 + j*(514) +172 + j*(310) +67 + j*(-50) +-197 + j*(56) +-66 + j*(297) +193 + j*(192) +164 + j*(-54) +-28 + j*(-98) +-116 + j*(18) +-81 + j*(117) +-19 + j*(151) +37 + j*(168) +129 + j*(162) +209 + j*(63) +163 + j*(-70) +45 + j*(-78) +25 + j*(6) +100 + j*(17) +131 + j*(-62) +88 + j*(-138) +-5 + j*(-174) +-111 + j*(-132) +-146 + j*(-30) +-123 + j*(44) +-94 + j*(106) +11 + j*(177) +171 + j*(91) +123 + j*(-115) +-89 + j*(-86) +-54 + j*(130) +180 + j*(79) +123 + j*(-181) +-157 + j*(-134) +-135 + j*(154) +141 + j*(170) +193 + j*(-69) +15 + j*(-131) +-30 + j*(-1) +87 + j*(23) +130 + j*(-98) +33 + j*(-192) +-98 + j*(-163) +-141 + j*(-40) +-41 + j*(35) +35 + j*(-76) +-122 + j*(-187) +-322 + j*(-10) +-206 + j*(290) +116 + j*(298) +231 + j*(49) +106 + j*(-91) +16 + j*(-54) +35 + j*(-28) +39 + j*(-62) +7 + j*(-80) +-8 + j*(-82) +-33 + j*(-113) +-124 + j*(-127) +-225 + j*(-24) +-181 + j*(148) +-6 + j*(187) +78 + j*(68) +18 + j*(-5) +-16 + j*(27) +11 + j*(34) +21 + j*(15) +33 + j*(-19) +-19 + j*(-102) +-199 + j*(-66) +-223 + j*(192) +48 + j*(288) +165 + j*(59) +-33 + j*(-6) +-26 + j*(218) +255 + j*(191) +272 + j*(-114) +8 + j*(-186) +-96 + j*(-7) +-14 + j*(115) +115 + j*(137) +253 + j*(25) +185 + j*(-202) +-76 + j*(-175) +-47 + j*(91) +243 + j*(33) +178 + j*(-313) +-200 + j*(-301) +-272 + j*(54) +-1 + j*(194) +169 + j*(40) +136 + j*(-121) +37 + j*(-179) +-43 + j*(-160) +-63 + j*(-138) +-114 + j*(-163) +-235 + j*(-103) +-231 + j*(80) +-65 + j*(129) +-11 + j*(6) +-116 + j*(-33) +-173 + j*(54) +-153 + j*(148) +-80 + j*(243) +95 + j*(272) +233 + j*(119) +171 + j*(-49) +55 + j*(-51) +62 + j*(1) +98 + j*(-42) +52 + j*(-112) +-40 + j*(-102) +-72 + j*(-16) +1 + j*(43) +81 + j*(-20) +53 + j*(-125) +-43 + j*(-179) +-188 + j*(-168) +-325 + j*(2) +-218 + j*(263) +74 + j*(243) +76 + j*(-13) +-163 + j*(36) +-66 + j*(303) +223 + j*(214) +158 + j*(-27) +11 + j*(62) +166 + j*(144) +234 + j*(-49) +67 + j*(-89) +112 + j*(40) +257 + j*(-106) +83 + j*(-316) +-161 + j*(-204) +-150 + j*(-12) +-67 + j*(54) +35 + j*(88) +170 + j*(-28) +55 + j*(-238) +-200 + j*(-151) +-151 + j*(99) +42 + j*(74) +9 + j*(-31) +-1 + j*(45) +143 + j*(-13) +63 + j*(-231) +-192 + j*(-179) +-185 + j*(47) +-30 + j*(47) +-66 + j*(-51) +-162 + j*(28) +-84 + j*(158) +79 + j*(127) +111 + j*(-55) +-77 + j*(-161) +-276 + j*(13) +-178 + j*(303) +132 + j*(349) +320 + j*(135) +297 + j*(-108) +119 + j*(-267) +-125 + j*(-216) +-168 + j*(18) +16 + j*(81) +48 + j*(-74) +-92 + j*(-81) +-94 + j*(18) +-81 + j*(-3) +-179 + j*(80) +-57 + j*(281) +202 + j*(188) +150 + j*(-26) +40 + j*(47) +203 + j*(78) +226 + j*(-163) +0 + j*(-209) +-13 + j*(-86) +6 + j*(-194) +-262 + j*(-181) +-286 + j*(189) +80 + j*(265) +151 + j*(-21) +-35 + j*(-16) +78 + j*(108) +181 + j*(-91) +-48 + j*(-185) +-113 + j*(24) +58 + j*(37) +21 + j*(-93) +-57 + j*(-22) +38 + j*(-23) +-54 + j*(-161) +-253 + j*(-11) +-105 + j*(243) +149 + j*(144) +117 + j*(-54) +15 + j*(-83) +-57 + j*(-91) +-180 + j*(6) +-98 + j*(235) +189 + j*(204) +222 + j*(-64) +36 + j*(-125) +-2 + j*(-39) +12 + j*(-47) +-20 + j*(-14) +54 + j*(13) +81 + j*(-112) +-78 + j*(-156) +-151 + j*(-22) +-98 + j*(49) +-86 + j*(112) +76 + j*(211) +308 + j*(4) +122 + j*(-337) +-262 + j*(-223) +-233 + j*(119) +6 + j*(144) +40 + j*(33) +45 + j*(11) +43 + j*(-90) +-130 + j*(-105) +-162 + j*(110) +53 + j*(146) +67 + j*(-40) +-78 + j*(-10) +-3 + j*(91) +42 + j*(-25) +-122 + j*(-4) +-47 + j*(221) +228 + j*(124) +138 + j*(-163) +-124 + j*(-83) +-40 + j*(128) +112 + j*(25) +-30 + j*(-65) +-81 + j*(145) +210 + j*(213) +359 + j*(-129) +35 + j*(-382) +-292 + j*(-139) +-144 + j*(200) +153 + j*(124) +97 + j*(-101) +-52 + j*(-10) +112 + j*(100) +239 + j*(-129) +11 + j*(-296) +-152 + j*(-137) +-54 + j*(-61) +-98 + j*(-168) +-269 + j*(-66) +-192 + j*(139) +-30 + j*(98) +-91 + j*(12) +-161 + j*(124) +-47 + j*(248) +115 + j*(233) +236 + j*(119) +250 + j*(-72) +95 + j*(-197) +-52 + j*(-136) +-57 + j*(-49) +-47 + j*(-37) +-54 + j*(-12) +-31 + j*(-16) +-93 + j*(-37) +-151 + j*(93) +11 + j*(206) +153 + j*(60) +35 + j*(-54) +-14 + j*(54) +110 + j*(35) +32 + j*(-99) +-103 + j*(47) +114 + j*(197) +316 + j*(-71) +65 + j*(-332) +-214 + j*(-156) +-134 + j*(71) +-4 + j*(54) +1 + j*(30) +66 + j*(43) +121 + j*(-80) +-9 + j*(-190) +-156 + j*(-113) +-150 + j*(11) +-104 + j*(44) +-106 + j*(69) +-71 + j*(145) +52 + j*(167) +144 + j*(62) +97 + j*(-61) +-7 + j*(-66) +-28 + j*(-11) +-20 + j*(-7) +-63 + j*(14) +-44 + j*(110) +88 + j*(124) +147 + j*(-8) +36 + j*(-94) +-58 + j*(1) +39 + j*(115) +204 + j*(23) +161 + j*(-202) +-83 + j*(-239) +-188 + j*(-33) +-38 + j*(81) +49 + j*(-44) +-83 + j*(-132) +-227 + j*(-7) +-192 + j*(210) +33 + j*(340) +315 + j*(206) +324 + j*(-126) +49 + j*(-216) +-6 + j*(-18) +190 + j*(-70) +64 + j*(-332) +-242 + j*(-202) +-119 + j*(66) +68 + j*(-121) +-240 + j*(-272) +-431 + j*(117) +-62 + j*(359) +168 + j*(81) +-14 + j*(-62) +-42 + j*(56) +35 + j*(-28) +-143 + j*(-83) +-199 + j*(154) +36 + j*(207) +38 + j*(9) +-150 + j*(108) +25 + j*(344) +317 + j*(180) +221 + j*(-98) +23 + j*(-40) +105 + j*(94) +245 + j*(-13) +183 + j*(-194) +4 + j*(-231) +-112 + j*(-112) +-64 + j*(18) +39 + j*(7) +29 + j*(-66) +-8 + j*(-44) +40 + j*(-46) +14 + j*(-140) +-119 + j*(-122) +-127 + j*(6) +-47 + j*(11) +-90 + j*(-26) +-123 + j*(74) +-8 + j*(132) +60 + j*(39) +-11 + j*(-6) +-38 + j*(69) +47 + j*(123) +156 + j*(77) +216 + j*(-64) +124 + j*(-233) +-90 + j*(-257) +-214 + j*(-104) +-177 + j*(40) +-98 + j*(95) +-26 + j*(106) +40 + j*(76) +68 + j*(6) +35 + j*(-67) +-59 + j*(-93) +-153 + j*(0) +-78 + j*(149) +103 + j*(101) +69 + j*(-101) +-152 + j*(-82) +-163 + j*(154) +59 + j*(207) +144 + j*(28) +11 + j*(-62) +-85 + j*(35) +-25 + j*(155) +107 + j*(158) +172 + j*(62) +152 + j*(-12) +137 + j*(-38) +126 + j*(-89) +62 + j*(-109) +65 + j*(-64) +127 + j*(-144) +-11 + j*(-286) +-241 + j*(-156) +-163 + j*(96) +54 + j*(46) +-8 + j*(-119) +-135 + j*(-46) +-76 + j*(45) +-47 + j*(12) +-54 + j*(60) +71 + j*(45) +36 + j*(-161) +-245 + j*(-125) +-243 + j*(197) +57 + j*(221) +52 + j*(-16) +-157 + j*(70) +-7 + j*(316) +300 + j*(180) +240 + j*(-146) +-49 + j*(-164) +-121 + j*(78) +91 + j*(207) +287 + j*(41) +203 + j*(-204) +-25 + j*(-200) +-50 + j*(-33) +74 + j*(-29) +61 + j*(-146) +-47 + j*(-156) +-89 + j*(-97) +-93 + j*(-52) +-59 + j*(-19) +-25 + j*(-72) +-133 + j*(-123) +-226 + j*(28) +-69 + j*(151) +38 + j*(-12) +-158 + j*(-95) +-256 + j*(132) +-58 + j*(262) +54 + j*(157) +24 + j*(139) +112 + j*(168) +187 + j*(37) +86 + j*(-59) +16 + j*(0) +59 + j*(20) +46 + j*(-21) +-2 + j*(8) +18 + j*(72) +103 + j*(110) +242 + j*(49) +283 + j*(-177) +63 + j*(-349) +-171 + j*(-238) +-180 + j*(-73) +-181 + j*(-31) +-218 + j*(127) +13 + j*(308) +317 + j*(100) +180 + j*(-249) +-138 + j*(-177) +-78 + j*(81) +146 + j*(-2) +57 + j*(-236) +-176 + j*(-192) +-194 + j*(-18) +-125 + j*(-6) +-196 + j*(-15) +-239 + j*(140) +-93 + j*(263) +40 + j*(199) +26 + j*(161) +98 + j*(230) +284 + j*(135) +255 + j*(-117) +28 + j*(-158) +-29 + j*(-4) +69 + j*(37) +98 + j*(-4) +141 + j*(-21) +175 + j*(-158) +-8 + j*(-275) +-180 + j*(-100) +-18 + j*(64) +117 + j*(-118) +-94 + j*(-255) +-248 + j*(-61) +-112 + j*(74) +-43 + j*(-29) +-158 + j*(-42) +-182 + j*(93) +-77 + j*(161) +21 + j*(132) +57 + j*(35) +-44 + j*(-43) +-165 + j*(81) +-31 + j*(267) +203 + j*(157) +128 + j*(-79) +-87 + j*(-9) +-4 + j*(209) +245 + j*(149) +262 + j*(-107) +58 + j*(-215) +-103 + j*(-107) +-89 + j*(53) +44 + j*(110) +147 + j*(25) +136 + j*(-93) +44 + j*(-163) +-94 + j*(-143) +-162 + j*(35) +33 + j*(192) +276 + j*(1) +118 + j*(-319) +-238 + j*(-221) +-201 + j*(113) +76 + j*(107) +74 + j*(-97) +-54 + j*(-91) +-29 + j*(-59) +-99 + j*(-143) +-282 + j*(-12) +-161 + j*(262) +140 + j*(199) +129 + j*(-60) +-64 + j*(-62) +-53 + j*(68) +25 + j*(51) +6 + j*(24) +28 + j*(52) +80 + j*(-8) +14 + j*(-88) +-90 + j*(-59) +-140 + j*(35) +-114 + j*(186) +98 + j*(286) +330 + j*(91) +204 + j*(-202) +-58 + j*(-122) +52 + j*(80) +236 + j*(-100) +20 + j*(-310) +-190 + j*(-115) +-12 + j*(36) +76 + j*(-176) +-187 + j*(-270) +-344 + j*(-37) +-238 + j*(147) +-126 + j*(180) +-33 + j*(186) +35 + j*(103) +-52 + j*(49) +-85 + j*(202) +136 + j*(264) +256 + j*(45) +103 + j*(-90) +21 + j*(-9) +54 + j*(-2) +-6 + j*(-4) +35 + j*(121) +237 + j*(49) +168 + j*(-221) +-132 + j*(-182) +-128 + j*(100) +96 + j*(123) +135 + j*(-8) +127 + j*(-30) +165 + j*(-132) +10 + j*(-247) +-133 + j*(-87) +42 + j*(19) +100 + j*(-223) +-222 + j*(-286) +-333 + j*(62) +-33 + j*(204) +95 + j*(-21) +-64 + j*(-117) +-130 + j*(-28) +-133 + j*(-2) +-188 + j*(76) +-101 + j*(226) +95 + j*(206) +155 + j*(47) +94 + j*(-64) +-34 + j*(-110) +-178 + j*(15) +-74 + j*(246) +210 + j*(184) +187 + j*(-86) +-14 + j*(-54) +100 + j*(81) +223 + j*(-134) +-47 + j*(-290) +-216 + j*(-41) +-10 + j*(69) +-2 + j*(-136) +-267 + j*(-77) +-235 + j*(247) +64 + j*(313) +211 + j*(148) +238 + j*(6) +191 + j*(-171) +-45 + j*(-252) +-218 + j*(-37) +-59 + j*(169) +144 + j*(66) +88 + j*(-122) +-86 + j*(-115) +-136 + j*(40) +-5 + j*(144) +148 + j*(40) +75 + j*(-150) +-138 + j*(-115) +-154 + j*(91) +-1 + j*(159) +87 + j*(103) +144 + j*(42) +158 + j*(-103) +-23 + j*(-199) +-171 + j*(-38) +-54 + j*(110) +37 + j*(25) +-58 + j*(23) +9 + j*(170) +218 + j*(90) +172 + j*(-133) +-3 + j*(-113) +45 + j*(-8) +119 + j*(-112) +-10 + j*(-196) +-89 + j*(-106) +-42 + j*(-93) +-127 + j*(-153) +-262 + j*(-16) +-144 + j*(182) +47 + j*(115) +-1 + j*(-23) +-86 + j*(62) +46 + j*(127) +110 + j*(-31) +-53 + j*(-82) +-69 + j*(88) +113 + j*(64) +59 + j*(-134) +-136 + j*(-60) +-41 + j*(107) +82 + j*(-21) +-89 + j*(-90) +-97 + j*(122) +169 + j*(59) +45 + j*(-286) +-397 + j*(-161) +-355 + j*(334) +84 + j*(410) +231 + j*(128) +119 + j*(5) +63 + j*(3) +4 + j*(25) +30 + j*(139) +221 + j*(116) +240 + j*(-124) +23 + j*(-187) +-40 + j*(-53) +13 + j*(-55) +-84 + j*(-57) +-74 + j*(125) +165 + j*(130) +197 + j*(-127) +-37 + j*(-181) +-86 + j*(2) +45 + j*(20) +16 + j*(-74) +-71 + j*(1) +35 + j*(109) +179 + j*(11) +139 + j*(-147) +26 + j*(-174) +-8 + j*(-152) +-52 + j*(-191) +-188 + j*(-172) +-266 + j*(3) +-136 + j*(168) +52 + j*(132) +100 + j*(-23) +17 + j*(-127) +-110 + j*(-131) +-202 + j*(-24) +-151 + j*(117) +-20 + j*(118) +-13 + j*(30) +-76 + j*(63) +-2 + j*(139) +105 + j*(52) +33 + j*(-74) +-95 + j*(-33) +-92 + j*(82) +-8 + j*(115) +42 + j*(70) +19 + j*(27) +-23 + j*(67) +59 + j*(145) +216 + j*(42) +144 + j*(-204) +-153 + j*(-209) +-245 + j*(70) +-40 + j*(204) +59 + j*(79) +-44 + j*(63) +1 + j*(219) +226 + j*(186) +257 + j*(-53) +64 + j*(-124) +5 + j*(14) +122 + j*(37) +124 + j*(-71) +35 + j*(-55) +83 + j*(21) +177 + j*(-45) +146 + j*(-151) +92 + j*(-190) +26 + j*(-250) +-139 + j*(-231) +-185 + j*(-25) +24 + j*(56) +122 + j*(-159) +-81 + j*(-301) +-264 + j*(-180) +-276 + j*(-36) +-257 + j*(64) +-177 + j*(170) +-37 + j*(166) +-4 + j*(84) +-8 + j*(76) +38 + j*(30) +-32 + j*(-66) +-163 + j*(13) +-101 + j*(153) +1 + j*(117) +-42 + j*(90) +-12 + j*(180) +119 + j*(151) +118 + j*(46) +96 + j*(48) +146 + j*(-9) +49 + j*(-115) +-74 + j*(-1) +65 + j*(105) +148 + j*(-71) +-60 + j*(-138) +-116 + j*(88) +109 + j*(135) +158 + j*(-69) +0 + j*(-125) +-55 + j*(-34) +-37 + j*(9) +-11 + j*(54) +79 + j*(37) +63 + j*(-92) +-106 + j*(-74) +-110 + j*(134) +105 + j*(196) +244 + j*(34) +192 + j*(-152) +17 + j*(-219) +-125 + j*(-83) +-1 + j*(95) +216 + j*(-44) +77 + j*(-322) +-231 + j*(-233) +-198 + j*(36) +-13 + j*(4) +-98 + j*(-134) +-258 + j*(-17) +-184 + j*(182) +8 + j*(197) +91 + j*(61) +1 + j*(-35) +-86 + j*(46) +16 + j*(127) +89 + j*(-1) +-80 + j*(-47) +-95 + j*(187) +206 + j*(194) +231 + j*(-133) +-62 + j*(-153) +-21 + j*(76) +164 + j*(-67) +-66 + j*(-256) +-270 + j*(-5) +-62 + j*(169) +6 + j*(22) +-118 + j*(103) +91 + j*(258) +290 + j*(-17) +15 + j*(-226) +-156 + j*(23) +66 + j*(129) +97 + j*(-69) +-72 + j*(-26) +34 + j*(121) +175 + j*(-28) +25 + j*(-163) +-91 + j*(-52) +-42 + j*(16) +-49 + j*(22) +-19 + j*(124) +164 + j*(124) +243 + j*(-84) +98 + j*(-250) +-100 + j*(-234) +-218 + j*(-77) +-147 + j*(123) +78 + j*(139) +161 + j*(-71) +4 + j*(-197) +-129 + j*(-128) +-143 + j*(-45) +-141 + j*(2) +-122 + j*(45) +-107 + j*(54) +-117 + j*(101) +-40 + j*(161) +40 + j*(84) +-67 + j*(37) +-97 + j*(231) +188 + j*(313) +370 + j*(17) +158 + j*(-226) +-66 + j*(-129) +-54 + j*(23) +35 + j*(68) +139 + j*(27) +158 + j*(-143) +-45 + j*(-235) +-185 + j*(-54) +-51 + j*(61) +-35 + j*(-49) +-178 + j*(45) +-4 + j*(259) +267 + j*(54) +59 + j*(-241) +-228 + j*(-37) +-34 + j*(224) +180 + j*(54) +35 + j*(-87) +-25 + j*(50) +119 + j*(49) +84 + j*(-80) +0 + j*(-6) +139 + j*(39) +206 + j*(-162) +13 + j*(-283) +-124 + j*(-184) +-116 + j*(-117) +-155 + j*(-119) +-226 + j*(-56) +-247 + j*(66) +-173 + j*(209) +42 + j*(250) +177 + j*(32) +-29 + j*(-141) +-209 + j*(83) +45 + j*(274) +258 + j*(11) +16 + j*(-204) +-165 + j*(-1) +-2 + j*(117) +32 + j*(-23) +-111 + j*(28) +-8 + j*(192) +165 + j*(91) +99 + j*(-37) +73 + j*(5) +147 + j*(-90) +-31 + j*(-238) +-258 + j*(-49) +-117 + j*(214) +118 + j*(139) +89 + j*(-19) +11 + j*(0) +40 + j*(21) +35 + j*(-11) +9 + j*(13) +49 + j*(36) +94 + j*(3) +107 + j*(-69) +24 + j*(-164) +-161 + j*(-100) +-141 + j*(158) +157 + j*(201) +267 + j*(-76) +83 + j*(-209) +10 + j*(-151) +-16 + j*(-212) +-202 + j*(-191) +-211 + j*(35) +-29 + j*(13) +-168 + j*(-146) +-388 + j*(119) +-94 + j*(441) +273 + j*(221) +144 + j*(-82) +-36 + j*(16) +87 + j*(100) +141 + j*(-43) +18 + j*(-96) +-24 + j*(-37) +-25 + j*(-23) +-53 + j*(13) +-23 + j*(74) +40 + j*(106) +163 + j*(103) +291 + j*(-91) +100 + j*(-375) +-272 + j*(-255) +-221 + j*(100) +53 + j*(44) +-82 + j*(-169) +-295 + j*(35) +-92 + j*(264) +97 + j*(131) +34 + j*(59) +103 + j*(104) +171 + j*(-62) +-25 + j*(-145) +-67 + j*(46) +138 + j*(-2) +1 + j*(-266) +-345 + j*(-102) +-222 + j*(293) +151 + j*(245) +151 + j*(-49) +-62 + j*(-60) +-69 + j*(107) +81 + j*(129) +144 + j*(-4) +32 + j*(-121) +-141 + j*(-47) +-134 + j*(176) +87 + j*(270) +281 + j*(137) +303 + j*(-72) +185 + j*(-235) +-19 + j*(-260) +-150 + j*(-108) +-71 + j*(45) +59 + j*(11) +47 + j*(-105) +-69 + j*(-129) +-163 + j*(-31) +-121 + j*(141) +97 + j*(195) +257 + j*(-18) +95 + j*(-258) +-180 + j*(-167) +-146 + j*(113) +137 + j*(120) +197 + j*(-177) +-105 + j*(-314) +-317 + j*(-47) +-110 + j*(209) +154 + j*(55) +45 + j*(-206) +-199 + j*(-161) +-227 + j*(14) +-176 + j*(76) +-161 + j*(139) +-66 + j*(207) +28 + j*(161) +32 + j*(127) +88 + j*(130) +134 + j*(21) +21 + j*(-32) +13 + j*(87) +168 + j*(25) +63 + j*(-192) +-204 + j*(-83) +-122 + j*(182) +84 + j*(126) +18 + j*(18) +-4 + j*(131) +150 + j*(105) +93 + j*(-37) +-3 + j*(91) +233 + j*(173) +367 + j*(-139) +78 + j*(-336) +-112 + j*(-143) +-4 + j*(-45) +-9 + j*(-131) +-103 + j*(-71) +-32 + j*(-3) +-30 + j*(-91) +-170 + j*(-27) +-76 + j*(189) +197 + j*(115) +184 + j*(-183) +-89 + j*(-236) +-194 + j*(-35) +-69 + j*(81) +33 + j*(7) +-21 + j*(-98) +-161 + j*(-71) +-204 + j*(107) +-37 + j*(241) +161 + j*(144) +149 + j*(-46) +23 + j*(-83) +-8 + j*(-36) +-11 + j*(-44) +-68 + j*(-16) +-21 + j*(86) +132 + j*(37) +116 + j*(-173) +-110 + j*(-238) +-264 + j*(-83) +-255 + j*(90) +-177 + j*(215) +-18 + j*(296) +179 + j*(214) +214 + j*(6) +68 + j*(-100) +-61 + j*(-35) +-76 + j*(94) +28 + j*(204) +221 + j*(187) +339 + j*(-5) +269 + j*(-218) +93 + j*(-317) +-90 + j*(-290) +-208 + j*(-153) +-174 + j*(-4) +-92 + j*(18) +-100 + j*(8) +-82 + j*(83) +41 + j*(72) +41 + j*(-76) +-122 + j*(-94) +-178 + j*(50) +-107 + j*(134) +-55 + j*(170) +46 + j*(211) +180 + j*(128) +154 + j*(-30) +33 + j*(-28) +62 + j*(72) +199 + j*(27) +215 + j*(-164) +37 + j*(-307) +-204 + j*(-242) +-288 + j*(-9) +-171 + j*(158) +-47 + j*(177) +31 + j*(182) +157 + j*(148) +211 + j*(-5) +117 + j*(-101) +71 + j*(-81) +66 + j*(-141) +-81 + j*(-169) +-163 + j*(18) +25 + j*(127) +137 + j*(-39) +8 + j*(-131) +-37 + j*(-42) +28 + j*(-64) +-48 + j*(-138) +-127 + j*(-55) +-64 + j*(-16) +-105 + j*(-90) +-244 + j*(19) +-136 + j*(239) +115 + j*(183) +109 + j*(-37) +-54 + j*(-30) +-6 + j*(98) +125 + j*(0) +-4 + j*(-169) +-224 + j*(-39) +-127 + j*(221) +142 + j*(183) +163 + j*(-52) +3 + j*(-110) +-57 + j*(-47) +-82 + j*(-33) +-137 + j*(42) +-74 + j*(148) +19 + j*(119) +-8 + j*(95) +24 + j*(173) +148 + j*(144) +152 + j*(57) +177 + j*(71) +301 + j*(-57) +147 + j*(-323) +-212 + j*(-216) +-170 + j*(158) +158 + j*(166) +208 + j*(-74) +96 + j*(-134) +68 + j*(-169) +-72 + j*(-209) +-172 + j*(-21) +32 + j*(85) +112 + j*(-146) +-152 + j*(-204) +-201 + j*(76) +69 + j*(110) +78 + j*(-144) +-173 + j*(-148) +-206 + j*(94) +5 + j*(179) +146 + j*(25) +59 + j*(-169) +-175 + j*(-153) +-226 + j*(95) +10 + j*(196) +125 + j*(-16) +-63 + j*(-127) +-161 + j*(30) +-50 + j*(101) +-45 + j*(33) +-116 + j*(107) +6 + j*(240) +213 + j*(154) +223 + j*(-80) +44 + j*(-195) +-124 + j*(-118) +-154 + j*(23) +-95 + j*(109) +-25 + j*(144) +65 + j*(130) +93 + j*(28) +-23 + j*(3) +-41 + j*(175) +191 + j*(228) +316 + j*(4) +185 + j*(-139) +129 + j*(-107) +139 + j*(-197) +-44 + j*(-263) +-156 + j*(-78) +-8 + j*(11) +12 + j*(-128) +-142 + j*(-95) +-98 + j*(57) +14 + j*(12) +-44 + j*(-38) +-41 + j*(38) +37 + j*(-1) +-17 + j*(-58) +-8 + j*(2) +69 + j*(-117) +-173 + j*(-255) +-416 + j*(61) +-106 + j*(380) +202 + j*(123) +-37 + j*(-95) +-159 + j*(194) +202 + j*(280) +305 + j*(-110) +-48 + j*(-237) +-175 + j*(40) +17 + j*(151) +99 + j*(49) +89 + j*(11) +108 + j*(-40) +42 + j*(-106) +-22 + j*(-56) +32 + j*(-42) +-19 + j*(-139) +-181 + j*(-54) +-98 + j*(169) +161 + j*(101) +119 + j*(-177) +-168 + j*(-175) +-224 + j*(81) +-42 + j*(186) +69 + j*(107) +79 + j*(40) +71 + j*(-13) +8 + j*(-39) +-18 + j*(30) +74 + j*(40) +71 + j*(-88) +-93 + j*(-84) +-103 + j*(117) +117 + j*(165) +234 + j*(-37) +115 + j*(-219) +-88 + j*(-229) +-228 + j*(-66) +-147 + j*(160) +113 + j*(151) +153 + j*(-106) +-80 + j*(-168) +-131 + j*(13) +-11 + j*(6) +-115 + j*(-80) +-220 + j*(122) +30 + j*(283) +231 + j*(51) +51 + j*(-148) +-115 + j*(-27) +-54 + j*(92) +1 + j*(101) +71 + j*(133) +204 + j*(47) +149 + j*(-150) +-49 + j*(-141) +-57 + j*(23) +74 + j*(31) +106 + j*(-79) +54 + j*(-171) +-86 + j*(-245) +-306 + j*(-141) +-325 + j*(156) +-70 + j*(288) +83 + j*(156) +46 + j*(88) +86 + j*(115) +158 + j*(23) +77 + j*(-86) +-24 + j*(-36) +1 + j*(38) +54 + j*(31) +68 + j*(4) +74 + j*(-21) +71 + j*(-45) +72 + j*(-72) +45 + j*(-136) +-73 + j*(-156) +-146 + j*(-31) +-47 + j*(54) +6 + j*(-28) +-95 + j*(-40) +-88 + j*(93) +56 + j*(94) +69 + j*(-23) +12 + j*(-25) +54 + j*(-30) +16 + j*(-139) +-152 + j*(-108) +-157 + j*(76) +-4 + j*(113) +44 + j*(16) +5 + j*(-21) +-18 + j*(-37) +-75 + j*(-35) +-98 + j*(37) +-44 + j*(64) +-59 + j*(38) +-85 + j*(127) +62 + j*(199) +191 + j*(50) +99 + j*(-103) +-20 + j*(-98) +-95 + j*(-77) +-221 + j*(28) +-174 + j*(302) +161 + j*(393) +378 + j*(131) +269 + j*(-100) +143 + j*(-91) +175 + j*(-71) +202 + j*(-180) +83 + j*(-320) +-159 + j*(-292) +-243 + j*(-25) +6 + j*(103) +125 + j*(-158) +-182 + j*(-278) +-330 + j*(53) +-28 + j*(209) +87 + j*(-44) +-133 + j*(-98) +-148 + j*(98) +-8 + j*(100) +-25 + j*(47) +15 + j*(103) +116 + j*(-4) +-33 + j*(-134) +-166 + j*(30) +-9 + j*(145) +65 + j*(6) +-54 + j*(-18) +-39 + j*(66) +-13 + j*(16) +-127 + j*(62) +-58 + j*(260) +182 + j*(251) +255 + j*(86) +262 + j*(12) +310 + j*(-136) +165 + j*(-339) +-88 + j*(-323) +-206 + j*(-184) +-265 + j*(-32) +-186 + j*(199) +124 + j*(227) +233 + j*(-72) +2 + j*(-201) +-70 + j*(-66) +-18 + j*(-109) +-199 + j*(-134) +-247 + j*(142) +52 + j*(219) +122 + j*(-47) +-98 + j*(-73) +-71 + j*(100) +48 + j*(25) +-83 + j*(-39) +-117 + j*(148) +96 + j*(191) +163 + j*(14) +69 + j*(-51) +52 + j*(-48) +-1 + j*(-100) +-112 + j*(-35) +-72 + j*(105) +53 + j*(110) +95 + j*(47) +127 + j*(4) +151 + j*(-115) +1 + j*(-254) +-248 + j*(-164) +-279 + j*(143) +-1 + j*(298) +228 + j*(104) +124 + j*(-119) +-37 + j*(-70) +9 + j*(3) +-1 + j*(-85) +-151 + j*(-22) +-82 + j*(185) +129 + j*(152) +133 + j*(8) +112 + j*(22) +209 + j*(-59) +104 + j*(-248) +-107 + j*(-182) +-71 + j*(-43) +-45 + j*(-108) +-172 + j*(-52) +-74 + j*(115) +83 + j*(-25) +-111 + j*(-149) +-212 + j*(94) +50 + j*(164) +59 + j*(-96) +-214 + j*(-33) +-108 + j*(274) +221 + j*(184) +180 + j*(-109) +-30 + j*(-104) +-18 + j*(21) +74 + j*(-22) +15 + j*(-140) +-161 + j*(-123) +-222 + j*(91) +-16 + j*(219) +119 + j*(31) +-93 + j*(-53) +-136 + j*(249) +267 + j*(321) +422 + j*(-106) +83 + j*(-326) +-103 + j*(-133) +-19 + j*(-66) +-76 + j*(-122) +-156 + j*(-10) +-61 + j*(81) +4 + j*(31) +-7 + j*(6) +-9 + j*(-18) +-76 + j*(-28) +-103 + j*(77) +8 + j*(109) +-6 + j*(26) +-76 + j*(143) +158 + j*(265) +379 + j*(-24) +124 + j*(-326) +-173 + j*(-161) +-82 + j*(57) +29 + j*(-19) +-76 + j*(-59) +-96 + j*(74) +27 + j*(110) +71 + j*(33) +47 + j*(18) +88 + j*(33) +153 + j*(-46) +93 + j*(-183) +-85 + j*(-192) +-160 + j*(-37) +-65 + j*(51) +-23 + j*(8) +-49 + j*(45) +68 + j*(91) +153 + j*(-83) +-45 + j*(-222) +-215 + j*(-39) +-76 + j*(128) +57 + j*(24) +-31 + j*(-62) +-94 + j*(17) +-35 + j*(77) +25 + j*(60) +62 + j*(13) +48 + j*(-77) +-66 + j*(-117) +-169 + j*(-25) +-148 + j*(110) +-46 + j*(175) +66 + j*(153) +118 + j*(61) +73 + j*(-13) +18 + j*(15) +72 + j*(76) +202 + j*(-4) +170 + j*(-243) +-148 + j*(-337) +-383 + j*(-37) +-180 + j*(274) +90 + j*(170) +14 + j*(19) +-11 + j*(147) +204 + j*(98) +129 + j*(-184) +-167 + j*(-109) +-95 + j*(139) +38 + j*(57) +-108 + j*(78) +52 + j*(354) +470 + j*(147) +305 + j*(-340) +-129 + j*(-233) +-25 + j*(78) +165 + j*(-70) +-12 + j*(-168) +-20 + j*(11) +165 + j*(-69) +56 + j*(-277) +-128 + j*(-223) +-151 + j*(-162) +-265 + j*(-139) +-330 + j*(69) +-180 + j*(206) +-98 + j*(208) +23 + j*(308) +322 + j*(173) +234 + j*(-235) +-176 + j*(-170) +-61 + j*(183) +243 + j*(-21) +-40 + j*(-298) +-281 + j*(18) +28 + j*(190) +106 + j*(-104) +-175 + j*(-97) +-111 + j*(153) +73 + j*(53) +-63 + j*(-48) +-102 + j*(122) +65 + j*(134) +61 + j*(25) +47 + j*(66) +148 + j*(-6) +30 + j*(-163) +-146 + j*(-35) +-18 + j*(112) +71 + j*(-20) +-81 + j*(-45) +-62 + j*(141) +157 + j*(104) +135 + j*(-134) +-111 + j*(-157) +-197 + j*(73) +-11 + j*(230) +194 + j*(111) +134 + j*(-102) +-62 + j*(-59) +-3 + j*(141) +239 + j*(83) +249 + j*(-192) +9 + j*(-319) +-204 + j*(-199) +-226 + j*(18) +-57 + j*(117) +35 + j*(-24) +-144 + j*(-77) +-189 + j*(177) +117 + j*(246) +204 + j*(-59) +-71 + j*(-129) +-109 + j*(110) +74 + j*(128) +74 + j*(46) +125 + j*(105) +293 + j*(-47) +124 + j*(-316) +-171 + j*(-190) +-82 + j*(49) +76 + j*(-41) +-20 + j*(-145) +-95 + j*(-79) +-88 + j*(-45) +-96 + j*(4) +-4 + j*(19) +-30 + j*(-130) +-269 + j*(-49) +-153 + j*(281) +231 + j*(144) +61 + j*(-247) +-316 + j*(-23) +-40 + j*(334) +289 + j*(28) +-18 + j*(-257) +-237 + j*(28) +10 + j*(163) +55 + j*(-52) +-143 + j*(-21) +-86 + j*(154) +36 + j*(115) +16 + j*(90) +100 + j*(114) +154 + j*(-57) +-74 + j*(-144) +-199 + j*(110) +39 + j*(281) +238 + j*(115) +183 + j*(-55) +107 + j*(-86) +57 + j*(-136) +-100 + j*(-133) +-185 + j*(79) +18 + j*(264) +272 + j*(126) +228 + j*(-124) +57 + j*(-138) +52 + j*(-62) +74 + j*(-105) +11 + j*(-100) +70 + j*(-62) +100 + j*(-229) +-173 + j*(-303) +-309 + j*(14) +-11 + j*(165) +88 + j*(-107) +-182 + j*(-122) +-108 + j*(158) +177 + j*(-9) +-81 + j*(-312) +-420 + j*(10) +-87 + j*(375) +267 + j*(65) +-15 + j*(-252) +-297 + j*(1) +-99 + j*(247) +85 + j*(129) +24 + j*(45) +37 + j*(105) +133 + j*(47) +86 + j*(-66) +2 + j*(-36) +59 + j*(-3) +82 + j*(-129) +-110 + j*(-208) +-272 + j*(-12) +-133 + j*(203) +57 + j*(128) +-1 + j*(5) +-67 + j*(95) +56 + j*(132) +55 + j*(2) +-104 + j*(74) +21 + j*(325) +397 + j*(245) +479 + j*(-168) +187 + j*(-424) +-112 + j*(-354) +-223 + j*(-171) +-210 + j*(-34) +-180 + j*(40) +-151 + j*(127) +-30 + j*(218) +151 + j*(151) +162 + j*(-45) +-1 + j*(-98) +-57 + j*(28) +45 + j*(92) +136 + j*(23) +131 + j*(-99) +6 + j*(-171) +-126 + j*(-63) +-30 + j*(97) +153 + j*(-6) +38 + j*(-223) +-206 + j*(-115) +-122 + j*(133) +104 + j*(64) +32 + j*(-139) +-155 + j*(-63) +-92 + j*(118) +71 + j*(85) +76 + j*(-45) +3 + j*(-83) +-49 + j*(-84) +-129 + j*(-49) +-145 + j*(93) +30 + j*(165) +148 + j*(-16) +-26 + j*(-164) +-193 + j*(-4) +-58 + j*(157) +66 + j*(52) +-34 + j*(-5) +-21 + j*(121) +144 + j*(62) +71 + j*(-129) +-114 + j*(-54) +-28 + j*(91) +74 + j*(-21) +-74 + j*(-101) +-159 + j*(49) +-75 + j*(139) +-42 + j*(163) +66 + j*(264) +320 + j*(168) +315 + j*(-167) +11 + j*(-255) +-103 + j*(-51) +8 + j*(26) +26 + j*(-25) +5 + j*(4) +61 + j*(14) +71 + j*(-38) +62 + j*(-42) +102 + j*(-91) +30 + j*(-209) +-154 + j*(-167) +-170 + j*(28) +-4 + j*(84) +75 + j*(-52) +-42 + j*(-158) +-196 + j*(-76) +-167 + j*(122) +52 + j*(160) +147 + j*(-67) +-71 + j*(-224) +-288 + j*(-60) +-233 + j*(160) +-115 + j*(214) +-53 + j*(279) +156 + j*(344) +403 + j*(129) +305 + j*(-223) +-13 + j*(-255) +-86 + j*(-47) +35 + j*(-33) +-35 + j*(-149) +-202 + j*(-40) +-119 + j*(170) +86 + j*(138) +84 + j*(-18) +-21 + j*(-8) +10 + j*(69) +79 + j*(35) +62 + j*(-9) +64 + j*(6) +117 + j*(-38) +78 + j*(-147) +-62 + j*(-166) +-147 + j*(-49) +-96 + j*(75) +23 + j*(88) +79 + j*(8) +55 + j*(-57) +28 + j*(-82) +-13 + j*(-128) +-125 + j*(-137) +-226 + j*(-23) +-197 + j*(148) +-41 + j*(251) +158 + j*(197) +228 + j*(-18) +69 + j*(-161) +-68 + j*(-64) +13 + j*(20) +49 + j*(-93) +-93 + j*(-119) +-125 + j*(1) +-74 + j*(-6) +-194 + j*(5) +-200 + j*(272) +164 + j*(381) +399 + j*(35) +170 + j*(-278) +-124 + j*(-202) +-181 + j*(1) +-99 + j*(130) +40 + j*(155) +115 + j*(48) +47 + j*(-8) +49 + j*(64) +170 + j*(11) +112 + j*(-161) +-74 + j*(-132) +-78 + j*(27) +31 + j*(60) +92 + j*(13) +125 + j*(-69) +62 + j*(-180) +-76 + j*(-174) +-123 + j*(-94) +-156 + j*(-50) +-170 + j*(93) +50 + j*(170) +159 + j*(-115) +-197 + j*(-238) +-335 + j*(179) +103 + j*(320) +206 + j*(-99) +-185 + j*(-123) +-128 + j*(246) +194 + j*(129) +23 + j*(-105) +-100 + j*(143) +235 + j*(190) +255 + j*(-187) +-83 + j*(-195) +-48 + j*(43) +90 + j*(-62) +-66 + j*(-126) +-54 + j*(26) +61 + j*(-91) +-182 + j*(-188) +-292 + j*(146) +59 + j*(268) +154 + j*(-42) +-104 + j*(-69) +-62 + j*(144) +95 + j*(56) +-24 + j*(-26) +-31 + j*(132) +156 + j*(95) +112 + j*(-81) +-4 + j*(-31) +79 + j*(8) +69 + j*(-118) +-75 + j*(-99) +-64 + j*(18) +-15 + j*(8) +-44 + j*(33) +38 + j*(95) +130 + j*(-11) +35 + j*(-104) +-21 + j*(-25) +64 + j*(-24) +41 + j*(-137) +-82 + j*(-142) +-141 + j*(-64) +-153 + j*(28) +-67 + j*(131) +93 + j*(62) +26 + j*(-125) +-173 + j*(-42) +-63 + j*(158) +138 + j*(8) +-60 + j*(-206) +-307 + j*(6) +-136 + j*(267) +69 + j*(159) +-29 + j*(66) +-37 + j*(230) +202 + j*(243) +265 + j*(5) +98 + j*(-65) +90 + j*(48) +213 + j*(-6) +160 + j*(-149) +56 + j*(-121) +119 + j*(-106) +91 + j*(-280) +-187 + j*(-302) +-305 + j*(-4) +-69 + j*(175) +116 + j*(18) +30 + j*(-141) +-93 + j*(-135) +-163 + j*(-81) +-216 + j*(28) +-139 + j*(171) +18 + j*(165) +49 + j*(78) +57 + j*(83) +155 + j*(21) +103 + j*(-164) +-122 + j*(-168) +-175 + j*(40) +-28 + j*(109) +23 + j*(23) +-23 + j*(6) +-10 + j*(32) +2 + j*(1) +-35 + j*(-1) +-23 + j*(35) +13 + j*(-4) +-66 + j*(-68) +-210 + j*(28) +-175 + j*(274) +111 + j*(379) +349 + j*(170) +293 + j*(-82) +161 + j*(-128) +151 + j*(-157) +40 + j*(-276) +-187 + j*(-195) +-172 + j*(47) +14 + j*(54) +-13 + j*(-79) +-132 + j*(-13) +-64 + j*(110) +35 + j*(85) +52 + j*(49) +99 + j*(15) +79 + j*(-91) +-39 + j*(-89) +-27 + j*(5) +39 + j*(-52) +-76 + j*(-105) +-136 + j*(44) +11 + j*(106) +51 + j*(-4) +-18 + j*(1) +37 + j*(23) +4 + j*(-74) +-138 + j*(35) +53 + j*(249) +366 + j*(14) +157 + j*(-379) +-248 + j*(-250) +-188 + j*(83) +41 + j*(38) +-22 + j*(-115) +-141 + j*(-55) +-129 + j*(31) +-105 + j*(80) +-28 + j*(122) +49 + j*(49) +-32 + j*(-14) +-62 + j*(99) +91 + j*(110) +94 + j*(-57) +-52 + j*(-32) +41 + j*(77) +134 + j*(-120) +-168 + j*(-247) +-377 + j*(124) +-13 + j*(419) +333 + j*(126) +125 + j*(-203) +-144 + j*(-54) +-21 + j*(157) +153 + j*(50) +77 + j*(-89) +-10 + j*(-42) +33 + j*(-24) +-8 + j*(-95) +-121 + j*(-30) +-54 + j*(96) +50 + j*(21) +-81 + j*(-54) +-167 + j*(165) +110 + j*(319) +340 + j*(62) +156 + j*(-168) +14 + j*(-24) +199 + j*(27) +245 + j*(-236) +-26 + j*(-341) +-163 + j*(-165) +-98 + j*(-92) +-140 + j*(-118) +-202 + j*(-4) +-97 + j*(97) +-11 + j*(29) +-64 + j*(-8) +-75 + j*(61) +6 + j*(84) +62 + j*(32) +72 + j*(-46) +13 + j*(-127) +-112 + j*(-111) +-132 + j*(13) +-25 + j*(25) +-56 + j*(-96) +-250 + j*(-49) +-264 + j*(226) +14 + j*(361) +247 + j*(173) +189 + j*(-72) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +0 + j*(0) +]; -- GitLab