Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
alex037yang
OpenXG-RAN
Commits
4ab303ab
Commit
4ab303ab
authored
Sep 13, 2018
by
Hongzhi Wang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
nr ue adding dlsch_modulation
parent
d651fe9c
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
2565 additions
and
47 deletions
+2565
-47
cmake_targets/CMakeLists.txt
cmake_targets/CMakeLists.txt
+1
-0
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+2532
-0
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+17
-34
openair1/PHY/phy_extern_nr_ue.h
openair1/PHY/phy_extern_nr_ue.h
+3
-1
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+12
-12
No files found.
cmake_targets/CMakeLists.txt
View file @
4ab303ab
...
@@ -1324,6 +1324,7 @@ set(PHY_SRC_UE
...
@@ -1324,6 +1324,7 @@ set(PHY_SRC_UE
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/dmrs_nr.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/dmrs_nr.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/nr_pbch.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/nr_pbch.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/dci_nr.c
${
OPENAIR1_DIR
}
/PHY/NR_UE_TRANSPORT/dci_nr.c
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
0 → 100644
View file @
4ab303ab
This source diff could not be displayed because it is too large. You can
view the blob
instead.
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
View file @
4ab303ab
...
@@ -708,7 +708,7 @@ void dlsch_detection_mrc_TM34(NR_DL_FRAME_PARMS *frame_parms,
...
@@ -708,7 +708,7 @@ void dlsch_detection_mrc_TM34(NR_DL_FRAME_PARMS *frame_parms,
@param high_speed_flag
@param high_speed_flag
@param frame_parms Pointer to frame descriptor
@param frame_parms Pointer to frame descriptor
*/
*/
uint16_t
dlsch_extract_rbs_single
(
int32_t
**
rxdataF
,
/*uint16_t nr_
dlsch_extract_rbs_single(int32_t **rxdataF,
int32_t **dl_ch_estimates,
int32_t **dl_ch_estimates,
int32_t **rxdataF_ext,
int32_t **rxdataF_ext,
int32_t **dl_ch_estimates_ext,
int32_t **dl_ch_estimates_ext,
...
@@ -718,6 +718,20 @@ uint16_t dlsch_extract_rbs_single(int32_t **rxdataF,
...
@@ -718,6 +718,20 @@ uint16_t dlsch_extract_rbs_single(int32_t **rxdataF,
uint8_t symbol,
uint8_t symbol,
uint8_t subframe,
uint8_t subframe,
uint32_t high_speed_flag,
uint32_t high_speed_flag,
NR_DL_FRAME_PARMS *frame_parms);*/
unsigned
short
nr_dlsch_extract_rbs_single
(
int
**
rxdataF
,
int
**
dl_ch_estimates
,
int
**
rxdataF_ext
,
int
**
dl_ch_estimates_ext
,
unsigned
short
pmi
,
unsigned
char
*
pmi_ext
,
unsigned
int
*
rb_alloc
,
unsigned
char
symbol
,
unsigned
short
start_rb
,
unsigned
short
nb_pdsch_rb
,
unsigned
char
nr_tti_rx
,
uint32_t
high_speed_flag
,
NR_DL_FRAME_PARMS
*
frame_parms
);
NR_DL_FRAME_PARMS
*
frame_parms
);
/** \fn dlsch_extract_rbs_dual(int32_t **rxdataF,
/** \fn dlsch_extract_rbs_dual(int32_t **rxdataF,
...
@@ -953,7 +967,7 @@ void dlsch_channel_level_TM7(int32_t **dl_bf_ch_estimates_ext,
...
@@ -953,7 +967,7 @@ void dlsch_channel_level_TM7(int32_t **dl_bf_ch_estimates_ext,
uint8_t
pilots_flag
,
uint8_t
pilots_flag
,
uint16_t
nb_rb
);
uint16_t
nb_rb
);
void
dlsch_scale_channel
(
int32_t
**
dl_ch_estimates_ext
,
void
nr_
dlsch_scale_channel
(
int32_t
**
dl_ch_estimates_ext
,
NR_DL_FRAME_PARMS
*
frame_parms
,
NR_DL_FRAME_PARMS
*
frame_parms
,
NR_UE_DLSCH_t
**
dlsch_ue
,
NR_UE_DLSCH_t
**
dlsch_ue
,
uint8_t
symbol_mod
,
uint8_t
symbol_mod
,
...
@@ -1385,37 +1399,6 @@ uint32_t ulsch_encoding(uint8_t *a,
...
@@ -1385,37 +1399,6 @@ uint32_t ulsch_encoding(uint8_t *a,
uint8_t
control_only_flag
,
uint8_t
control_only_flag
,
uint8_t
Nbundled
);
uint8_t
Nbundled
);
/* \brief This routine demodulates the PHICH and updates PUSCH/ULSCH parameters.
@param phy_vars_ue Pointer to UE variables
@param proc Pointer to RXN_TXNp4 proc
@param subframe Subframe of received PDCCH/PHICH
@param eNB_id Index of eNB
*/
void
rx_phich
(
PHY_VARS_NR_UE
*
phy_vars_ue
,
UE_nr_rxtx_proc_t
*
proc
,
uint8_t
subframe
,
uint8_t
eNB_id
);
/** \brief This routine provides the relationship between a PHICH TXOp and its corresponding PUSCH subframe (Table 8.3.-1 from 36.213).
@param frame_parms Pointer to DL frame configuration parameters
@param subframe Subframe of received/transmitted PHICH
@returns subframe of PUSCH transmission
*/
uint8_t
phich_subframe2_pusch_subframe
(
NR_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
subframe
);
/** \brief This routine provides the relationship between a PHICH TXOp and its corresponding PUSCH frame (Table 8.3.-1 from 36.213).
@param frame_parms Pointer to DL frame configuration parameters
@param frame Frame of received/transmitted PHICH
@param subframe Subframe of received/transmitted PHICH
@returns frame of PUSCH transmission
*/
int
phich_frame2_pusch_frame
(
NR_DL_FRAME_PARMS
*
frame_parms
,
int
frame
,
int
subframe
);
void
print_CQI
(
void
*
o
,
UCI_format_t
uci_format
,
uint8_t
eNB_id
,
int
N_RB_DL
);
void
print_CQI
(
void
*
o
,
UCI_format_t
uci_format
,
uint8_t
eNB_id
,
int
N_RB_DL
);
void
fill_CQI
(
NR_UE_ULSCH_t
*
ulsch
,
PHY_NR_MEASUREMENTS
*
meas
,
uint8_t
eNB_id
,
uint8_t
harq_pid
,
int
N_RB_DL
,
rnti_t
rnti
,
uint8_t
trans_mode
,
double
sinr_eff
);
void
fill_CQI
(
NR_UE_ULSCH_t
*
ulsch
,
PHY_NR_MEASUREMENTS
*
meas
,
uint8_t
eNB_id
,
uint8_t
harq_pid
,
int
N_RB_DL
,
rnti_t
rnti
,
uint8_t
trans_mode
,
double
sinr_eff
);
...
...
openair1/PHY/phy_extern_nr_ue.h
View file @
4ab303ab
...
@@ -32,7 +32,9 @@ extern char fmageren_name2[512];
...
@@ -32,7 +32,9 @@ extern char fmageren_name2[512];
extern
unsigned
int
RX_DMA_BUFFER
[
4
][
NB_ANTENNAS_RX
];
extern
unsigned
int
RX_DMA_BUFFER
[
4
][
NB_ANTENNAS_RX
];
extern
unsigned
int
TX_DMA_BUFFER
[
4
][
NB_ANTENNAS_TX
];
extern
unsigned
int
TX_DMA_BUFFER
[
4
][
NB_ANTENNAS_TX
];
#include "PHY/LTE_TRANSPORT/transport_extern.h"
//#include "PHY/LTE_TRANSPORT/transport_extern.h"
extern
short
conjugate
[
8
],
conjugate2
[
8
];
extern
int
number_of_cards
;
extern
int
number_of_cards
;
...
...
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
View file @
4ab303ab
...
@@ -4018,7 +4018,7 @@ void copy_harq_proc_struct(NR_DL_UE_HARQ_t *harq_processes_dest, NR_DL_UE_HARQ_t
...
@@ -4018,7 +4018,7 @@ void copy_harq_proc_struct(NR_DL_UE_HARQ_t *harq_processes_dest, NR_DL_UE_HARQ_t
memcpy(harq_ack_dest, current_harq_ack, sizeof(nr_harq_status_t));
memcpy(harq_ack_dest, current_harq_ack, sizeof(nr_harq_status_t));
}*/
}*/
void
ue_pdsch_procedures
(
PHY_VARS_NR_UE
*
ue
,
UE_nr_rxtx_proc_t
*
proc
,
int
eNB_id
,
PDSCH_t
pdsch
,
NR_UE_DLSCH_t
*
dlsch0
,
NR_UE_DLSCH_t
*
dlsch1
,
int
s0
,
int
s1
,
int
abstraction_flag
)
{
void
nr_
ue_pdsch_procedures
(
PHY_VARS_NR_UE
*
ue
,
UE_nr_rxtx_proc_t
*
proc
,
int
eNB_id
,
PDSCH_t
pdsch
,
NR_UE_DLSCH_t
*
dlsch0
,
NR_UE_DLSCH_t
*
dlsch1
,
int
s0
,
int
s1
,
int
abstraction_flag
)
{
int
nr_tti_rx
=
proc
->
nr_tti_rx
;
int
nr_tti_rx
=
proc
->
nr_tti_rx
;
int
m
;
int
m
;
...
@@ -4078,7 +4078,7 @@ void ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_id
...
@@ -4078,7 +4078,7 @@ void ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_id
start_meas
(
&
ue
->
dlsch_llr_stats_parallelization
[
ue
->
current_thread_id
[
nr_tti_rx
]][
slot
]);
start_meas
(
&
ue
->
dlsch_llr_stats_parallelization
[
ue
->
current_thread_id
[
nr_tti_rx
]][
slot
]);
#endif
#endif
// process DLSCH received in first slot
// process DLSCH received in first slot
rx_pdsch
(
ue
,
nr_
rx_pdsch
(
ue
,
pdsch
,
pdsch
,
eNB_id
,
eNB_id
,
eNB_id_i
,
eNB_id_i
,
...
@@ -5597,7 +5597,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5597,7 +5597,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
#endif
#endif
#endif
#endif
#if 0
//
#if 0
LOG_D
(
PHY
,
" ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------
\n
"
,
frame_rx
%
1024
,
nr_tti_rx
);
LOG_D
(
PHY
,
" ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------
\n
"
,
frame_rx
%
1024
,
nr_tti_rx
);
//to update from pdsch config
//to update from pdsch config
nr_gold_pdsch
(
ue
,
0
,
0
,
1
);
nr_gold_pdsch
(
ue
,
0
,
0
,
1
);
...
@@ -5616,7 +5616,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5616,7 +5616,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
// do procedures for C-RNTI
// do procedures for C-RNTI
if
(
ue
->
dlsch
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
][
0
]
->
active
==
1
)
{
if
(
ue
->
dlsch
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
][
0
]
->
active
==
1
)
{
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC
,
VCD_FUNCTION_IN
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC
,
VCD_FUNCTION_IN
);
ue_pdsch_procedures(ue,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
PDSCH
,
PDSCH
,
...
@@ -5633,7 +5633,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5633,7 +5633,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
// do procedures for SI-RNTI
// do procedures for SI-RNTI
if
((
ue
->
dlsch_SI
[
eNB_id
])
&&
(
ue
->
dlsch_SI
[
eNB_id
]
->
active
==
1
))
{
if
((
ue
->
dlsch_SI
[
eNB_id
])
&&
(
ue
->
dlsch_SI
[
eNB_id
]
->
active
==
1
))
{
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI
,
VCD_FUNCTION_IN
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI
,
VCD_FUNCTION_IN
);
ue_pdsch_procedures(ue,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
SI_PDSCH
,
SI_PDSCH
,
...
@@ -5648,7 +5648,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5648,7 +5648,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
// do procedures for SI-RNTI
// do procedures for SI-RNTI
if
((
ue
->
dlsch_p
[
eNB_id
])
&&
(
ue
->
dlsch_p
[
eNB_id
]
->
active
==
1
))
{
if
((
ue
->
dlsch_p
[
eNB_id
])
&&
(
ue
->
dlsch_p
[
eNB_id
]
->
active
==
1
))
{
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P
,
VCD_FUNCTION_IN
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P
,
VCD_FUNCTION_IN
);
ue_pdsch_procedures(ue,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
P_PDSCH
,
P_PDSCH
,
...
@@ -5663,7 +5663,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5663,7 +5663,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
// do procedures for RA-RNTI
// do procedures for RA-RNTI
if
((
ue
->
dlsch_ra
[
eNB_id
])
&&
(
ue
->
dlsch_ra
[
eNB_id
]
->
active
==
1
))
{
if
((
ue
->
dlsch_ra
[
eNB_id
])
&&
(
ue
->
dlsch_ra
[
eNB_id
]
->
active
==
1
))
{
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA
,
VCD_FUNCTION_IN
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA
,
VCD_FUNCTION_IN
);
ue_pdsch_procedures(ue,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
RA_PDSCH
,
RA_PDSCH
,
...
@@ -5740,7 +5740,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5740,7 +5740,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
#if UE_TIMING_TRACE
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
pdsch_procedures_stat
[
ue
->
current_thread_id
[
nr_tti_rx
]]);
start_meas
(
&
ue
->
pdsch_procedures_stat
[
ue
->
current_thread_id
[
nr_tti_rx
]]);
#endif
#endif
ue_pdsch_procedures
(
ue
,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
PDSCH
,
PDSCH
,
...
@@ -5805,7 +5805,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5805,7 +5805,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
// do procedures for SI-RNTI
// do procedures for SI-RNTI
if
((
ue
->
dlsch_SI
[
eNB_id
])
&&
(
ue
->
dlsch_SI
[
eNB_id
]
->
active
==
1
))
{
if
((
ue
->
dlsch_SI
[
eNB_id
])
&&
(
ue
->
dlsch_SI
[
eNB_id
]
->
active
==
1
))
{
ue_pdsch_procedures
(
ue
,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
SI_PDSCH
,
SI_PDSCH
,
...
@@ -5829,7 +5829,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5829,7 +5829,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
// do procedures for P-RNTI
// do procedures for P-RNTI
if
((
ue
->
dlsch_p
[
eNB_id
])
&&
(
ue
->
dlsch_p
[
eNB_id
]
->
active
==
1
))
{
if
((
ue
->
dlsch_p
[
eNB_id
])
&&
(
ue
->
dlsch_p
[
eNB_id
]
->
active
==
1
))
{
ue_pdsch_procedures
(
ue
,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
P_PDSCH
,
P_PDSCH
,
...
@@ -5852,7 +5852,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5852,7 +5852,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
}
}
// do procedures for RA-RNTI
// do procedures for RA-RNTI
if
((
ue
->
dlsch_ra
[
eNB_id
])
&&
(
ue
->
dlsch_ra
[
eNB_id
]
->
active
==
1
))
{
if
((
ue
->
dlsch_ra
[
eNB_id
])
&&
(
ue
->
dlsch_ra
[
eNB_id
]
->
active
==
1
))
{
ue_pdsch_procedures
(
ue
,
nr_
ue_pdsch_procedures
(
ue
,
proc
,
proc
,
eNB_id
,
eNB_id
,
RA_PDSCH
,
RA_PDSCH
,
...
@@ -5936,7 +5936,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
...
@@ -5936,7 +5936,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
#endif
#endif
#endif
#endif
#endif //pdsch
//
#endif //pdsch
LOG_D
(
PHY
,
" ****** end RX-Chain for AbsSubframe %d.%d ******
\n
"
,
frame_rx
%
1024
,
nr_tti_rx
);
LOG_D
(
PHY
,
" ****** end RX-Chain for AbsSubframe %d.%d ******
\n
"
,
frame_rx
%
1024
,
nr_tti_rx
);
return
(
0
);
return
(
0
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment