Merge branch 'develop'

This commit is contained in:
Rohit Gupta
2016-08-16 15:27:27 +02:00
68 changed files with 4732 additions and 1245 deletions
-4
View File
@@ -32,8 +32,4 @@ job1:
- sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no " --rsync-path="mkdir -p $NFS_TEST_RESULTS_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$NFS_TEST_RESULTS_DIR
- sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no " --rsync-path="mkdir -p $EXTERNAL_SHARE_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$EXTERNAL_SHARE_DIR
- cat $OPENAIR_DIR/cmake_targets/autotests/log/results_autotests.xml
- exce_log=`egrep -i 'warning|error|critical|exception' $NFS_TEST_RESULTS_DIR/log/python_autotest.log `
- if [ -n "$exce_log" ]; then echo -e "\e[31mThere are errors in $NFS_TEST_RESULTS_DIR/log/python_autotest.log. Please check the logs\e[0m" ; fi
- exce_log=`egrep -i 'warning|error|critical|exception' $NFS_TEST_RESULTS_DIR/log/python_autotest_cleanup.log `
- if [ -n "$exce_log" ]; then echo -e "\e[31mThere are errors in $NFS_TEST_RESULTS_DIR/log/python_autotest_cleanup.log. Please check the logs\e[0m" ; fi
+13 -8
View File
@@ -126,6 +126,7 @@ endmacro(add_list_string_option)
if (CMAKE_BUILD_TYPE STREQUAL "")
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
endif()
message("CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}")
add_list_string_option(CMAKE_BUILD_TYPE "RelWithDebInfo" "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." Debug Release RelWithDebInfo MinSizeRel)
Message("Architecture is ${CMAKE_SYSTEM_PROCESSOR}")
@@ -1518,7 +1519,7 @@ if (${RF_BOARD} STREQUAL "OAI_USRP")
include_directories(${LIBBOOST_INCLUDE_DIR})
endif (${RF_BOARD} STREQUAL "OAI_USRP")
pkg_search_module(OPENPGM openpgm-5.1)
pkg_search_module(OPENPGM openpgm-5.1 openpgm-5.2)
if(NOT ${OPENPGM_FOUND})
message("PACKAGE openpgm-5.1 is required by binaries such as oaisim: will fail later if this target is built")
else()
@@ -1625,15 +1626,14 @@ add_executable(lte-softmodem
${T_SOURCE}
)
target_link_libraries (lte-softmodem
target_link_libraries (lte-softmodem -ldl
-Wl,--start-group
RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB}
-Wl,--end-group )
target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES})
target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} )
target_link_libraries (lte-softmodem ${LIBBOOST_LIBRARIES})
target_link_libraries (lte-softmodem ${LIBBOOST_LIBRARIES} -lboost_system) #Added manually as it is not found for some reason for USRP
target_link_libraries (lte-softmodem ${LIB_LMS_LIBRARIES})
target_link_libraries (lte-softmodem ${T_LIB})
@@ -1652,8 +1652,8 @@ add_executable(lte-softmodem-nos1
${OPENAIR_TARGETS}/SIMU/USER/init_lte.c
${OPENAIR_TARGETS}/COMMON/create_tasks.c
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
#${OPENAIR2_DIR}/RRC/NAS/nas_config.c # enable if you want rrc to mount ip interface
#${OPENAIR2_DIR}/RRC/NAS/rb_config.c
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
${HW_SOURCE}
${TRANSPORT_SOURCE}
@@ -1669,9 +1669,9 @@ target_link_libraries (lte-softmodem-nos1
target_link_libraries (lte-softmodem-nos1 ${LIBXML2_LIBRARIES})
target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} )
target_link_libraries (lte-softmodem-nos1 ${LIBBOOST_LIBRARIES})
target_link_libraries (lte-softmodem-nos1 ${LIBBOOST_LIBRARIES} -lboost_system) #Added manually as it is not found for some reason for USRP
target_link_libraries (lte-softmodem-nos1 ${LIB_LMS_LIBRARIES})
target_link_libraries (lte-softmodem ${T_LIB})
target_link_libraries (lte-softmodem-nos1 ${T_LIB})
# rrh
################################
@@ -1929,6 +1929,11 @@ foreach( d ${DirDefs} )
list(APPEND itti_compiler_options "-I${d}")
endforeach()
# castxml doesn't work with c11 (gcc 5 default)
# force castxml and clang compilation with gnu89 standard
# we can't use cXX standard as pthread_rwlock_t is gnu standard
list(APPEND itti_compiler_options "-std=gnu89")
set (ITTI_H ${ITTI_DIR}/intertask_interface_types.h)
add_custom_command (
OUTPUT ${OPENAIR_BIN_DIR}/messages.xml
+48 -29
View File
@@ -12,10 +12,12 @@ Obj.# Case# Test# Description
01 01 11 Build lte-softmodem_noS1.EXMIMO.Rel10
01 01 12 Build lte-softmodem_noS1.BLADERF.Rel10
01 01 13 Build lte-softmodem_noS1.ETHERNET.Rel10
01 01 14 Build lte-softmodem_noS1.LMSSDR.Rel10
01 01 20 Build lte-softmodem.USRP.Rel10
01 01 21 Build lte-softmodem.EXMIMO.Rel10
01 01 22 Build lte-softmodem.BLADERF.Rel10
01 01 23 Build lte-softmodem.ETHERNET.Rel10
01 01 24 Build lte-softmodem.LMSSDR.Rel10
01 01 30 Build (dlsim.Rel10 + ulsim.Rel10 + pucchsim.Rel10 + prachsim.Rel10 + pdcchsim.Rel10 + pbchsim.Rel10 + mbmssim.Rel10
secu_knas_encrypt_eia1.Rel10 secu_kenb.Rel10 aes128_ctr_encrypt.Rel10 aes128_ctr_decrypt.Rel10 secu_knas_encrypt_eea2.Rel10
@@ -24,7 +26,7 @@ Obj.# Case# Test# Description
01 01 40 Build RRH Gateway for USRP (Rel 10)
01 01 41 Build RRH Gateway for EXMIMO (Rel 10)
01 01 42 Build RRH Gateway for BLADERF (Rel 10)
01 01 43 Build RRH Gateway for LMSSDR (Rel 10)
01 02 Run OAISIM-NOS1 Rel10 (TDD + 5MHz/10MHz/20MHz + TM 1,2), and check the operation
@@ -98,18 +100,24 @@ Obj.# Case# Test# Description
01 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX, 2TX/2RX
01 55 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
01 55 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
01 55 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
01 55 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
01 55 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
01 55 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
01 55 06 Band 7 FDD 5MHz UL Throughput for 300 sec for 2TX/2RX
01 55 07 Band 7 FDD 10MHz UL Throughput for 300 sec for 2TX/2RX
01 55 08 Band 7 FDD 20MHz UL Throughput for 300 sec for 2TX/2RX
01 55 09 Band 7 FDD 5MHz DL Throughput for 300 sec for 2TX/2RX
01 55 10 Band 7 FDD 10MHz DL Throughput for 300 sec for 2TX/2RX
01 55 11 Band 7 FDD 20MHz DL Throughput for 300 sec for 2TX/2RX
01 55 00 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
01 55 01 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
01 55 02 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
01 55 03 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
01 55 04 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
01 55 05 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
01 55 06 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 2TX/2RX
01 55 07 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 2TX/2RX
01 55 08 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 2TX/2RX
01 55 09 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 2TX/2RX
01 55 10 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 2TX/2RX
01 55 11 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 2TX/2RX
01 55 12 Band 7 FDD 5MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
01 55 13 Band 7 FDD 10MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
01 55 14 Band 7 FDD 20MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
01 55 15 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
01 55 16 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
01 55 17 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
01 56 lte-softmodem tests with USRP B210 RF as eNB and OAI EPC (eNB and EPC are on same machines) w/ Bandrich COTS UE
01 56 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
@@ -128,12 +136,19 @@ Obj.# Case# Test# Description
01 57 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
01 58 lte-softmodem tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for `TX/1RX, 2TX/2RX
01 58 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
01 58 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
01 58 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
01 58 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
01 58 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
01 58 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
01 58 00 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
01 58 01 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
01 58 02 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
01 58 03 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
01 58 04 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
01 58 05 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
01 58 06 Band 7 FDD 5MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
01 58 07 Band 7 FDD 10MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
01 58 08 Band 7 FDD 20MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
01 58 09 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
01 58 10 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
01 58 11 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
01 59 lte-softmodem tests with USRP X310 RF as eNB and OAI EPC (eNB and EPC are on same machines) w/ Bandrich COTS UE
@@ -206,19 +221,25 @@ Obj.# Case# Test# Description
01 85 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
02 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Sony Experia M4 COTS UE for TX/1RX
02 55 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
02 55 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
02 55 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
02 55 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
02 55 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
02 55 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
02 55 00 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
02 55 01 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
02 55 02 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 1TX/1RX
02 55 03 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
02 55 04 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
02 55 05 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 1TX/1RX
02 55 06 Band 7 FDD 5MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
02 55 07 Band 7 FDD 10MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
02 55 08 Band 7 FDD 20MHz UL Throughput (TCP) for 300 sec for 1TX/1RX
02 55 09 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
02 55 10 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
02 55 11 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 1TX/1RX
01 64 lte-softmodem-noS1 tests
02 Functional test case
03 Non-Functional test case
03 Autotests specific to OAI UE
04 Failure test case
@@ -228,6 +249,4 @@ Obj.# Case# Test# Description
#TODO: Add test cases for 10,20 MHz
#TODO: Add test cases for TDD/FDD
#TODO: Test and compile seperately for Rel8/Rel10
#TODO: Case03.py eMBMS test case
#TODO: Case03.py eMBMS test case
@@ -312,13 +312,13 @@ def SSHSessionWrapper(machine, username, key_file, password, logdir_remote, logd
# \parm programList list of programs that must be terminated before execution of any test case
# \param CleanUpAluLteBox program to terminate AlU Bell Labs LTE Box
# \param ExmimoRfStop String to stop EXMIMO card (specified in test_case_list.xml)
def cleanOldPrograms(oai, programList, CleanUpAluLteBox, ExmimoRfStop):
def cleanOldPrograms(oai, programList, CleanUpAluLteBox, ExmimoRfStop, logdir, logdirOAI5GRepo):
cmd = 'killall -9 -q -r ' + programList
result = oai.send(cmd, True)
print "Killing old programs..." + result
programArray = programList.split()
programListJoin = '|'.join(programArray)
cmd = " ( date ;echo \"Starting cleaning old programs.. \" ; dmesg|tail ; echo \"Current disk space.. \" ; df -h )>& $HOME/.oai_test_setup_cleanup.log.`hostname` 2>&1 ; sync"
cmd = " ( date ;echo \"Starting cleaning old programs.. \" ; dmesg|tail ; echo \"Current disk space.. \" ; df -h )>& " + logdir + "/oai_test_setup_cleanup.log.`hostname` 2>&1 ; sync"
result=oai.send_recv(cmd)
cmd = cleanupOldProgramsScript + ' ' + '\''+programListJoin+'\''
#result = oai.send_recv(cmd)
@@ -326,8 +326,14 @@ def cleanOldPrograms(oai, programList, CleanUpAluLteBox, ExmimoRfStop):
result = oai.send_expect_false(cmd, 'Match found', False)
print "Looking for old programs..." + result
res=oai.send_recv(CleanUpAluLteBox, True)
cmd = "( " + ExmimoRfStop + " ) >> $HOME/.oai_test_setup_cleanup.log.`hostname` ; sync "
cmd= " echo \"Starting EXmimoRF Stop... \" >> " + logdir + "/oai_test_setup_cleanup.log.`hostname` 2>&1 ; sync ";
oai.send_recv(cmd)
cmd = "( " + "cd " + logdirOAI5GRepo + " ; source oaienv ; " + ExmimoRfStop + " ) >> " + logdir + "/oai_test_setup_cleanup.log.`hostname` 2>&1 ; sync "
print "cleanoldprograms cmd = " + cmd
res=oai.send_recv(cmd, False, timeout=600)
cmd= " echo \"Stopping EXmimoRF Stop... \" >> " + logdir + "/oai_test_setup_cleanup.log.`hostname` 2>&1 ; sync ";
oai.send_recv(cmd)
#res = oai.send_recv(ExmimoRfStop, False)
cmd = " ( date ;echo \"Finished cleaning old programs.. \" ; dmesg | tail)>> $HOME/.oai_test_setup_cleanup.log.`hostname` 2>&1 ; sync"
res=oai.send_recv(cmd)
@@ -775,7 +781,7 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo ,
task_eNB = task_eNB + 'array_exec_pid+=($!) \n'
task_eNB = task_eNB + 'echo eNB_traffic_exec PID = $! \n'
task_eNB = task_eNB + ' (date; sudo rm -f ' + logfile_pcap_tmp_eNB + ' ; sudo -E tshark -i any -s 65535 -a duration:' + str(timeout_cmd-10)+ ' -w ' + logfile_pcap_tmp_eNB+ ' ; sudo -E chown ' + user + ' ' + logfile_pcap_tmp_eNB + ' ; zip -j -9 ' + logfile_pcap_zip_eNB + ' ' + logfile_pcap_tmp_eNB + ' ) > ' + logfile_tshark_eNB + ' 2>&1 & \n '
task_eNB = task_eNB + ' (date; sudo rm -f ' + logfile_pcap_tmp_eNB + ' ; sudo -E tshark -i lo -s 65535 -a duration:' + str(timeout_cmd-10)+ ' -w ' + logfile_pcap_tmp_eNB+ ' ; sudo -E chown ' + user + ' ' + logfile_pcap_tmp_eNB + ' ; zip -j -9 ' + logfile_pcap_zip_eNB + ' ' + logfile_pcap_tmp_eNB + ' ) > ' + logfile_tshark_eNB + ' 2>&1 & \n '
task_eNB = task_eNB + 'array_exec_pid+=($!) \n'
task_eNB = task_eNB + 'echo eNB_tshark_exec PID = $! \n'
#terminate the eNB test case after timeout_cmd seconds
@@ -934,9 +940,9 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo ,
t.join()
#Now we get the log files from remote machines on the local machine
if RRHMachine != '':
cleanOldProgramsAllMachines([oai_eNB, oai_UE, oai_EPC, oai_RRH] , oldprogramList, CleanUpAluLteBox, ExmimoRfStop)
cleanOldProgramsAllMachines([oai_eNB, oai_UE, oai_EPC, oai_RRH] , oldprogramList, CleanUpAluLteBox, ExmimoRfStop, [logdir_eNB, logdir_UE, logdir_EPC, logdir_RRH], logdirOAI5GRepo)
else:
cleanOldProgramsAllMachines([oai_eNB, oai_UE, oai_EPC] , oldprogramList, CleanUpAluLteBox, ExmimoRfStop)
cleanOldProgramsAllMachines([oai_eNB, oai_UE, oai_EPC] , oldprogramList, CleanUpAluLteBox, ExmimoRfStop, [logdir_eNB, logdir_UE, logdir_EPC], logdirOAI5GRepo)
logfile_UE_stop_script_out = logdir_UE + '/UE_stop_script_out' + '_' + str(run) + '_.log'
logfile_UE_stop_script = logdir_local_testcase + '/UE_stop_script' + '_' + str(run) + '_.log'
@@ -999,7 +1005,28 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo ,
run_result_string = ' RUN_'+str(run) + ' = PASS'
else:
run_result_string = ' RUN_'+str(run) + ' = FAIL'
#If there is assertion, we mark the test case as failure as most likely eNB crashed
cmd = "grep -ilr \"assertion\" " + logdir_local_testcase + " | cat "
cmd_out = subprocess.check_output ([cmd], shell=True)
if len(cmd_out) !=0 :
run_result=0
run_result_string = ' RUN_'+str(run) + ' = FAIL(Assert)'
#If there is thread busy error, we mark the test case as failure as most likely eNB crashed
cmd = "grep -ilr \"thread busy\" " + logdir_local_testcase + " | cat "
cmd_out = subprocess.check_output ([cmd], shell=True)
if len(cmd_out) !=0:
run_result=0
run_result_string = ' RUN_'+str(run) + ' = FAIL(Thread_Busy)'
#If there is Segmentation fault, we mark the test case as failure as most likely eNB crashed
cmd = "grep -ilr \"segmentation fault\" " + logdir_local_testcase + " | cat "
cmd_out = subprocess.check_output ([cmd], shell=True)
if len(cmd_out) !=0:
run_result=0
run_result_string = ' RUN_'+str(run) + ' = FAIL(SEGFAULT)'
run_result_string = run_result_string + tput_run_string
test_result=test_result & run_result
@@ -1065,7 +1092,7 @@ def search_test_case_group(testcasename, testcasegroup, test_case_exclude):
# \param CleanupAluLteBox string that contains commands to stop ALU Bell Labs LTEBox (specified in test_case_list.xml)
# \param ExmimoRfStop command to stop EXMIMO Card
class oaiCleanOldProgramThread (threading.Thread):
def __init__(self, threadID, threadname, oai, CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop):
def __init__(self, threadID, threadname, oai, CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop, logdir, logdirOAI5GRepo):
threading.Thread.__init__(self)
self.threadID = threadID
self.threadname = threadname
@@ -1073,9 +1100,11 @@ class oaiCleanOldProgramThread (threading.Thread):
self.CleanUpOldProgs = CleanUpOldProgs
self.CleanUpAluLteBox = CleanUpAluLteBox
self.ExmimoRfStop = ExmimoRfStop
self.logdir = logdir
self.logdirOAI5GRepo = logdirOAI5GRepo
def run(self):
try:
cleanOldPrograms(self.oai, self.CleanUpOldProgs, self.CleanUpAluLteBox, self.ExmimoRfStop)
cleanOldPrograms(self.oai, self.CleanUpOldProgs, self.CleanUpAluLteBox, self.ExmimoRfStop, self.logdir, self.logdirOAI5GRepo)
except Exception, e:
error=''
error = error + ' In class oaiCleanOldProgramThread, function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
@@ -1090,15 +1119,20 @@ class oaiCleanOldProgramThread (threading.Thread):
# \param CleanUpOldProgs list of programs which must be terminated before running a test case (specified in test_case_list.xml)
# \param CleanupAluLteBox string that contains commands to stop ALU Bell Labs LTEBox (specified in test_case_list.xml)
# \param ExmimoRfStop command to stop EXMIMO Card
def cleanOldProgramsAllMachines(oai_list, CleanOldProgs, CleanUpAluLteBox, ExmimoRfStop):
def cleanOldProgramsAllMachines(oai_list, CleanOldProgs, CleanUpAluLteBox, ExmimoRfStop, logdir_list, logdirOAI5GRepo):
threadId=0
threadList=[]
index=0
if len(oai_list)!=len(logdir_list) :
logdir_list=[logdir[0]]*len(oai_list)
for oai in oai_list:
threadName="cleanup_thread_"+str(threadId)
thread=oaiCleanOldProgramThread(threadId, threadName, oai, CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop)
thread=oaiCleanOldProgramThread(threadId, threadName, oai, CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop, logdir_list[index],logdirOAI5GRepo)
threadList.append(thread)
thread.start()
threadId = threadId + 1
index = index+1
for t in threadList:
t.join()
@@ -1360,7 +1394,7 @@ if localshell == 0:
print "Sudo permissions..." + result
print '\nCleaning Older running programs : ' + CleanUpOldProgs
cleanOldPrograms(oai_list[index], CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop)
cleanOldPrograms(oai_list[index], CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop, '$HOME', '/tmp')
#result = oai_list[index].send('mount ' + NFSResultsDir, True)
#print "Mounting NFS Share " + NFSResultsDir + "..." + result
@@ -1399,13 +1433,26 @@ for oai in oai_list:
setuplogfile = logdir + '/setup_log_' + MachineList[index] + '_.txt'
setup_script = locallogdir + '/setup_script_' + MachineList[index] + '_.txt'
#Sometimes git fails so the script below retries in that case
localfile = os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/tools/git-retry.sh')
remotefile = logdir + '/git-retry.sh'
paramList=[]
port=22
paramList.append ( {"operation":'put', "localfile":localfile, "remotefile":remotefile} )
sftp_log = os.path.expandvars(locallogdir + '/sftp_module.log')
sftp_module (user, pw, MachineList[index], port, paramList, sftp_log)
cmd = ' ( \n'
#cmd = cmd + 'rm -fR ' + logdir + '\n'
#cmd = cmd + 'mkdir -p ' + logdir + '\n'
cmd = cmd + 'cd '+ logdir + '\n'
cmd = cmd + 'sudo apt-get install -y git \n'
cmd = cmd + 'git config --global http.sslVerify false \n'
cmd = cmd + 'git clone '+ GitOAI5GRepo +' \n'
cmd = cmd + 'git clone '+ GitOpenaircnRepo + ' \n'
cmd = cmd + 'chmod 700 ' + logdir + '/git-retry.sh \n'
cmd = cmd + logdir + '/git-retry.sh clone '+ GitOAI5GRepo +' \n'
cmd = cmd + logdir + '/git-retry.sh clone '+ GitOpenaircnRepo + ' \n'
cmd = cmd + 'cd ' + logdirOAI5GRepo + '\n'
cmd = cmd + 'git checkout ' + GitOAI5GRepoBranch + '\n'
#cmd = cmd + 'git checkout ' + GitOAI5GHeadVersion + '\n'
@@ -1489,7 +1536,7 @@ if (out != '') :
print "Exiting now..."
sys.exit(1)
cleanOldProgramsAllMachines(oai_list, CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop)
cleanOldProgramsAllMachines(oai_list, CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop, '$HOME' , logdirOAI5GRepo)
if cleanUpRemoteMachines == True:
sys.exit(0)
File diff suppressed because it is too large Load Diff
+18
View File
@@ -0,0 +1,18 @@
#!/bin/bash
#Simple script to retry git clone in case of failure
REALGIT=/usr/bin/git
RETRIES=10
DELAY=10
COUNT=1
while [ $COUNT -lt $RETRIES ]; do
$REALGIT $* >> git-clone-`hostname`-log.txt 2>&1
if [ $? -eq 0 ]; then
RETRIES=0
break
fi
let COUNT=$COUNT+1
sleep $DELAY
done
+56 -2
View File
@@ -34,19 +34,73 @@
#arg2 interface
#arg3 iperf arguments
echo "Start time of script: `date`"
args=($*)
timeout=${args[0]}
iface=${args[1]}
iperf_args=(${args[@]:2})
ip_client=`echo "$iperf_args" | sed -ne 's/.*\-c[ ]*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p'`
#array=${1:-1}
echo "args = ${args[@]}"
echo "timeout = $timeout"
echo "iface = $iface"
echo "iperf_args = ${iperf_args[@]}"
echo "ip_client = $ip_client"
# Test an IP address for validity:
# Usage:
# valid_ip IP_ADDRESS
# if [[ $? -eq 0 ]]; then echo good; else echo bad; fi
# OR
# if valid_ip IP_ADDRESS; then echo good; else echo bad; fi
#
function valid_ip()
{
local ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
if valid_ip $iface; then
echo "$iface is Valid IP Address. Checking for connectivity..."
ping -c 1 $iface >& /dev/null
while [ "$?" != "0" ]; do
ping -c 1 $iface >& /dev/null
done
echo "$iface connectivity achieved at `date`, Seconds = $SECONDS"
else
echo "Waiting for Interface $iface to come up..."
while true; do var=`ifconfig $iface` ;sleep 1; if [ "$var" != "" ]; then break; fi ; done
echo "$iface is now available at `date` , Seconds = $SECONDS"
fi
#if [ -n "$ip_client" ]; then
#echo "Waiting for route to be setup before iperf makes connection..."
# var=`route -n | grep $ip_client`
# if ["$var" != "" ] ; then break; fi
#
#fi
echo "Sleeping for additional $timeout seconds"
sleep $timeout
while true; do var=`ifconfig $iface` ;sleep 1; if [ "$var" != "" ]; then break; fi ; done ; sleep 5
echo "Starting iperf at `date` , Seconds = $SECONDS ...."
iperf ${iperf_args[@]}
+56
View File
@@ -0,0 +1,56 @@
#!/bin/bash
#arg0 -> Name of executable
#args[1...N] -> arguments to be passed to executable
if [ -z "$OPENAIR_DIR" ]
then
echo "OPENAIR_DIR environment not set. Exiting.."
exit
fi
source $OPENAIR_DIR/cmake_targets/tools/build_helper
args=($*)
exec_name=${args[0]}
exe_args=(${args[@]:1})
gdb_file=$OPENAIR_DIR/targets/bin/gdb_file
gdb_log=$OPENAIR_DIR/targets/bin/gdb_log.bt
echo "args = ${args[@]}"
echo "exec_name = $exec_name"
echo "exe_args = ${exe_args[@]}"
echo "gdb log file = $gdb_log"
$SUDO rm -fr $gdb_file $gdb_log
$SUDO touch $gdb_file $gdb_log
$SUDO chmod 777 $gdb_file $gdb_log
$SUDO echo "file $exec_name" >> $gdb_file
$SUDO echo "set args ${exe_args[@]}" >> $gdb_file
$SUDO echo "run" >> $gdb_file
$SUDO echo "set logging overwrite on" >> $gdb_file
$SUDO echo "set logging file $gdb_log" >> $gdb_file
$SUDO echo "set logging on" >> $gdb_file
$SUDO echo "set pagination off" >> $gdb_file
$SUDO echo "handle SIG33 pass nostop noprint" >> $gdb_file
$SUDO echo "echo backtrace:\n" >> $gdb_file
$SUDO echo "backtrace full" >> $gdb_file
$SUDO echo "echo \n\nVariables:\n" >> $gdb_file
$SUDO echo "info variables" >> $gdb_file
$SUDO echo "echo \n\nlocals:\n" >> $gdb_file
$SUDO echo "info locals" >> $gdb_file
$SUDO echo "echo \n\nregisters:\n" >> $gdb_file
$SUDO echo "info registers" >> $gdb_file
$SUDO echo "echo \n\ncurrent instructions:\n" >> $gdb_file
$SUDO echo "x/16i \$pc" >> $gdb_file
$SUDO echo "echo \n\nthreads backtrace:\n" >> $gdb_file
$SUDO echo "thread apply all backtrace" >> $gdb_file
$SUDO echo "set logging off" >> $gdb_file
$SUDO echo "quit" >> $gdb_file
echo "Contents of gdb_file...start"
$SUDO cat $gdb_file
echo "Contents of gdb_file...finish"
$SUDO gdb -n -x $gdb_file 2>&1
+34 -12
View File
@@ -33,6 +33,7 @@
# brief OAI automated build tool that can be used to install, compile, run OAI.
# author Navid Nikaein, Lionel GAUTHIER, Laurent Thomas
set -e
################################
# include helper functions
@@ -59,6 +60,8 @@ RUN_GROUP=0
TEST_CASE_GROUP=""
BUILD_DOXYGEN=0
T_TRACER="False"
DISABLE_HARDWARE_DEPENDENCY="False"
CMAKE_BUILD_TYPE=""
trap handle_ctrl_c INT
function print_help() {
@@ -80,7 +83,7 @@ Options
--install-optional-packages
Install useful but not mandatory packages such as valgrind
-g | --run-with-gdb
Add debugging symbols to compilation directives
Add debugging symbols to compilation directives. It also disables any compiler optimization.
-h | --help
Print this help
--eNB
@@ -131,6 +134,8 @@ Options
Disables CPU Affinity between UHD/TX/RX Threads (Valid only when deadline scheduler is disabled). By defaulT, CPU Affinity is enabled when not using deadline scheduler. It is enabled only with >2 CPUs. For eNB, CPU_0-> Device library (UHD), CPU_1->TX Threads, CPU_2...CPU_MAX->Rx Threads. For UE, CPU_0->Device Library(UHD), CPU_1..CPU_MAX -> All the UE threads
--T-tracer
Enables the T tracer.
--disable-hardware-dependency
Disable HW dependency during installation
Usage (first build):
oaisim (eNB + UE): ./build_oai -I -g --oaisim -x --install-system-files
Eurecom EXMIMO + COTS UE : ./build_oai -I -g --eNB -x --install-system-files
@@ -166,7 +171,8 @@ function main() {
shift;;
-g | --run-with-gdb)
GDB=1
echo_info "Will Compile with gdb symbols"
CMAKE_BUILD_TYPE="Debug"
echo_info "Will Compile with gdb symbols and disable compiler optimization"
shift;;
--eNB)
eNB=1
@@ -277,6 +283,10 @@ function main() {
T_TRACER="True"
echo_info "Enabling the T tracer"
shift 1;;
--disable-hardware-dependency)
echo_info "Disabling hardware dependency for compiling software"
DISABLE_HARDWARE_DEPENDENCY="True"
shift 1;;
-h | --help)
print_help
exit 1;;
@@ -386,10 +396,16 @@ function main() {
if [ "$HW" == "OAI_USRP" ] ; then
echo_info "installing packages for USRP support"
check_install_usrp_uhd_driver
if [ ! "$DISABLE_HARDWARE_DEPENDENCY" == "True" ]; then
install_usrp_uhd_driver
fi
fi
if [ "$HW" == "OAI_BLADERF" ] ; then
echo_info "installing packages for BLADERF support"
check_install_bladerf_driver
if [ ! "$DISABLE_HARDWARE_DEPENDENCY" == "True" ]; then
flash_firmware_bladerf
fi
fi
fi
@@ -432,6 +448,7 @@ function main() {
if [ "$NOS1" = "1" ] ; then
cat $DIR/$lte_build_dir/CMakeLists.template >> $cmake_file
fi
echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file
echo "set ( XFORMS $XFORMS )" >> $cmake_file
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
@@ -557,6 +574,8 @@ function main() {
cp $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 $dbin
fi
# oaisim compilation
###############
if [ "$oaisim" = "1" ] ; then
dconf=$OPENAIR_DIR/targets/bin
if [ "$NOS1" = "1" ] ; then
@@ -570,6 +589,7 @@ function main() {
echo_info "Compiling $oaisim_exec ($oaisim_build_dir)"
cmake_file=$DIR/$oaisim_build_dir/CMakeLists.txt
cp $DIR/$oaisim_build_dir/CMakeLists.template $cmake_file
echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file
echo "set ( XFORMS $XFORMS )" >> $cmake_file
echo "set ( PRINT_STATS $PRINT_STATS )" >> $cmake_file
@@ -638,9 +658,10 @@ function main() {
cmake_file=$DIR/oaisim_mme_build_oai/CMakeLists.txt
cp $DIR/oaisim_mme_build_oai/CMakeLists.template $cmake_file
echo "set(XFORMS $XFORMS )" >> $cmake_file
echo "set(RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
echo "set(ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
echo "set ( XFORMS $XFORMS )" >> $cmake_file
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
echo "set ( T_TRACER $T_TRACER )" >> $cmake_file
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
#[ "$CLEAN" = "1" ] && rm -rf $DIR/oaisim_mme_build_oai/build
@@ -665,13 +686,14 @@ function main() {
mkdir -p $DIR/$rrh_build_dir/build
cmake_file=$DIR/$rrh_build_dir/CMakeLists.txt
echo "cmake_minimum_required(VERSION 2.8)" > $cmake_file
echo "set(ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
echo "set(ENABLE_ITTI False )" >> $cmake_file
echo "set(RF_BOARD \"${HW}\")" >> $cmake_file
echo "set(TRANSP_PRO \"${TP}\")" >> $cmake_file
echo 'set(PACKAGE_NAME "\"rrh_gw\"")' >> $cmake_file
echo "set (DEADLINE_SCHEDULER \"${DEADLINE_SCHEDULER_FLAG_USER}\" )" >>$cmake_file
echo "set (CPU_AFFINITY \"${CPU_AFFINITY_FLAG_USER}\" )" >>$cmake_file
echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
echo "set ( ENABLE_ITTI False )" >> $cmake_file
echo "set ( RF_BOARD \"${HW}\")" >> $cmake_file
echo "set ( TRANSP_PRO \"${TP}\")" >> $cmake_file
echo 'set ( PACKAGE_NAME "\"rrh_gw\"")' >> $cmake_file
echo "set ( DEADLINE_SCHEDULER \"${DEADLINE_SCHEDULER_FLAG_USER}\" )" >>$cmake_file
echo "set ( CPU_AFFINITY \"${CPU_AFFINITY_FLAG_USER}\" )" >>$cmake_file
echo "set ( T_TRACER $T_TRACER )" >> $cmake_file
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
cd $DIR/$rrh_build_dir/build
+92 -19
View File
@@ -1,4 +1,4 @@
################################################################################
################################################################################
#
# Copyright (c) 2015, EURECOM (www.eurecom.fr)
# All rights reserved.
@@ -67,7 +67,45 @@ echo_warning() { cecho "$*" $yellow ;}
echo_success() { cecho "$*" $green ;}
echo_info() { cecho "$*" $blue ;}
########################
# distribution helpers #
########################
# This function return a string to identify the distribution we are running
# If we can't check the distribution, it returns "Unknown"
# This function return always true as exit code by design
# Examples:
# Ubuntu16.04
# Debian8.5
get_distribution_release() {
local distributor
if distributor=$(lsb_release -si 2>/dev/null) ; then
echo $distributor$(lsb_release -sr)
else
echo Unknown
fi
}
check_supported_distribution() {
local distribution=$(get_distribution_release)
case "$distribution" in
"Ubuntu16.04") return 0 ;;
"Ubuntu14.04") return 0 ;;
esac
return 1
}
##################
# Error handlers #
##################
handler_EXIT() {
local exit_code=$?
[ "$exit_code" -eq 0 ] || echo_error "build have failed"
exit $exit_code
}
trap handler_EXIT EXIT
###########################
# Cleaners
@@ -109,6 +147,7 @@ clean_all_files() {
compilations() {
cd $OPENAIR_DIR/cmake_targets/$1/build
set +e
{
rm -f $3
if [ "$VERBOSE_COMPILE" == "1" ]; then
@@ -118,12 +157,14 @@ compilations() {
fi
} > $dlog/$2.$REL.txt 2>&1
set -e
echo_info "Log file for compilation has been written to: $dlog/$2.$REL.txt"
if [ -s $3 ] ; then
cp $3 $4
echo_success "$2 compiled"
else
echo_error "$2 compilation failed"
exit 1
fi
}
@@ -164,10 +205,8 @@ install_gnutls_from_source(){
cd /tmp
echo "Downloading gnutls archive"
$SUDO rm -rf /tmp/gnutls-3.1.23.tar.xz* /tmp/gnutls-3.1.23
wget http://mirrors.dotsrc.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz
if [ $? -ne 0 ]; then
wget http://mirrors.dotsrc.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz || \
wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz
fi
if [ ! -f gnutls-3.1.23.tar.xz ]; then
echo_error "Could not download gnutls source files"
cd -
@@ -186,23 +225,36 @@ install_gnutls_from_source(){
check_install_usrp_uhd_driver(){
#first we remove old installation
$SUDO apt-get remove uhd libuhd-dev libuhd003 uhd-host -y
$SUDO apt-get remove -y uhd || true
$SUDO apt-get remove libuhd-dev libuhd003 uhd-host -y
v=$(lsb_release -cs)
$SUDO apt-add-repository --remove "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main"
#The new USRP repository
$SUDO add-apt-repository ppa:ettusresearch/uhd -y
$SUDO apt-get update
$SUDO apt-get -y install python python-tk libboost-all-dev libusb-1.0-0-dev
$SUDO apt-get -y install libuhd-dev libuhd003 uhd-host
$SUDO apt-get -y install libuhd-dev libuhd003
}
install_usrp_uhd_driver() {
# We move uhd-host apart because it depends on linux kernel version
# On newer kernels, it fails to install
$SUDO apt-get -y install uhd-host
$SUDO uhd_images_downloader
}
check_install_bladerf_driver(){
$SUDO add-apt-repository -y ppa:bladerf/bladerf
$SUDO apt-get update
if [ "$(get_distribution_release)" == "Ubuntu14.04" ] ; then
$SUDO add-apt-repository -y ppa:bladerf/bladerf
$SUDO apt-get update
fi
$SUDO apt-get install -y bladerf libbladerf-dev
$SUDO apt-get install -y bladerf-firmware-fx3
$SUDO apt-get install -y bladerf-fpga-hostedx40
$SUDO bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img
}
flash_firmware_bladerf() {
$SUDO bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img
}
check_install_additional_tools (){
@@ -228,12 +280,16 @@ check_install_additional_tools (){
ctags \
ntpdate \
iperf3 \
android-tools-adb
android-tools-adb \
wvdial \
python-numpy \
sshpass \
nscd
$SUDO pip install paramiko
$SUDO pip install pyroute2
$SUDO rm -fr /opt/ssh
$SUDO git clone https://gist.github.com/2190472.git /opt/ssh
$SUDO GIT_SSL_NO_VERIFY=true git clone https://gist.github.com/2190472.git /opt/ssh
log_netiface=$OPENAIR_DIR/cmake_targets/log/netiface_install_log.txt
echo_info "Installing Netinterfaces package. The logfile for installation is in $log_netiface"
@@ -248,8 +304,26 @@ check_install_additional_tools (){
}
check_install_oai_software() {
local specific_packages=""
if ! check_supported_distribution; then
echo_error "Your distribution $(get_distribution_release) is not supported by oai !"
exit 1
fi
$SUDO apt-get update
$SUDO apt install -y software-properties-common
case "$(get_distribution_release)" in
"Ubuntu14.04")
specific_packages="libtasn1-3-dev"
# For iperf3
$SUDO add-apt-repository "deb http://archive.ubuntu.com/ubuntu trusty-backports universe"
$SUDO apt-get update
;;
"Ubuntu16.04")
specific_packages="libtasn1-6-dev"
;;
esac
$SUDO apt-get install -y \
$specific_packages \
autoconf \
automake \
bison \
@@ -273,9 +347,9 @@ check_install_oai_software() {
iptables-dev \
libatlas-base-dev \
libatlas-dev \
libblas3gf \
libblas-dev \
libconfig8-dev \
libffi-dev \
libforms-bin \
libforms-dev \
libgcrypt11-dev \
@@ -285,16 +359,16 @@ check_install_oai_software() {
libidn11-dev \
libmysqlclient-dev \
liboctave-dev \
libpgm-5.1 \
libpgm-dev \
libpython2.7-dev \
libsctp1 \
libsctp-dev \
libssl-dev \
libtasn1-3-dev \
libtool \
libusb-1.0-0-dev \
libxml2 \
libxml2-dev \
libxslt1-dev \
linux-headers-`uname -r` \
mscgen \
octave \
@@ -307,11 +381,7 @@ check_install_oai_software() {
xmlstarlet \
python-pip \
pydb \
wvdial \
python-numpy \
sshpass \
libxslt1-dev \
android-tools-adb
wget
$SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so
@@ -337,6 +407,7 @@ install_asn1c_from_source(){
./configure
make -j`nproc`
$SUDO make install
cd -
) > $asn1_install_log 2>&1
}
@@ -387,6 +458,8 @@ CURPID=$$
ppid=$$
arraycounter=1
echo_info "** Trapped CTRL-C. Killing all subprocesses now..."
echo_info "** Calling sync now..."
sync
while true
do
FORLOOP=FALSE
+14 -2
View File
@@ -60,7 +60,9 @@ function help()
echo_error " -f, --rf-config-file filename RF specific configuration file"
echo_error " -K, --itti-dump-file filename ITTI dump file containing all ITTI events occuring during EPC runtime.(can omit file name if last argument)"
echo_error " -M, --target-dl-mcs mcs Downlink target MCS."
echo_error " -m, --mscgen directory Generate mscgen output files in a directory"
echo_error " -n, --T-no-wait don't wait for tracer, start immediately"
echo_error " -p, --T-port port use given port"
echo_error " -m, --mscgen directory Generate mscgen output files in a directory"
echo_error " -s, --show-stdout Do not redirect stdout and stderr to file /tmp/lte_softmodem.stdout.txt."
echo_error " -S, --enable-missed-slot Continue execution in case of missed slot."
echo_error " -T, --target-ul-mcs mcs Uplink target MCS."
@@ -188,7 +190,17 @@ function main()
exe_arguments="$exe_arguments -m $2"
shift 2;
;;
-V | --vcd)
-n | --T-no-wait)
echo "setting T tracer operation"
exe_arguments="$exe_arguments --T_nowait"
shift ;
;;
-p | --T-port)
echo "setting T tracer port"
exe_arguments="$exe_arguments --T_port $2"
shift 2;
;;
-V | --vcd)
echo "setting gtk-wave output"
exe_arguments="$exe_arguments -V /tmp/oai_gtk_wave.vcd"
shift ;
+13
View File
@@ -0,0 +1,13 @@
*.o
*.a
T_IDs.h
T_messages.txt.h
genids
tracer/enb
tracer/extract_config
tracer/record
tracer/replay
tracer/textlog
tracer/vcd
tracer/macpdu2wireshark
tracee/tracee
+8 -34
View File
@@ -1,5 +1,4 @@
#include "T.h"
#include "T_messages.txt.h"
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
@@ -108,19 +107,17 @@ static void monitor_and_kill(int child1, int child2)
exit(0);
}
void T_init(int remote_port, int wait_for_tracer)
void T_init(int remote_port, int wait_for_tracer, int dont_fork)
{
int socket_pair[2];
int s;
int T_shm_fd;
unsigned char *buf;
int len;
int child1, child2;
if (socketpair(AF_UNIX, SOCK_STREAM, 0, socket_pair))
{ perror("socketpair"); abort(); }
/* child1 runs the local tracer and child2 runs the tracee */
/* child1 runs the local tracer and child2 (or main) runs the tracee */
child1 = fork(); if (child1 == -1) abort();
if (child1 == 0) {
@@ -130,10 +127,12 @@ void T_init(int remote_port, int wait_for_tracer)
}
close(socket_pair[0]);
child2 = fork(); if (child2 == -1) abort();
if (child2 != 0) {
close(socket_pair[1]);
monitor_and_kill(child1, child2);
if (dont_fork == 0) {
child2 = fork(); if (child2 == -1) abort();
if (child2 != 0) {
close(socket_pair[1]);
monitor_and_kill(child1, child2);
}
}
s = socket_pair[1];
@@ -153,29 +152,4 @@ void T_init(int remote_port, int wait_for_tracer)
close(T_shm_fd);
new_thread(T_receive_thread, NULL);
/* trace T_message.txt
* Send several messages -1 with content followed by message -2.
* We can't use the T macro directly, events -1 and -2 are special.
*/
buf = T_messages_txt;
len = T_messages_txt_len;
while (len) {
int send_size = len;
if (send_size > T_PAYLOAD_MAXSIZE - sizeof(int))
send_size = T_PAYLOAD_MAXSIZE - sizeof(int);
do {
T_LOCAL_DATA
T_HEADER(T_ID(-1));
T_PUT_buffer(1, ((T_buffer){addr:(buf), length:(len)}));
T_COMMIT();
} while (0);
buf += send_size;
len -= send_size;
}
do {
T_LOCAL_DATA
T_HEADER(T_ID(-2));
T_COMMIT();
} while (0);
}
+1 -1
View File
@@ -562,7 +562,7 @@ extern T_cache_t *T_cache;
extern int *T_active;
void T_init(int remote_port, int wait_for_tracer);
void T_init(int remote_port, int wait_for_tracer, int dont_fork);
#else /* T_TRACER */
+13 -1
View File
@@ -52,7 +52,7 @@ ID = ENB_PHY_UL_CHANNEL_ESTIMATE
ID = ENB_PHY_PUSCH_IQ
DESC = eNodeB PUSCH received IQ data
GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,nb_rb : buffer,pusch_comp
FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,nb_rb : int,N_RB_UL : int,symbols_per_tti : buffer,pusch_comp
ID = ENB_PHY_PUCCH_1AB_IQ
DESC = eNodeB PUCCH received IQ data
GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB
@@ -79,14 +79,26 @@ ID = ENB_MAC_UE_UL_PDU
DESC = MAC uplink UE received PDU
GROUP = ALL:MAC:ENB
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : int,sdu_length : int,num_ce : int,num_sdu
ID = ENB_MAC_UE_UL_PDU_WITH_DATA
DESC = MAC uplink UE received PDU
GROUP = ALL:MAC:ENB:HEAVY
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : int,sdu_length : int,num_ce : int,num_sdu : buffer,data
ID = ENB_MAC_UE_UL_SDU
DESC = MAC uplink UE received SDU
GROUP = ALL:MAC:ENB
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,lcid : int,length
ID = ENB_MAC_UE_UL_SDU_WITH_DATA
DESC = MAC uplink UE received SDU
GROUP = ALL:MAC:ENB:HEAVY
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,lcid : int,length : buffer,data
ID = ENB_MAC_UE_UL_CE
DESC = MAC uplink UE received control element
GROUP = ALL:MAC:ENB
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,ce
ID = ENB_MAC_UE_DL_PDU_WITH_DATA
DESC = MAC downlink PDU for an UE
GROUP = ALL:MAC:ENB
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : buffer,data
#RLC logs
ID = ENB_RLC_DL
+46 -10
View File
@@ -11,10 +11,12 @@
#include <inttypes.h>
#include <signal.h>
#include "T.h"
#include "T_messages.txt.h"
#include "T_defs.h"
#include "T_IDs.h"
static T_cache_t *T_cache;
static T_cache_t *T_local_cache;
static int T_busylist_head;
typedef struct databuf {
@@ -85,6 +87,38 @@ static int get_connection(char *addr, int port)
return t;
}
static void forward(void *_forwarder, char *buf, int size);
void send_T_messages_txt(void *forwarder)
{
char buf[T_BUFFER_MAX];
char *T_LOCAL_buf = buf;
int T_LOCAL_size;
unsigned char *src;
int src_len;
/* trace T_message.txt
* Send several messages -1 with content followed by message -2.
*/
src = T_messages_txt;
src_len = T_messages_txt_len;
while (src_len) {
int send_size = src_len;
if (send_size > T_PAYLOAD_MAXSIZE - sizeof(int))
send_size = T_PAYLOAD_MAXSIZE - sizeof(int);
/* TODO: be careful, we use internal T stuff, to rewrite? */
T_LOCAL_size = 0;
T_HEADER(T_ID(-1));
T_PUT_buffer(1, ((T_buffer){addr:(src), length:(send_size)}));
forward(forwarder, buf, T_LOCAL_size);
src += send_size;
src_len -= send_size;
}
T_LOCAL_size = 0;
T_HEADER(T_ID(-2));
forward(forwarder, buf, T_LOCAL_size);
}
/****************************************************************************/
/* forward functions */
/****************************************************************************/
@@ -213,6 +247,7 @@ dead:
close(f->socket_remote);
f->socket_remote = get_connection("0.0.0.0", f->remote_port);
send_T_messages_txt(f);
goto again;
return NULL;
@@ -237,6 +272,7 @@ static void *forwarder(int port, int s)
f->remote_port = port;
f->socket_remote = get_connection("0.0.0.0", port);
send_T_messages_txt(f);
new_thread(data_sender, f);
new_thread(forward_remote_messages, f);
@@ -287,7 +323,7 @@ static void forward(void *_forwarder, char *buf, int size)
static void wait_message(void)
{
while (T_cache[T_busylist_head].busy == 0) usleep(1000);
while (T_local_cache[T_busylist_head].busy == 0) usleep(1000);
}
static void init_shm(void)
@@ -297,17 +333,17 @@ static void init_shm(void)
if (s == -1) { perror(T_SHM_FILENAME); abort(); }
if (ftruncate(s, T_CACHE_SIZE * sizeof(T_cache_t)))
{ perror(T_SHM_FILENAME); abort(); }
T_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t),
PROT_READ | PROT_WRITE, MAP_SHARED, s, 0);
if (T_cache == NULL)
T_local_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t),
PROT_READ | PROT_WRITE, MAP_SHARED, s, 0);
if (T_local_cache == NULL)
{ perror(T_SHM_FILENAME); abort(); }
close(s);
/* let's garbage the memory to catch some potential problems
* (think multiprocessor sync issues, barriers, etc.)
*/
memset(T_cache, 0x55, T_CACHE_SIZE * sizeof(T_cache_t));
for (i = 0; i < T_CACHE_SIZE; i++) T_cache[i].busy = 0;
memset(T_local_cache, 0x55, T_CACHE_SIZE * sizeof(T_cache_t));
for (i = 0; i < T_CACHE_SIZE; i++) T_local_cache[i].busy = 0;
}
void T_local_tracer_main(int remote_port, int wait_for_tracer,
@@ -335,9 +371,9 @@ void T_local_tracer_main(int remote_port, int wait_for_tracer,
while (1) {
wait_message();
__sync_synchronize();
forward(f, T_cache[T_busylist_head].buffer,
T_cache[T_busylist_head].length);
T_cache[T_busylist_head].busy = 0;
forward(f, T_local_cache[T_busylist_head].buffer,
T_local_cache[T_busylist_head].length);
T_local_cache[T_busylist_head].busy = 0;
T_busylist_head++;
T_busylist_head &= T_CACHE_SIZE - 1;
}
+1 -1
View File
@@ -2,7 +2,7 @@ CC=gcc
CFLAGS=-Wall -g -pthread -DT_TRACER -I.
PROG=tracee
OBJS=tracee.o ../T.o
OBJS=tracee.o ../T.o ../local_tracer.o
$(PROG): $(OBJS)
$(CC) $(CFLAGS) -o $(PROG) $(OBJS) -lrt
+1 -1
View File
@@ -6,7 +6,7 @@
int main(void)
{
int frame = 0;
T_connect_to_tracer("127.0.0.1", 2020);
T_init(2021, 1, 0);
while (1) {
getchar();
T(T_ENB_PHY_PUCCH_1AB_IQ, T_INT(0), T_INT(0), T_INT(frame), T_INT(0), T_INT(0), T_INT(0));
+17 -2
View File
@@ -5,7 +5,16 @@ CFLAGS=-Wall -g -pthread -DT_TRACER -I.
LIBS=-lX11 -lm -lpng -lXft
all: textlog enb vcd
all: record replay extract_config textlog enb vcd macpdu2wireshark
record: utils.o record.o database.o config.o
$(CC) $(CFLAGS) -o record $^ $(LIBS)
replay: utils.o replay.o
$(CC) $(CFLAGS) -o replay $^ $(LIBS)
extract_config: extract_config.o
$(CC) $(CFLAGS) -o extract_config $^ $(LIBS)
textlog: utils.o textlog.o database.o event.o handler.o config.o \
event_selector.o view/view.a gui/gui.a logger/logger.a \
@@ -22,6 +31,10 @@ vcd: utils.o vcd.o database.o event.o handler.o config.o \
filter/filter.a
$(CC) $(CFLAGS) -o vcd $^ $(LIBS)
macpdu2wireshark: macpdu2wireshark.o database.o utils.o handler.o event.o \
config.o
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
.PHONY: all gui/gui.a view/view.a logger/logger.a filter/filter.a
gui/gui.a:
@@ -40,8 +53,10 @@ filter/filter.a:
$(CC) $(CFLAGS) -c -o $@ $<
clean:
rm -f *.o core tracer_remote textlog enb vcd
rm -f *.o core tracer_remote textlog enb vcd record replay
rm -f extract_config macpdu2wireshark
cd gui && make clean
cd view && make clean
cd logger && make clean
cd filter && make clean
cd hacks && make clean
+82 -10
View File
@@ -33,9 +33,6 @@ typedef struct {
pthread_mutex_t lock;
} enb_data;
#define DEFAULT_REMOTE_IP "127.0.0.1"
#define DEFAULT_REMOTE_PORT 2021
void is_on_changed(void *_d)
{
enb_data *d = _d;
@@ -116,8 +113,11 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
widget *text;
view *textview;
int i;
widget *w;
view *v;
logger *l;
main_window = new_toplevel_window(g, 800, 600, "eNB tracer");
main_window = new_toplevel_window(g, 1200, 900, "eNB tracer");
top_container = new_container(g, VERTICAL);
widget_add_child(g, main_window, top_container, -1);
@@ -135,12 +135,73 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
*/
framelog_set_skip(input_signal_log, 10);
input_signal_view = new_view_xy(7680*10, 10,
g, input_signal_plot, new_color(g, "#0c0c72"));
g, input_signal_plot, new_color(g, "#0c0c72"), XY_LOOP_MODE);
logger_add_view(input_signal_log, input_signal_view);
/* UE 0 PUSCH IQ data */
w = new_xy_plot(g, 55, 55, "PUSCH IQ [UE 0]", 50);
widget_add_child(g, line, w, -1);
xy_plot_set_range(g, w, -1000, 1000, -1000, 1000);
l = new_iqlog(h, database, "ENB_PHY_PUSCH_IQ", "nb_rb",
"N_RB_UL", "symbols_per_tti", "pusch_comp");
v = new_view_xy(100*12*14,10,g,w,new_color(g,"#000"),XY_FORCED_MODE);
logger_add_view(l, v);
logger_set_filter(l,
filter_eq(
filter_evarg(database, "ENB_PHY_PUSCH_IQ", "UE_ID"),
filter_int(0)));
/* UE 0 estimated UL channel */
w = new_xy_plot(g, 280, 55, "UL estimated channel [UE 0]", 50);
widget_add_child(g, line, w, -1);
xy_plot_set_range(g, w, 0, 512*10, -10, 80);
l = new_framelog(h, database,
"ENB_PHY_UL_CHANNEL_ESTIMATE", "subframe", "chest_t");
//framelog_set_skip(input_signal_log, 10);
framelog_set_update_only_at_sf9(l, 0);
v = new_view_xy(512*10, 10, g, w, new_color(g, "#0c0c72"), XY_LOOP_MODE);
logger_add_view(l, v);
logger_set_filter(l,
filter_eq(
filter_evarg(database, "ENB_PHY_UL_CHANNEL_ESTIMATE", "UE_ID"),
filter_int(0)));
/* UE 0 PUCCH energy */
w = new_xy_plot(g, 128, 55, "PUCCH1 energy (SR) [UE 0]", 50);
widget_add_child(g, line, w, -1);
xy_plot_set_range(g, w, 0, 1024*10, -10, 80);
l = new_ttilog(h, database,
"ENB_PHY_PUCCH_1_ENERGY", "frame", "subframe", "threshold", 0);
v = new_view_tti(10, g, w, new_color(g, "#ff0000"));
logger_add_view(l, v);
logger_set_filter(l,
filter_eq(
filter_evarg(database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
filter_int(0)));
l = new_ttilog(h, database,
"ENB_PHY_PUCCH_1_ENERGY", "frame", "subframe", "energy", 1);
v = new_view_tti(10, g, w, new_color(g, "#0c0c72"));
logger_add_view(l, v);
logger_set_filter(l,
filter_eq(
filter_evarg(database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"),
filter_int(0)));
/* UE 0 PUCCH IQ data */
w = new_xy_plot(g, 55, 55, "PUCCH IQ [UE 0]", 50);
widget_add_child(g, line, w, -1);
xy_plot_set_range(g, w, -100, 100, -100, 100);
l = new_iqdotlog(h, database, "ENB_PHY_PUCCH_1AB_IQ", "I", "Q");
v = new_view_xy(500, 10, g, w, new_color(g,"#000"), XY_LOOP_MODE);
logger_add_view(l, v);
logger_set_filter(l,
filter_eq(
filter_evarg(database, "ENB_PHY_PUCCH_1AB_IQ", "UE_ID"),
filter_int(0)));
/* downlink/uplink UE DCIs */
widget_add_child(g, top_container,
new_label(g,"DL/UL TICK/DCI/ACK/NACK "), -1);
new_label(g,"DL/UL TICK/DCI/ACK/NACK [all UEs]"), -1);
line = new_container(g, HORIZONTAL);
widget_add_child(g, top_container, line, -1);
timeline_plot = new_timeline(g, 512, 8, 5);
@@ -190,7 +251,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database)
/* harq processes' ticktime view */
widget_add_child(g, top_container,
new_label(g,"DL/UL HARQ (x8) "), -1);
new_label(g,"DL/UL HARQ (x8) [UE 0]"), -1);
line = new_container(g, HORIZONTAL);
widget_add_child(g, top_container, line, -1);
timeline_plot = new_timeline(g, 512, 2*8+2, 3);
@@ -440,14 +501,16 @@ int main(int n, char **v)
logger *textlog;
char *name, *desc;
database_get_generic_description(database, i, &name, &desc);
if (strncmp(name, "LEGACY_", 7) != 0) continue;
textlog = new_textlog(h, database, name, desc);
logger_add_view(textlog, eg.legacy);
if (!strncmp(name, "LEGACY_", 7)) {
textlog = new_textlog(h, database, name, desc);
logger_add_view(textlog, eg.legacy);
}
free(name);
free(desc);
}
on_off(database, "ENB_PHY_INPUT_SIGNAL", is_on, 1);
on_off(database, "ENB_PHY_UL_CHANNEL_ESTIMATE", is_on, 1);
on_off(database, "ENB_PHY_DL_TICK", is_on, 1);
on_off(database, "ENB_PHY_DLSCH_UE_DCI", is_on, 1);
on_off(database, "ENB_PHY_DLSCH_UE_ACK", is_on, 1);
@@ -458,6 +521,9 @@ int main(int n, char **v)
on_off(database, "ENB_PHY_ULSCH_UE_ACK", is_on, 1);
on_off(database, "ENB_PHY_ULSCH_UE_NACK", is_on, 1);
on_off(database, "ENB_MASTER_TICK", is_on, 1);
on_off(database, "ENB_PHY_PUSCH_IQ", is_on, 1);
on_off(database, "ENB_PHY_PUCCH_1_ENERGY", is_on, 1);
on_off(database, "ENB_PHY_PUCCH_1AB_IQ", is_on, 1);
on_off(database, "LEGACY_RRC_INFO", is_on, 1);
on_off(database, "LEGACY_RRC_ERROR", is_on, 1);
@@ -477,7 +543,9 @@ int main(int n, char **v)
view_add_log(eg.macview, "ENB_MAC_UE_UL_SCHEDULE_RETRANSMISSION",
h, database, is_on);
view_add_log(eg.macview, "ENB_MAC_UE_UL_PDU", h, database, is_on);
view_add_log(eg.macview, "ENB_MAC_UE_UL_PDU_WITH_DATA", h, database, is_on);
view_add_log(eg.macview, "ENB_MAC_UE_UL_SDU", h, database, is_on);
view_add_log(eg.macview, "ENB_MAC_UE_UL_SDU_WITH_DATA", h, database, is_on);
view_add_log(eg.macview, "ENB_MAC_UE_UL_CE", h, database, is_on);
view_add_log(eg.rlcview, "ENB_RLC_DL", h, database, is_on);
@@ -545,6 +613,10 @@ int main(int n, char **v)
view_add_log(eg.rrcview, "ENB_RRC_UNKNOW_MESSAGE",
h, database, is_on);
/* deactivate those two by default, they are a bit heavy */
on_off(database, "ENB_MAC_UE_UL_SDU_WITH_DATA", is_on, 0);
on_off(database, "ENB_MAC_UE_UL_PDU_WITH_DATA", is_on, 0);
for (i = 0; i < on_off_n; i++)
on_off(database, on_off_name[i], is_on, on_off_action[i]);
+3
View File
@@ -34,11 +34,14 @@ static void scroll(void *private, gui *g,
int number_of_lines;
int new_line;
int inc;
int *d = notification_data;
int key_modifiers = *d;
textlist_state(g, w, &visible_lines, &start_line, &number_of_lines);
inc = 10;
if (inc > visible_lines - 2) inc = visible_lines - 2;
if (inc < 1) inc = 1;
if (key_modifiers & KEY_CONTROL) inc = 1;
if (!strcmp(notification, "scrollup")) inc = -inc;
new_line = start_line + inc;
+75
View File
@@ -0,0 +1,75 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../T_defs.h"
void usage(void)
{
printf(
"options:\n"
" -i <input file> this option is mandatory\n"
);
exit(1);
}
#define ERR printf("ERROR: read file %s failed\n", input_filename)
int main(int n, char **v)
{
char *input_filename = NULL;
int i;
FILE *in;
for (i = 1; i < n; i++) {
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
if (!strcmp(v[i], "-i"))
{ if (i > n-2) usage(); input_filename = v[++i]; continue; }
usage();
}
if (input_filename == NULL) {
printf("ERROR: provide an input file (-i)\n");
exit(1);
}
in = fopen(input_filename, "r");
if (in == NULL) { perror(input_filename); abort(); }
while (1) {
int type;
int32_t length;
char v[T_BUFFER_MAX];
int vpos = 0;
/* read event from file */
if (fread(&length, 4, 1, in) != 1) break;
memcpy(v+vpos, &length, 4);
vpos += 4;
#ifdef T_SEND_TIME
if (length < sizeof(struct timespec)) { ERR; break; }
if (fread(v+vpos, sizeof(struct timespec), 1, in) != 1) { ERR; break; }
vpos += sizeof(struct timespec);
length -= sizeof(struct timespec);
#endif
if (length < sizeof(int)) { ERR; break; }
if (fread(&type, sizeof(int), 1, in) != 1) { ERR; break; }
memcpy(v+vpos, &type, sizeof(int));
vpos += sizeof(int);
length -= sizeof(int);
if (length) if (fread(v+vpos, length, 1, in) != 1) { ERR; break; }
vpos += length;
if (type == -1) {
if (length < sizeof(int)) { ERR; break; }
length -= sizeof(int);
if (fwrite(v+vpos-length, length, 1, stdout) != 1) { ERR; break; }
}
/* TODO: parse all file? */
if (type == -2) break;
}
fclose(in);
return 0;
}
+2 -2
View File
@@ -83,8 +83,8 @@ int new_color(gui *gui, char *color);
/* notifications */
/* known notifications:
* - textlist:
* - scrollup { void *: NULL }
* - scrolldown { void *: NULL }
* - scrollup { int: key_modifiers }
* - scrolldown { int: key_modifiers }
* - click { int [2]: line, button }
* - label:
* - click { int: button } (if enabled)
+2 -2
View File
@@ -54,11 +54,11 @@ static void button(gui *_g, widget *_this, int x, int y,
x -= this->common.x;
/* scroll up */
if (button == 4 && up == 0) {
gui_notify(g, "scrollup", _this, NULL);
gui_notify(g, "scrollup", _this, &key_modifiers);
}
/* scroll down */
if (button == 5 && up == 0) {
gui_notify(g, "scrolldown", _this, NULL);
gui_notify(g, "scrolldown", _this, &key_modifiers);
}
/* button 1/2/3 click */
if (button >= 1 && button <= 3 && up == 0) {
+18
View File
@@ -0,0 +1,18 @@
CC=gcc
CFLAGS=-Wall -g -pthread -DT_TRACER -I. -I..
LIBS=-lX11 -lm -lpng -lXft
all: dump_nack_signal
dump_nack_signal: ../utils.o ../database.o ../config.o ../event.o \
dump_nack_signal.o
$(CC) $(CFLAGS) -o dump_nack_signal $^ $(LIBS)
.PHONY: all
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
clean:
rm -f *.o core dump_nack_signal
@@ -0,0 +1,115 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "utils.h"
#include "event.h"
#include "database.h"
#include "config.h"
#include "../T_defs.h"
void usage(void)
{
printf(
"options:\n"
" -d <database file> this option is mandatory\n"
" -ip <host> connect to given IP address (default %s)\n"
" -p <port> connect to given port (default %d)\n",
DEFAULT_REMOTE_IP,
DEFAULT_REMOTE_PORT
);
exit(1);
}
int main(int n, char **v)
{
char *database_filename = NULL;
void *database;
char *ip = DEFAULT_REMOTE_IP;
int port = DEFAULT_REMOTE_PORT;
int i;
char t;
int number_of_events;
int socket;
int *is_on;
int ev_input, ev_nack;
int ev_ack;
for (i = 1; i < n; i++) {
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
if (!strcmp(v[i], "-d"))
{ if (i > n-2) usage(); database_filename = v[++i]; continue; }
if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; }
if (!strcmp(v[i], "-p"))
{ if (i > n-2) usage(); port = atoi(v[++i]); continue; }
usage();
}
if (database_filename == NULL) {
printf("ERROR: provide a database file (-d)\n");
exit(1);
}
database = parse_database(database_filename);
load_config_file(database_filename);
number_of_events = number_of_ids(database);
is_on = calloc(number_of_events, sizeof(int));
if (is_on == NULL) abort();
on_off(database, "ENB_PHY_INPUT_SIGNAL", is_on, 1);
on_off(database, "ENB_PHY_ULSCH_UE_NACK", is_on, 1);
on_off(database, "ENB_PHY_ULSCH_UE_ACK", is_on, 1);
ev_input = event_id_from_name(database, "ENB_PHY_INPUT_SIGNAL");
ev_nack = event_id_from_name(database, "ENB_PHY_ULSCH_UE_NACK");
ev_ack = event_id_from_name(database, "ENB_PHY_ULSCH_UE_ACK");
socket = connect_to(ip, port);
t = 1;
if (socket_send(socket, &t, 1) == -1 ||
socket_send(socket, &number_of_events, sizeof(int)) == -1 ||
socket_send(socket, is_on, number_of_events * sizeof(int)) == -1)
abort();
char dump[10][T_BUFFER_MAX];
event dump_ev[10];
FILE *z = fopen("/tmp/dd", "w"); if (z == NULL) abort();
while (1) {
char v[T_BUFFER_MAX];
event e;
e = get_event(socket, v, database);
if (e.type == -1) break;
if (e.type == ev_input) {
int sf = e.e[2].i;
memcpy(dump[sf], v, T_BUFFER_MAX);
dump_ev[sf] = e;
printf("input %d/%d\n", e.e[1].i, sf);
if (fwrite(dump_ev[sf].e[4].b, dump_ev[sf].e[4].bsize, 1, z) != 1) abort();
fflush(z);
}
if (e.type == ev_nack) {
int sf = e.e[2].i;
printf("nack %d/%d\n", e.e[1].i, sf);
FILE *f = fopen("/tmp/dump.raw", "w"); if (f == NULL) abort();
if (fwrite(dump[sf] + ((char *)dump_ev[sf].e[4].b - v),
dump_ev[sf].e[4].bsize, 1, f) != 1) abort();
if (fclose(f)) abort();
printf("dumped... press enter (delta %d)\n", (int)((char *)dump_ev[sf].e[4].b - v));
// getchar();
}
if (e.type == ev_ack) {
int sf = e.e[2].i;
printf("ack %d/%d\n", e.e[1].i, sf);
FILE *f = fopen("/tmp/dump.raw", "w"); if (f == NULL) abort();
if (fwrite(dump[sf] + ((char *)dump_ev[sf].e[4].b - v),
dump_ev[sf].e[4].bsize, 1, f) != 1) abort();
if (fclose(f)) abort();
printf("dumped... press enter (delta %d)\n", (int)((char *)dump_ev[sf].e[4].b - v));
// getchar();
}
}
return 0;
}
+2 -1
View File
@@ -1,7 +1,8 @@
CC=gcc
CFLAGS=-Wall -g -pthread -I..
OBJS=logger.o textlog.o framelog.o ttilog.o timelog.o ticklog.o
OBJS=logger.o textlog.o framelog.o ttilog.o timelog.o ticklog.o iqlog.o \
iqdotlog.o
logger.a: $(OBJS)
ar cr logger.a $(OBJS)
+10 -1
View File
@@ -21,6 +21,7 @@ struct framelog {
*/
int skip_current; /* internal data for the skip mechanism */
int skip_on; /* internal data for the skip mechanism */
int update_only_at_sf9;
};
static void _event(void *p, event e)
@@ -76,7 +77,7 @@ static void _event(void *p, event e)
l->buffer[subframe * nsamples + i] = 10*log10(1.0+(float)(I*I+Q*Q));
}
if (subframe == 9)
if (l->update_only_at_sf9 == 0 || subframe == 9)
for (i = 0; i < l->common.vsize; i++)
l->common.v[i]->append(l->common.v[i], l->x, l->buffer, l->blength);
}
@@ -91,6 +92,8 @@ logger *new_framelog(event_handler *h, void *database,
ret = calloc(1, sizeof(struct framelog)); if (ret == NULL) abort();
ret->update_only_at_sf9 = 1;
ret->common.event_name = strdup(event_name);
if (ret->common.event_name == NULL) abort();
ret->database = database;
@@ -144,3 +147,9 @@ void framelog_set_skip(logger *_this, int skip_delay)
l->skip_current = 0;
l->skip_on = 0;
}
void framelog_set_update_only_at_sf9(logger *_this, int update_only_at_sf9)
{
struct framelog *l = _this;
l->update_only_at_sf9 = update_only_at_sf9;
}
+82
View File
@@ -0,0 +1,82 @@
#include "logger.h"
#include "logger_defs.h"
#include "handler.h"
#include "database.h"
#include "filter/filter.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
struct iqdotlog {
struct logger common;
void *database;
int i_arg;
int q_arg;
};
static void _event(void *p, event e)
{
struct iqdotlog *l = p;
int i;
float I, Q;
if (l->common.filter != NULL && filter_eval(l->common.filter, e) == 0)
return;
I = e.e[l->i_arg].i;
Q = e.e[l->q_arg].i;
for (i = 0; i < l->common.vsize; i++)
l->common.v[i]->append(l->common.v[i], &I, &Q, 1);
}
logger *new_iqdotlog(event_handler *h, void *database,
char *event_name, char *I, char *Q)
{
struct iqdotlog *ret;
int event_id;
database_event_format f;
int i;
ret = calloc(1, sizeof(struct iqdotlog)); if (ret == NULL) abort();
ret->common.event_name = strdup(event_name);
if (ret->common.event_name == NULL) abort();
ret->database = database;
event_id = event_id_from_name(database, event_name);
ret->common.handler_id = register_handler_function(h,event_id,_event,ret);
f = get_format(database, event_id);
/* look for args */
ret->i_arg = -1;
ret->q_arg = -1;
for (i = 0; i < f.count; i++) {
if (!strcmp(f.name[i], I)) ret->i_arg = i;
if (!strcmp(f.name[i], Q)) ret->q_arg = i;
}
if (ret->i_arg == -1) {
printf("%s:%d: argument '%s' not found in event '%s'\n",
__FILE__, __LINE__, I, event_name);
abort();
}
if (ret->q_arg == -1) {
printf("%s:%d: argument '%s' not found in event '%s'\n",
__FILE__, __LINE__, Q, event_name);
abort();
}
if (strcmp(f.type[ret->i_arg], "int") != 0) {
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
__FILE__, __LINE__, I);
abort();
}
if (strcmp(f.type[ret->q_arg], "int") != 0) {
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
__FILE__, __LINE__, Q);
abort();
}
return ret;
}
+187
View File
@@ -0,0 +1,187 @@
#include "logger.h"
#include "logger_defs.h"
#include "handler.h"
#include "database.h"
#include "filter/filter.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
struct iqlog {
struct logger common;
void *database;
int nb_rb_arg;
int N_RB_UL_arg;
int symbols_per_tti_arg;
int buffer_arg;
float *i;
float *q;
int max_length;
};
#if 0
/* this function passes all received IQ samples to the views */
static void _event(void *p, event e)
{
struct iqlog *l = p;
int i;
void *buffer;
int bsize;
int nsamples;
if (l->common.filter != NULL && filter_eval(l->common.filter, e) == 0)
return;
buffer = e.e[l->buffer_arg].b;
bsize = e.e[l->buffer_arg].bsize;
nsamples = bsize / (2*sizeof(int16_t));
if (nsamples > l->max_length) {
l->i = realloc(l->i, nsamples * sizeof(float));
if (l->i == NULL) abort();
l->q = realloc(l->q, nsamples * sizeof(float));
if (l->q == NULL) abort();
l->max_length = nsamples;
}
for (i = 0; i < nsamples; i++) {
l->i[i] = ((int16_t *)buffer)[i*2];
l->q[i] = ((int16_t *)buffer)[i*2+1];
}
for (i = 0; i < l->common.vsize; i++)
l->common.v[i]->append(l->common.v[i], l->i, l->q, nsamples);
}
#endif
static void _event(void *p, event e)
{
struct iqlog *l = p;
int i, j;
void *buffer;
int bsize;
int nb_rb;
int N_RB_UL;
int symbols_per_tti;
int max_nsamples;
float *idst, *qdst;
int count;
if (l->common.filter != NULL && filter_eval(l->common.filter, e) == 0)
return;
nb_rb = e.e[l->nb_rb_arg].i;
N_RB_UL = e.e[l->N_RB_UL_arg].i;
symbols_per_tti = e.e[l->symbols_per_tti_arg].i;
buffer = e.e[l->buffer_arg].b;
bsize = e.e[l->buffer_arg].bsize;
if (bsize != N_RB_UL * symbols_per_tti * 12 * 4) {
printf("%s:%d:%s: bad buffer size\n", __FILE__, __LINE__, __FUNCTION__);
abort();
}
max_nsamples = bsize / 4;
if (max_nsamples > l->max_length) {
l->i = realloc(l->i, max_nsamples * sizeof(float));
if (l->i == NULL) abort();
l->q = realloc(l->q, max_nsamples * sizeof(float));
if (l->q == NULL) abort();
l->max_length = max_nsamples;
}
idst = l->i;
qdst = l->q;
count = 0;
for (i = 0; i < symbols_per_tti; i++)
for (j = 0; j < 12 * nb_rb; j++) {
*idst = ((int16_t *)buffer)[(i*N_RB_UL*12 + j) * 2];
*qdst = ((int16_t *)buffer)[(i*N_RB_UL*12 + j) * 2 + 1];
idst++;
qdst++;
count++;
}
for (i = 0; i < l->common.vsize; i++)
l->common.v[i]->append(l->common.v[i], l->i, l->q, count);
}
logger *new_iqlog(event_handler *h, void *database,
char *event_name, char *nb_rb, char *N_RB_UL, char *symbols_per_tti,
char *buffer_varname)
{
struct iqlog *ret;
int event_id;
database_event_format f;
int i;
ret = calloc(1, sizeof(struct iqlog)); if (ret == NULL) abort();
ret->common.event_name = strdup(event_name);
if (ret->common.event_name == NULL) abort();
ret->database = database;
event_id = event_id_from_name(database, event_name);
ret->common.handler_id = register_handler_function(h,event_id,_event,ret);
f = get_format(database, event_id);
/* look for args */
ret->nb_rb_arg = -1;
ret->N_RB_UL_arg = -1;
ret->symbols_per_tti_arg = -1;
ret->buffer_arg = -1;
for (i = 0; i < f.count; i++) {
if (!strcmp(f.name[i], nb_rb)) ret->nb_rb_arg = i;
if (!strcmp(f.name[i], N_RB_UL)) ret->N_RB_UL_arg = i;
if (!strcmp(f.name[i], symbols_per_tti)) ret->symbols_per_tti_arg = i;
if (!strcmp(f.name[i], buffer_varname)) ret->buffer_arg = i;
}
if (ret->nb_rb_arg == -1) {
printf("%s:%d: argument '%s' not found in event '%s'\n",
__FILE__, __LINE__, nb_rb, event_name);
abort();
}
if (ret->N_RB_UL_arg == -1) {
printf("%s:%d: argument '%s' not found in event '%s'\n",
__FILE__, __LINE__, N_RB_UL, event_name);
abort();
}
if (ret->symbols_per_tti_arg == -1) {
printf("%s:%d: argument '%s' not found in event '%s'\n",
__FILE__, __LINE__, symbols_per_tti, event_name);
abort();
}
if (ret->buffer_arg == -1) {
printf("%s:%d: buffer argument '%s' not found in event '%s'\n",
__FILE__, __LINE__, buffer_varname, event_name);
abort();
}
if (strcmp(f.type[ret->nb_rb_arg], "int") != 0) {
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
__FILE__, __LINE__, nb_rb);
abort();
}
if (strcmp(f.type[ret->N_RB_UL_arg], "int") != 0) {
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
__FILE__, __LINE__, N_RB_UL);
abort();
}
if (strcmp(f.type[ret->symbols_per_tti_arg], "int") != 0) {
printf("%s:%d: argument '%s' has wrong type (should be 'int')\n",
__FILE__, __LINE__, symbols_per_tti);
abort();
}
if (strcmp(f.type[ret->buffer_arg], "buffer") != 0) {
printf("%s:%d: argument '%s' has wrong type (should be 'buffer')\n",
__FILE__, __LINE__, buffer_varname);
abort();
}
return ret;
}
+8
View File
@@ -13,8 +13,16 @@ logger *new_ttilog(void *event_handler, void *database,
logger *new_timelog(void *event_handler, void *database, char *event_name);
logger *new_ticklog(void *event_handler, void *database,
char *event_name, char *frame_name, char *subframe_name);
logger *new_iqlog(void *event_handler, void *database,
char *event_name, char *nb_rb, char *N_RB_UL, char *symbols_per_tti,
char *buffer_varname);
logger *new_iqdotlog(void *event_handler, void *database,
char *event_name, char *I, char *Q);
void framelog_set_skip(logger *_this, int skip_delay);
void framelog_set_update_only_at_sf9(logger *_this, int update_only_at_sf9);
void textlog_dump_buffer(logger *_this, int dump_buffer);
#include "view/view.h"
+20 -1
View File
@@ -32,12 +32,13 @@ struct textlog {
int fsize;
/* local output buffer */
OBUF o;
int dump_buffer;
};
static void _event(void *p, event e)
{
struct textlog *l = p;
int i;
int i, j;
#ifdef T_SEND_TIME
struct tm *t;
char tt[64];
@@ -65,6 +66,14 @@ static void _event(void *p, event e)
case BUFFER:
PUTS(&l->o, "{buffer size:");
PUTI(&l->o, e.e[l->f[i].event_arg].bsize);
if (l->dump_buffer) {
PUTS(&l->o, " [");
for (j = 0; j < e.e[l->f[i].event_arg].bsize; j++) {
PUTX2(&l->o, ((unsigned char *)e.e[l->f[i].event_arg].b)[j]);
PUTC(&l->o, ' ');
}
PUTS(&l->o, "]");
}
PUTS(&l->o, "}");
break;
}
@@ -196,3 +205,13 @@ error:
printf("%s:%d: bad format '%s'\n", __FILE__, __LINE__, format);
abort();
}
/****************************************************************************/
/* public functions */
/****************************************************************************/
void textlog_dump_buffer(logger *_this, int dump_buffer)
{
struct textlog *l = _this;
l->dump_buffer = dump_buffer;
}
+260
View File
@@ -0,0 +1,260 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "database.h"
#include "event.h"
#include "handler.h"
#include "config.h"
#include "utils.h"
#include "packet-mac-lte.h"
#define DEFAULT_IP "127.0.0.1"
#define DEFAULT_PORT 9999
typedef struct {
int socket;
struct sockaddr_in to;
OBUF buf;
/* ul */
int ul_rnti;
int ul_frame;
int ul_subframe;
int ul_data;
/* dl */
int dl_rnti;
int dl_frame;
int dl_subframe;
int dl_data;
} ev_data;
void ul(void *_d, event e)
{
ev_data *d = _d;
ssize_t ret;
int fsf;
int i;
d->buf.osize = 0;
PUTS(&d->buf, MAC_LTE_START_STRING);
PUTC(&d->buf, FDD_RADIO);
PUTC(&d->buf, DIRECTION_UPLINK);
PUTC(&d->buf, C_RNTI);
PUTC(&d->buf, MAC_LTE_RNTI_TAG);
PUTC(&d->buf, (e.e[d->ul_rnti].i>>8) & 255);
PUTC(&d->buf, e.e[d->ul_rnti].i & 255);
/* for newer version of wireshark? */
fsf = (e.e[d->ul_frame].i << 4) + e.e[d->ul_subframe].i;
/* for older version? */
fsf = e.e[d->ul_subframe].i;
PUTC(&d->buf, MAC_LTE_FRAME_SUBFRAME_TAG);
PUTC(&d->buf, (fsf>>8) & 255);
PUTC(&d->buf, fsf & 255);
PUTC(&d->buf, MAC_LTE_PAYLOAD_TAG);
for (i = 0; i < e.e[d->ul_data].bsize; i++)
PUTC(&d->buf, ((char*)e.e[d->ul_data].b)[i]);
ret = sendto(d->socket, d->buf.obuf, d->buf.osize, 0,
(struct sockaddr *)&d->to, sizeof(struct sockaddr_in));
if (ret != d->buf.osize) abort();
}
void dl(void *_d, event e)
{
ev_data *d = _d;
ssize_t ret;
int fsf;
int i;
d->buf.osize = 0;
PUTS(&d->buf, MAC_LTE_START_STRING);
PUTC(&d->buf, FDD_RADIO);
PUTC(&d->buf, DIRECTION_DOWNLINK);
PUTC(&d->buf, C_RNTI);
PUTC(&d->buf, MAC_LTE_RNTI_TAG);
PUTC(&d->buf, (e.e[d->dl_rnti].i>>8) & 255);
PUTC(&d->buf, e.e[d->dl_rnti].i & 255);
/* for newer version of wireshark? */
fsf = (e.e[d->dl_frame].i << 4) + e.e[d->dl_subframe].i;
/* for older version? */
fsf = e.e[d->dl_subframe].i;
PUTC(&d->buf, MAC_LTE_FRAME_SUBFRAME_TAG);
PUTC(&d->buf, (fsf>>8) & 255);
PUTC(&d->buf, fsf & 255);
PUTC(&d->buf, MAC_LTE_PAYLOAD_TAG);
for (i = 0; i < e.e[d->dl_data].bsize; i++)
PUTC(&d->buf, ((char*)e.e[d->dl_data].b)[i]);
ret = sendto(d->socket, d->buf.obuf, d->buf.osize, 0,
(struct sockaddr *)&d->to, sizeof(struct sockaddr_in));
if (ret != d->buf.osize) abort();
}
void setup_data(ev_data *d, void *database, int ul_id, int dl_id)
{
database_event_format f;
int i;
d->ul_rnti = -1;
d->ul_frame = -1;
d->ul_subframe = -1;
d->ul_data = -1;
d->dl_rnti = -1;
d->dl_frame = -1;
d->dl_subframe = -1;
d->dl_data = -1;
#define G(var_name, var_type, var) \
if (!strcmp(f.name[i], var_name)) { \
if (strcmp(f.type[i], var_type)) goto error; \
var = i; \
continue; \
}
/* ul: rnti, frame, subframe, data */
f = get_format(database, ul_id);
for (i = 0; i < f.count; i++) {
G("rnti", "int", d->ul_rnti);
G("frame", "int", d->ul_frame);
G("subframe", "int", d->ul_subframe);
G("data", "buffer", d->ul_data);
}
if (d->ul_rnti == -1 || d->ul_frame == -1 || d->ul_subframe == -1 ||
d->ul_data == -1) goto error;
/* dl: rnti, frame, subframe, data */
f = get_format(database, dl_id);
for (i = 0; i < f.count; i++) {
G("rnti", "int", d->dl_rnti);
G("frame", "int", d->dl_frame);
G("subframe", "int", d->dl_subframe);
G("data", "buffer", d->dl_data);
}
if (d->dl_rnti == -1 || d->dl_frame == -1 || d->dl_subframe == -1 ||
d->dl_data == -1) goto error;
#undef G
return;
error:
printf("bad T_messages.txt\n");
abort();
}
void *receiver(void *_d)
{
ev_data *d = _d;
int s;
char buf[100000];
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == -1) { perror("socket"); abort(); }
if (bind(s, (struct sockaddr *)&d->to, sizeof(struct sockaddr_in)) == -1)
{ perror("bind"); abort(); }
while (1) {
if (recv(s, buf, 100000, 0) <= 0) abort();
}
return 0;
}
void usage(void)
{
printf(
"options:\n"
" -d <database file> this option is mandatory\n"
" -in <dump file> read events from this dump file\n"
" -ip <IP address> send packets to this IP address (default %s)\n"
" -p <port> send packets to this port (default %d)\n",
DEFAULT_IP,
DEFAULT_PORT
);
exit(1);
}
int main(int n, char **v)
{
char *database_filename = NULL;
char *input_filename = NULL;
void *database;
event_handler *h;
int in;
int i;
int ul_id, dl_id;
ev_data d;
char *ip = DEFAULT_IP;
int port = DEFAULT_PORT;
memset(&d, 0, sizeof(ev_data));
for (i = 1; i < n; i++) {
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
if (!strcmp(v[i], "-d"))
{ if (i > n-2) usage(); database_filename = v[++i]; continue; }
if (!strcmp(v[i], "-in"))
{ if (i > n-2) usage(); input_filename = v[++i]; continue; }
if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; }
if (!strcmp(v[i], "-p")) {if(i>n-2)usage(); port=atoi(v[++i]); continue; }
usage();
}
if (database_filename == NULL) {
printf("ERROR: provide a database file (-d)\n");
exit(1);
}
if (input_filename == NULL) {
printf("ERROR: provide an input file (-i)\n");
exit(1);
}
in = open(input_filename, O_RDONLY);
if (in == -1) { perror(input_filename); return 1; }
database = parse_database(database_filename);
load_config_file(database_filename);
h = new_handler(database);
ul_id = event_id_from_name(database, "ENB_MAC_UE_UL_PDU_WITH_DATA");
dl_id = event_id_from_name(database, "ENB_MAC_UE_DL_PDU_WITH_DATA");
setup_data(&d, database, ul_id, dl_id);
register_handler_function(h, ul_id, ul, &d);
register_handler_function(h, dl_id, dl, &d);
d.socket = socket(AF_INET, SOCK_DGRAM, 0);
if (d.socket == -1) { perror("socket"); exit(1); }
d.to.sin_family = AF_INET;
d.to.sin_port = htons(port);
d.to.sin_addr.s_addr = inet_addr(ip);
new_thread(receiver, &d);
/* read messages */
while (1) {
char v[T_BUFFER_MAX];
event e;
e = get_event(in, v, database);
if (e.type == -1) break;
if (!(e.type == ul_id || e.type == dl_id)) continue;
handle_event(h, e);
}
return 0;
}
+586 -389
View File
@@ -3,393 +3,590 @@
*/
unsigned char openair_logo_png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x28,
0x08, 0x06, 0x00, 0x00, 0x00, 0x08, 0x78, 0x5f, 0x43, 0x00, 0x00, 0x00,
0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,
0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00,
0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18,
0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xe0, 0x05, 0x17,
0x0e, 0x30, 0x2a, 0xd1, 0xdd, 0x83, 0x5b, 0x00, 0x00, 0x11, 0xc5, 0x49,
0x44, 0x41, 0x54, 0x68, 0xde, 0xed, 0x9b, 0x79, 0x70, 0x94, 0xe7, 0x7d,
0xc7, 0x3f, 0xcf, 0xf3, 0xbe, 0xbb, 0x2b, 0xed, 0xea, 0xbe, 0xef, 0x03,
0x24, 0x10, 0x08, 0x8c, 0xb9, 0x31, 0x06, 0x73, 0xd4, 0xd8, 0x4e, 0x38,
0x62, 0x63, 0x77, 0x92, 0x90, 0xcb, 0x9d, 0x34, 0x19, 0x27, 0xce, 0xa4,
0xed, 0x8c, 0xd3, 0x78, 0xd2, 0x64, 0xd2, 0x36, 0x9d, 0x34, 0xa9, 0xdb,
0xa6, 0x99, 0xb6, 0x49, 0x67, 0x82, 0xe3, 0x24, 0x76, 0x9a, 0x34, 0x76,
0x5c, 0x1f, 0x18, 0x8f, 0x31, 0xc4, 0xc6, 0x06, 0xcc, 0x69, 0x21, 0xb0,
0x05, 0x08, 0x1d, 0x80, 0x2e, 0x74, 0xae, 0xa4, 0xbd, 0xb4, 0xbb, 0xef,
0xfb, 0x3c, 0xfd, 0x63, 0x57, 0x2b, 0xd6, 0x12, 0x58, 0x60, 0x32, 0x74,
0xb0, 0x9f, 0x99, 0x1d, 0x69, 0x9f, 0xe7, 0xf9, 0x3d, 0xd7, 0xf7, 0x77,
0x3f, 0xcf, 0x0a, 0xad, 0xb5, 0xe6, 0x43, 0x5a, 0x94, 0xd6, 0xf4, 0x07,
0xc3, 0xf8, 0xa3, 0x51, 0x3a, 0x47, 0xfc, 0xf4, 0x05, 0x82, 0x0c, 0xf8,
0x43, 0x98, 0x52, 0x50, 0xec, 0x49, 0xa5, 0x38, 0xdd, 0x4d, 0x71, 0xba,
0x87, 0x34, 0x97, 0x93, 0x74, 0x97, 0x13, 0x21, 0xc4, 0x1f, 0x7d, 0x4d,
0xe2, 0xc3, 0x0a, 0xc8, 0xde, 0xce, 0x3e, 0xde, 0xea, 0x1e, 0x60, 0x45,
0x51, 0x2e, 0x45, 0x9e, 0x14, 0x72, 0x52, 0x9c, 0xa4, 0x3b, 0x1d, 0x38,
0x0d, 0x03, 0x04, 0x44, 0x6d, 0x9b, 0x50, 0xc4, 0xc2, 0x1f, 0x8e, 0x30,
0x1c, 0x0a, 0xd1, 0xed, 0x1d, 0xa1, 0x36, 0x3f, 0x97, 0x19, 0x05, 0xb9,
0x1f, 0x01, 0x72, 0x3d, 0xcb, 0x68, 0x24, 0xca, 0x7f, 0x34, 0xb6, 0x30,
0x37, 0x27, 0x83, 0x7b, 0x67, 0x96, 0x5e, 0x15, 0x6d, 0x63, 0x47, 0x0f,
0x03, 0x23, 0x3e, 0x6e, 0x9f, 0x5d, 0x4d, 0x8a, 0xc3, 0xf1, 0x11, 0x20,
0x1f, 0xb4, 0xbc, 0x7c, 0xbe, 0x97, 0x0e, 0x9f, 0x9f, 0x7b, 0x67, 0x94,
0x51, 0xe0, 0x76, 0x5d, 0xd3, 0x18, 0xc1, 0x48, 0x84, 0x53, 0x1d, 0xdd,
0xe4, 0x78, 0xdc, 0x54, 0x17, 0x15, 0x7c, 0x04, 0xc8, 0xb5, 0x96, 0x86,
0xfe, 0x61, 0x0e, 0x5c, 0x1c, 0xe4, 0xe1, 0xf9, 0x33, 0xaf, 0xcb, 0x78,
0xa7, 0x2e, 0x74, 0x91, 0x9b, 0x91, 0x46, 0x41, 0x56, 0xe6, 0x75, 0x5d,
0xa7, 0xfc, 0x30, 0x80, 0xb1, 0xaf, 0x67, 0x90, 0x97, 0xcf, 0xf7, 0x4d,
0x0b, 0x8c, 0xd1, 0x70, 0x04, 0x7f, 0x38, 0xfa, 0xbe, 0xfd, 0xe6, 0x54,
0x94, 0xd2, 0x33, 0xe8, 0x65, 0x60, 0x78, 0xe4, 0xba, 0xae, 0xd5, 0xbc,
0xd9, 0xc1, 0x08, 0x5a, 0x36, 0xfb, 0x7b, 0x86, 0xf8, 0xd6, 0x92, 0x59,
0x97, 0xed, 0xd3, 0xe1, 0x0b, 0xf2, 0xf8, 0x89, 0xb3, 0x48, 0x65, 0x33,
0x33, 0xc3, 0x83, 0x43, 0x08, 0x46, 0x82, 0x21, 0xd2, 0x1d, 0x06, 0x1b,
0xea, 0x66, 0x90, 0xeb, 0x71, 0x4f, 0x49, 0xb7, 0x60, 0x66, 0x15, 0x0d,
0x67, 0x5a, 0xc8, 0xf0, 0xb8, 0x71, 0x5e, 0x27, 0x9b, 0x72, 0xd3, 0xab,
0xac, 0x7f, 0x6a, 0x38, 0xcb, 0xa6, 0xaa, 0x22, 0xe6, 0x66, 0xa7, 0x4f,
0x6a, 0x3b, 0x37, 0x1a, 0x64, 0xe7, 0xb9, 0x6e, 0xb2, 0x9d, 0x0e, 0xb6,
0xd6, 0x96, 0xe3, 0x32, 0x92, 0x15, 0x86, 0x65, 0x2b, 0x1a, 0x3b, 0xba,
0x51, 0xb6, 0xa2, 0xb6, 0x28, 0x8f, 0xac, 0x29, 0x80, 0x09, 0x85, 0xc3,
0xf4, 0x0d, 0x0e, 0x53, 0x59, 0x52, 0xf8, 0x91, 0x84, 0xbc, 0x5f, 0x79,
0x77, 0xc8, 0x87, 0x37, 0x6c, 0x4d, 0x09, 0x46, 0x87, 0x2f, 0xc4, 0x4f,
0xdf, 0x69, 0xe3, 0x6f, 0x97, 0xcd, 0x21, 0xd5, 0x34, 0xa6, 0x3e, 0x1c,
0x43, 0xb2, 0xb8, 0xaa, 0x8c, 0xa8, 0x6d, 0xd3, 0xd8, 0x7a, 0x9e, 0xb9,
0x95, 0xa5, 0xb8, 0x5d, 0xc9, 0xce, 0x40, 0xaa, 0xcb, 0xc5, 0xa8, 0xdf,
0x8f, 0x52, 0xf9, 0x48, 0x79, 0x1d, 0x2c, 0x80, 0xbe, 0x89, 0xcb, 0x5f,
0xee, 0x3b, 0xa9, 0xb5, 0x9a, 0x5c, 0xdf, 0x1f, 0x0a, 0xeb, 0x07, 0x77,
0x1f, 0x9b, 0x54, 0xef, 0x1d, 0x0b, 0xeb, 0xd6, 0xa1, 0x11, 0x7d, 0xde,
0x3b, 0xaa, 0xfd, 0xe1, 0x48, 0x52, 0x9b, 0xd2, 0x4a, 0xbf, 0x71, 0xfc,
0x1d, 0x1d, 0x89, 0x46, 0x27, 0xd1, 0x05, 0x82, 0x21, 0x7d, 0xa6, 0xa5,
0xed, 0xba, 0xac, 0xf9, 0xa6, 0x95, 0x90, 0xd1, 0x88, 0x45, 0x65, 0x7a,
0x2a, 0x4c, 0x11, 0x5c, 0x3f, 0xdd, 0xd2, 0xc5, 0xbf, 0xae, 0x9a, 0x9f,
0x54, 0xf7, 0xc3, 0xa3, 0xa7, 0x29, 0x48, 0x71, 0xb0, 0xa2, 0x30, 0x07,
0x5b, 0xc0, 0xa1, 0xf6, 0x0e, 0xa4, 0xb2, 0x59, 0x3b, 0xa7, 0x36, 0xa6,
0xdb, 0x11, 0xac, 0x9c, 0x3f, 0x87, 0xd3, 0xed, 0xe7, 0xa9, 0x9f, 0x59,
0x9d, 0x44, 0xeb, 0x4e, 0x4d, 0x21, 0x1c, 0x8d, 0x60, 0xdb, 0x0a, 0xc3,
0x90, 0xfc, 0x67, 0x63, 0x1b, 0xbf, 0x69, 0xef, 0x27, 0x64, 0xab, 0xd8,
0xf4, 0xd2, 0x60, 0xd7, 0xc7, 0x17, 0x91, 0xe3, 0x8a, 0x1d, 0xf7, 0xe3,
0xef, 0x9c, 0xe3, 0x17, 0x67, 0x7b, 0xc9, 0x4e, 0x75, 0xf1, 0xcd, 0x85,
0xd5, 0xdc, 0x5e, 0x98, 0x79, 0xf3, 0xab, 0xac, 0xe1, 0x48, 0x74, 0x4a,
0x55, 0x15, 0xb2, 0x6d, 0xbc, 0x91, 0x28, 0xd9, 0xae, 0x09, 0x23, 0xfc,
0x58, 0x43, 0x33, 0x9b, 0x67, 0x94, 0x32, 0x37, 0x67, 0xa2, 0x7f, 0x6d,
0x5e, 0x36, 0x43, 0xfe, 0x20, 0x0d, 0x2d, 0xed, 0x2c, 0xac, 0x89, 0x01,
0x60, 0x48, 0x49, 0xa6, 0xc7, 0x43, 0x24, 0x1a, 0x9d, 0x64, 0xc4, 0x0b,
0x72, 0x73, 0x09, 0x04, 0x83, 0x64, 0xa4, 0xa7, 0xd1, 0x36, 0x1a, 0xa4,
0x69, 0x38, 0xcc, 0x33, 0x1b, 0xea, 0x09, 0x5a, 0x0a, 0x1b, 0xf0, 0x98,
0x12, 0xb4, 0x66, 0xcb, 0x8b, 0x87, 0x79, 0x7b, 0x34, 0xc2, 0xf7, 0x97,
0xd5, 0xd0, 0x33, 0xea, 0xe7, 0xae, 0x17, 0x8e, 0xf0, 0xe4, 0x5d, 0x8b,
0xd8, 0x5a, 0x99, 0x73, 0x73, 0x03, 0x32, 0x12, 0x89, 0x92, 0xee, 0x9c,
0xbc, 0xbd, 0x5f, 0x9e, 0xee, 0x60, 0x55, 0xf1, 0x44, 0xfa, 0xe3, 0xdf,
0x1a, 0x5b, 0x59, 0x92, 0x9f, 0x93, 0x04, 0xc6, 0x78, 0xc9, 0x49, 0x73,
0x13, 0xcc, 0x48, 0xa7, 0x7f, 0xc8, 0x4b, 0x7e, 0x4e, 0x36, 0x00, 0x69,
0xee, 0x54, 0x02, 0x81, 0x20, 0xce, 0xf7, 0xc4, 0x1f, 0x99, 0xe9, 0xe9,
0xf8, 0xfc, 0x7e, 0x74, 0x9a, 0x07, 0x7f, 0xd4, 0x26, 0xc3, 0x65, 0x72,
0xbc, 0x6f, 0x04, 0xbf, 0xd2, 0x3c, 0x30, 0xa3, 0x18, 0x97, 0x21, 0x19,
0x0c, 0x8e, 0x71, 0xc6, 0x1f, 0x66, 0x43, 0x65, 0x11, 0x9f, 0x9f, 0x55,
0x0c, 0xc0, 0x17, 0xeb, 0x2b, 0x89, 0xe8, 0x0f, 0x41, 0x1c, 0xd2, 0x13,
0x1c, 0x23, 0x63, 0x0a, 0x57, 0xf4, 0xe5, 0x0b, 0xbd, 0xdc, 0x56, 0x18,
0xe3, 0x46, 0x0d, 0x1c, 0xe9, 0x1f, 0x66, 0x5d, 0x59, 0x5e, 0xcc, 0xab,
0xd2, 0x9a, 0xed, 0xa7, 0x3a, 0xd9, 0x7e, 0xaa, 0x13, 0x3b, 0xee, 0x7c,
0x96, 0x15, 0xe4, 0xd1, 0x76, 0xa1, 0x73, 0xc2, 0x88, 0xa7, 0xb8, 0x18,
0x1e, 0xf5, 0x4d, 0x0e, 0xe8, 0x0c, 0x09, 0x08, 0x34, 0x10, 0x88, 0x5a,
0x78, 0x43, 0x21, 0x5e, 0xec, 0x18, 0x62, 0x5f, 0xe7, 0x20, 0x8b, 0x9f,
0x39, 0xc0, 0x6f, 0xdb, 0x07, 0x70, 0x4a, 0x81, 0x00, 0x0c, 0x21, 0xe8,
0x1d, 0xf1, 0xb1, 0xf8, 0x99, 0xb7, 0xd8, 0xb8, 0xf3, 0x18, 0x47, 0x07,
0xfc, 0x37, 0x3f, 0x20, 0x1e, 0xc3, 0x24, 0xcb, 0x35, 0x19, 0x90, 0xd9,
0x59, 0x69, 0x38, 0xa4, 0x48, 0xe4, 0xb5, 0xee, 0xad, 0x2e, 0x4e, 0xb4,
0xf5, 0x06, 0x23, 0xbc, 0x70, 0xae, 0x8f, 0x1d, 0xe7, 0xfb, 0x39, 0xed,
0x0d, 0x24, 0xea, 0x73, 0x33, 0x33, 0x12, 0xff, 0x3b, 0x4c, 0x13, 0xa7,
0x39, 0x59, 0xf2, 0xa4, 0x90, 0x38, 0x1c, 0x26, 0x42, 0x08, 0xfe, 0xe2,
0xd6, 0x99, 0xfc, 0x6e, 0xc3, 0xad, 0xbc, 0xb6, 0x65, 0x09, 0xbb, 0x3e,
0xb1, 0x8c, 0xfb, 0xcb, 0xb3, 0xf8, 0x61, 0xc3, 0xb9, 0x84, 0x37, 0x27,
0x80, 0x5c, 0x4f, 0x2a, 0xdf, 0x5e, 0x3c, 0x83, 0x40, 0x34, 0xca, 0xf6,
0xa6, 0xee, 0x9b, 0xdf, 0x86, 0xdc, 0x5e, 0x9c, 0x33, 0x75, 0x5c, 0x72,
0x5b, 0xfd, 0x84, 0x9a, 0x71, 0x3a, 0xf8, 0xd3, 0x99, 0x25, 0x89, 0xef,
0xa5, 0x1e, 0x17, 0x2f, 0x7c, 0x6c, 0xd1, 0x24, 0x9a, 0x9a, 0xea, 0xca,
0x89, 0x83, 0x97, 0x92, 0xd2, 0x92, 0xa2, 0xc9, 0x2e, 0xb2, 0x69, 0x90,
0x95, 0x99, 0x81, 0xd2, 0x9a, 0x1d, 0x6d, 0x17, 0x39, 0xe8, 0x0d, 0xb1,
0xa1, 0x2c, 0x17, 0x8d, 0x26, 0x60, 0xd9, 0xb8, 0x1d, 0x4e, 0x24, 0x60,
0x4a, 0xc1, 0xc5, 0xe0, 0x18, 0xd2, 0x30, 0x59, 0x5d, 0x94, 0x85, 0x29,
0x48, 0x30, 0xc8, 0xa4, 0xc0, 0x30, 0x14, 0x0a, 0xd2, 0xd1, 0xd1, 0x85,
0xdf, 0xef, 0xc7, 0x30, 0x0c, 0x72, 0x73, 0x73, 0x28, 0x2b, 0x2b, 0x9b,
0x34, 0x79, 0x67, 0x67, 0x27, 0x7d, 0x7d, 0x7d, 0xc9, 0x11, 0xa6, 0x10,
0xa4, 0xa5, 0xa5, 0x51, 0x56, 0x56, 0x4e, 0x6a, 0x6a, 0xca, 0x24, 0x9a,
0xf6, 0xf6, 0x76, 0xbc, 0x5e, 0xef, 0x94, 0x87, 0xa4, 0x94, 0xa2, 0xb8,
0xb8, 0x98, 0xd2, 0xd2, 0x58, 0xf6, 0xb5, 0xbf, 0xbf, 0x9f, 0x8e, 0x8e,
0x0e, 0x4a, 0x4b, 0x4b, 0x29, 0x2c, 0x2c, 0xbc, 0xd4, 0x45, 0xa7, 0xb9,
0xb9, 0x99, 0x40, 0x20, 0x80, 0xd3, 0xe9, 0xa4, 0xbe, 0xbe, 0xfe, 0xaa,
0xee, 0x28, 0x0e, 0x5c, 0x1c, 0xe6, 0xf8, 0xa0, 0x8f, 0x95, 0x85, 0x59,
0xdc, 0x9a, 0x37, 0xd9, 0x66, 0x74, 0x07, 0xc2, 0x3c, 0xdd, 0x7a, 0x11,
0x29, 0x04, 0x1b, 0xca, 0x73, 0xa9, 0xcb, 0xf2, 0x4c, 0xd0, 0x0d, 0x8c,
0xa2, 0x92, 0x24, 0x42, 0x50, 0x90, 0xe2, 0x64, 0x79, 0x61, 0x26, 0xe5,
0x69, 0xc9, 0xfb, 0x7d, 0x77, 0x60, 0x84, 0x47, 0xde, 0x3a, 0xc3, 0xbb,
0xc3, 0x21, 0x9c, 0x02, 0x8a, 0xd3, 0xdd, 0xfc, 0xe4, 0x8e, 0x7a, 0xe6,
0x67, 0xbb, 0xd9, 0xd1, 0xda, 0xc3, 0x3f, 0x34, 0xb4, 0x33, 0x10, 0xb6,
0x89, 0xda, 0x36, 0x17, 0x02, 0x63, 0x6c, 0xa8, 0x28, 0x61, 0xd7, 0xc6,
0x5b, 0x92, 0x25, 0xe4, 0xb5, 0xd7, 0x5e, 0xa7, 0xb1, 0xb1, 0x71, 0xd2,
0x22, 0x0d, 0xc3, 0x60, 0xf3, 0xe6, 0x4d, 0x54, 0x55, 0x55, 0x01, 0xd0,
0xd2, 0xd2, 0xca, 0x73, 0xcf, 0x3d, 0x87, 0x69, 0x5e, 0x5e, 0xb8, 0xe6,
0xcd, 0x9b, 0xc7, 0x9d, 0x77, 0xfe, 0x49, 0xe2, 0xfb, 0xd1, 0xa3, 0x47,
0xd9, 0xbb, 0xf7, 0x0d, 0x0c, 0x63, 0xea, 0x00, 0xcc, 0xb6, 0x6d, 0x56,
0xac, 0x58, 0x4e, 0x69, 0x69, 0x29, 0xd1, 0x68, 0x94, 0x27, 0x9e, 0xf8,
0x05, 0x4e, 0xa7, 0x13, 0x87, 0xc3, 0xc1, 0xb6, 0x6d, 0x9f, 0x26, 0x3b,
0x3b, 0x3b, 0x01, 0xdc, 0xf1, 0xe3, 0x8d, 0xf4, 0xf4, 0xf4, 0x90, 0x99,
0x99, 0x49, 0x7d, 0x7d, 0xfd, 0xb4, 0xc1, 0xd8, 0xdb, 0x33, 0xc4, 0xdd,
0x3b, 0x8e, 0xe1, 0x36, 0x0d, 0xa2, 0x4a, 0x73, 0xf4, 0xfe, 0x15, 0xcc,
0x8e, 0x1f, 0xf8, 0x78, 0x39, 0xef, 0x0f, 0xf1, 0xe8, 0xa1, 0xb3, 0xb8,
0x0c, 0x41, 0x5e, 0x8a, 0x83, 0xba, 0x2c, 0x0f, 0xbb, 0x3b, 0x07, 0xf9,
0xe4, 0xee, 0x46, 0xa6, 0xca, 0x67, 0x8c, 0xb3, 0xc2, 0x7d, 0xd5, 0x85,
0x6c, 0x5f, 0x3b, 0xb1, 0x96, 0xfa, 0xbc, 0x4c, 0x76, 0x6e, 0x5e, 0xc6,
0x38, 0xaf, 0x0b, 0x21, 0x12, 0x7d, 0x37, 0xcd, 0x2c, 0x66, 0xe3, 0x8c,
0x62, 0x34, 0xfa, 0x92, 0x71, 0x26, 0x98, 0xca, 0xb4, 0x6d, 0x9b, 0x17,
0x5e, 0x78, 0x91, 0xd6, 0xd6, 0x56, 0x84, 0x10, 0x54, 0x54, 0x94, 0x53,
0x54, 0x54, 0x44, 0x24, 0x12, 0xa5, 0xad, 0xad, 0x8d, 0x40, 0x20, 0xc0,
0xef, 0x7f, 0xff, 0x2c, 0x5b, 0xb7, 0xde, 0x47, 0x75, 0x75, 0x35, 0x3e,
0x9f, 0x0f, 0x21, 0x04, 0x4a, 0x29, 0x66, 0xcc, 0x98, 0x41, 0x41, 0x41,
0x01, 0x5a, 0x2b, 0x6c, 0x5b, 0xd1, 0xd3, 0xd3, 0x43, 0x57, 0x57, 0x17,
0x8d, 0x8d, 0x8d, 0x8c, 0x8e, 0xfa, 0xb8, 0xf7, 0xde, 0x2d, 0x48, 0x29,
0xf1, 0x7a, 0x87, 0x13, 0x34, 0x75, 0x75, 0x75, 0x64, 0x65, 0x65, 0x72,
0x69, 0xc6, 0x46, 0x29, 0x4d, 0x69, 0x69, 0x4c, 0x12, 0xfd, 0x7e, 0x7f,
0xa2, 0x2d, 0x1c, 0x0e, 0xb3, 0x67, 0xcf, 0x6b, 0x3c, 0xf0, 0xc0, 0xd6,
0x0f, 0xac, 0xc2, 0xbe, 0xf6, 0xe6, 0x69, 0x52, 0xe2, 0xa9, 0x11, 0x01,
0xfc, 0xd5, 0xfe, 0x33, 0xec, 0xdc, 0x98, 0xac, 0x9e, 0xf4, 0x7b, 0xfe,
0x02, 0x0c, 0x86, 0xa3, 0x68, 0x1d, 0x33, 0xf8, 0x6b, 0x8b, 0x73, 0x58,
0x51, 0x98, 0x89, 0xa5, 0x35, 0x96, 0xd2, 0x9c, 0x1c, 0xf2, 0xb1, 0xab,
0x63, 0x90, 0xff, 0x6e, 0xe9, 0xe1, 0x1d, 0xaf, 0x8f, 0x5d, 0x1b, 0x97,
0x90, 0x11, 0xf7, 0xec, 0x44, 0x1c, 0x88, 0x29, 0xf3, 0x55, 0x22, 0x19,
0x84, 0x24, 0xd5, 0x37, 0x3a, 0x3a, 0x4a, 0x47, 0x47, 0x07, 0x86, 0x61,
0x24, 0x38, 0x7b, 0x7c, 0xa0, 0x45, 0x8b, 0x16, 0xf2, 0xd4, 0x53, 0xbf,
0x46, 0x6b, 0xcd, 0xab, 0xaf, 0xee, 0xe6, 0xcb, 0x5f, 0xfe, 0x52, 0xa2,
0x4d, 0x29, 0x45, 0x4d, 0xcd, 0x4c, 0xe6, 0xcd, 0x9b, 0x97, 0xc4, 0xe9,
0x3b, 0x77, 0xbe, 0x4c, 0x6b, 0x6b, 0x2b, 0xed, 0xed, 0xed, 0x84, 0xc3,
0x61, 0x52, 0x53, 0x53, 0x13, 0x34, 0xb6, 0x6d, 0x53, 0x5f, 0x3f, 0x97,
0xca, 0xca, 0xca, 0xcb, 0x27, 0xd7, 0x2e, 0xd9, 0x84, 0x94, 0x92, 0xf3,
0xe7, 0xcf, 0x71, 0xe2, 0xc4, 0x49, 0x6e, 0xb9, 0x65, 0xfe, 0x35, 0x83,
0xb1, 0xb7, 0xdb, 0xcb, 0x05, 0x7f, 0x08, 0x43, 0x08, 0x6c, 0xad, 0x31,
0xa5, 0xe0, 0x8d, 0x8b, 0x5e, 0xce, 0x8e, 0x04, 0xa9, 0xcd, 0x74, 0x5f,
0x39, 0xd9, 0x17, 0x3f, 0x38, 0x4b, 0x69, 0xee, 0x2c, 0xcb, 0xe1, 0xeb,
0xf3, 0x93, 0xd7, 0xfe, 0x9d, 0xc3, 0x67, 0xf9, 0xf1, 0xc9, 0x0b, 0x9c,
0x1d, 0x0e, 0x72, 0xa0, 0x77, 0x98, 0x7b, 0xca, 0xf3, 0x3e, 0x58, 0xfa,
0x5d, 0x29, 0x85, 0x6d, 0xdb, 0x00, 0x14, 0x16, 0x16, 0x24, 0x1d, 0x48,
0x76, 0x76, 0x36, 0x5a, 0x6b, 0x84, 0x10, 0x04, 0x83, 0xc1, 0xe9, 0xa4,
0x61, 0x88, 0x46, 0x63, 0xa9, 0xeb, 0x71, 0x8f, 0x63, 0x2a, 0xee, 0xb8,
0x9a, 0x62, 0x18, 0x06, 0xfb, 0xf7, 0xef, 0x23, 0x18, 0x0c, 0x5d, 0x5b,
0x6a, 0x08, 0x78, 0xaa, 0xb9, 0x1b, 0x43, 0x08, 0x94, 0xd6, 0x3c, 0xb2,
0xa0, 0x8a, 0x90, 0x65, 0xe3, 0x90, 0x82, 0xff, 0x6a, 0xba, 0xf0, 0x81,
0x25, 0x2f, 0x60, 0xd9, 0x89, 0x7d, 0xa5, 0x1a, 0x1f, 0xdc, 0x69, 0x35,
0x93, 0x8d, 0xab, 0x9e, 0x16, 0xe7, 0x4e, 0x78, 0x16, 0x31, 0xf2, 0xa1,
0xa1, 0x21, 0x4e, 0x9d, 0x3a, 0x4d, 0x53, 0x53, 0x13, 0x81, 0x40, 0x80,
0x68, 0x34, 0xca, 0xaa, 0x55, 0xb7, 0x93, 0x92, 0x92, 0x32, 0x69, 0x0c,
0x9f, 0x2f, 0xc0, 0xe8, 0xe8, 0x08, 0x4a, 0x69, 0xb4, 0x56, 0x64, 0x66,
0x66, 0x5d, 0x36, 0x29, 0xe7, 0x74, 0x3a, 0xb1, 0x2c, 0x8b, 0xb1, 0xb1,
0x30, 0x47, 0x8e, 0x1c, 0x61, 0xcd, 0x9a, 0x3b, 0xae, 0xfe, 0xc0, 0xa2,
0x36, 0x7b, 0xba, 0x06, 0x01, 0x58, 0x55, 0x9c, 0xcd, 0xb7, 0x17, 0xcd,
0xe4, 0x7f, 0xdb, 0xfb, 0x38, 0xe7, 0x0b, 0xf1, 0x87, 0xae, 0x21, 0x7c,
0x51, 0x8b, 0x74, 0xc7, 0xd5, 0x3b, 0x9b, 0xaf, 0x74, 0x0c, 0xf0, 0xfd,
0xb7, 0xdb, 0x38, 0x39, 0xe4, 0xc7, 0xd2, 0x9a, 0xf5, 0x45, 0x39, 0xac,
0x29, 0xc9, 0xb9, 0x71, 0xd9, 0x5e, 0xd3, 0x34, 0xd9, 0xbd, 0x7b, 0x0f,
0xcf, 0x3f, 0xff, 0x02, 0x5a, 0x6b, 0xa4, 0x94, 0x78, 0x3c, 0x1e, 0x0a,
0x0b, 0x0b, 0x58, 0xb1, 0xe2, 0x36, 0xaa, 0xab, 0xab, 0xa6, 0xa4, 0x79,
0xe9, 0xa5, 0x9d, 0xd8, 0xb6, 0x8d, 0x10, 0x82, 0x50, 0x28, 0xc4, 0x37,
0xbe, 0xf1, 0x08, 0x69, 0x69, 0x9e, 0x29, 0xe7, 0x28, 0x2c, 0x2c, 0xc4,
0xb2, 0xa2, 0xf4, 0xf4, 0x5c, 0xe4, 0xd0, 0xa1, 0x43, 0xd4, 0xd6, 0xd6,
0x5c, 0x75, 0x46, 0xf5, 0x77, 0x2d, 0x17, 0xe9, 0x0e, 0x86, 0xf1, 0x98,
0x06, 0x5b, 0xab, 0x0b, 0x11, 0x02, 0x3e, 0x5b, 0x5b, 0xc2, 0x3f, 0xbc,
0xdd, 0xca, 0x69, 0x6f, 0x90, 0xe3, 0x03, 0x3e, 0x56, 0x17, 0x67, 0x4f,
0xef, 0xae, 0x02, 0xc1, 0x33, 0x6d, 0xbd, 0x3c, 0xfc, 0x66, 0x13, 0xde,
0xb0, 0x85, 0x43, 0x0a, 0x72, 0x53, 0x1c, 0x7c, 0x69, 0x4e, 0x19, 0x3f,
0x5c, 0x31, 0xeb, 0xc6, 0xa7, 0xdf, 0x23, 0x91, 0x08, 0x85, 0x85, 0x05,
0x14, 0x17, 0x17, 0x53, 0x55, 0x55, 0x4d, 0x7e, 0x7e, 0x1e, 0x59, 0x59,
0x97, 0xe7, 0x78, 0xa5, 0x14, 0x95, 0x95, 0xe5, 0xa4, 0xa6, 0xba, 0x01,
0x4d, 0x24, 0x12, 0xc1, 0x71, 0x05, 0xee, 0x34, 0x4d, 0x93, 0x75, 0xeb,
0xd6, 0xf2, 0xb3, 0x9f, 0x6d, 0xc7, 0xe5, 0x72, 0xb1, 0x63, 0xc7, 0x0e,
0xdc, 0x6e, 0xcf, 0x55, 0xad, 0xf1, 0x9b, 0x87, 0x9a, 0x71, 0x9b, 0x06,
0x52, 0x08, 0xb6, 0xd5, 0xc6, 0x82, 0xc0, 0xad, 0x33, 0x0a, 0x78, 0xac,
0xb1, 0x1d, 0x5b, 0x6b, 0xfe, 0xe6, 0xf0, 0x59, 0xde, 0xf8, 0xc4, 0xb2,
0x69, 0x8d, 0xe5, 0x34, 0x04, 0x0f, 0xbd, 0xd1, 0x84, 0xad, 0x35, 0x45,
0x6e, 0x27, 0xdf, 0x5b, 0x5a, 0xcb, 0x1d, 0x25, 0xd9, 0x54, 0xa7, 0xa7,
0x5e, 0xb7, 0xf8, 0xc9, 0xbc, 0x56, 0xfd, 0x6e, 0x59, 0x16, 0x9b, 0x36,
0x6d, 0xa4, 0xae, 0xae, 0x6e, 0xda, 0x34, 0xb6, 0x6d, 0xb3, 0x72, 0xe5,
0x4a, 0xca, 0xcb, 0xcb, 0xa7, 0x7b, 0x35, 0x40, 0x4e, 0x4e, 0x0e, 0xb7,
0xdf, 0xbe, 0x92, 0xc3, 0x87, 0x8f, 0x10, 0x0c, 0x86, 0x08, 0x04, 0x82,
0xd3, 0x8e, 0x3d, 0x9e, 0x38, 0xdd, 0xc5, 0x98, 0xad, 0x30, 0xa5, 0xc0,
0xed, 0x30, 0x78, 0x68, 0x6f, 0x13, 0x11, 0x15, 0xfb, 0x6e, 0x6b, 0x8d,
0x21, 0x04, 0x07, 0xfb, 0x46, 0x38, 0xd2, 0x37, 0xc2, 0xd2, 0x82, 0xf7,
0xbf, 0x1b, 0xb7, 0x94, 0xe6, 0xcf, 0xea, 0x4a, 0xf8, 0x59, 0x53, 0x17,
0xde, 0x70, 0x94, 0x53, 0x5e, 0x3f, 0x5f, 0x98, 0x5d, 0x72, 0x5d, 0x03,
0xda, 0xf7, 0x95, 0xff, 0xf1, 0xcd, 0x4f, 0x75, 0xb1, 0x68, 0x59, 0xd6,
0x55, 0x4f, 0xa8, 0x94, 0xba, 0x6a, 0x9a, 0x65, 0xcb, 0x96, 0x91, 0x99,
0x99, 0x79, 0x59, 0x5b, 0x36, 0xa5, 0xf4, 0x2a, 0xc5, 0x6f, 0x5b, 0x2f,
0xe2, 0x90, 0x02, 0x4b, 0x69, 0x2e, 0x8c, 0x86, 0xf8, 0xe5, 0xe9, 0x4e,
0x7e, 0xd3, 0xdc, 0xcd, 0x93, 0xa7, 0xbb, 0xe8, 0x0f, 0x45, 0xb0, 0xb5,
0xc6, 0x63, 0x1a, 0x7c, 0xbf, 0xa1, 0x6d, 0x7a, 0x0c, 0xa5, 0x35, 0x8f,
0xad, 0x98, 0xcd, 0x9a, 0x92, 0x6c, 0x94, 0x86, 0x1f, 0x9f, 0xbc, 0xc0,
0xd7, 0xf6, 0x9d, 0xba, 0xae, 0x80, 0x98, 0x2e, 0x97, 0x0b, 0xb7, 0xdb,
0x4d, 0x28, 0x14, 0x62, 0xff, 0xfe, 0xfd, 0x54, 0x54, 0x54, 0x90, 0x91,
0x91, 0x81, 0x52, 0x8a, 0x86, 0x86, 0x06, 0x94, 0x52, 0x28, 0xa5, 0xa8,
0xad, 0xad, 0xbd, 0x2e, 0x13, 0xda, 0xb6, 0x9d, 0x18, 0x33, 0x89, 0x33,
0xa4, 0xbc, 0xa2, 0x71, 0x5f, 0xbe, 0x7c, 0x39, 0xbb, 0x76, 0xed, 0x9a,
0xb6, 0x0d, 0xe9, 0x0a, 0x84, 0x69, 0x18, 0x18, 0x45, 0x03, 0x1f, 0xab,
0xc8, 0xe3, 0x89, 0x75, 0xf3, 0xb0, 0x2f, 0xe1, 0x29, 0xa7, 0x14, 0xdc,
0xf3, 0xd2, 0x31, 0x1a, 0x07, 0x7d, 0x34, 0x0e, 0xf8, 0xe8, 0x0c, 0x8c,
0x31, 0x5d, 0x05, 0xf1, 0xfc, 0x3d, 0x0b, 0xb9, 0xfb, 0xa5, 0x63, 0x1c,
0xee, 0x1d, 0xe1, 0xc9, 0xe6, 0x6e, 0x66, 0x65, 0x7a, 0xf8, 0xfa, 0xfc,
0x8a, 0xeb, 0x03, 0x48, 0x5a, 0x5a, 0x1a, 0x6b, 0xd6, 0xac, 0x61, 0xd7,
0xae, 0x5d, 0x04, 0x83, 0x21, 0xb6, 0x6f, 0x7f, 0x9c, 0x9c, 0x9c, 0x1c,
0xa2, 0xd1, 0x28, 0x3e, 0x5f, 0x2c, 0xab, 0x59, 0x5a, 0x5a, 0xc2, 0x86,
0x0d, 0x77, 0x5e, 0xf3, 0x24, 0x4a, 0x29, 0xb4, 0xd6, 0x98, 0xa6, 0xc9,
0x9e, 0x3d, 0x7f, 0x98, 0x14, 0xe5, 0xdb, 0xb6, 0xcd, 0xad, 0xb7, 0x2e,
0x60, 0xc9, 0x92, 0x25, 0x57, 0x88, 0xfe, 0xeb, 0x69, 0x69, 0x69, 0xa5,
0xa5, 0xe5, 0x2c, 0xa6, 0x69, 0xbe, 0xaf, 0xa4, 0xfd, 0xe2, 0x74, 0x17,
0xc1, 0xa8, 0x4d, 0x8a, 0x69, 0xf0, 0x99, 0xda, 0x62, 0x3c, 0x53, 0x5c,
0xd3, 0x7e, 0xb1, 0xae, 0x94, 0xaf, 0xef, 0x3b, 0x4d, 0xdf, 0x58, 0x84,
0xd7, 0xbb, 0xbc, 0xcc, 0xca, 0x72, 0x27, 0x45, 0xe0, 0x57, 0x04, 0xe5,
0xee, 0x85, 0xdc, 0xb3, 0xf3, 0x18, 0x6f, 0xf7, 0x8f, 0xf2, 0xd7, 0x07,
0xcf, 0x20, 0x05, 0x7c, 0x6d, 0x5e, 0xc5, 0xf5, 0x51, 0x59, 0x75, 0x75,
0xb3, 0xf9, 0xea, 0x57, 0x1f, 0x62, 0xe9, 0xd2, 0x25, 0xa4, 0xa4, 0xa4,
0x30, 0x32, 0x32, 0x42, 0x30, 0x18, 0xa4, 0x20, 0xbf, 0x80, 0xcd, 0x9b,
0x37, 0xb3, 0x6d, 0xdb, 0xb6, 0x84, 0x0b, 0xab, 0xb5, 0x4e, 0xfa, 0x4c,
0xa7, 0xac, 0x5e, 0xbd, 0x8a, 0xf4, 0xf4, 0x74, 0xb4, 0xd6, 0xf8, 0xfd,
0x7e, 0x86, 0x87, 0x87, 0x27, 0x7d, 0xc6, 0x42, 0xa1, 0xf8, 0xf8, 0x5c,
0x76, 0xfc, 0x4d, 0x9b, 0x3e, 0x4e, 0x41, 0x41, 0x21, 0x4a, 0x69, 0xe6,
0xce, 0x9d, 0x73, 0x45, 0xf5, 0xf5, 0x83, 0x86, 0x76, 0x4c, 0x29, 0x71,
0x9b, 0x92, 0x75, 0xa5, 0x53, 0xbb, 0xa3, 0xab, 0x8b, 0xb3, 0xc9, 0x70,
0x9a, 0x18, 0x42, 0xf2, 0xdd, 0xa3, 0x2d, 0xa4, 0x1a, 0x12, 0xa5, 0x35,
0x4a, 0x5f, 0x1a, 0xb5, 0x6b, 0xb4, 0x26, 0xa9, 0x0e, 0x20, 0xc5, 0x94,
0xbc, 0xbe, 0x65, 0x29, 0x15, 0x69, 0x29, 0xb8, 0xa4, 0xc1, 0x77, 0x8e,
0xb4, 0xf0, 0x54, 0x73, 0xf7, 0x07, 0x06, 0x44, 0x04, 0x7c, 0x83, 0xda,
0xb6, 0x2d, 0x94, 0xb6, 0x30, 0xe2, 0x1b, 0x0c, 0xf8, 0x7d, 0x18, 0x12,
0x4c, 0xd3, 0x41, 0x24, 0x12, 0xc6, 0xb2, 0x22, 0x68, 0xad, 0xd0, 0x4a,
0x13, 0xb5, 0xa2, 0xd8, 0xd1, 0x28, 0x5a, 0xdb, 0x48, 0x19, 0x7b, 0x07,
0x8b, 0x56, 0x09, 0x29, 0x40, 0xab, 0x58, 0xdf, 0xd8, 0xc9, 0xc6, 0x0f,
0x55, 0xe3, 0x30, 0x4d, 0x82, 0xa1, 0x20, 0xca, 0xb6, 0xe3, 0xdb, 0x14,
0xb1, 0xbf, 0xf1, 0x76, 0x29, 0x24, 0x86, 0x61, 0xa0, 0xb4, 0xc6, 0x8a,
0x07, 0x97, 0x42, 0x08, 0x4c, 0xc3, 0x84, 0xf1, 0xb4, 0x9e, 0x10, 0x18,
0x86, 0x41, 0x34, 0x12, 0xa1, 0x7c, 0xc6, 0x2d, 0xe4, 0x16, 0x4f, 0xed,
0x6a, 0xaa, 0x78, 0xaa, 0xc3, 0x52, 0x0a, 0x43, 0x88, 0x49, 0xaf, 0x49,
0xde, 0x6b, 0x17, 0xb4, 0x86, 0x90, 0xad, 0x48, 0x77, 0x18, 0x58, 0xf1,
0x58, 0xcc, 0x8c, 0x67, 0x60, 0xc7, 0x01, 0xba, 0xb4, 0x6e, 0x2a, 0x63,
0xaf, 0xb4, 0x66, 0xcc, 0x56, 0x89, 0xd4, 0xc9, 0x35, 0xab, 0x2c, 0xad,
0x35, 0x1a, 0x85, 0x56, 0x8a, 0xa8, 0x6d, 0x61, 0x2b, 0x1b, 0x69, 0x08,
0x94, 0x6d, 0x13, 0x0a, 0x85, 0xd0, 0xda, 0x46, 0x29, 0x3b, 0x01, 0x88,
0x40, 0x23, 0x24, 0x08, 0x25, 0x50, 0xda, 0x42, 0xdb, 0x3a, 0x0e, 0x88,
0x1d, 0xe7, 0x6a, 0x95, 0x00, 0x05, 0x0d, 0x4a, 0x2b, 0x34, 0x60, 0x45,
0x42, 0x71, 0x90, 0x6c, 0x40, 0xa1, 0x11, 0x08, 0x4d, 0xec, 0xb0, 0x75,
0x6c, 0xe3, 0xb6, 0x15, 0x0b, 0xad, 0xa5, 0x14, 0x38, 0xa4, 0x40, 0x6b,
0x8d, 0x1d, 0x89, 0xa0, 0xb1, 0x27, 0x0e, 0x30, 0xae, 0x54, 0x0c, 0xe3,
0xf2, 0xef, 0xa0, 0x9a, 0x87, 0x03, 0xbc, 0xd5, 0x3b, 0xcc, 0x67, 0x67,
0x95, 0xd0, 0x19, 0x18, 0x23, 0x64, 0xd9, 0xcc, 0xcd, 0x4e, 0xa3, 0x71,
0xd0, 0xc7, 0x81, 0x8b, 0xc3, 0x6c, 0xae, 0xcc, 0xe7, 0xc5, 0xf3, 0xfd,
0x49, 0xa0, 0x6c, 0xab, 0x2d, 0xe6, 0xed, 0x81, 0x00, 0x07, 0x2e, 0x0e,
0x23, 0x85, 0x60, 0xcc, 0xb2, 0x79, 0x78, 0x5e, 0x05, 0xbe, 0xa8, 0xcd,
0x33, 0xad, 0x17, 0xb1, 0xb5, 0xa6, 0x30, 0xd5, 0xc5, 0x03, 0x33, 0x63,
0xd9, 0x67, 0x5f, 0xd4, 0xe2, 0xe9, 0xd6, 0x5e, 0xc6, 0xec, 0x18, 0xf3,
0x95, 0xa7, 0xa7, 0xb0, 0xa5, 0xb2, 0x00, 0x0d, 0x3c, 0x7f, 0xae, 0x97,
0x8d, 0x15, 0x05, 0x49, 0x69, 0xf5, 0x86, 0x81, 0x51, 0x8e, 0xf4, 0x8d,
0xf0, 0xa9, 0xda, 0x62, 0x32, 0xe2, 0xae, 0xfe, 0xab, 0x9d, 0x83, 0x34,
0x0f, 0x07, 0x10, 0x42, 0xa0, 0xd1, 0x3c, 0x5c, 0x5f, 0x81, 0xe9, 0x49,
0xff, 0xe3, 0xbe, 0xe6, 0xbe, 0x96, 0xf2, 0x64, 0xdb, 0x20, 0x0f, 0xbe,
0xf6, 0x2e, 0xa6, 0x10, 0x68, 0x31, 0x2e, 0x4d, 0xc9, 0xf9, 0x10, 0xeb,
0x74, 0x2b, 0xa8, 0xe6, 0x09, 0xce, 0x32, 0x24, 0xed, 0x9f, 0x59, 0x4d,
0x99, 0x27, 0x85, 0xc3, 0x7d, 0x23, 0x7c, 0xfb, 0x48, 0x0b, 0x0f, 0xd6,
0x95, 0x72, 0xf7, 0x8e, 0xa3, 0x8c, 0x46, 0x2d, 0x5a, 0x3e, 0x7d, 0x07,
0x7b, 0xbb, 0x87, 0x78, 0xe4, 0x60, 0x33, 0x1b, 0x2b, 0xf2, 0x69, 0x19,
0x09, 0xf2, 0x6a, 0xd7, 0x20, 0x29, 0x52, 0xb2, 0xb2, 0x28, 0x0b, 0xa7,
0x94, 0x2c, 0x7f, 0xf6, 0x20, 0xf7, 0x56, 0x15, 0x52, 0xea, 0x71, 0x11,
0xb0, 0x6c, 0x94, 0xd6, 0xfc, 0xf3, 0xf1, 0x73, 0xfc, 0xaa, 0xb9, 0x8b,
0xcf, 0xcf, 0x2a, 0xe1, 0xad, 0xde, 0x61, 0xbe, 0x79, 0xf0, 0x0c, 0x87,
0xef, 0xbf, 0x8d, 0x57, 0x3a, 0x06, 0x78, 0xf4, 0x50, 0x33, 0x5f, 0x98,
0x55, 0x42, 0x44, 0xa9, 0xc4, 0x0a, 0xf7, 0xf5, 0x78, 0xb9, 0x6f, 0xc7,
0x31, 0xd6, 0x57, 0x14, 0xb0, 0x67, 0x4b, 0xcc, 0x26, 0x3e, 0xb4, 0xb7,
0x89, 0xc6, 0x21, 0x1f, 0x8b, 0xf3, 0x33, 0xf8, 0xd6, 0xaf, 0xdf, 0xe4,
0xdf, 0x57, 0xd5, 0xf1, 0xc9, 0x9a, 0x62, 0xee, 0x7a, 0xee, 0x30, 0x0f,
0xcc, 0x2a, 0xa1, 0xd4, 0xe3, 0xfa, 0xff, 0x73, 0x41, 0x35, 0xd4, 0x77,
0x1e, 0xad, 0xed, 0x84, 0x29, 0x95, 0x02, 0x22, 0xfd, 0x7d, 0x3c, 0x98,
0x37, 0xc6, 0x54, 0x1a, 0x42, 0x03, 0xa6, 0xe1, 0x20, 0x33, 0xaf, 0x2a,
0x26, 0x85, 0xf1, 0x92, 0xe3, 0x72, 0x90, 0xeb, 0x72, 0xc6, 0xf2, 0x5f,
0x42, 0xc4, 0x32, 0xbb, 0x1a, 0xdc, 0xa6, 0x41, 0x87, 0x7f, 0x8c, 0xfb,
0x77, 0x35, 0xf0, 0xe9, 0x9a, 0x12, 0x52, 0x0d, 0x49, 0x45, 0x7a, 0x0a,
0xff, 0xb2, 0x72, 0x36, 0x5f, 0x79, 0xa3, 0x89, 0x2c, 0x97, 0x83, 0x7f,
0x5c, 0x1e, 0xf3, 0x20, 0x53, 0x0d, 0x83, 0x47, 0x17, 0x56, 0xb3, 0x38,
0x7f, 0xe2, 0x86, 0xd0, 0x90, 0x82, 0xca, 0xf4, 0x54, 0x7e, 0xb0, 0x62,
0x16, 0x27, 0x87, 0x7c, 0x2c, 0x79, 0xe6, 0x20, 0x61, 0x5b, 0x21, 0x04,
0xcc, 0xca, 0xf4, 0xf0, 0xd8, 0x6d, 0xb3, 0xdf, 0x93, 0x55, 0x3e, 0xc5,
0xdd, 0xd5, 0x85, 0x1c, 0xea, 0x1b, 0xe1, 0xc4, 0xa0, 0x8f, 0x5b, 0x72,
0xd3, 0x79, 0xb6, 0xbd, 0x97, 0x03, 0x5b, 0x97, 0x53, 0x93, 0xe1, 0xe6,
0xbb, 0x8b, 0x67, 0x22, 0x85, 0xc0, 0x56, 0x1a, 0xa7, 0xcb, 0x9c, 0x34,
0xdf, 0x0d, 0x05, 0x44, 0x6b, 0xcd, 0xbb, 0x47, 0x77, 0x20, 0x44, 0xb2,
0x8e, 0x5f, 0xec, 0x30, 0x58, 0x96, 0x26, 0x2e, 0xe3, 0xb1, 0xd9, 0x94,
0x54, 0x2d, 0x20, 0xbf, 0xb6, 0x66, 0x7a, 0x1e, 0x1e, 0xf0, 0xb9, 0x59,
0x25, 0xfc, 0xbe, 0xbd, 0x37, 0x61, 0x23, 0x2f, 0x05, 0x57, 0x5d, 0xe2,
0x38, 0x08, 0x01, 0x9f, 0xd9, 0x73, 0x82, 0x2c, 0xa7, 0xc9, 0xcf, 0xd7,
0xcd, 0x63, 0x6e, 0x76, 0x5a, 0xa2, 0x6d, 0xdb, 0xee, 0x13, 0x1c, 0xe8,
0x1d, 0xe6, 0xb7, 0x1b, 0x16, 0x50, 0xe2, 0x71, 0x21, 0x85, 0xa0, 0xc9,
0xeb, 0x67, 0xc1, 0xd3, 0x07, 0xf8, 0xca, 0xdc, 0x72, 0x1e, 0xaa, 0x2f,
0xe7, 0xad, 0xde, 0x61, 0xce, 0xf9, 0x43, 0x3c, 0xbe, 0xb6, 0x9e, 0x4f,
0xed, 0x3e, 0xc1, 0x13, 0x67, 0xba, 0xf8, 0xd1, 0xca, 0x3a, 0x10, 0x24,
0xe6, 0xce, 0x4f, 0x8d, 0x31, 0x4d, 0xc4, 0x56, 0x58, 0x4a, 0xf3, 0xd9,
0x3d, 0x27, 0xc8, 0x74, 0x99, 0x3c, 0x7b, 0xd7, 0x42, 0x4a, 0x3c, 0xae,
0x1b, 0x0d, 0x88, 0xcd, 0x82, 0xdb, 0x92, 0xef, 0x3a, 0x1c, 0x52, 0xf2,
0xc0, 0x2b, 0xc7, 0x71, 0x3b, 0x8c, 0xcb, 0x82, 0x98, 0xda, 0x66, 0xe2,
0xe8, 0x7a, 0xe7, 0x12, 0x23, 0xae, 0xb9, 0xaf, 0xba, 0x90, 0x4f, 0x54,
0x4d, 0xfd, 0xf3, 0x80, 0x5b, 0xf3, 0x32, 0x58, 0x5a, 0x90, 0xc9, 0xc3,
0x6f, 0x9e, 0x22, 0xd5, 0x94, 0x57, 0x58, 0x0f, 0xfc, 0x74, 0xf5, 0x5c,
0xee, 0x28, 0xc9, 0x9e, 0x04, 0xde, 0x2d, 0x39, 0x69, 0x1c, 0xeb, 0x1f,
0x65, 0x6d, 0x49, 0x76, 0x62, 0xce, 0x9a, 0x4c, 0x37, 0x87, 0xb7, 0xae,
0x20, 0x1a, 0x77, 0xc1, 0x7f, 0x7e, 0xaa, 0x0b, 0x0d, 0xfc, 0xf9, 0xde,
0x26, 0xc6, 0x6c, 0xc5, 0x73, 0xe7, 0xfa, 0xf8, 0xd1, 0xca, 0x3a, 0x2c,
0xa5, 0x13, 0xf6, 0x64, 0x77, 0xe7, 0x20, 0x11, 0x5b, 0x71, 0x77, 0x79,
0x1e, 0x86, 0x10, 0xfc, 0xe4, 0x3d, 0xf3, 0xdd, 0x50, 0x40, 0x84, 0x30,
0x48, 0xcf, 0x2a, 0x4c, 0xca, 0x0a, 0x9c, 0x1c, 0xf0, 0xf1, 0x87, 0x61,
0x41, 0x86, 0xf3, 0xf2, 0x07, 0x27, 0x7c, 0x01, 0x60, 0xe2, 0x11, 0x42,
0x54, 0x29, 0x3e, 0x57, 0x5b, 0x9a, 0xc4, 0xe9, 0x46, 0xec, 0x16, 0x28,
0xa6, 0x02, 0x6d, 0xc5, 0x57, 0xeb, 0x2b, 0xf9, 0xd5, 0x99, 0x6e, 0xda,
0x46, 0x43, 0x97, 0x5c, 0xc3, 0xc6, 0xae, 0x62, 0xc7, 0x4b, 0x9a, 0xc3,
0xe0, 0xa9, 0xb3, 0x3d, 0xbc, 0xde, 0x3d, 0x44, 0xd0, 0xb2, 0xf9, 0xde,
0xb2, 0xda, 0x78, 0x1f, 0x78, 0x74, 0xd1, 0x0c, 0x0e, 0xf4, 0x8d, 0x70,
0xff, 0x2b, 0xc7, 0x79, 0xe9, 0xe3, 0x8b, 0x11, 0x62, 0xc2, 0xeb, 0x72,
0x48, 0x89, 0x37, 0x1c, 0x65, 0x77, 0xd7, 0x20, 0x2f, 0xde, 0xb3, 0x88,
0x35, 0x71, 0xd0, 0x2a, 0x9e, 0xdc, 0xcb, 0xce, 0xf3, 0xfd, 0x7c, 0x69,
0x4e, 0x19, 0x5b, 0x5e, 0x6e, 0x60, 0x7d, 0x49, 0x0e, 0xff, 0xd3, 0x76,
0x91, 0xbf, 0x5b, 0x52, 0x83, 0x21, 0x63, 0xde, 0xdf, 0x53, 0x67, 0xbb,
0x79, 0xbd, 0x7b, 0x08, 0x0d, 0xfc, 0xfd, 0xd2, 0x9a, 0x1b, 0xfb, 0xd8,
0xba, 0xfb, 0x5c, 0x23, 0xde, 0x81, 0x8e, 0xa4, 0x2b, 0xd1, 0xa1, 0x31,
0x8b, 0x36, 0x5f, 0x68, 0x12, 0x87, 0x26, 0x24, 0xc8, 0x99, 0xca, 0xac,
0x05, 0xeb, 0x93, 0x62, 0x14, 0xad, 0xa1, 0x3e, 0x27, 0x2d, 0xe1, 0xde,
0xf6, 0x06, 0xc3, 0xb4, 0xfb, 0xc6, 0x58, 0x51, 0x98, 0xc9, 0x91, 0xbe,
0x11, 0x8a, 0xdd, 0x2e, 0xca, 0xd2, 0x52, 0xe8, 0xf0, 0x8f, 0xe1, 0x8b,
0x5a, 0x09, 0x55, 0xd4, 0x3c, 0x1c, 0xc0, 0x90, 0x82, 0x99, 0x19, 0xb1,
0x80, 0xf0, 0xdd, 0x21, 0x3f, 0xfd, 0xa1, 0x08, 0x3a, 0x0e, 0xf2, 0xfa,
0xd2, 0x5c, 0x3a, 0xfc, 0x63, 0x78, 0xc3, 0x51, 0x16, 0xe5, 0x67, 0x60,
0x6b, 0xcd, 0xde, 0x6e, 0x2f, 0x4b, 0xf2, 0x33, 0x18, 0xb3, 0x15, 0x9d,
0xfe, 0x31, 0x16, 0xc5, 0xf5, 0x7f, 0xd0, 0xb2, 0x39, 0xd8, 0x3b, 0xc2,
0xfa, 0x4b, 0x62, 0x9e, 0x53, 0xde, 0x00, 0xa0, 0x99, 0x93, 0x9d, 0xc6,
0x89, 0x41, 0x1f, 0xde, 0x70, 0x94, 0xaa, 0x74, 0x37, 0x95, 0xe9, 0xb1,
0x98, 0xee, 0x68, 0xff, 0x28, 0xfe, 0xa8, 0x15, 0x8b, 0xbd, 0x80, 0xf5,
0xa5, 0x39, 0x37, 0x0e, 0x10, 0xad, 0x15, 0x67, 0x4f, 0xbc, 0xc6, 0x88,
0x37, 0x39, 0x98, 0x0a, 0x59, 0x2a, 0xe9, 0xbe, 0x39, 0x39, 0x6e, 0xd6,
0xe4, 0xe4, 0x55, 0x50, 0x33, 0x7f, 0xed, 0x15, 0x52, 0xe4, 0xd3, 0xa8,
0x13, 0x53, 0xd5, 0x8b, 0x2b, 0x46, 0xe9, 0xd3, 0x1b, 0xe3, 0x72, 0xf7,
0x8d, 0x5c, 0x79, 0xbd, 0x22, 0x6e, 0xd0, 0xc4, 0x0d, 0xfe, 0x39, 0x82,
0x6d, 0x45, 0x92, 0x0e, 0x5f, 0x69, 0x58, 0xb7, 0xe3, 0x18, 0x41, 0xdb,
0xc6, 0x10, 0x32, 0xa1, 0x52, 0x0c, 0x29, 0xd1, 0x42, 0x60, 0x0a, 0x81,
0x34, 0x0d, 0x4c, 0xd3, 0x81, 0x94, 0x02, 0xa7, 0x90, 0x08, 0xa1, 0x71,
0x08, 0x89, 0x29, 0x63, 0xed, 0xa6, 0x10, 0x98, 0x52, 0x20, 0xa5, 0xc0,
0x10, 0x02, 0x87, 0x20, 0x51, 0x6f, 0x88, 0x98, 0xd7, 0x64, 0x08, 0x19,
0x7b, 0x7e, 0x13, 0x57, 0x6d, 0x26, 0x02, 0x43, 0x82, 0x21, 0x0d, 0x0c,
0x21, 0x30, 0x0c, 0x30, 0x90, 0x31, 0x3a, 0x34, 0x86, 0x90, 0x13, 0xb4,
0xd2, 0x48, 0x3c, 0xe7, 0x31, 0x20, 0x56, 0x2f, 0x04, 0x32, 0x3e, 0xe6,
0xf8, 0xbc, 0x32, 0x51, 0x1f, 0x03, 0x25, 0x36, 0xbf, 0x8e, 0xed, 0x47,
0xc4, 0xd6, 0x27, 0x11, 0xf1, 0xf5, 0x80, 0x88, 0xc7, 0x5f, 0x37, 0xd4,
0x86, 0x18, 0xa6, 0x33, 0xe9, 0x7b, 0xfb, 0x68, 0x88, 0x8e, 0x90, 0xcd,
0x98, 0x52, 0x18, 0x09, 0x30, 0xc0, 0x90, 0x1a, 0x25, 0xc1, 0x29, 0x80,
0xa8, 0x85, 0x29, 0x15, 0xd2, 0x90, 0x38, 0xa5, 0xc0, 0x14, 0xe0, 0x94,
0x32, 0x01, 0x84, 0x63, 0x1c, 0x10, 0xc3, 0xc0, 0x21, 0x62, 0x34, 0x86,
0x90, 0x38, 0x25, 0x48, 0x62, 0x6d, 0x46, 0xbc, 0xdf, 0xa5, 0x60, 0x99,
0x02, 0x4c, 0x43, 0xc7, 0x0e, 0x4e, 0x09, 0x0c, 0x14, 0x26, 0xe3, 0x6d,
0xb1, 0x88, 0xdf, 0x21, 0x05, 0x52, 0xc6, 0x40, 0x70, 0x48, 0x89, 0x8c,
0x03, 0x62, 0x0a, 0x81, 0x21, 0x63, 0xb4, 0x52, 0x49, 0x0c, 0x19, 0x4b,
0xed, 0x1b, 0x82, 0x58, 0x7f, 0x40, 0x09, 0x1d, 0x03, 0x4c, 0x80, 0x8a,
0x83, 0x65, 0xa0, 0xd1, 0x0a, 0xb4, 0x88, 0x8d, 0xa3, 0x15, 0xfc, 0x1f,
0xd7, 0xc0, 0x3b, 0xab, 0xdb, 0x65, 0xb1, 0x8a, 0x00, 0x00, 0x00, 0x00,
0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x3c,
0x08, 0x06, 0x00, 0x00, 0x00, 0xcf, 0x2e, 0x90, 0x87, 0x00, 0x00, 0x1b,
0x39, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0x9d, 0x79, 0x70, 0x1c,
0xd7, 0x7d, 0xe7, 0x3f, 0xaf, 0xbb, 0xa7, 0xe7, 0x02, 0x06, 0xf7, 0x8d,
0xc1, 0xc5, 0x03, 0xa0, 0x48, 0x91, 0x94, 0x64, 0x52, 0x24, 0xbd, 0x96,
0xe4, 0x48, 0xb2, 0x9d, 0xc4, 0x76, 0x7c, 0xc5, 0x89, 0x53, 0x59, 0xef,
0x3a, 0xeb, 0x72, 0xe2, 0xdd, 0x8a, 0x1d, 0xa7, 0xca, 0xf6, 0x3a, 0x5b,
0x59, 0x67, 0xbd, 0xde, 0x4d, 0x7c, 0x24, 0xf6, 0x7a, 0x53, 0x71, 0xec,
0x8a, 0x6d, 0xc5, 0x67, 0x39, 0x4e, 0x36, 0x76, 0x2c, 0x7b, 0x23, 0x5b,
0xca, 0xea, 0xb0, 0x49, 0x49, 0x94, 0x28, 0x92, 0x00, 0x49, 0x00, 0x84,
0x00, 0x10, 0x04, 0x06, 0xc7, 0x00, 0x83, 0x01, 0xe6, 0x9e, 0x3e, 0xde,
0xfe, 0xd1, 0x3d, 0x03, 0x0c, 0x0e, 0x12, 0xa4, 0x48, 0x29, 0x06, 0xe7,
0x57, 0x35, 0x85, 0x41, 0x1f, 0xaf, 0x5f, 0xf7, 0x7c, 0xdf, 0xef, 0x7d,
0x7f, 0xdf, 0xf7, 0x7b, 0xaf, 0x85, 0x94, 0x52, 0x52, 0xb6, 0x57, 0xd4,
0x6c, 0x29, 0xb1, 0xa5, 0x64, 0x21, 0x93, 0x67, 0x60, 0x3e, 0xc6, 0xd8,
0x62, 0x82, 0x68, 0x32, 0x4d, 0xce, 0x30, 0x51, 0x05, 0x28, 0x42, 0xa0,
0x09, 0x08, 0xa8, 0x2a, 0x0d, 0x41, 0x3f, 0xed, 0x55, 0x15, 0x74, 0xd5,
0x84, 0x68, 0xae, 0x0c, 0xa2, 0x28, 0x0a, 0x8a, 0x10, 0xe5, 0x87, 0xe8,
0x9a, 0x28, 0x03, 0xfa, 0x95, 0xb3, 0xbc, 0x65, 0xb3, 0x98, 0xcd, 0xf3,
0xdc, 0x6c, 0x8c, 0xa7, 0x23, 0x73, 0xa8, 0xc0, 0xa1, 0x96, 0x3a, 0xf6,
0xd4, 0x55, 0x13, 0xae, 0x0c, 0xe2, 0x51, 0x95, 0x75, 0xe7, 0x2c, 0xa4,
0xb3, 0x4c, 0xc5, 0x97, 0x19, 0x5b, 0x88, 0xb3, 0x9c, 0xc9, 0xd0, 0x53,
0x57, 0xcd, 0xee, 0xc6, 0x7a, 0xaa, 0xfc, 0x3e, 0x74, 0x4d, 0x2d, 0x03,
0xba, 0x0c, 0xe8, 0x97, 0xdf, 0xa4, 0x84, 0xf1, 0x44, 0x8a, 0x67, 0x67,
0x16, 0x38, 0x13, 0x8d, 0x73, 0x47, 0x43, 0x35, 0x6f, 0xe8, 0x6a, 0xa1,
0x52, 0xf7, 0x5c, 0x5b, 0x39, 0xc0, 0xf0, 0x4c, 0x94, 0x91, 0xb9, 0x05,
0xaa, 0xfd, 0x3e, 0xba, 0xeb, 0x6b, 0x68, 0xaa, 0xaa, 0x44, 0x55, 0x94,
0x32, 0xa0, 0xcb, 0xf6, 0xf2, 0x58, 0xda, 0xb4, 0x78, 0xec, 0xf2, 0x2c,
0xfd, 0xd1, 0x25, 0x76, 0xd7, 0x54, 0xf0, 0xe6, 0x9e, 0x36, 0x74, 0xf5,
0xa5, 0x03, 0x70, 0x2c, 0xba, 0xc0, 0x78, 0x74, 0x91, 0xda, 0x80, 0x8f,
0xee, 0xc6, 0x3a, 0x42, 0x01, 0x7f, 0x19, 0xd0, 0x65, 0xbb, 0xb9, 0x36,
0x9f, 0xcd, 0xf1, 0xd0, 0xf9, 0x4b, 0x04, 0x34, 0x85, 0x37, 0x76, 0xb5,
0xd2, 0x11, 0x0a, 0xdc, 0xd0, 0xf2, 0x4d, 0xcb, 0x66, 0x28, 0x32, 0xc3,
0x72, 0x3a, 0x43, 0x47, 0x7d, 0x2d, 0x6d, 0x75, 0x35, 0x65, 0x40, 0x97,
0xed, 0xe6, 0xd8, 0x5c, 0x26, 0xc7, 0x9f, 0x3d, 0x3f, 0xc4, 0x6b, 0x5a,
0xea, 0xf8, 0xe5, 0xae, 0x66, 0x7c, 0xea, 0xcd, 0xe3, 0xbb, 0xb3, 0xf1,
0x65, 0xc6, 0x67, 0xe6, 0x68, 0xa8, 0x0e, 0xd1, 0xd3, 0xdc, 0x78, 0x4b,
0x3d, 0x67, 0xad, 0x0c, 0xb5, 0x9b, 0x6f, 0xcb, 0x79, 0x93, 0x0f, 0xff,
0x7c, 0x80, 0xff, 0x70, 0x5b, 0x27, 0xf7, 0xb4, 0xd6, 0xdf, 0xf4, 0xeb,
0x35, 0x55, 0x87, 0xf0, 0xeb, 0x1e, 0x86, 0x27, 0x23, 0x28, 0x40, 0xd7,
0x2d, 0x04, 0x6a, 0xa5, 0x0c, 0xb7, 0x9b, 0x6f, 0xbf, 0xf7, 0xf8, 0x69,
0xde, 0xfb, 0x32, 0x81, 0xb9, 0x60, 0xa1, 0x80, 0x9f, 0xdd, 0xed, 0xad,
0x2c, 0x2c, 0x25, 0x88, 0x2e, 0x2e, 0x95, 0x3d, 0x74, 0xd9, 0x6e, 0x8c,
0x7d, 0xe4, 0xc4, 0x79, 0xde, 0xdc, 0xdd, 0xcc, 0x6b, 0xb6, 0x08, 0x66,
0x09, 0x0c, 0x44, 0x17, 0x39, 0x35, 0xb3, 0x40, 0x64, 0x29, 0x41, 0xce,
0x30, 0xd0, 0x84, 0x20, 0xe4, 0x51, 0x69, 0xab, 0x0c, 0xb2, 0xb3, 0xbe,
0x86, 0x3d, 0x8d, 0x75, 0x5b, 0x92, 0xe8, 0x42, 0x01, 0x3f, 0x1d, 0x8d,
0xf5, 0x44, 0xe6, 0x17, 0xa8, 0xf0, 0xfb, 0xf0, 0xfb, 0xbc, 0x65, 0x0e,
0x5d, 0xb6, 0xeb, 0xb7, 0x47, 0x2e, 0xcf, 0xf1, 0xe8, 0xe5, 0x39, 0x3e,
0x75, 0x74, 0xef, 0x55, 0x07, 0x3f, 0xf2, 0x96, 0xcd, 0x4f, 0x26, 0x66,
0xf8, 0xd1, 0xe8, 0x14, 0xbd, 0x55, 0x15, 0xdc, 0x1b, 0x6e, 0x62, 0x57,
0x75, 0x25, 0x15, 0x5e, 0x4f, 0x31, 0xe0, 0x9b, 0x49, 0xa4, 0x18, 0x5b,
0x58, 0x64, 0x2c, 0xba, 0x40, 0x67, 0x4d, 0x15, 0x77, 0x75, 0xb6, 0x51,
0xb1, 0x05, 0x90, 0x8e, 0x5c, 0x9e, 0x42, 0x55, 0x14, 0xba, 0x5a, 0x9b,
0x11, 0xdb, 0x7c, 0x10, 0xa6, 0x0c, 0xe8, 0x9b, 0x64, 0x69, 0xd3, 0xe2,
0xfd, 0x4f, 0x9c, 0xe6, 0x13, 0x87, 0x6f, 0xa3, 0xb3, 0xd2, 0x7f, 0x45,
0x8f, 0x3c, 0x18, 0x5b, 0xe6, 0xaf, 0xcf, 0x8e, 0xd2, 0x57, 0x53, 0xc1,
0xef, 0xec, 0xeb, 0xc1, 0xbb, 0x05, 0x19, 0x6f, 0x78, 0x26, 0xca, 0xc5,
0x99, 0x39, 0x7a, 0x9b, 0x1b, 0xe8, 0x6e, 0xac, 0xbf, 0xa2, 0xf6, 0x9c,
0x37, 0x0c, 0x86, 0xc7, 0x2f, 0x13, 0x6e, 0x69, 0xa2, 0xaa, 0x22, 0x58,
0x06, 0x74, 0xd9, 0xae, 0xdd, 0xbe, 0x74, 0x7e, 0x1c, 0x9f, 0xaa, 0xf0,
0xae, 0x5d, 0xed, 0xe8, 0x9b, 0x80, 0x4d, 0x02, 0x8f, 0x4c, 0xcc, 0xf2,
0xf0, 0x58, 0x84, 0x0f, 0x1c, 0xd8, 0xc9, 0xee, 0xea, 0xca, 0x6b, 0xba,
0x46, 0xd6, 0x30, 0x38, 0x3d, 0x36, 0x41, 0x85, 0xd7, 0x4b, 0x6f, 0x5b,
0x0b, 0x9e, 0x2b, 0xd0, 0x90, 0xcb, 0x33, 0x73, 0x98, 0xa6, 0x49, 0x47,
0x6b, 0xf3, 0xb6, 0x1e, 0x78, 0x29, 0x07, 0x85, 0x37, 0xc1, 0xe2, 0x39,
0x83, 0x17, 0x97, 0x52, 0x1c, 0x6e, 0xac, 0xdd, 0x14, 0xcc, 0x00, 0x3f,
0x1a, 0x9f, 0xe1, 0xf1, 0xc9, 0x28, 0x1f, 0x3f, 0xbc, 0xf7, 0x9a, 0xc1,
0x0c, 0xe0, 0xf3, 0x78, 0x38, 0xb4, 0xb3, 0x1b, 0xcb, 0xb2, 0x18, 0x9d,
0x9e, 0xc1, 0xbe, 0x82, 0x6f, 0x6a, 0x6b, 0x6a, 0x20, 0x91, 0x48, 0x92,
0xcf, 0xe7, 0xcb, 0x41, 0x61, 0xd9, 0xae, 0xcd, 0x1e, 0x8f, 0xcc, 0xd3,
0x1d, 0x0a, 0xd2, 0x51, 0xe1, 0xdb, 0xf4, 0x98, 0x53, 0xd1, 0x38, 0x3f,
0x9f, 0x89, 0xf1, 0xbb, 0xfb, 0x7a, 0x68, 0xf0, 0xeb, 0xeb, 0xf6, 0x4f,
0x25, 0xd3, 0x9c, 0x9f, 0x8f, 0x93, 0xc9, 0xe5, 0xf1, 0x08, 0x08, 0x79,
0x34, 0xc2, 0x55, 0x95, 0x74, 0xd4, 0x56, 0x95, 0x1c, 0xa7, 0x2a, 0x0a,
0x7b, 0xbb, 0xc2, 0x9c, 0xb9, 0x38, 0x46, 0x34, 0x16, 0xa7, 0x69, 0x93,
0xc1, 0x14, 0x45, 0x08, 0x42, 0x15, 0x41, 0x96, 0x96, 0x13, 0xf8, 0xbc,
0xde, 0x6d, 0xcb, 0xa5, 0xcb, 0x1e, 0xfa, 0x26, 0xd8, 0xd8, 0x72, 0x9a,
0xd6, 0xa0, 0x8f, 0xa0, 0x67, 0x63, 0x7f, 0x91, 0x34, 0x4c, 0x1e, 0x9b,
0x9c, 0xe7, 0x35, 0x2d, 0x75, 0x74, 0xaf, 0x19, 0x2d, 0x34, 0xa5, 0xcd,
0x57, 0xcf, 0x8d, 0xf1, 0xbd, 0xe1, 0x09, 0xa4, 0x94, 0xb4, 0x54, 0x06,
0x68, 0xad, 0x0c, 0x12, 0xd4, 0x3d, 0x4c, 0x2c, 0x2e, 0xf1, 0xd8, 0xb9,
0x61, 0xe2, 0xa9, 0x74, 0xa9, 0x57, 0x52, 0x14, 0xf6, 0x74, 0xb6, 0x73,
0x69, 0x7a, 0x1a, 0xd3, 0xb2, 0x36, 0xad, 0x57, 0x4b, 0x63, 0x03, 0xd1,
0x58, 0xac, 0xec, 0xa1, 0xcb, 0xb6, 0x75, 0x9b, 0x4e, 0x67, 0xb1, 0x91,
0x74, 0x54, 0x6c, 0x1e, 0x08, 0x3e, 0x1f, 0x8d, 0x93, 0xb7, 0x6d, 0x5e,
0xd3, 0x5a, 0x57, 0xb2, 0xdd, 0x92, 0x92, 0x3f, 0x3a, 0x71, 0x9e, 0xfd,
0x35, 0x95, 0xfc, 0x56, 0x5f, 0x17, 0x35, 0x3e, 0x1d, 0x8f, 0x4b, 0x59,
0x24, 0x90, 0xce, 0xe7, 0x59, 0x4c, 0xa4, 0x39, 0x3d, 0x76, 0x89, 0xbd,
0xe1, 0x36, 0x1a, 0xaa, 0x42, 0xc5, 0x73, 0x03, 0x3e, 0x2f, 0x75, 0x55,
0x55, 0x4c, 0x47, 0xe7, 0x09, 0x37, 0x37, 0x6d, 0x78, 0x5d, 0xaf, 0x57,
0xc7, 0x34, 0x4d, 0x4c, 0xd3, 0xc4, 0xe3, 0xf1, 0x6c, 0xcb, 0xe7, 0x5f,
0xf6, 0xd0, 0x37, 0xd8, 0x22, 0xa9, 0x2c, 0x42, 0x08, 0xda, 0x82, 0x1b,
0xd3, 0x8d, 0xbc, 0x6d, 0x33, 0xba, 0x9c, 0xa6, 0xb3, 0x32, 0x40, 0xe5,
0x1a, 0x0f, 0xfe, 0x99, 0x17, 0x2e, 0xb2, 0xb3, 0x2a, 0xc8, 0x6f, 0xef,
0xe9, 0xa4, 0x31, 0xe0, 0x2b, 0x82, 0x19, 0x40, 0x00, 0x41, 0x5d, 0xa7,
0xbd, 0xae, 0x9a, 0x03, 0x5d, 0x1d, 0x8c, 0x4c, 0x46, 0xc8, 0xe6, 0x72,
0x25, 0xe7, 0x77, 0xb5, 0xb6, 0x10, 0x99, 0x9e, 0xbd, 0x62, 0xfd, 0x2a,
0x83, 0x15, 0x24, 0xd7, 0x78, 0xf8, 0x32, 0xa0, 0xcb, 0xb6, 0xa9, 0x45,
0xb3, 0x79, 0x04, 0xd0, 0xe0, 0xdf, 0x58, 0x1f, 0x8e, 0x66, 0xf2, 0xcc,
0x67, 0xf3, 0x1c, 0xac, 0x0f, 0x95, 0x6c, 0x7f, 0x71, 0x39, 0xc5, 0xf3,
0xf3, 0x71, 0xde, 0xb7, 0xb7, 0xfb, 0xaa, 0xd7, 0xa8, 0x0e, 0x06, 0xe8,
0x6a, 0x6c, 0x60, 0x6c, 0x72, 0xba, 0x94, 0x4f, 0xab, 0x0a, 0x7e, 0x9f,
0x97, 0x74, 0x3a, 0xb3, 0x39, 0xa0, 0x2b, 0x2a, 0x48, 0x95, 0x01, 0x5d,
0xb6, 0xad, 0x5a, 0xc6, 0xb4, 0x10, 0x08, 0x36, 0x0b, 0xb9, 0x96, 0xf2,
0x06, 0xcb, 0x79, 0x83, 0x1d, 0xa1, 0x52, 0x3d, 0xf8, 0x6b, 0x83, 0x13,
0xfc, 0xde, 0x6d, 0xa5, 0x60, 0xb6, 0x25, 0x0c, 0xc4, 0x92, 0x3c, 0x17,
0x5d, 0x26, 0x63, 0xae, 0x70, 0x63, 0xe1, 0x06, 0x78, 0x8a, 0x22, 0xc8,
0xe5, 0x4a, 0x55, 0x8b, 0x9a, 0xaa, 0x10, 0x4b, 0x89, 0xe4, 0xa6, 0xf5,
0xf3, 0xfb, 0x74, 0xb2, 0xd9, 0x6c, 0x19, 0xd0, 0x65, 0xdb, 0x9a, 0x49,
0x40, 0x53, 0x36, 0x57, 0x10, 0x72, 0x96, 0x4d, 0xde, 0x96, 0xf8, 0xd7,
0x68, 0xc6, 0xcf, 0xcd, 0x2d, 0xad, 0xe3, 0xd4, 0xdf, 0xba, 0x18, 0xe1,
0xfe, 0x1f, 0x9e, 0xe4, 0xd0, 0xdf, 0x9f, 0xe0, 0xe3, 0x27, 0x5f, 0xc4,
0x5c, 0x25, 0xcb, 0xe9, 0x9a, 0x86, 0x5f, 0xd7, 0x49, 0x67, 0x33, 0x6b,
0x00, 0xeb, 0x23, 0x97, 0xdb, 0x1c, 0xb0, 0xba, 0x47, 0xbf, 0x62, 0xe0,
0x58, 0x0e, 0x0a, 0xcb, 0x56, 0x62, 0xdd, 0x95, 0x01, 0x6a, 0xbd, 0xfa,
0xa6, 0xfb, 0xeb, 0x7c, 0x3a, 0x87, 0x1b, 0xab, 0xd7, 0x6d, 0x7f, 0xa0,
0xbd, 0xbe, 0x44, 0xb3, 0x36, 0x6d, 0x89, 0x47, 0x11, 0xbc, 0xb3, 0xa7,
0xd9, 0x99, 0x00, 0x20, 0xdc, 0xd6, 0x22, 0x56, 0xe8, 0x45, 0xa8, 0x22,
0x88, 0xb6, 0xa6, 0x61, 0x04, 0x02, 0x3e, 0xa4, 0xb4, 0x37, 0xff, 0xc1,
0x35, 0x8d, 0xaa, 0x50, 0x68, 0xdb, 0x3e, 0xff, 0xf2, 0x48, 0xe1, 0x4d,
0xf4, 0xd4, 0xe2, 0x26, 0x1c, 0x5b, 0xb6, 0x9b, 0xe4, 0xa1, 0x33, 0x99,
0x0c, 0x86, 0x61, 0xa0, 0xaa, 0x1a, 0xc1, 0xe0, 0xd6, 0x66, 0x5e, 0x24,
0x93, 0x49, 0x6c, 0x7b, 0xbd, 0xf7, 0x10, 0x42, 0xe0, 0xf5, 0x7a, 0xd1,
0x75, 0x7d, 0x4b, 0xe5, 0x64, 0xb3, 0x39, 0xf2, 0xf9, 0xdc, 0xd5, 0x5b,
0xeb, 0x26, 0xe5, 0x3a, 0x41, 0x93, 0x24, 0x10, 0x08, 0x6c, 0xa9, 0xae,
0x42, 0x08, 0x82, 0x41, 0x67, 0x86, 0xf5, 0x96, 0x3d, 0xc5, 0x26, 0xdb,
0x17, 0xb2, 0x06, 0x12, 0x49, 0xbd, 0x4f, 0xbf, 0xe2, 0xb1, 0xb6, 0x94,
0x2c, 0xe6, 0x4c, 0x52, 0xa6, 0x85, 0x00, 0x6c, 0xa0, 0x3d, 0xe0, 0x45,
0x5d, 0x43, 0x67, 0x16, 0x73, 0x06, 0x09, 0xc3, 0x5a, 0x57, 0x86, 0x10,
0x10, 0xd4, 0x54, 0x6a, 0xbc, 0x9e, 0x32, 0xa0, 0xaf, 0xf4, 0x23, 0x5f,
0xb8, 0x30, 0xc8, 0xcc, 0xcc, 0x0c, 0x99, 0x4c, 0x06, 0xcb, 0xb2, 0x50,
0x14, 0x05, 0x9f, 0xcf, 0x4b, 0x7d, 0x7d, 0x3d, 0x3b, 0x77, 0xee, 0xa4,
0xa9, 0x69, 0xbd, 0x06, 0x1a, 0x8b, 0xc5, 0x78, 0xf6, 0xd9, 0x93, 0x2c,
0x2d, 0xc5, 0xb1, 0x6d, 0xb9, 0x21, 0xf0, 0x34, 0x4d, 0x25, 0x18, 0x0c,
0xd2, 0xd6, 0xd6, 0xc6, 0xee, 0xdd, 0xbb, 0xf1, 0xf9, 0xd6, 0xcb, 0x5e,
0xb6, 0x6d, 0x73, 0xe2, 0xc4, 0xd3, 0x44, 0x22, 0x11, 0x4c, 0xd3, 0xbc,
0xfa, 0xcd, 0x69, 0x2a, 0xfb, 0xf7, 0xdf, 0x4e, 0x6f, 0x6f, 0x1f, 0x00,
0xf9, 0x7c, 0x9e, 0xe7, 0x9f, 0x7f, 0x9e, 0xcb, 0x97, 0x27, 0x91, 0x52,
0xd2, 0xd1, 0x11, 0xe6, 0xe8, 0xd1, 0xa3, 0xeb, 0xce, 0xb3, 0x2c, 0x8b,
0xc7, 0x1e, 0x7b, 0xac, 0xa8, 0x16, 0xf8, 0x7c, 0x3e, 0x1e, 0x78, 0xe0,
0x01, 0x2a, 0x2b, 0x2b, 0xae, 0x3f, 0x58, 0xb4, 0x2c, 0x3e, 0xf1, 0xdc,
0x28, 0xa7, 0xa2, 0xcb, 0x48, 0xe0, 0x50, 0x63, 0x88, 0xdf, 0xdf, 0xd7,
0x41, 0x73, 0x60, 0x63, 0x35, 0x24, 0x69, 0x58, 0xfc, 0xd5, 0xb9, 0xcb,
0xfc, 0x74, 0x72, 0x1e, 0x5d, 0x51, 0x48, 0x9b, 0x16, 0xdf, 0x7f, 0xc3,
0x1d, 0x34, 0xba, 0xa3, 0x8a, 0x0b, 0x59, 0x83, 0xff, 0xd5, 0x7f, 0x89,
0x67, 0xe7, 0x96, 0x30, 0x37, 0x78, 0xa6, 0x08, 0xf0, 0x2a, 0x0a, 0xf5,
0x3e, 0x0f, 0x77, 0x36, 0x84, 0x78, 0x7b, 0x77, 0x13, 0xed, 0x57, 0x18,
0xb9, 0xbc, 0xe5, 0x00, 0x7d, 0xf2, 0xe4, 0x49, 0xfa, 0xfb, 0x07, 0x48,
0xa7, 0xd3, 0xe4, 0xf3, 0x79, 0x6c, 0xdb, 0x46, 0x4a, 0x89, 0x10, 0x02,
0x45, 0x51, 0xb8, 0x74, 0x69, 0x82, 0xc1, 0xc1, 0x21, 0xba, 0xba, 0x3a,
0x39, 0x7a, 0xf4, 0x68, 0x89, 0xf7, 0x7b, 0xea, 0xa9, 0xa7, 0x18, 0x1b,
0x1b, 0x2f, 0x7a, 0xbc, 0xc2, 0xb9, 0x25, 0xd1, 0xa9, 0xa2, 0xa0, 0x28,
0x0a, 0x63, 0x63, 0xe3, 0x9c, 0x3d, 0xdb, 0xcf, 0x81, 0x03, 0x07, 0xb8,
0xfd, 0xf6, 0x7d, 0x25, 0xc7, 0x0c, 0x0e, 0x0e, 0xf1, 0xc2, 0x0b, 0x2f,
0x14, 0xf3, 0x11, 0xa4, 0x94, 0x1b, 0x7a, 0xfc, 0x82, 0x79, 0x3c, 0x1e,
0xba, 0xbb, 0x57, 0x94, 0x83, 0x8b, 0x17, 0x47, 0x38, 0x7d, 0xfa, 0x0c,
0x99, 0x8c, 0x03, 0xd4, 0x68, 0x34, 0x8a, 0x10, 0x0a, 0x47, 0x8e, 0xdc,
0x5d, 0x4a, 0x01, 0xa4, 0x64, 0x76, 0x76, 0x8e, 0x64, 0x32, 0xe9, 0xf2,
0xd2, 0x00, 0x96, 0x65, 0xbe, 0xa4, 0x07, 0xfd, 0x27, 0x27, 0x5f, 0xe4,
0xcb, 0x17, 0x26, 0x8b, 0xe0, 0x7b, 0x66, 0x2e, 0x8e, 0x2a, 0x04, 0x1f,
0x39, 0xd8, 0x4d, 0x85, 0x67, 0x7d, 0x52, 0x91, 0x29, 0x25, 0x23, 0xcb,
0x69, 0x9e, 0x9e, 0x5d, 0xc2, 0xa7, 0x2a, 0x24, 0x0d, 0x93, 0x9c, 0x7b,
0xaf, 0xa6, 0x2d, 0x79, 0x78, 0x22, 0xca, 0x5f, 0x9c, 0x1d, 0x47, 0x20,
0x50, 0x04, 0x18, 0xb6, 0x5c, 0x97, 0xcb, 0xa1, 0x08, 0x81, 0x47, 0x11,
0x3c, 0x3a, 0xb9, 0xc0, 0xd7, 0x06, 0xa7, 0x78, 0xf7, 0xee, 0x56, 0x3e,
0xb4, 0xbf, 0x73, 0x5b, 0xa7, 0x90, 0x6e, 0x09, 0xd0, 0x8f, 0x3c, 0xf2,
0x08, 0x83, 0x83, 0x43, 0x25, 0xe0, 0x69, 0x6c, 0x6c, 0xa4, 0xae, 0xae,
0x96, 0x44, 0x22, 0x49, 0x24, 0x12, 0xc1, 0xb2, 0x2c, 0x12, 0x89, 0x04,
0xfd, 0xfd, 0x03, 0x2c, 0x2f, 0x2f, 0x73, 0xff, 0xfd, 0xf7, 0x13, 0x72,
0x83, 0x8f, 0xe5, 0xe5, 0x44, 0x09, 0x68, 0x9b, 0x9b, 0x9b, 0xa9, 0xac,
0xac, 0x2c, 0x82, 0xda, 0x34, 0x4d, 0x22, 0x91, 0x08, 0xa9, 0x54, 0x8a,
0x7c, 0x3e, 0x4f, 0x34, 0x1a, 0xe5, 0xc9, 0x27, 0x9f, 0x24, 0x99, 0x4c,
0x94, 0x78, 0xd0, 0x64, 0x32, 0x51, 0xec, 0x15, 0x84, 0x10, 0x84, 0x42,
0x21, 0x5a, 0x5a, 0x5a, 0x36, 0x05, 0xb5, 0xa2, 0xa8, 0xd4, 0xd6, 0xd6,
0xad, 0xa2, 0x49, 0xe9, 0xe2, 0xf9, 0x85, 0xeb, 0xf6, 0xf7, 0xf7, 0xd3,
0xd3, 0xd3, 0x4d, 0x63, 0x63, 0xe3, 0x86, 0x0d, 0xac, 0xf0, 0xfd, 0xa5,
0xb0, 0xdc, 0xc5, 0x9c, 0xc1, 0x57, 0x07, 0xa7, 0x9c, 0x46, 0xe6, 0x52,
0x06, 0x53, 0x4a, 0xbe, 0x75, 0x71, 0x9a, 0x77, 0xed, 0x6a, 0x61, 0x4f,
0xf5, 0xc6, 0x29, 0x9d, 0xaa, 0x70, 0x14, 0x13, 0x4d, 0x11, 0x25, 0x19,
0x72, 0xb6, 0x94, 0x2c, 0x64, 0x0d, 0x72, 0x96, 0x4d, 0xa5, 0x47, 0xc3,
0xb0, 0x25, 0xf7, 0xb6, 0xd6, 0xd0, 0x12, 0x58, 0xf1, 0xc0, 0xa6, 0x65,
0x73, 0x21, 0x9e, 0xe2, 0xdc, 0x62, 0x92, 0x94, 0x69, 0x91, 0x4e, 0x64,
0xf9, 0xe4, 0xa9, 0x51, 0x2e, 0x25, 0x33, 0x7c, 0xfe, 0xd8, 0x1e, 0xb6,
0x2b, 0xa6, 0xaf, 0x0a, 0xe8, 0xd1, 0xd1, 0x31, 0xce, 0x9d, 0x3b, 0x5f,
0xfc, 0x71, 0x43, 0xa1, 0x10, 0xf7, 0xdd, 0x77, 0x1f, 0x3b, 0x76, 0xf4,
0x14, 0x8f, 0x89, 0xc7, 0xe3, 0x3c, 0xfc, 0xf0, 0x8f, 0x5c, 0x8f, 0x27,
0x18, 0x1d, 0x1d, 0xa3, 0xa9, 0x69, 0x80, 0x63, 0xc7, 0x8e, 0x6d, 0xe8,
0x35, 0x5f, 0xf5, 0xaa, 0xbb, 0xe8, 0xe9, 0xe9, 0x29, 0x02, 0x5a, 0x08,
0x81, 0x94, 0x92, 0x53, 0xa7, 0x4e, 0xf1, 0xe4, 0x93, 0x4f, 0x21, 0x84,
0x20, 0x9f, 0xcf, 0x33, 0x38, 0x38, 0x44, 0x38, 0x1c, 0xa6, 0xbd, 0xbd,
0x7d, 0x43, 0x9a, 0x12, 0x0e, 0x87, 0x79, 0xe0, 0x81, 0xfb, 0xb9, 0x52,
0x5c, 0x7b, 0x35, 0x6f, 0x94, 0x4a, 0xa5, 0x38, 0x7e, 0xfc, 0x04, 0x6f,
0x79, 0xcb, 0xaf, 0xdd, 0xb4, 0x87, 0xfc, 0xe5, 0x0b, 0x97, 0xc9, 0xdb,
0x36, 0xea, 0xaa, 0xba, 0x68, 0x42, 0x30, 0x91, 0xcc, 0xf0, 0xff, 0x26,
0x63, 0xec, 0x0c, 0x05, 0x8a, 0x40, 0xbf, 0xa6, 0x88, 0xde, 0x6d, 0x64,
0x29, 0xd3, 0xe2, 0x03, 0xfb, 0x3a, 0x79, 0x43, 0xb8, 0xbe, 0x84, 0x72,
0x58, 0xb6, 0xe4, 0x87, 0x97, 0xa2, 0x7c, 0xec, 0x99, 0x61, 0xa6, 0xd3,
0x39, 0x54, 0x04, 0x5f, 0x3a, 0x3f, 0xc9, 0x6f, 0xec, 0x68, 0xe1, 0x58,
0x73, 0xf5, 0xb6, 0x04, 0xf4, 0x55, 0xa3, 0x9c, 0xb1, 0xb1, 0xb1, 0x22,
0x28, 0x54, 0x55, 0x65, 0xef, 0xde, 0xbd, 0x25, 0x60, 0x06, 0xa8, 0xae,
0xae, 0xe6, 0x4d, 0x6f, 0x7a, 0x23, 0x86, 0x61, 0x14, 0xbb, 0xec, 0x85,
0x85, 0x18, 0xe9, 0x74, 0xfa, 0x8a, 0x21, 0x93, 0x10, 0xa2, 0x58, 0xb6,
0x10, 0x82, 0xbb, 0xee, 0xba, 0x8b, 0xee, 0xee, 0xee, 0xa2, 0xc7, 0x4d,
0xa5, 0x52, 0x2c, 0x2d, 0x2d, 0x5d, 0x01, 0xac, 0x94, 0x94, 0xb3, 0xd1,
0x67, 0x2b, 0x36, 0x3d, 0x1d, 0xa1, 0xbf, 0xbf, 0xff, 0xa6, 0x3d, 0xe4,
0xaf, 0x5c, 0x88, 0x14, 0xc1, 0x2c, 0xa0, 0xf8, 0xdd, 0xa7, 0xaa, 0x7c,
0x63, 0x38, 0x42, 0x3c, 0x67, 0xbc, 0x74, 0xb9, 0x4a, 0xac, 0xf9, 0xe0,
0x78, 0xf7, 0xb7, 0x76, 0x37, 0xf2, 0xef, 0x7a, 0xdb, 0x30, 0x5c, 0xaa,
0xa3, 0x08, 0xc1, 0x89, 0xd9, 0xf8, 0xb6, 0xa5, 0x1c, 0x57, 0x05, 0xf4,
0xea, 0xe0, 0x4b, 0x55, 0x55, 0xbc, 0xde, 0x8d, 0x83, 0x98, 0xd5, 0x9c,
0x59, 0x08, 0xb1, 0x21, 0x4f, 0xbe, 0x9a, 0xe5, 0xf3, 0x79, 0x72, 0xab,
0xf2, 0x13, 0x3c, 0x1e, 0xcf, 0x86, 0xc1, 0xe1, 0x8d, 0xb6, 0x74, 0x3a,
0xcb, 0xc0, 0xc0, 0xb9, 0x2b, 0x36, 0x9e, 0xeb, 0xb5, 0x6f, 0x0d, 0x47,
0x58, 0x5c, 0x05, 0xd8, 0x9e, 0x90, 0x9f, 0xd7, 0x87, 0xeb, 0xc9, 0x59,
0x36, 0x1e, 0x45, 0xf0, 0x6c, 0x74, 0x89, 0x53, 0xf3, 0x4e, 0xa0, 0x78,
0x33, 0x2c, 0x6f, 0xdb, 0xc4, 0xdc, 0xe1, 0xf8, 0x02, 0x5d, 0x69, 0x0d,
0x7a, 0x6f, 0x5d, 0x40, 0x6f, 0xac, 0x9a, 0x6e, 0xb0, 0xf5, 0x1a, 0xc0,
0xbb, 0x5a, 0xfe, 0x2a, 0x70, 0xef, 0xa9, 0xa9, 0x08, 0x8f, 0x3e, 0xfa,
0x18, 0x93, 0x93, 0x93, 0x2e, 0x05, 0x81, 0x8e, 0x8e, 0x30, 0x6d, 0x6d,
0x6d, 0xd7, 0x21, 0x8e, 0x6d, 0xcd, 0x54, 0x55, 0x45, 0x4a, 0x89, 0xaa,
0x2a, 0xcc, 0xcc, 0xcc, 0x14, 0xbd, 0xf4, 0x8d, 0x0c, 0x9a, 0x1e, 0x1a,
0x8e, 0x14, 0x83, 0x35, 0x9f, 0xaa, 0xf0, 0x3b, 0x7b, 0xda, 0x79, 0x77,
0x6f, 0x2b, 0xba, 0xaa, 0x20, 0x01, 0xbf, 0xa6, 0xf0, 0x57, 0xe7, 0x2e,
0x63, 0xd9, 0xf2, 0x86, 0x03, 0x79, 0x30, 0x9e, 0xe2, 0xd3, 0x2f, 0x8c,
0xf3, 0xed, 0x91, 0x19, 0x3c, 0x8a, 0x42, 0xce, 0xb2, 0xd9, 0x5d, 0x15,
0x2c, 0xa5, 0x26, 0x65, 0x1d, 0xfa, 0xa5, 0x99, 0x6d, 0xdb, 0xcc, 0xcd,
0xcd, 0x22, 0xa5, 0x4d, 0x22, 0x91, 0x64, 0x69, 0x69, 0x89, 0x68, 0x34,
0xca, 0xd4, 0xd4, 0x14, 0xd9, 0x6c, 0xd6, 0x95, 0xf0, 0x34, 0x76, 0xef,
0xde, 0xcd, 0xe1, 0xc3, 0x87, 0x37, 0xf5, 0xd0, 0x52, 0x4a, 0xe6, 0xe6,
0xe6, 0x38, 0x75, 0xea, 0x14, 0xe6, 0xaa, 0x3c, 0x07, 0xcb, 0xb2, 0xb8,
0xfb, 0xee, 0xc3, 0x57, 0xd5, 0x8c, 0xa5, 0x94, 0xb4, 0xb4, 0x34, 0x13,
0x8b, 0x2d, 0x92, 0x4a, 0xa5, 0x90, 0x52, 0x72, 0xe1, 0xc2, 0x05, 0x3a,
0x3b, 0xbb, 0x68, 0x6b, 0x6b, 0xbd, 0x21, 0xf7, 0xfa, 0x78, 0x64, 0x91,
0xe1, 0x78, 0xba, 0xe8, 0x02, 0xea, 0x7d, 0x3a, 0xbf, 0xb5, 0xb3, 0x85,
0xe5, 0xbc, 0xc9, 0xd1, 0xa6, 0x2a, 0x9e, 0x88, 0x2c, 0xe2, 0x55, 0x15,
0x1e, 0x9d, 0x5c, 0x60, 0x28, 0x9e, 0x62, 0x6f, 0xed, 0xf5, 0xcb, 0x82,
0x85, 0x6b, 0x8c, 0x2d, 0x67, 0xe8, 0x8f, 0x25, 0x79, 0x2e, 0xba, 0xc4,
0x4f, 0x27, 0xe7, 0x39, 0x3d, 0x9f, 0x40, 0x53, 0x14, 0x0c, 0xdb, 0x66,
0x5f, 0x4d, 0x05, 0x9f, 0x3d, 0xd6, 0xbb, 0xad, 0xb5, 0xe9, 0x97, 0x1d,
0xd0, 0xa6, 0x69, 0x72, 0xea, 0xd4, 0x0b, 0x58, 0x96, 0x45, 0x3a, 0x9d,
0x29, 0x91, 0xc3, 0x6a, 0x6a, 0x6a, 0x08, 0x87, 0xc3, 0xf4, 0xf4, 0xf4,
0xd0, 0xd3, 0xd3, 0x85, 0xae, 0x7b, 0xaf, 0x08, 0xc8, 0x48, 0x24, 0xc2,
0xc4, 0xc4, 0x44, 0xc9, 0xf6, 0x5c, 0x2e, 0xc7, 0xa1, 0x43, 0xaf, 0xda,
0xd2, 0x20, 0x48, 0x5d, 0x5d, 0x1d, 0x7d, 0x7d, 0x7d, 0xfc, 0xf8, 0xc7,
0xff, 0x8c, 0xae, 0x7b, 0x88, 0xc7, 0x97, 0x39, 0x73, 0xe6, 0x34, 0x35,
0x35, 0xd5, 0x37, 0x44, 0x05, 0xf8, 0xe6, 0x70, 0x84, 0x94, 0xdb, 0xd8,
0x14, 0x01, 0xaf, 0x0b, 0xd7, 0x51, 0xa5, 0x6b, 0x54, 0xe9, 0x1a, 0xf7,
0xb5, 0xd6, 0x72, 0x7c, 0x26, 0x5e, 0xec, 0x67, 0xbe, 0x30, 0x70, 0x89,
0x2f, 0xdd, 0xb3, 0xf7, 0xba, 0xd1, 0xec, 0x57, 0x55, 0xbe, 0x37, 0x3a,
0xcb, 0xdf, 0x0e, 0x4d, 0xf1, 0xc2, 0x7c, 0x82, 0x68, 0x26, 0x8f, 0x22,
0xc0, 0x92, 0x50, 0xeb, 0xd1, 0x78, 0x73, 0x57, 0x03, 0xef, 0xdd, 0xd3,
0xce, 0x5d, 0x0d, 0xdb, 0x77, 0xd8, 0xfb, 0x15, 0x01, 0xb4, 0x94, 0x92,
0x44, 0xc2, 0x91, 0xdf, 0xfc, 0x7e, 0x3f, 0x75, 0x75, 0xcd, 0x34, 0x36,
0x36, 0xd2, 0xda, 0xda, 0x4a, 0x5d, 0x5d, 0x2d, 0xd5, 0xd5, 0xd5, 0xf8,
0xfd, 0x5b, 0x5b, 0x68, 0x50, 0xd7, 0x75, 0x02, 0x81, 0x40, 0x09, 0xdd,
0xf1, 0x5e, 0xc3, 0xf4, 0x22, 0x29, 0xa1, 0xaf, 0xaf, 0x97, 0xa1, 0xa1,
0x61, 0x46, 0x47, 0x47, 0xf1, 0x78, 0x3c, 0x5c, 0xbc, 0x38, 0x42, 0x38,
0x1c, 0xc6, 0xb2, 0xec, 0x97, 0x74, 0x9f, 0xe7, 0x16, 0x93, 0xbc, 0x30,
0xbf, 0x8c, 0x69, 0xdb, 0xae, 0x1e, 0xac, 0xf0, 0xc1, 0xdb, 0x3b, 0x8a,
0xfb, 0x1f, 0x6c, 0xaf, 0xe3, 0xef, 0x47, 0x67, 0x19, 0x8a, 0xa7, 0xf0,
0xa8, 0x0a, 0x3f, 0x18, 0x9b, 0xe3, 0x13, 0x87, 0x76, 0xd2, 0xe4, 0xbf,
0x76, 0x7e, 0xab, 0x08, 0x88, 0x65, 0xf3, 0xfc, 0xd9, 0xa9, 0x51, 0x86,
0x97, 0xd2, 0xa8, 0x02, 0xaa, 0x75, 0x8d, 0xdb, 0xeb, 0x2a, 0xb9, 0xbf,
0xad, 0x96, 0x63, 0xcd, 0xd5, 0xdc, 0x59, 0x1f, 0x22, 0xa4, 0x6f, 0xff,
0xd4, 0x9d, 0x97, 0xfd, 0x0e, 0x35, 0x4d, 0xe3, 0xc0, 0x81, 0x03, 0xec,
0xda, 0xb5, 0x93, 0x40, 0x20, 0x80, 0xc7, 0xe3, 0x41, 0xd7, 0xf5, 0x4d,
0x83, 0xcd, 0x2b, 0xc9, 0x71, 0x3b, 0x76, 0xec, 0xe0, 0xde, 0x7b, 0xef,
0x21, 0x9f, 0x37, 0x4a, 0x1a, 0xcc, 0xb5, 0x0c, 0x51, 0x6b, 0x9a, 0x87,
0xc3, 0x87, 0x0f, 0x31, 0x3d, 0x3d, 0x5d, 0x54, 0x69, 0x9e, 0x7d, 0xf6,
0xe4, 0x4b, 0x4e, 0xb1, 0xfc, 0xfe, 0xd8, 0x1c, 0x97, 0x93, 0x59, 0x14,
0x21, 0x90, 0xc0, 0x1d, 0xf5, 0x95, 0xa8, 0x42, 0x61, 0x7c, 0x39, 0x83,
0x10, 0x82, 0x1a, 0xaf, 0x87, 0x9e, 0x90, 0x9f, 0xa1, 0x78, 0x0a, 0x01,
0xa4, 0x4d, 0x9b, 0xaf, 0x5c, 0x98, 0xe2, 0x8f, 0xee, 0xec, 0xb9, 0x2e,
0xba, 0x51, 0xa1, 0x6b, 0xa8, 0xae, 0x66, 0x2d, 0x70, 0x66, 0xbf, 0xd4,
0x78, 0x3d, 0x7c, 0xf0, 0xf6, 0x4e, 0x82, 0x9e, 0x5b, 0x67, 0xdd, 0xe8,
0x97, 0x1d, 0xd0, 0xaa, 0xaa, 0xd2, 0xd1, 0xd1, 0xb1, 0xa1, 0xb6, 0x7c,
0xad, 0x80, 0xf6, 0x7a, 0xbd, 0x04, 0x83, 0x41, 0x82, 0x2f, 0x71, 0xa9,
0x89, 0x96, 0x96, 0x16, 0x0e, 0x1e, 0x3c, 0xc8, 0xf1, 0xe3, 0xc7, 0xd1,
0x75, 0x9d, 0x54, 0x2a, 0xf5, 0x92, 0xca, 0x8b, 0xa4, 0x72, 0x1c, 0x9f,
0x89, 0x93, 0xb5, 0xec, 0x22, 0xc0, 0x9e, 0x8f, 0x2e, 0xf3, 0xea, 0xef,
0x3f, 0x53, 0xe4, 0xba, 0x02, 0xc8, 0x98, 0x2b, 0xda, 0xb4, 0xa6, 0x08,
0x1e, 0x1a, 0x8a, 0xf0, 0xb1, 0x3b, 0x7a, 0xae, 0x99, 0xee, 0x48, 0x40,
0x41, 0xf0, 0xe5, 0x7b, 0xf6, 0xf2, 0x2b, 0xff, 0xf7, 0x79, 0xb2, 0xa6,
0x8d, 0x04, 0x9e, 0x9a, 0x8e, 0xf1, 0xdf, 0x4f, 0xbd, 0xc8, 0x9f, 0x1e,
0xde, 0xcd, 0xad, 0xb2, 0xc8, 0xff, 0x0d, 0xcb, 0x87, 0xbe, 0x16, 0x85,
0xee, 0xc6, 0xa9, 0x08, 0x37, 0x46, 0x19, 0xd0, 0x34, 0x8d, 0xbe, 0xbe,
0x5e, 0xda, 0xda, 0xda, 0xaf, 0x38, 0x94, 0xbe, 0x55, 0x7b, 0x72, 0x7a,
0x91, 0xb3, 0xb1, 0x44, 0xc9, 0x6a, 0x49, 0x86, 0x2d, 0x59, 0xca, 0x9b,
0x2c, 0xbb, 0x9f, 0xa5, 0xbc, 0x49, 0x7e, 0xcd, 0xb5, 0xe2, 0x79, 0x83,
0x6f, 0x5e, 0x8c, 0x5c, 0x5f, 0x6c, 0x22, 0x6d, 0x0e, 0xd6, 0x57, 0xf2,
0x0f, 0xaf, 0xbb, 0xa3, 0xd8, 0x48, 0xf2, 0xb6, 0xe4, 0x6f, 0x2e, 0x4c,
0xf1, 0x99, 0x33, 0x63, 0xd8, 0xdc, 0x1a, 0x49, 0x95, 0x57, 0xf5, 0xd0,
0x85, 0x21, 0x6a, 0x21, 0x04, 0x86, 0x61, 0x10, 0x8d, 0xce, 0x17, 0xff,
0x5f, 0xad, 0x5c, 0x8c, 0x8f, 0x5f, 0x2a, 0x76, 0xf5, 0x52, 0x4a, 0xbc,
0x5e, 0x2f, 0x9a, 0x76, 0xb3, 0xa3, 0xe9, 0x1b, 0xe7, 0x76, 0xea, 0xeb,
0xeb, 0xd9, 0xb7, 0x6f, 0x2f, 0xb1, 0xd8, 0x02, 0xa6, 0x69, 0x5e, 0x77,
0xa3, 0x4b, 0x1a, 0x16, 0x8f, 0x47, 0x62, 0xcc, 0x67, 0xf2, 0xf8, 0x35,
0x15, 0x4b, 0x4a, 0x1e, 0x6c, 0xaf, 0x2b, 0xc9, 0xae, 0x5b, 0xe1, 0xbe,
0x82, 0xc9, 0x54, 0x96, 0x67, 0x66, 0xe3, 0x18, 0xb6, 0xc4, 0xb4, 0x25,
0x5f, 0x1d, 0x9c, 0xe2, 0xdf, 0xee, 0x6e, 0xbd, 0xee, 0x3b, 0x3b, 0xda,
0x54, 0xc5, 0xdf, 0xbd, 0x6e, 0x3f, 0xbf, 0xf9, 0xd3, 0x7e, 0x72, 0x96,
0x8d, 0x29, 0x25, 0x9f, 0x3a, 0x3d, 0x46, 0xad, 0xd7, 0xc3, 0x7b, 0xfa,
0xda, 0x4a, 0x46, 0x2b, 0x6f, 0x49, 0x40, 0xef, 0xdb, 0xb7, 0x97, 0xb3,
0x67, 0xcf, 0x92, 0x4e, 0xa7, 0x11, 0x42, 0x30, 0x38, 0x38, 0x88, 0x65,
0x99, 0xec, 0xdf, 0xbf, 0x9f, 0x60, 0x30, 0x88, 0x61, 0x18, 0x0c, 0x0f,
0x5f, 0xe4, 0xe4, 0xc9, 0x93, 0x68, 0x9a, 0x86, 0x94, 0x4e, 0x5a, 0x66,
0x57, 0x57, 0x07, 0x5e, 0xaf, 0x7e, 0x43, 0x2b, 0xbb, 0xba, 0x17, 0x90,
0x52, 0x92, 0xcb, 0xe5, 0xdc, 0xfc, 0x0f, 0x63, 0x93, 0x9e, 0x00, 0x7c,
0x3e, 0x3f, 0xbe, 0x2d, 0x2e, 0x52, 0xb8, 0x67, 0x4f, 0x1f, 0x13, 0x13,
0x97, 0x18, 0x19, 0x79, 0xf1, 0xba, 0x7b, 0x83, 0x33, 0x0b, 0x09, 0x9e,
0x9c, 0x5e, 0x44, 0x57, 0x15, 0x2c, 0x29, 0x69, 0xf0, 0xeb, 0x7c, 0xf7,
0xc1, 0x83, 0xa8, 0x9b, 0xe0, 0x28, 0x65, 0x98, 0x1c, 0xfb, 0xfe, 0xb3,
0x5c, 0x4e, 0x3a, 0x9c, 0x7d, 0x2c, 0x91, 0xe1, 0x89, 0x48, 0x8c, 0x43,
0x8d, 0x55, 0xd7, 0xfd, 0x9c, 0x5e, 0xdb, 0x5a, 0xc7, 0x57, 0xee, 0xdb,
0xcb, 0xef, 0x3e, 0x71, 0x9e, 0xa4, 0x69, 0x62, 0xda, 0xf0, 0xb1, 0x67,
0x2e, 0x12, 0xf2, 0x68, 0xbc, 0x7d, 0x47, 0xd3, 0xb6, 0x06, 0xf5, 0x55,
0x01, 0x1d, 0x0a, 0x85, 0x78, 0xfd, 0xeb, 0x5f, 0xcf, 0x53, 0x4f, 0x3d,
0xc5, 0xc2, 0xc2, 0x02, 0x86, 0x61, 0x30, 0x30, 0x70, 0x8e, 0xfe, 0xfe,
0x01, 0x74, 0x5d, 0x77, 0xc1, 0x24, 0xd1, 0x34, 0xa7, 0xa8, 0xaa, 0xaa,
0x2a, 0x0e, 0x1e, 0x3c, 0x58, 0x4c, 0xd9, 0xbc, 0xa1, 0xfc, 0x48, 0x51,
0x8a, 0x8a, 0x86, 0x94, 0x92, 0x8b, 0x17, 0x2f, 0x32, 0x32, 0x32, 0x72,
0x45, 0x2a, 0x71, 0xe4, 0xc8, 0x11, 0xee, 0xbc, 0xf3, 0x8e, 0x2d, 0xab,
0x26, 0x07, 0x0f, 0x1e, 0x64, 0x76, 0x76, 0x96, 0x44, 0x22, 0x59, 0xcc,
0x31, 0xb1, 0x6d, 0x7b, 0x4b, 0x81, 0xa6, 0x61, 0x4b, 0x7e, 0x3e, 0xb3,
0xc8, 0xc8, 0x52, 0x8a, 0x0a, 0x8f, 0x46, 0xd2, 0xb0, 0x78, 0xff, 0x6d,
0x61, 0xc4, 0x15, 0x52, 0xf8, 0x83, 0x1e, 0x8d, 0xfb, 0xdb, 0xeb, 0xf8,
0xfa, 0xd0, 0x14, 0xb6, 0x74, 0x3c, 0xfc, 0xb7, 0x2f, 0xce, 0x70, 0xb8,
0xa9, 0x7a, 0xeb, 0x0d, 0x6a, 0x83, 0x5d, 0x6f, 0xec, 0x6c, 0xe0, 0xcf,
0x8f, 0xf5, 0xf2, 0xd1, 0xa7, 0x87, 0x89, 0xe5, 0x9c, 0x44, 0xa6, 0x0f,
0x1e, 0x1f, 0x44, 0x57, 0x15, 0xde, 0xd2, 0xdd, 0x78, 0xeb, 0x02, 0x1a,
0xa0, 0xbb, 0xbb, 0x8b, 0xea, 0xea, 0x2a, 0xfa, 0xfb, 0x07, 0x88, 0x44,
0xa6, 0x88, 0xc5, 0x16, 0x8b, 0x69, 0xa4, 0x42, 0x08, 0x7c, 0x3e, 0x3f,
0x35, 0x35, 0xd5, 0x34, 0x37, 0xb7, 0xd0, 0xdb, 0xbb, 0x8b, 0x70, 0xb8,
0xa3, 0xf4, 0x87, 0x36, 0x8c, 0xa2, 0x82, 0xa0, 0x28, 0xca, 0x75, 0xf3,
0xd4, 0xf6, 0xf6, 0x36, 0xea, 0xeb, 0xeb, 0x99, 0x9d, 0x9d, 0x75, 0x65,
0x35, 0x79, 0x55, 0x6e, 0xbc, 0x5a, 0xe7, 0xb6, 0x2c, 0xab, 0xa4, 0x2e,
0xd6, 0x06, 0x73, 0xeb, 0xc2, 0xe1, 0x30, 0x77, 0xde, 0x79, 0x27, 0x27,
0x4f, 0x3e, 0xc7, 0xf2, 0xf2, 0x32, 0xba, 0xae, 0x13, 0x0e, 0xb7, 0x13,
0xdc, 0x42, 0xe4, 0x39, 0xba, 0x9c, 0xe6, 0xeb, 0xc3, 0x11, 0x0c, 0xdb,
0x59, 0xe4, 0xbc, 0xd6, 0xe7, 0xe1, 0x6d, 0xdd, 0x4d, 0x57, 0x5d, 0x79,
0xf4, 0xfd, 0xb7, 0x85, 0x79, 0x68, 0x70, 0x8a, 0xa4, 0x61, 0x61, 0x23,
0x79, 0x7c, 0x3a, 0xc6, 0xf1, 0x99, 0x45, 0x6c, 0x09, 0x19, 0xc3, 0xc2,
0xb2, 0x25, 0xa6, 0x61, 0xad, 0x34, 0x66, 0x9c, 0x91, 0x40, 0xc3, 0x30,
0x49, 0x01, 0xd2, 0x34, 0x37, 0xcc, 0x89, 0x7e, 0xe7, 0x8e, 0x26, 0xd2,
0xa6, 0xc5, 0xc7, 0x9f, 0x1b, 0x61, 0x3a, 0x95, 0x23, 0x69, 0x58, 0xbc,
0xf7, 0x89, 0x01, 0x32, 0xd6, 0x1e, 0xde, 0xb5, 0xb3, 0x65, 0x5b, 0x02,
0xfa, 0x9a, 0xa7, 0x60, 0x2d, 0x2e, 0x2e, 0xb2, 0xb0, 0x10, 0x23, 0x95,
0x4a, 0x61, 0x9a, 0x26, 0xaa, 0xaa, 0x12, 0x08, 0xf8, 0xa9, 0xae, 0xae,
0xa6, 0xa1, 0xa1, 0x61, 0x43, 0xee, 0x79, 0xee, 0xdc, 0xb9, 0xa2, 0x0c,
0xa6, 0xaa, 0x2a, 0x5d, 0x5d, 0xdd, 0x54, 0x57, 0x5f, 0x5f, 0x97, 0x3a,
0x3b, 0x3b, 0xc7, 0xdc, 0xdc, 0x2c, 0xb9, 0x5c, 0xfe, 0xaa, 0x91, 0xbb,
0xa2, 0x28, 0xb4, 0xb6, 0xb6, 0x16, 0x27, 0x1d, 0xcc, 0xcc, 0xcc, 0x12,
0x89, 0x44, 0x90, 0xd2, 0x46, 0x4a, 0x68, 0x6c, 0x6c, 0xa0, 0xa3, 0xa3,
0x63, 0x03, 0x6a, 0x23, 0x19, 0x1f, 0x1f, 0x67, 0x71, 0x31, 0x8e, 0xdf,
0xef, 0x27, 0x1c, 0x6e, 0xa7, 0xa2, 0xe2, 0xea, 0xa3, 0x78, 0xd3, 0xe9,
0x1c, 0xdf, 0x1d, 0x99, 0x41, 0x15, 0x02, 0x4b, 0x4a, 0xc2, 0x15, 0x3e,
0xde, 0xd4, 0xd9, 0xb0, 0xa5, 0x97, 0x02, 0x7d, 0x75, 0x70, 0xca, 0x19,
0x84, 0x91, 0xe0, 0xd5, 0x14, 0xee, 0xaa, 0x0f, 0xb1, 0x98, 0x33, 0xe8,
0x8f, 0x25, 0xd1, 0x14, 0x41, 0xde, 0x92, 0xbc, 0xef, 0xb6, 0x36, 0x2a,
0x3d, 0x1a, 0x96, 0x94, 0x9c, 0x9a, 0x4f, 0xf0, 0x64, 0x64, 0x11, 0x5d,
0x15, 0xe4, 0x2c, 0x9b, 0xb7, 0xf7, 0x34, 0xd1, 0xbd, 0xc1, 0x2a, 0xa7,
0x39, 0xcb, 0xe6, 0x27, 0x93, 0x0b, 0xbc, 0xb8, 0x94, 0x46, 0x55, 0x04,
0x86, 0x2d, 0x69, 0x09, 0x78, 0xf9, 0xcd, 0x1d, 0xcd, 0xdb, 0x52, 0xf9,
0x28, 0xcf, 0x29, 0xbc, 0x45, 0x6d, 0xbb, 0xce, 0x63, 0xd4, 0xa4, 0x94,
0x48, 0xdb, 0xe9, 0xce, 0x9c, 0x8f, 0xe5, 0x7c, 0x6c, 0x1b, 0xdb, 0xb6,
0xb1, 0x6d, 0x0b, 0x5b, 0x5a, 0xce, 0x31, 0xb6, 0x8d, 0x94, 0x56, 0x31,
0x93, 0x6e, 0xe5, 0xff, 0x95, 0x73, 0xb1, 0x6d, 0xd7, 0x03, 0x4a, 0x90,
0x12, 0xcb, 0x2d, 0x1b, 0xf7, 0x63, 0xe3, 0x78, 0x47, 0x6c, 0x1b, 0x89,
0x5b, 0x8e, 0x74, 0x45, 0x25, 0xf7, 0xbb, 0xfb, 0x4f, 0xf1, 0x3c, 0x49,
0xe9, 0xdf, 0xd5, 0x11, 0x62, 0xc1, 0xdb, 0xba, 0xcd, 0x13, 0xe7, 0x10,
0x59, 0x42, 0x2e, 0xe5, 0x3a, 0x9e, 0x59, 0xd8, 0x2e, 0x41, 0x8a, 0xab,
0x52, 0x97, 0x86, 0x96, 0x9d, 0xb4, 0x76, 0xed, 0xdf, 0x5e, 0x9e, 0x6c,
0x7b, 0x73, 0x68, 0xe9, 0xac, 0x6a, 0x82, 0x0b, 0xc6, 0x02, 0x90, 0xdd,
0x8f, 0x65, 0x99, 0xd8, 0xb6, 0x05, 0xb6, 0x03, 0x76, 0xcb, 0xb2, 0x8a,
0xc7, 0x49, 0xdb, 0xc2, 0xb2, 0x6d, 0x27, 0xa3, 0x4c, 0x9a, 0xee, 0x36,
0xdb, 0x05, 0xa6, 0xc4, 0xb2, 0x2c, 0x6c, 0xf7, 0x3b, 0xd2, 0xc6, 0x76,
0x01, 0x28, 0x0b, 0x80, 0xb6, 0x25, 0x12, 0xcb, 0x01, 0x65, 0x11, 0xd0,
0x2e, 0xf8, 0x65, 0xa1, 0x4e, 0xab, 0x00, 0x6d, 0xaf, 0x06, 0xb4, 0x74,
0xcb, 0x76, 0x21, 0xb9, 0x16, 0xd0, 0x72, 0x15, 0x70, 0xc1, 0x01, 0xaf,
0x90, 0x28, 0xc2, 0x49, 0x8e, 0x97, 0xd8, 0x20, 0x15, 0x9c, 0x29, 0xa8,
0x9b, 0xfc, 0xf0, 0x42, 0xe0, 0xf7, 0x55, 0x94, 0x5d, 0xfa, 0x2f, 0x0a,
0xa0, 0x05, 0x80, 0xa2, 0x82, 0x90, 0x08, 0xa9, 0x22, 0x50, 0x91, 0xd2,
0x46, 0x2d, 0x78, 0x4e, 0x59, 0xf0, 0xc6, 0x2e, 0xd8, 0x5c, 0xcf, 0x69,
0xbb, 0x00, 0xa5, 0xe0, 0xd9, 0x0b, 0x5e, 0xd4, 0x05, 0x5a, 0x31, 0x80,
0xb1, 0x6d, 0x24, 0x8e, 0x37, 0x2f, 0x82, 0xb2, 0xe0, 0x8d, 0x5d, 0xb8,
0x39, 0x13, 0x67, 0x65, 0x11, 0xa4, 0x05, 0x1e, 0x5b, 0x68, 0x6c, 0x05,
0xb0, 0xaf, 0xfc, 0x5f, 0x00, 0xb1, 0x5c, 0x9f, 0xb6, 0x5a, 0x2c, 0x77,
0x7d, 0x07, 0xab, 0x20, 0x98, 0xcb, 0xe4, 0x38, 0xb3, 0xb0, 0x8c, 0x61,
0x3b, 0xc7, 0x49, 0xdb, 0x76, 0x07, 0x38, 0xe4, 0x26, 0x9e, 0x4c, 0x30,
0xb1, 0xac, 0xe2, 0xcd, 0xcd, 0xb3, 0xba, 0x64, 0xe9, 0xd6, 0xf1, 0x4d,
0x9d, 0x0d, 0x28, 0xc2, 0xe1, 0xb1, 0xdf, 0x18, 0x9e, 0xe6, 0x27, 0x93,
0x0b, 0x7c, 0xe4, 0x60, 0x17, 0xaf, 0x6a, 0x08, 0xf1, 0x27, 0x27, 0x47,
0x98, 0xcd, 0xe4, 0xf9, 0xf3, 0x63, 0x7d, 0x04, 0x34, 0x85, 0x68, 0x26,
0xcf, 0xdb, 0x1e, 0x39, 0xcd, 0x3b, 0x76, 0x34, 0x73, 0xb4, 0xa9, 0x8a,
0xcf, 0x9d, 0xbd, 0xc4, 0x72, 0xde, 0x2a, 0xe1, 0xb2, 0x3e, 0x55, 0xe1,
0xdf, 0xf7, 0xb6, 0xd2, 0x12, 0xd0, 0xf9, 0xd3, 0x17, 0xc6, 0xc8, 0x98,
0x76, 0x31, 0xa8, 0x34, 0xa5, 0xe4, 0x53, 0x77, 0xef, 0x62, 0x6f, 0x6d,
0x05, 0xdf, 0x1e, 0x99, 0xe6, 0xdb, 0xc3, 0xd3, 0xee, 0xd4, 0x2c, 0x49,
0xbd, 0x57, 0xe7, 0x1d, 0x3b, 0x9a, 0xf8, 0x95, 0x8e, 0x7a, 0x14, 0x21,
0x58, 0xc8, 0x19, 0x7c, 0xf4, 0xe9, 0x61, 0xa6, 0x92, 0xb9, 0xe2, 0xc2,
0x37, 0x59, 0xcb, 0xe6, 0xbd, 0x7d, 0x6d, 0xfc, 0xfa, 0x0e, 0x27, 0x50,
0x9d, 0x4e, 0xe7, 0xf8, 0xf0, 0x89, 0x21, 0x76, 0x54, 0x05, 0xf8, 0xc3,
0xfd, 0x5d, 0x54, 0xad, 0xca, 0xf5, 0x58, 0xca, 0x9b, 0x7c, 0xf9, 0xc2,
0x24, 0x27, 0x66, 0xe2, 0x78, 0x55, 0x85, 0x5f, 0xed, 0xac, 0xe7, 0x6d,
0xdd, 0x4d, 0x04, 0xdc, 0x75, 0x40, 0x3e, 0xf9, 0xfc, 0x28, 0xcf, 0xcc,
0xad, 0xe4, 0x8f, 0x9b, 0xb6, 0xe4, 0xf6, 0xba, 0x0a, 0x3e, 0x7c, 0xa0,
0x6b, 0xc3, 0xe5, 0x81, 0x5f, 0x3e, 0x0f, 0x2d, 0x9c, 0x85, 0xab, 0x56,
0x1e, 0xea, 0xf6, 0x1e, 0xf7, 0x7f, 0x64, 0x68, 0x9a, 0xff, 0x7c, 0x69,
0x98, 0x94, 0x61, 0xad, 0xe9, 0x7f, 0xc5, 0xa6, 0xe2, 0xb7, 0x1c, 0xbf,
0xb8, 0x81, 0x44, 0x67, 0x73, 0x77, 0x63, 0x35, 0xbf, 0xdc, 0x51, 0x8f,
0x2e, 0x04, 0xb6, 0x84, 0xb1, 0x44, 0x9a, 0x13, 0x33, 0x8b, 0x2c, 0xe5,
0xdb, 0x99, 0x4c, 0x65, 0xf9, 0xe1, 0x44, 0x94, 0xb3, 0x0b, 0x09, 0x42,
0xba, 0xc6, 0xa7, 0x8e, 0xec, 0x26, 0x67, 0xdb, 0xfc, 0x2c, 0xb2, 0xc0,
0xde, 0xda, 0x0a, 0xde, 0xd4, 0xd9, 0xc0, 0xbe, 0xda, 0x0a, 0x32, 0xa6,
0xcd, 0xd7, 0x86, 0x26, 0xc9, 0x9a, 0x92, 0xff, 0xb4, 0x2f, 0x8c, 0xa6,
0x08, 0x2a, 0x75, 0x8d, 0xc7, 0xa6, 0x62, 0x3c, 0x7c, 0x29, 0xca, 0xaf,
0xef, 0x68, 0xa6, 0xbb, 0xd2, 0x8f, 0x2d, 0x9d, 0xe4, 0xfc, 0x0a, 0x8f,
0x4a, 0x22, 0x6f, 0xf1, 0x37, 0x17, 0xa6, 0x98, 0x48, 0x64, 0x78, 0x63,
0x67, 0x23, 0x75, 0x3e, 0x0f, 0x27, 0x66, 0xe3, 0xbc, 0xe3, 0x27, 0xa7,
0x79, 0x4f, 0x6f, 0x1b, 0x5f, 0xbc, 0xe7, 0x36, 0x86, 0x16, 0x53, 0x7c,
0xe5, 0xfc, 0x24, 0xf7, 0xb6, 0xd6, 0xf2, 0x4b, 0xed, 0xb5, 0xe4, 0x2d,
0x49, 0xde, 0xb6, 0x69, 0x0a, 0x78, 0x01, 0x27, 0x68, 0xfd, 0xdf, 0xfd,
0x13, 0x7c, 0x67, 0x64, 0x86, 0x06, 0x9f, 0xce, 0x8e, 0xca, 0x00, 0xef,
0xee, 0x75, 0xd2, 0x66, 0xa7, 0x52, 0x39, 0xee, 0xfb, 0xa7, 0x67, 0x49,
0x1a, 0x16, 0x6f, 0xef, 0x69, 0x22, 0x65, 0x58, 0xfc, 0xfe, 0xcf, 0x06,
0xf9, 0x97, 0xa9, 0x45, 0x3e, 0x77, 0xac, 0x17, 0x01, 0x3c, 0x34, 0x34,
0x45, 0xce, 0xb6, 0x79, 0x4f, 0x6f, 0x5b, 0xb1, 0x6e, 0x5d, 0x21, 0xff,
0x86, 0xef, 0x27, 0xff, 0x57, 0x27, 0xdb, 0xfd, 0xa2, 0x99, 0x69, 0x64,
0x37, 0x1c, 0x8a, 0xf7, 0x78, 0x54, 0x2e, 0xc5, 0x62, 0x34, 0xa8, 0x16,
0x35, 0x8a, 0xdc, 0x92, 0xce, 0xab, 0x6a, 0xba, 0xa3, 0x41, 0xaf, 0xd9,
0x9d, 0xb1, 0x6c, 0xde, 0xd8, 0x59, 0x5f, 0x32, 0x48, 0xe1, 0xcc, 0xc0,
0x76, 0x72, 0x37, 0x04, 0x02, 0x4d, 0x08, 0x82, 0x9a, 0xca, 0x5f, 0x0e,
0x4c, 0xf0, 0xf6, 0x9e, 0x26, 0xe7, 0x5d, 0x2b, 0xae, 0x02, 0xd2, 0x13,
0xf2, 0xf3, 0x5f, 0xdc, 0x44, 0xa4, 0x1f, 0x8c, 0xcf, 0xb2, 0x80, 0xc1,
0x27, 0x0e, 0xed, 0x04, 0x1c, 0x56, 0xf5, 0xb3, 0xe9, 0x45, 0x02, 0x9a,
0xca, 0x7f, 0xdc, 0x1b, 0xe6, 0xe8, 0x1a, 0x4d, 0x3a, 0x96, 0x33, 0x50,
0x04, 0x74, 0x87, 0xfc, 0xfc, 0xf1, 0x5d, 0x3d, 0x34, 0xfa, 0x75, 0xb2,
0x96, 0xc5, 0xc1, 0xef, 0x9d, 0xe0, 0xef, 0x46, 0x67, 0xf8, 0xe2, 0x3d,
0xb7, 0xa1, 0x08, 0x50, 0x14, 0xc1, 0x2f, 0xb5, 0xd7, 0xf2, 0x5f, 0xef,
0xda, 0xb1, 0x5e, 0xad, 0xca, 0x59, 0x7c, 0x63, 0x38, 0x42, 0x53, 0x40,
0x07, 0x09, 0x8f, 0x47, 0x62, 0xbc, 0xa5, 0xbb, 0x91, 0x90, 0xae, 0xf1,
0x0f, 0xa3, 0x33, 0xcc, 0x67, 0x0c, 0x3e, 0x7e, 0x68, 0x07, 0x7f, 0x70,
0x7b, 0x27, 0x00, 0xbf, 0x36, 0x36, 0xc7, 0x40, 0x2c, 0x49, 0x3c, 0x67,
0x50, 0xeb, 0xf3, 0xa0, 0x2a, 0x82, 0x06, 0x5d, 0x2f, 0xd6, 0xf9, 0x17,
0x4a, 0x87, 0xfe, 0x85, 0x8a, 0xde, 0x6d, 0x8b, 0xd1, 0x0b, 0xc7, 0x37,
0x5c, 0x0e, 0x4b, 0x13, 0x82, 0xc3, 0x46, 0x8a, 0xbe, 0x26, 0x73, 0x4b,
0x51, 0x91, 0xb4, 0x6d, 0xba, 0xfa, 0x8e, 0xe1, 0xf3, 0x57, 0xb2, 0x96,
0xc8, 0xd8, 0x52, 0xd2, 0x53, 0x19, 0xb8, 0xe2, 0xa8, 0x9b, 0x2d, 0x9d,
0xa4, 0xfe, 0xa4, 0x61, 0xf1, 0xa1, 0xe3, 0x43, 0x3c, 0xf4, 0xda, 0x7d,
0x20, 0xd6, 0x2f, 0xe4, 0xb8, 0x8a, 0x69, 0xb9, 0xd4, 0xc2, 0x46, 0x08,
0xa7, 0x1b, 0xff, 0x97, 0xa9, 0x18, 0x0b, 0x59, 0x83, 0x06, 0x9f, 0xce,
0xa1, 0xc6, 0x2a, 0x56, 0xcf, 0xa5, 0x95, 0x12, 0x46, 0x97, 0x33, 0x9c,
0x5d, 0x48, 0xf0, 0xb7, 0xc3, 0x11, 0x2c, 0x29, 0xf9, 0x90, 0x0b, 0xc0,
0xc2, 0x0d, 0x5e, 0x58, 0x4c, 0xf2, 0x93, 0xcb, 0x0b, 0xa8, 0x02, 0xee,
0x6e, 0xaa, 0x2e, 0x2e, 0x99, 0xf0, 0xbd, 0x17, 0x67, 0x58, 0x32, 0x4c,
0xde, 0xb7, 0xa7, 0x1d, 0x4d, 0x11, 0x7c, 0x73, 0x78, 0x9a, 0xd3, 0x0b,
0x09, 0xee, 0x69, 0xa9, 0x71, 0xe7, 0x63, 0x3a, 0x0b, 0xd5, 0x14, 0xec,
0x2d, 0xdd, 0x8d, 0xc5, 0x01, 0x99, 0x78, 0xde, 0x40, 0xe0, 0x8c, 0x72,
0xfe, 0x78, 0xc2, 0x49, 0x85, 0xe8, 0xad, 0x0e, 0xb2, 0xb3, 0x2a, 0x50,
0x06, 0xf4, 0x8d, 0xb6, 0xe4, 0x52, 0x94, 0x68, 0x64, 0x78, 0xc3, 0xc1,
0x1b, 0x55, 0x11, 0xb4, 0x69, 0x2a, 0x1d, 0x5b, 0x0c, 0xf1, 0x15, 0x8f,
0xce, 0xde, 0xf0, 0xf5, 0xcf, 0x5e, 0xb1, 0xa4, 0xa4, 0xaf, 0x26, 0xc8,
0x81, 0xda, 0x4a, 0xfe, 0xa2, 0x7f, 0x9c, 0xcf, 0x9e, 0x19, 0xdb, 0xd2,
0x1b, 0xae, 0x0a, 0xde, 0xde, 0xb0, 0x6d, 0xfe, 0x69, 0x7c, 0x8e, 0x47,
0x27, 0x63, 0x1c, 0x6d, 0xaa, 0xe2, 0xae, 0x86, 0x50, 0x91, 0x4f, 0x0b,
0x04, 0x59, 0xcb, 0xe2, 0x4b, 0xe7, 0x2f, 0xf3, 0xdd, 0x91, 0x19, 0x1e,
0x6c, 0xaf, 0xe5, 0x93, 0x87, 0x77, 0xf1, 0x1b, 0x3b, 0x9a, 0x4b, 0x9a,
0xde, 0xe9, 0xf9, 0x04, 0x9f, 0xc9, 0x8e, 0xd3, 0xec, 0xd7, 0xd9, 0x55,
0x1d, 0xa4, 0xc2, 0xa3, 0x62, 0x4b, 0xc9, 0x17, 0xcf, 0x5d, 0xa6, 0xc9,
0xaf, 0xf3, 0x9e, 0xde, 0x36, 0xce, 0x2f, 0xa6, 0xf8, 0xc2, 0xd9, 0x09,
0x9e, 0x9c, 0x5e, 0x74, 0x00, 0x7d, 0xc5, 0x3e, 0xab, 0x70, 0x75, 0x88,
0x1b, 0x16, 0x9f, 0x3f, 0x7b, 0x09, 0x5d, 0x11, 0xfc, 0xf6, 0xee, 0x96,
0x32, 0xa0, 0x6f, 0x86, 0x29, 0x9a, 0x87, 0x8e, 0x5d, 0x87, 0xd7, 0xfd,
0x1c, 0xaa, 0x10, 0x8c, 0x2f, 0x67, 0x78, 0x6c, 0x2e, 0x4e, 0xc6, 0xdc,
0xca, 0x48, 0xa5, 0xc4, 0xa3, 0xfb, 0x39, 0x75, 0x71, 0x7a, 0x5d, 0xe0,
0xe9, 0x70, 0x59, 0x8d, 0x5f, 0xed, 0x68, 0xc0, 0xaf, 0x5d, 0x19, 0xa0,
0x59, 0xd3, 0xe6, 0xc3, 0x07, 0xbb, 0x78, 0x7c, 0x3a, 0xc6, 0x77, 0x47,
0x66, 0xdc, 0x00, 0x4d, 0x6c, 0xe1, 0xea, 0x12, 0xaf, 0xaa, 0xf0, 0xe1,
0x83, 0xdd, 0xbc, 0xb6, 0xad, 0x16, 0x4d, 0x88, 0x75, 0xab, 0x9a, 0x6a,
0x8a, 0xa0, 0x39, 0xe0, 0x25, 0xa4, 0xab, 0x54, 0x79, 0x3d, 0xbc, 0xb5,
0xbb, 0x69, 0x1d, 0x85, 0x7a, 0x5d, 0xb8, 0x9e, 0xff, 0x76, 0x68, 0x27,
0x59, 0xd3, 0x2a, 0x26, 0x48, 0xfd, 0xf3, 0xe5, 0x79, 0x2e, 0x2e, 0xa7,
0x50, 0x85, 0xe0, 0x8f, 0x4f, 0x8e, 0x30, 0x97, 0xc9, 0xa3, 0x2a, 0xf0,
0x7f, 0x46, 0x67, 0x79, 0x6f, 0x5f, 0x5b, 0x51, 0x48, 0xd2, 0x57, 0x5d,
0x6f, 0x31, 0x67, 0x30, 0x9b, 0xc9, 0xd3, 0x59, 0xe1, 0x2b, 0xae, 0x1b,
0xd9, 0xe8, 0xd3, 0xf9, 0xce, 0x83, 0xfb, 0xb1, 0x6c, 0x49, 0xe5, 0xbf,
0x92, 0xc9, 0x03, 0xdb, 0x0e, 0xd0, 0x81, 0x8a, 0x5a, 0x02, 0x15, 0x35,
0x1b, 0xc8, 0x6f, 0x0a, 0x8f, 0x0e, 0x4d, 0xf2, 0x95, 0x98, 0xbd, 0xe1,
0x5a, 0x70, 0x9b, 0x68, 0x76, 0x88, 0x99, 0xe1, 0x75, 0x9b, 0x73, 0xb6,
0xe4, 0xbe, 0x96, 0x1a, 0x1e, 0x6c, 0xaf, 0xc3, 0x7f, 0x95, 0x0c, 0x5c,
0x89, 0x24, 0xa4, 0x6b, 0x7c, 0xe6, 0x48, 0x2f, 0x0f, 0x3e, 0xfc, 0x1c,
0xae, 0x10, 0x79, 0xd5, 0x4b, 0xdb, 0xae, 0x14, 0x69, 0xd9, 0x12, 0xd3,
0x92, 0xa4, 0x6d, 0x8b, 0x78, 0xce, 0xa0, 0x39, 0xe0, 0x75, 0x01, 0x25,
0xd1, 0x14, 0xc1, 0x7b, 0xfa, 0xda, 0x68, 0xf2, 0x7b, 0xf8, 0x1f, 0xa7,
0xc6, 0x78, 0xdf, 0x13, 0x03, 0x7c, 0xed, 0xb5, 0xfb, 0x4a, 0x56, 0xa7,
0x0e, 0x79, 0x34, 0xaa, 0x75, 0x0d, 0x56, 0x01, 0xee, 0xf3, 0x67, 0x2f,
0xe1, 0x11, 0x0a, 0xff, 0xf3, 0xee, 0x5d, 0x04, 0x35, 0x15, 0x8f, 0x2a,
0x78, 0x32, 0xb2, 0xc8, 0xd7, 0x87, 0x23, 0xfc, 0x7c, 0x26, 0x4e, 0x77,
0xa5, 0x9f, 0xac, 0x69, 0xf3, 0x8f, 0x63, 0x73, 0x1c, 0x6e, 0xac, 0x22,
0x9a, 0xc9, 0xf3, 0xd9, 0x33, 0xe3, 0x78, 0x55, 0x85, 0x4f, 0x1f, 0xd9,
0x4d, 0x83, 0x4f, 0xc7, 0x96, 0x12, 0x1b, 0x30, 0x2c, 0x1b, 0xd3, 0x96,
0x44, 0x33, 0x79, 0x74, 0x45, 0x50, 0xef, 0xd7, 0xd1, 0x5e, 0xc1, 0x21,
0xc8, 0x6d, 0x07, 0x68, 0x67, 0xe8, 0x7d, 0xe3, 0x07, 0x3a, 0xb0, 0x64,
0x30, 0x91, 0x95, 0x88, 0x2d, 0xa5, 0x81, 0x0b, 0x2c, 0x33, 0xbf, 0x61,
0xc7, 0x9b, 0x31, 0x2c, 0xfa, 0x6a, 0x2a, 0xd6, 0xd0, 0x07, 0x49, 0xce,
0xb2, 0x49, 0x18, 0x4e, 0x5e, 0x85, 0x44, 0x92, 0x34, 0x4c, 0x74, 0x45,
0x60, 0x4a, 0xc9, 0xe1, 0xa6, 0x2a, 0x3e, 0x7a, 0xb0, 0x9b, 0x8f, 0x9f,
0x1c, 0xa1, 0x4a, 0x2f, 0x55, 0x92, 0x12, 0x86, 0xc5, 0xf2, 0x2a, 0xd5,
0x45, 0x13, 0x0a, 0x35, 0xba, 0xc6, 0x72, 0xde, 0xe4, 0x03, 0x3f, 0xbf,
0x80, 0x5f, 0x53, 0x91, 0xd2, 0x91, 0xed, 0xbe, 0xf7, 0xe0, 0x01, 0xf6,
0xd6, 0x56, 0x90, 0x32, 0x2c, 0x6c, 0xe9, 0x78, 0xd1, 0x3f, 0xd8, 0xdf,
0x45, 0xc2, 0xb0, 0xf8, 0xf4, 0xe9, 0x31, 0x52, 0xa6, 0xcd, 0x77, 0xee,
0xbf, 0x1d, 0x4b, 0x82, 0x9d, 0x37, 0xc9, 0xac, 0xc9, 0x57, 0xf9, 0xd9,
0x74, 0x9c, 0x9f, 0xcd, 0xc4, 0x39, 0xd2, 0x54, 0xc5, 0xfb, 0xf7, 0x86,
0x8b, 0x23, 0x86, 0xbd, 0xd5, 0x41, 0x1e, 0x8f, 0xc4, 0xf8, 0xec, 0x99,
0x71, 0x7e, 0xf0, 0x86, 0x3b, 0xf8, 0xc2, 0xbf, 0xe9, 0xe3, 0x73, 0x67,
0x2f, 0xf1, 0xe0, 0xc3, 0xcf, 0x23, 0x90, 0x74, 0x55, 0x06, 0xf8, 0xd8,
0x1d, 0xdd, 0x74, 0x87, 0x02, 0x58, 0x52, 0x12, 0xd0, 0x54, 0x06, 0xe3,
0x29, 0x8e, 0xfc, 0xe3, 0x33, 0x6e, 0xdd, 0x6c, 0x8e, 0x34, 0x55, 0xf3,
0x85, 0x57, 0xef, 0xa1, 0xed, 0x15, 0x5c, 0x26, 0x61, 0x5b, 0x0d, 0x7d,
0x1b, 0xb9, 0x34, 0x83, 0xa7, 0x7f, 0x8a, 0x61, 0xe4, 0x36, 0x80, 0xa7,
0xb3, 0x60, 0xa2, 0x61, 0x6d, 0xed, 0x76, 0x2d, 0xcb, 0xe0, 0xc0, 0xd1,
0xb7, 0xa2, 0x7b, 0x03, 0xeb, 0x21, 0x2d, 0x1d, 0xbd, 0x78, 0x75, 0x8e,
0x86, 0x94, 0x30, 0x9f, 0xcd, 0xb3, 0x64, 0x98, 0xb4, 0x04, 0xbc, 0xe8,
0x8a, 0xc2, 0xe5, 0x54, 0x16, 0x55, 0x40, 0x47, 0x85, 0x1f, 0x81, 0x93,
0x57, 0x31, 0x9f, 0xcd, 0x53, 0xeb, 0xf5, 0x94, 0x2c, 0x78, 0x3e, 0xba,
0x9c, 0xc6, 0x92, 0xb0, 0x6b, 0x15, 0x07, 0xcd, 0x59, 0x36, 0xb3, 0x99,
0x3c, 0x69, 0xd3, 0x2a, 0xe1, 0xb4, 0x1d, 0x15, 0x3e, 0x7c, 0xaa, 0xc2,
0xe5, 0x54, 0x0e, 0xa4, 0xa4, 0x35, 0xe8, 0xc3, 0xe3, 0xe6, 0x68, 0x5c,
0x4a, 0x66, 0x90, 0x12, 0xc2, 0x15, 0x3e, 0x24, 0x92, 0xf1, 0xe5, 0x2c,
0xf5, 0x3e, 0x4f, 0x89, 0x2e, 0xbc, 0x98, 0x33, 0x89, 0x66, 0x72, 0x54,
0x7b, 0x3d, 0xc5, 0x85, 0x1f, 0x0b, 0x7c, 0x3f, 0x92, 0xca, 0x91, 0xb5,
0x6c, 0x7a, 0x42, 0x4e, 0x4e, 0x48, 0xc6, 0xb4, 0x89, 0x65, 0x0d, 0x84,
0x70, 0x82, 0x5b, 0xaf, 0x2a, 0x8a, 0x1c, 0x7e, 0x29, 0xef, 0x50, 0x90,
0xe2, 0x18, 0x16, 0x10, 0xd0, 0x54, 0x5a, 0x02, 0xde, 0xeb, 0x5a, 0x05,
0xaa, 0x0c, 0xe8, 0x0d, 0x2c, 0x3e, 0x3f, 0xc9, 0xc8, 0xc0, 0xe3, 0x98,
0xe6, 0x4b, 0x7b, 0xb9, 0xa4, 0x94, 0x12, 0xdd, 0x17, 0xe0, 0x8e, 0x57,
0xbf, 0x13, 0x45, 0xb9, 0x75, 0xe6, 0xe3, 0x6d, 0x07, 0xdb, 0x56, 0x94,
0x43, 0x4a, 0x9b, 0xea, 0xfa, 0xf5, 0xd3, 0xa8, 0x14, 0xe1, 0x78, 0xa6,
0xcb, 0xc9, 0x2c, 0xa6, 0xb4, 0x29, 0xcc, 0x3c, 0xdb, 0xc8, 0x91, 0x08,
0xb7, 0x9c, 0x8a, 0x8a, 0x46, 0x06, 0xe2, 0x69, 0x07, 0xd0, 0xee, 0x71,
0x85, 0xa5, 0x80, 0x0b, 0x4b, 0x6d, 0x81, 0x33, 0x97, 0xaf, 0x70, 0xa2,
0x10, 0x2b, 0x0a, 0xc0, 0xea, 0x0f, 0xab, 0x06, 0xae, 0x04, 0x94, 0x7c,
0x5f, 0x5d, 0x0f, 0xb1, 0xaa, 0x0e, 0x45, 0x35, 0xdb, 0x2d, 0x44, 0x48,
0x4a, 0x46, 0x14, 0x57, 0xbf, 0x1f, 0x6b, 0x75, 0x7d, 0xc4, 0x6a, 0x1d,
0xa2, 0xa8, 0x89, 0xcb, 0x75, 0x72, 0x61, 0x09, 0x31, 0x13, 0x2b, 0xeb,
0xe4, 0xad, 0x79, 0x51, 0x80, 0xbb, 0x6f, 0x4d, 0xf9, 0x6b, 0xee, 0xb3,
0x74, 0xbb, 0x13, 0x80, 0xab, 0xaf, 0x90, 0x93, 0xbe, 0x65, 0xb2, 0xed,
0xbe, 0x31, 0x3a, 0xcf, 0x1f, 0x3e, 0x3d, 0xe4, 0x4e, 0x4c, 0x55, 0x50,
0x14, 0x81, 0x22, 0x24, 0x42, 0x28, 0xce, 0xff, 0x6a, 0x01, 0x1c, 0xce,
0xf2, 0xb4, 0x8a, 0x3b, 0xc4, 0x2e, 0x14, 0x05, 0x55, 0x38, 0x92, 0x9f,
0x47, 0x38, 0x83, 0x25, 0x9a, 0x70, 0x5e, 0x76, 0xa9, 0x00, 0x9a, 0x2a,
0x50, 0x11, 0xa8, 0x8a, 0x40, 0x15, 0x02, 0x45, 0x71, 0xff, 0x17, 0x8e,
0xee, 0xad, 0xb9, 0x6a, 0x84, 0x42, 0x61, 0xbf, 0x33, 0xe0, 0x51, 0xf8,
0xd1, 0x3d, 0x38, 0xe5, 0x29, 0xee, 0x39, 0xce, 0x79, 0x0a, 0x8a, 0x70,
0xae, 0xab, 0x28, 0xee, 0x39, 0x28, 0xc5, 0xe3, 0x34, 0x57, 0x82, 0x54,
0x85, 0x13, 0x0d, 0xa8, 0x8a, 0x5b, 0x67, 0xa1, 0xa0, 0xba, 0xf5, 0x2a,
0x94, 0xaf, 0xe0, 0xdc, 0xa7, 0xe2, 0x96, 0x2b, 0x84, 0x40, 0xc5, 0x99,
0xfe, 0xa5, 0x28, 0x8a, 0xbb, 0xcf, 0xa1, 0x12, 0xc5, 0xed, 0x25, 0xe7,
0x89, 0x62, 0xdd, 0x9c, 0x67, 0xb6, 0x7a, 0xbf, 0xf3, 0x5d, 0x75, 0x1b,
0x84, 0xc0, 0x99, 0x9a, 0x57, 0xed, 0x55, 0xf1, 0xbf, 0x42, 0x88, 0xbe,
0x65, 0xde, 0xb1, 0x12, 0x4d, 0xa5, 0xd0, 0xb1, 0xa9, 0xf6, 0xa9, 0x28,
0x45, 0xe0, 0xca, 0xe2, 0x8f, 0x24, 0x5c, 0x37, 0x59, 0xf8, 0x91, 0x84,
0x50, 0x50, 0x84, 0x86, 0x28, 0x00, 0xc7, 0x95, 0xcd, 0x34, 0x1c, 0xa0,
0x3a, 0xa0, 0x2c, 0x00, 0xc7, 0x05, 0x84, 0xb2, 0x02, 0x8c, 0x02, 0xa0,
0x34, 0x17, 0xec, 0x05, 0x90, 0x09, 0x51, 0x0a, 0x68, 0x8d, 0x15, 0xe0,
0x15, 0x00, 0xad, 0x0a, 0x65, 0x05, 0x38, 0x62, 0x05, 0xd0, 0xaa, 0xc0,
0x69, 0x2c, 0x6e, 0x59, 0x0e, 0xd8, 0x24, 0xaa, 0xa2, 0x38, 0xe5, 0x0a,
0x05, 0xd5, 0x9d, 0x65, 0xae, 0xad, 0x05, 0x26, 0x4e, 0xb9, 0xc2, 0x6d,
0x04, 0x4e, 0x1d, 0x14, 0x04, 0xee, 0x33, 0x58, 0x7d, 0xef, 0xac, 0xa9,
0x2f, 0xab, 0xea, 0xe2, 0xd6, 0x5f, 0xb8, 0x3d, 0x8b, 0xe2, 0x96, 0x27,
0xdc, 0x80, 0xdc, 0xe3, 0x36, 0xfc, 0x32, 0xe5, 0xb8, 0xa9, 0x54, 0x04,
0x5e, 0xd3, 0x5c, 0x43, 0xbd, 0x4f, 0xc7, 0xa3, 0xac, 0xbc, 0x74, 0xad,
0xd8, 0x9d, 0x17, 0x29, 0x81, 0x58, 0x4f, 0x0b, 0x44, 0xa1, 0x4b, 0x2f,
0x00, 0x64, 0xe5, 0x78, 0x51, 0xf4, 0x4c, 0xab, 0xbe, 0xbb, 0x5d, 0xb4,
0xd3, 0x68, 0xa4, 0xbb, 0xbf, 0x00, 0x14, 0x56, 0x28, 0x8b, 0x0b, 0x46,
0xb1, 0x9a, 0xa2, 0x14, 0xc0, 0x21, 0x56, 0x68, 0x43, 0xf1, 0x3a, 0x52,
0x94, 0xac, 0x2c, 0xaa, 0xac, 0x12, 0xe7, 0x4a, 0xeb, 0xe1, 0x1c, 0xa0,
0xac, 0xa1, 0x3d, 0x45, 0x3a, 0x24, 0x56, 0x28, 0x4d, 0x09, 0x0d, 0xda,
0x80, 0xba, 0x6c, 0xb8, 0x7f, 0x15, 0xdd, 0x28, 0x38, 0x00, 0x0a, 0xb4,
0xa6, 0xd0, 0x90, 0x5f, 0xc1, 0x74, 0x8e, 0x72, 0x82, 0x7f, 0xd9, 0xb6,
0x95, 0x95, 0xdf, 0x53, 0x58, 0xb6, 0x6d, 0x65, 0xff, 0x1f, 0x15, 0xa9,
0x64, 0x27, 0x80, 0x33, 0x9e, 0x47, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
};
unsigned int openair_logo_png_len = 4664;
unsigned int openair_logo_png_len = 7026;
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

+404
View File
@@ -0,0 +1,404 @@
/* packet-mac-lte.h
*
* Martin Mathieson
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This header file may also be distributed under
* the terms of the BSD Licence as follows:
*
* Copyright (C) 2009 Martin Mathieson. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE
*/
//#include "ws_symbol_export.h"
/* radioType */
#define FDD_RADIO 1
#define TDD_RADIO 2
/* Direction */
#define DIRECTION_UPLINK 0
#define DIRECTION_DOWNLINK 1
/* rntiType */
#define NO_RNTI 0
#define P_RNTI 1
#define RA_RNTI 2
#define C_RNTI 3
#define SI_RNTI 4
#define SPS_RNTI 5
#define M_RNTI 6
#define SL_BCH_RNTI 7
#define SL_RNTI 8
#define SC_RNTI 9
#define G_RNTI 10
#if 0
typedef enum mac_lte_oob_event {
ltemac_send_preamble,
ltemac_send_sr,
ltemac_sr_failure
} mac_lte_oob_event;
typedef enum mac_lte_dl_retx {
dl_retx_no,
dl_retx_yes,
dl_retx_unknown
} mac_lte_dl_retx;
typedef enum mac_lte_crc_status {
crc_fail = 0,
crc_success = 1,
crc_high_code_rate = 2,
crc_pdsch_lost = 3,
crc_duplicate_nonzero_rv = 4,
crc_false_dci = 5
} mac_lte_crc_status;
typedef enum mac_lte_carrier_id {
carrier_id_primary,
carrier_id_secondary_1,
carrier_id_secondary_2,
carrier_id_secondary_3,
carrier_id_secondary_4
} mac_lte_carrier_id;
typedef enum mac_lte_ce_mode {
no_ce_mode = 0,
ce_mode_a = 1,
ce_mode_b = 2
} mac_lte_ce_mode;
typedef enum mac_lte_nb_mode {
no_nb_mode = 0,
nb_mode = 1
} mac_lte_nb_mode;
/* Context info attached to each LTE MAC frame */
typedef struct mac_lte_info
{
/* Needed for decode */
guint8 radioType;
guint8 direction;
guint8 rntiType;
/* Extra info to display */
guint16 rnti;
guint16 ueid;
/* Timing info */
guint16 sysframeNumber;
guint16 subframeNumber;
/* Optional field. More interesting for TDD (FDD is always -4 subframeNumber) */
gboolean subframeNumberOfGrantPresent;
guint16 subframeNumberOfGrant;
/* Flag set only if doing PHY-level data test - i.e. there may not be a
well-formed MAC PDU so just show as raw data */
gboolean isPredefinedData;
/* Length of DL PDU or UL grant size in bytes */
guint16 length;
/* 0=newTx, 1=first-retx, etc */
guint8 reTxCount;
guint8 isPHICHNACK; /* FALSE=PDCCH retx grant, TRUE=PHICH NACK */
/* UL only. Indicates if the R10 extendedBSR-Sizes parameter is set */
gboolean isExtendedBSRSizes;
/* UL only. Indicates if the R10 simultaneousPUCCH-PUSCH parameter is set for PCell */
gboolean isSimultPUCCHPUSCHPCell;
/* UL only. Indicates if the R10 extendedBSR-Sizes parameter is set for PSCell */
gboolean isSimultPUCCHPUSCHPSCell;
/* Status of CRC check. For UE it is DL only. For eNodeB it is UL
only. For an analyzer, it is present for both DL and UL. */
gboolean crcStatusValid;
mac_lte_crc_status crcStatus;
/* Carrier ID */
mac_lte_carrier_id carrierId;
/* DL only. Is this known to be a retransmission? */
mac_lte_dl_retx dl_retx;
/* DL only. CE mode to be used for RAR decoding */
mac_lte_ce_mode ceMode;
/* DL and UL. NB-IoT mode of the UE */
mac_lte_nb_mode nbMode;
/* More Physical layer info (see direction above for which side of union to use) */
union {
struct mac_lte_ul_phy_info
{
guint8 present; /* Remaining UL fields are present and should be displayed */
guint8 modulation_type;
guint8 tbs_index;
guint8 resource_block_length;
guint8 resource_block_start;
guint8 harq_id;
gboolean ndi;
} ul_info;
struct mac_lte_dl_phy_info
{
guint8 present; /* Remaining DL fields are present and should be displayed */
guint8 dci_format;
guint8 resource_allocation_type;
guint8 aggregation_level;
guint8 mcs_index;
guint8 redundancy_version_index;
guint8 resource_block_length;
guint8 harq_id;
gboolean ndi;
guint8 transport_block; /* 0..1 */
} dl_info;
} detailed_phy_info;
/* Relating to out-of-band events */
/* N.B. dissector will only look to these fields if length is 0... */
mac_lte_oob_event oob_event;
guint8 rapid;
guint8 rach_attempt_number;
#define MAX_SRs 20
guint16 number_of_srs;
guint16 oob_ueid[MAX_SRs];
guint16 oob_rnti[MAX_SRs];
} mac_lte_info;
typedef struct mac_lte_tap_info {
/* Info from context */
guint16 rnti;
guint16 ueid;
guint8 rntiType;
guint8 isPredefinedData;
gboolean crcStatusValid;
mac_lte_crc_status crcStatus;
guint8 direction;
guint8 isPHYRetx;
guint16 ueInTTI;
nstime_t mac_lte_time;
/* Number of bytes (which part is used depends upon context settings) */
guint32 single_number_of_bytes;
guint32 bytes_for_lcid[11];
guint32 sdus_for_lcid[11];
guint8 number_of_rars;
guint8 number_of_paging_ids;
/* Number of padding bytes includes padding subheaders and trailing padding */
guint16 padding_bytes;
guint16 raw_length;
} mac_lte_tap_info;
/* Accessor function to check if a frame was considered to be ReTx */
int is_mac_lte_frame_retx(packet_info *pinfo, guint8 direction);
#endif
/*****************************************************************/
/* UDP framing format */
/* ----------------------- */
/* Several people have asked about dissecting MAC by framing */
/* PDUs over IP. A suggested format over UDP has been created */
/* and implemented by this dissector, using the definitions */
/* below. A link to an example program showing you how to encode */
/* these headers and send LTE MAC PDUs on a UDP socket is */
/* provided at https://wiki.wireshark.org/MAC-LTE */
/* */
/* A heuristic dissecter (enabled by a preference) will */
/* recognise a signature at the beginning of these frames. */
/*****************************************************************/
/* Signature. Rather than try to define a port for this, or make the
port number a preference, frames will start with this string (with no
terminating NULL */
#define MAC_LTE_START_STRING "mac-lte"
/* Fixed fields. This is followed by the following 3 mandatory fields:
- radioType (1 byte)
- direction (1 byte)
- rntiType (1 byte)
(where the allowed values are defined above */
/* Optional fields. Attaching this info to frames will allow you
to show you display/filter/plot/add-custom-columns on these fields, so should
be added if available.
The format is to have the tag, followed by the value (there is no length field,
it's implicit from the tag) */
#define MAC_LTE_RNTI_TAG 0x02
/* 2 bytes, network order */
#define MAC_LTE_UEID_TAG 0x03
/* 2 bytes, network order */
#define MAC_LTE_FRAME_SUBFRAME_TAG 0x04
/* 2 bytes, network order, SFN is stored in 12 MSB and SF in 4 LSB */
#define MAC_LTE_PREDEFINED_DATA_TAG 0x05
/* 1 byte */
#define MAC_LTE_RETX_TAG 0x06
/* 1 byte */
#define MAC_LTE_CRC_STATUS_TAG 0x07
/* 1 byte */
#define MAC_LTE_EXT_BSR_SIZES_TAG 0x08
/* 0 byte */
#define MAC_LTE_SEND_PREAMBLE_TAG 0x09
/* 2 bytes, RAPID value (1 byte) followed by RACH attempt number (1 byte) */
#define MAC_LTE_CARRIER_ID_TAG 0x0A
/* 1 byte */
#define MAC_LTE_PHY_TAG 0x0B
/* variable length, length (1 byte) then depending on direction
in UL: modulation type (1 byte), TBS index (1 byte), RB length (1 byte),
RB start (1 byte), HARQ id (1 byte), NDI (1 byte)
in DL: DCI format (1 byte), resource allocation type (1 byte), aggregation level (1 byte),
MCS index (1 byte), redundancy version (1 byte), resource block length (1 byte),
HARQ id (1 byte), NDI (1 byte), TB (1 byte), DL reTx (1 byte) */
#define MAC_LTE_SIMULT_PUCCH_PUSCH_PCELL 0x0C
/* 0 byte */
#define MAC_LTE_SIMULT_PUCCH_PUSCH_PSCELL 0x0D
/* 0 byte */
#define MAC_LTE_CE_MODE 0x0E
/* 1 byte containing mac_lte_ce_mode enum value */
#define MAC_LTE_NB_MODE 0x0F
/* 1 byte containing mac_lte_nb_mode enum value */
/* MAC PDU. Following this tag comes the actual MAC PDU (there is no length, the PDU
continues until the end of the frame) */
#define MAC_LTE_PAYLOAD_TAG 0x01
#if 0
/* Type to store parameters for configuring LCID->RLC channel settings for DRB */
/* Some are optional, and may not be seen (e.g. on reestablishment) */
typedef struct drb_mapping_t
{
guint16 ueid; /* Mandatory */
guint8 drbid; /* Mandatory */
gboolean lcid_present;
guint8 lcid; /* Part of LogicalChannelConfig - optional */
gboolean rlcMode_present;
guint8 rlcMode; /* Part of RLC config - optional */
gboolean rlc_ul_ext_li_field; /* Part of RLC config - optional */
gboolean rlc_dl_ext_li_field; /* Part of RLC config - optional */
gboolean rlc_ul_ext_am_sn; /* Part of RLC config - optional */
gboolean rlc_dl_ext_am_sn; /* Part of RLC config - optional */
gboolean um_sn_length_present;
guint8 um_sn_length; /* Part of RLC config - optional */
gboolean ul_priority_present;
guint8 ul_priority; /* Part of LogicalChannelConfig - optional */
gboolean pdcp_sn_size_present;
guint8 pdcp_sn_size; /* Part of pdcp-Config - optional */
} drb_mapping_t;
/* Set details of an LCID -> drb channel mapping. To be called from
configuration protocol (e.g. RRC) */
void set_mac_lte_channel_mapping(drb_mapping_t *drb_mapping);
/* Dedicated DRX config. Used to verify that a sensible config is given.
Also, beginning to configure MAC with this config and (optionally) show
DRX config and state (cycles/timers) attached to each UL/DL PDU! */
typedef struct drx_config_t {
gboolean configured;
guint32 frameNum;
guint32 previousFrameNum;
guint32 onDurationTimer;
guint32 inactivityTimer;
guint32 retransmissionTimer;
guint32 longCycle;
guint32 cycleOffset;
/* Optional Short cycle */
gboolean shortCycleConfigured;
guint32 shortCycle;
guint32 shortCycleTimer;
} drx_config_t;
/* Functions to set/release up dedicated DRX config */
void set_mac_lte_drx_config(guint16 ueid, drx_config_t *drx_config, packet_info *pinfo);
void set_mac_lte_drx_config_release(guint16 ueid, packet_info *pinfo);
/* RRC can tell this dissector which RAPIDs are Group A, Group A&B */
void set_mac_lte_rapid_ranges(guint groupA, guint all_RA);
/* RRC can indicate whether extended BSR sizes are used */
void set_mac_lte_extended_bsr_sizes(guint16 ueid, gboolean use_ext_bsr_sizes, packet_info *pinfo);
/* RRC can indicate whether simultaneous PUCCH/PUSCH is used */
typedef enum {
SIMULT_PUCCH_PUSCH_PCELL = 0,
SIMULT_PUCCH_PUSCH_PSCELL
} simult_pucch_pusch_cell_type;
void set_mac_lte_simult_pucch_pusch(guint16 ueid, simult_pucch_pusch_cell_type cell_type, gboolean use_simult_pucch_pusch, packet_info *pinfo);
/* Functions to be called from outside this module (e.g. in a plugin, where mac_lte_info
isn't available) to get/set per-packet data */
WS_DLL_PUBLIC
mac_lte_info *get_mac_lte_proto_data(packet_info *pinfo);
WS_DLL_PUBLIC
void set_mac_lte_proto_data(packet_info *pinfo, mac_lte_info *p_mac_lte_info);
/* Function to attempt to populate p_mac_lte_info using framing definition above */
gboolean dissect_mac_lte_context_fields(struct mac_lte_info *p_mac_lte_info, tvbuff_t *tvb,
gint *p_offset);
#endif
+162
View File
@@ -0,0 +1,162 @@
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include "database.h"
#include "utils.h"
#include "../T_defs.h"
#include "config.h"
void usage(void)
{
printf(
"options:\n"
" -d <database file> this option is mandatory\n"
" -o <output file> this option is mandatory\n"
" -on <GROUP or ID> turn log ON for given GROUP or ID\n"
" -off <GROUP or ID> turn log OFF for given GROUP or ID\n"
" -ON turn all logs ON\n"
" -OFF turn all logs OFF\n"
" note: you may pass several -on/-off/-ON/-OFF,\n"
" they will be processed in order\n"
" by default, all is off\n"
" -ip <host> connect to given IP address (default %s)\n"
" -p <port> connect to given port (default %d)\n",
DEFAULT_REMOTE_IP,
DEFAULT_REMOTE_PORT
);
exit(1);
}
volatile int run = 1;
static int socket = -1;
void force_stop(int x)
{
printf("\ngently quit...\n");
close(socket);
socket = -1;
run = 0;
}
int main(int n, char **v)
{
char *database_filename = NULL;
char *output_filename = NULL;
FILE *out;
void *database;
char *ip = DEFAULT_REMOTE_IP;
int port = DEFAULT_REMOTE_PORT;
char **on_off_name;
int *on_off_action;
int on_off_n = 0;
int *is_on;
int number_of_events;
int i;
char mt;
/* write on a socket fails if the other end is closed and we get SIGPIPE */
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort();
on_off_name = malloc(n * sizeof(char *)); if (on_off_name == NULL) abort();
on_off_action = malloc(n * sizeof(int)); if (on_off_action == NULL) abort();
for (i = 1; i < n; i++) {
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
if (!strcmp(v[i], "-d"))
{ if (i > n-2) usage(); database_filename = v[++i]; continue; }
if (!strcmp(v[i], "-o"))
{ if (i > n-2) usage(); output_filename = v[++i]; continue; }
if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; }
if (!strcmp(v[i], "-p"))
{ if (i > n-2) usage(); port = atoi(v[++i]); continue; }
if (!strcmp(v[i], "-on")) { if (i > n-2) usage();
on_off_name[on_off_n]=v[++i]; on_off_action[on_off_n++]=1; continue; }
if (!strcmp(v[i], "-off")) { if (i > n-2) usage();
on_off_name[on_off_n]=v[++i]; on_off_action[on_off_n++]=0; continue; }
if (!strcmp(v[i], "-ON"))
{ on_off_name[on_off_n]=NULL; on_off_action[on_off_n++]=1; continue; }
if (!strcmp(v[i], "-OFF"))
{ on_off_name[on_off_n]=NULL; on_off_action[on_off_n++]=0; continue; }
usage();
}
if (database_filename == NULL) {
printf("ERROR: provide a database file (-d)\n");
exit(1);
}
if (output_filename == NULL) {
printf("ERROR: provide an output file (-o)\n");
exit(1);
}
database = parse_database(database_filename);
load_config_file(database_filename);
number_of_events = number_of_ids(database);
is_on = calloc(number_of_events, sizeof(int));
if (is_on == NULL) abort();
for (i = 0; i < on_off_n; i++)
on_off(database, on_off_name[i], is_on, on_off_action[i]);
socket = connect_to(ip, port);
/* activate selected traces */
mt = 1;
if (socket_send(socket, &mt, 1) == -1 ||
socket_send(socket, &number_of_events, sizeof(int)) == -1 ||
socket_send(socket, is_on, number_of_events * sizeof(int)) == -1)
abort();
out = fopen(output_filename, "w");
if (out == NULL) {
perror(output_filename);
exit(1);
}
/* exit on ctrl+c and ctrl+z */
if (signal(SIGQUIT, force_stop) == SIG_ERR) abort();
if (signal(SIGINT, force_stop) == SIG_ERR) abort();
if (signal(SIGTSTP, force_stop) == SIG_ERR) abort();
/* read messages */
while (run) {
int type;
int32_t length;
char v[T_BUFFER_MAX];
int vpos = 0;
if (fullread(socket, &length, 4) == -1) goto read_error;
memcpy(v+vpos, &length, 4);
vpos += 4;
#ifdef T_SEND_TIME
if (fullread(socket,v+vpos,sizeof(struct timespec))==-1) goto read_error;
vpos += sizeof(struct timespec);
length -= sizeof(struct timespec);
#endif
if (fullread(socket, &type, sizeof(int)) == -1) goto read_error;
memcpy(v+vpos, &type, sizeof(int));
vpos += sizeof(int);
length -= sizeof(int);
if (fullread(socket, v+vpos, length) == -1) goto read_error;
vpos += length;
if (type == -1) append_received_config_chunk(v+vpos-length, length);
if (type == -2) verify_config();
if (fwrite(v, vpos, 1, out) != 1) {
printf("error saving data to file %s\n", output_filename);
fclose(out);
exit(1);
}
}
read_error:
fclose(out);
return 0;
}
+183
View File
@@ -0,0 +1,183 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include "utils.h"
#include "../T_defs.h"
#define DEFAULT_REMOTE_PORT 2021
/* replay.c does not know anything about events - it just has the array
* is_on that grows each time replay.c sees a type that does not fit in
* there (the idea is to isolate replay.c as maximum by not using unneeded
* information)
*/
int *is_on;
int is_on_size;
/* this lock is used to protect access to is_on/is_on_size */
pthread_mutex_t biglock = PTHREAD_MUTEX_INITIALIZER;
void set_is_on_size(int size)
{
is_on = realloc(is_on, size * sizeof(int)); if (is_on == NULL) abort();
memset(is_on + is_on_size, 0, (size - is_on_size) * sizeof(int));
is_on_size = size;
}
void lock(void)
{
if (pthread_mutex_lock(&biglock)) abort();
}
void unlock(void)
{
if (pthread_mutex_unlock(&biglock)) abort();
}
#define QUIT(x) do { printf("%s\n", x); exit(1); } while(0)
void get_message(int s)
{
char t;
int l;
int id;
int on;
if (read(s, &t, 1) != 1) QUIT("get_message fails");
lock();
switch (t) {
case 0:
/* toggle all those IDs */
if (read(s, &l, sizeof(int)) != sizeof(int)) QUIT("get_message fails");
while (l) {
if (read(s, &id, sizeof(int)) != sizeof(int)) QUIT("get_message fails");
if (id > is_on_size - 1) set_is_on_size(id + 1);
is_on[id] = 1 - is_on[id];
l--;
}
break;
case 1:
/* set IDs as given */
/* optimize? */
if (read(s, &l, sizeof(int)) != sizeof(int)) QUIT("get_message fails");
if (l > is_on_size) set_is_on_size(l);
id = 0;
while (l) {
if (read(s, &on, sizeof(int)) != sizeof(int))
QUIT("get_message fails");
is_on[id] = on;
id++;
l--;
}
break;
case 2: break; /* do nothing, this message is to wait for local tracer */
default: abort();
}
unlock();
}
void *get_message_thread(void *_socket)
{
int socket = *(int *)_socket;
while (1) get_message(socket);
return NULL;
}
void usage(void)
{
printf(
"options:\n"
" -i <input file> this option is mandatory\n"
" -p <port> wait connection on given port (default %d)\n"
" -w user must press a key after each sent event\n",
DEFAULT_REMOTE_PORT
);
exit(1);
}
#define ERR printf("ERROR: read file %s failed\n", input_filename)
int main(int n, char **v)
{
int port = DEFAULT_REMOTE_PORT;
char *input_filename = NULL;
int i;
int socket;
FILE *in;
int do_send;
int do_wait = 0;
for (i = 1; i < n; i++) {
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
if (!strcmp(v[i], "-i"))
{ if (i > n-2) usage(); input_filename = v[++i]; continue; }
if (!strcmp(v[i], "-p"))
{ if (i > n-2) usage(); port = atoi(v[++i]); continue; }
if (!strcmp(v[i], "-w")) { do_wait = 1; continue; }
usage();
}
if (input_filename == NULL) {
printf("ERROR: provide an input file (-i)\n");
exit(1);
}
in = fopen(input_filename, "r");
if (in == NULL) { perror(input_filename); abort(); }
socket = get_connection("0.0.0.0", port);
/* get first message to activate selected traces */
get_message(socket);
new_thread(get_message_thread, &socket);
while (1) {
int type;
int32_t length;
char v[T_BUFFER_MAX];
int vpos = 0;
/* read event from file */
if (fread(&length, 4, 1, in) != 1) break;
memcpy(v+vpos, &length, 4);
vpos += 4;
#ifdef T_SEND_TIME
if (length < sizeof(struct timespec)) { ERR; break; }
if (fread(v+vpos, sizeof(struct timespec), 1, in) != 1) { ERR; break; }
vpos += sizeof(struct timespec);
length -= sizeof(struct timespec);
#endif
if (length < sizeof(int)) { ERR; break; }
if (fread(&type, sizeof(int), 1, in) != 1) { ERR; break; }
memcpy(v+vpos, &type, sizeof(int));
vpos += sizeof(int);
length -= sizeof(int);
if (length) if (fread(v+vpos, length, 1, in) != 1) { ERR; break; }
vpos += length;
/* only send if configured to do so */
lock();
if (type < 0) do_send = 1;
else {
if (type > is_on_size - 1) set_is_on_size(type+1);
do_send = is_on[type];
}
unlock();
if (do_send)
if (socket_send(socket, v, vpos) != 0)
{ printf("ERROR: socket writing failed\n"); abort(); }
if (do_send && do_wait) getchar();
}
fclose(in);
close(socket);
return 0;
}
+4 -3
View File
@@ -14,9 +14,6 @@
#include "event_selector.h"
#include "config.h"
#define DEFAULT_REMOTE_IP "127.0.0.1"
#define DEFAULT_REMOTE_PORT 2021
typedef struct {
int socket;
int *is_on;
@@ -55,6 +52,7 @@ void usage(void)
" note: you may pass several -on/-off/-ON/-OFF,\n"
" they will be processed in order\n"
" by default, all is off\n"
" -full also dump buffers' content\n"
" -ip <host> connect to given IP address (default %s)\n"
" -p <port> connect to given port (default %d)\n"
" -x GUI output\n"
@@ -93,6 +91,7 @@ int main(int n, char **v)
view *out;
int gui_active = 1;
textlog_data textlog_data;
int full = 0;
/* write on a socket fails if the other end is closed and we get SIGPIPE */
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort();
@@ -118,6 +117,7 @@ int main(int n, char **v)
if (!strcmp(v[i], "-x")) { gui_mode = 1; continue; }
if (!strcmp(v[i], "-debug-gui")) { gui_logd = 1; continue; }
if (!strcmp(v[i], "-no-gui")) { gui_active = 0; continue; }
if (!strcmp(v[i], "-full")) { full = 1; continue; }
usage();
}
@@ -162,6 +162,7 @@ int main(int n, char **v)
// "ENB_PHY_UL_CHANNEL_ESTIMATE",
// "ev: {} eNB_id [eNB_ID] frame [frame] subframe [subframe]");
logger_add_view(textlog, out);
if (full) textlog_dump_buffer(textlog, 1);
free(name);
free(desc);
}
+7
View File
@@ -190,6 +190,13 @@ void PUTI(OBUF *o, int i)
PUTS(o, s);
}
void PUTX2(OBUF *o, int i)
{
char s[64];
sprintf(s, "%2.2x", i);
PUTS(o, s);
}
void PUTUL(OBUF *o, unsigned long l)
{
char s[128];
+4
View File
@@ -20,6 +20,9 @@ list *list_append(list *l, void *data);
/* socket */
/****************************************************************************/
#define DEFAULT_REMOTE_IP "127.0.0.1"
#define DEFAULT_REMOTE_PORT 2021
/* socket_send: return 0 if okay, -1 on error */
int socket_send(int socket, void *buffer, int size);
int get_connection(char *addr, int port);
@@ -41,6 +44,7 @@ void PUTC(OBUF *o, char c);
void PUTS(OBUF *o, char *s);
void PUTS_CLEAN(OBUF *o, char *s);
void PUTI(OBUF *o, int i);
void PUTX2(OBUF *o, int i);
void PUTUL(OBUF *o, unsigned long i);
#endif /* _UTILS_H_ */
-3
View File
@@ -40,9 +40,6 @@ no_connection:
if (pthread_mutex_unlock(&d->lock)) abort();
}
#define DEFAULT_REMOTE_IP "127.0.0.1"
#define DEFAULT_REMOTE_PORT 2021
void usage(void)
{
printf(
+16 -1
View File
@@ -89,6 +89,8 @@ static void scroll(void *private, gui *g,
int number_of_lines;
int new_line;
int inc;
int *d = notification_data;
int key_modifiers = *d;
if (pthread_mutex_lock(&this->lock)) abort();
@@ -96,6 +98,7 @@ static void scroll(void *private, gui *g,
inc = 10;
if (inc > visible_lines - 2) inc = visible_lines - 2;
if (inc < 1) inc = 1;
if (key_modifiers & KEY_CONTROL) inc = 1;
if (!strcmp(notification, "scrollup")) inc = -inc;
new_line = start_line + inc;
@@ -122,7 +125,19 @@ static void click(void *private, gui *g,
if (pthread_mutex_lock(&this->lock)) abort();
if (button == 1) this->autoscroll = 1 - this->autoscroll;
if (button == 1) this->autoscroll = 1;
if (button == 3) this->autoscroll = 0;
if (this->autoscroll) {
int visible_lines, start_line, number_of_lines;
textlist_state(this->g, this->w, &visible_lines, &start_line,
&number_of_lines);
start_line = number_of_lines - visible_lines;
if (start_line < 0) start_line = 0;
textlist_set_start_line(this->g, this->w, start_line);
/* this call is not necessary, but if things change in textlist... */
widget_dirty(this->g, this->w);
}
if (pthread_mutex_unlock(&this->lock)) abort();
}
+3 -1
View File
@@ -11,10 +11,12 @@ typedef struct view {
void (*set)(struct view *this, char *name, ...);
} view;
enum xy_mode { XY_LOOP_MODE, XY_FORCED_MODE };
view *new_view_stdout(void);
view *new_view_textlist(int maxsize, float refresh_rate, gui *g, widget *w);
view *new_view_xy(int length, float refresh_rate, gui *g, widget *w,
int color);
int color, enum xy_mode mode);
view *new_view_tti(float refresh_rate, gui *g, widget *w,
int color);
view *new_view_time(int number_of_seconds, float refresh_rate,
+37 -6
View File
@@ -14,6 +14,7 @@ struct xy {
float refresh_rate;
pthread_mutex_t lock;
int length;
int max_length; /* used in XY_FORCED_MODE */
float *x;
float *y;
int insert_point;
@@ -39,7 +40,7 @@ static void clear(view *this)
/* TODO */
}
static void append(view *_this, float *x, float *y, int length)
static void append_loop(view *_this, float *x, float *y, int length)
{
struct xy *this = (struct xy *)_this;
int i;
@@ -61,6 +62,25 @@ static void append(view *_this, float *x, float *y, int length)
if (pthread_mutex_unlock(&this->lock)) abort();
}
static void append_forced(view *_this, float *x, float *y, int length)
{
struct xy *this = (struct xy *)_this;
if (length > this->max_length) {
printf("%s:%d:%s: bad length (%d), max allowed is %d\n",
__FILE__, __LINE__, __FUNCTION__, length, this->max_length);
abort();
}
if (pthread_mutex_lock(&this->lock)) abort();
memcpy(this->x, x, length * sizeof(float));
memcpy(this->y, y, length * sizeof(float));
this->length = length;
if (pthread_mutex_unlock(&this->lock)) abort();
}
static void set(view *_this, char *name, ...)
{
struct xy *this = (struct xy *)_this;
@@ -89,24 +109,35 @@ static void set(view *_this, char *name, ...)
}
view *new_view_xy(int length, float refresh_rate, gui *g, widget *w,
int color)
int color, enum xy_mode mode)
{
struct xy *ret = calloc(1, sizeof(struct xy));
if (ret == NULL) abort();
ret->common.clear = clear;
ret->common.append = (void (*)(view *, ...))append;
ret->common.set = set;
switch (mode) {
case XY_LOOP_MODE:
ret->common.append = (void (*)(view *, ...))append_loop;
ret->common.set = set;
ret->length = length;
ret->insert_point = 0;
break;
case XY_FORCED_MODE:
ret->common.append = (void (*)(view *, ...))append_forced;
ret->common.set = NULL;
ret->length = 0;
ret->max_length = length;
break;
}
ret->refresh_rate = refresh_rate;
ret->g = g;
ret->w = w;
ret->plot = xy_plot_new_plot(g, w, color);
ret->length = length;
ret->x = calloc(length, sizeof(float)); if (ret->x == NULL) abort();
ret->y = calloc(length, sizeof(float)); if (ret->y == NULL) abort();
ret->insert_point = 0;
if (pthread_mutex_init(&ret->lock, NULL)) abort();
+7 -7
View File
@@ -35,16 +35,18 @@
uint16_t dftsizes[33] = {12,24,36,48,60,72,96,108,120,144,180,192,216,240,288,300,324,360,384,432,480,540,576,600,648,720,864,900,960,972,1080,1152,1200};
uint16_t ref_primes[33] = {11,23,31,47,50,71,89,107,113,139,179,191,211,239,283,293,317,359,383,431,479,523,571,599,647,719,863,887,953,971,1069,1151,1193};
uint16_t ref_primes[33] = {11,23,31,47,59,71,89,107,113,139,179,191,211,239,283,293,317,359,383,431,479,523,571,599,647,719,863,887,953,971,1069,1151,1193};
int16_t *ul_ref_sigs[30][2][33];
int16_t *ul_ref_sigs_rx[30][2][33]; //these contain the sequences in repeated format and quantized to QPSK ifdef IFFT_FPGA
/* 36.211 table 5.5.1.2-1 */
char ref12[360] = {-1,1,3,-3,3,3,1,1,3,1,-3,3,1,1,3,3,3,-1,1,-3,-3,1,-3,3,1,1,-3,-3,-3,-1,-3,-3,1,-3,1,-1,-1,1,1,1,1,-1,-3,-3,1,-3,3,-1,-1,3,1,-1,1,-1,-3,-1,1,-1,1,3,1,-3,3,-1,-1,1,1,-1,-1,3,-3,1,-1,3,-3,-3,-3,3,1,-1,3,3,-3,1,-3,-1,-1,-1,1,-3,3,-1,1,-3,3,1,1,-3,3,1,-1,-1,-1,1,1,3,-1,1,1,-3,-1,3,3,-1,-3,1,1,1,1,1,-1,3,-1,1,1,-3,-3,-1,-3,-3,3,-1,3,1,-1,-1,3,3,-3,1,3,1,3,3,1,-3,1,1,-3,1,1,1,-3,-3,-3,1,3,3,-3,3,-3,1,1,3,-1,-3,3,3,-3,1,-1,-3,-1,3,1,3,3,3,-1,1,3,-1,1,-3,-1,-1,1,1,3,1,-1,-3,1,3,1,-1,1,3,3,3,-1,-1,3,-1,-3,1,1,3,-3,3,-3,-3,3,1,3,-1,-3,3,1,1,-3,1,-3,-3,-1,-1,1,-3,-1,3,1,3,1,-1,-1,3,-3,-1,-3,-1,-1,-3,1,1,1,1,3,1,-1,1,-3,-1,-1,3,-1,1,-3,-3,-3,-3,-3,1,-1,-3,1,1,-3,-3,-3,-3,-1,3,-3,1,-3,3,1,1,-1,-3,-1,-3,1,-1,1,3,-1,1,1,1,3,1,3,3,-1,1,-1,-3,-3,1,1,-3,3,3,1,3,3,1,-3,-1,-1,3,1,3,-3,-3,3,-3,1,-1,-1,3,-1,-3,-3,-1,-3,-1,-3,3,1,-1,1,3,-3,-3,-1,3,-3,3,-1,3,3,-3,3,3,-1,-1,3,-3,-3,-1,-1,-3,-1,3,-3,3,1,-1};
/* 36.211 table 5.5.1.2-2 */
char ref24[720] = {
-1,3,1,-3,3,-1,1,3,-3,3,1,3,-3,3,1,1,-1,1,3,-3,3,-3,-1,-3,-3,3,-3,-3,-3,1,-3,-3,3,-1,1,1,1,3,1,-1,3,-3,-3,1,3,1,1,-3,3,-1,3,3,1,1,-3,3,3,3,3,1,-1,3,-1,1,1,-1,-3,-1,-1,1,3,3,-1,-3,1,1,3,-3,1,1,-3,-1,-1,1,3,1,3,1,-1,3,1,1,-3,-1,-3,-1,-1,-1,-1,-3,-3,-1,1,1,3,3,-1,3,-1,1,-1,-3,1,-1,-3,-3,1,-3,-1,-1,-3,1,1,3,-1,1,3,1,-3,1,-3,1,1,-1,-1,3,-1,-3,3,-3,-3,-3,1,1,1,1,-1,-1,3,-3,-3,3,-3,1,-1,-1,1,-1,1,1,-1,-3,-1,1,-1,3,-1,-3,-3,3,3,-1,-1,-3,-1,3,1,3,1,3,1,1,-1,3,1,-1,1,3,-3,-1,-1,1,-3,1,3,-3,1,-1,-3,3,-3,3,-1,-1,-1,-1,1,-3,-3,-3,1,-3,-3,-3,1,-3,1,1,-3,3,3,-1,-3,-1,3,-3,3,3,3,-1,1,1,-3,1,-1,1,1,-3,1,1,-1,1,-3,-3,3,-1,3,-1,-1,-3,-3,-3,-1,-3,-3,1,-1,1,3,3,-1,1,-1,3,1,3,3,-3,-3,1,3,1,-1,-3,-3,-3,3,3,-3,3,3,-1,-3,3,-1,1,-3,1,1,3,3,1,1,1,-1,-1,1,-3,3,-1,1,1,-3,3,3,-1,-3,3,-3,-1,-3,-1,-1,-1,-1,-1,-3,-1,3,3,1,-1,1,3,3,3,-1,1,1,-3,1,3,-1,-3,3,-3,-3,3,1,3,1,-3,3,1,3,1,1,3,3,-1,-1,-3,1,-3,-1,3,1,1,3,-1,-1,1,-3,1,3,-3,1,-1,-3,-1,3,1,3,1,-1,-3,-3,-1,-1,-3,-3,-3,-1,-1,-3,3,-1,-1,-1,-1,1,1,-3,3,1,3,3,1,-1,1,-3,1,-3,1,1,-3,-1,1,3,-1,3,3,-1,-3,1,-1,-3,3,3,3,-1,1,1,3,-1,-3,-1,3,-1,-1,-1,1,1,1,1,1,-1,3,-1,-3,1,1,3,-3,1,-3,-1,1,1,-3,-3,3,1,1,-3,1,3,3,1,-1,-3,3,-1,3,3,3,-3,1,-1,1,-1,-3,-1,1,3,-1,3,-3,-3,-1,-3,3,-3,-3,-3,-1,-1,-3,-1,-3,3,1,3,-3,-1,3,-1,1,-1,3,-3,1,-1,-3,-3,1,1,-1,1,-1,1,-1,3,1,-3,-1,1,-1,1,-1,-1,3,3,-3,-1,1,-3,-3,-1,-3,3,1,-1,-3,-1,-3,-3,3,-3,3,-3,-1,1,3,1,-3,1,3,3,-1,-3,-1,-1,-1,-1,3,3,3,1,3,3,-3,1,3,-1,3,-1,3,3,-3,3,1,-1,3,3,1,-1,3,3,-1,-3,3,-3,-1,-1,3,-1,3,-1,-1,1,1,1,1,-1,-1,-3,-1,3,1,-1,1,-1,3,-1,3,1,1,-1,-1,-3,1,1,-3,1,3,-3,1,1,-3,-3,-1,-1,-3,-1,1,3,1,1,-3,-1,-1,-3,3,-3,3,1,-3,3,-3,1,-1,1,-3,1,1,1,-1,-3,3,3,1,1,3,-1,-3,-1,-1,-1,3,1,-3,-3,-1,3,-3,-1,-3,-1,-3,-1,-1,-3,-1,-1,1,-3,-1,-1,1,-1,-3,1,1,-3,1,-3,-3,3,1,1,-1,3,-1,-1,1,1,-1,-1,-3,-1,3,-1,3,-1,1,3,1,-1,3,1,3,-3,-3,1,-1,-1,1,3
-1,3,1,-3,3,-1,1,3,-3,3,1,3,-3,3,1,1,-1,1,3,-3,3,-3,-1,-3,-3,3,-3,-3,-3,1,-3,-3,3,-1,1,1,1,3,1,-1,3,-3,-3,1,3,1,1,-3,3,-1,3,3,1,1,-3,3,3,3,3,1,-1,3,-1,1,1,-1,-3,-1,-1,1,3,3,-1,-3,1,1,3,-3,1,1,-3,-1,-1,1,3,1,3,1,-1,3,1,1,-3,-1,-3,-1,-1,-1,-1,-3,-3,-1,1,1,3,3,-1,3,-1,1,-1,-3,1,-1,-3,-3,1,-3,-1,-1,-3,1,1,3,-1,1,3,1,-3,1,-3,1,1,-1,-1,3,-1,-3,3,-3,-3,-3,1,1,1,1,-1,-1,3,-3,-3,3,-3,1,-1,-1,1,-1,1,1,-1,-3,-1,1,-1,3,-1,-3,-3,3,3,-1,-1,-3,-1,3,1,3,1,3,1,1,-1,3,1,-1,1,3,-3,-1,-1,1,-3,1,3,-3,1,-1,-3,3,-3,3,-1,-1,-1,-1,1,-3,-3,-3,1,-3,-3,-3,1,-3,1,1,-3,3,3,-1,-3,-1,3,-3,3,3,3,-1,1,1,-3,1,-1,1,1,-3,1,1,-1,1,-3,-3,3,-1,3,-1,-1,-3,-3,-3,-1,-3,-3,1,-1,1,3,3,-1,1,-1,3,1,3,3,-3,-3,1,3,1,-1,-3,-3,-3,3,3,-3,3,3,-1,-3,3,-1,1,-3,1,1,3,3,1,1,1,-1,-1,1,-3,3,-1,1,1,-3,3,3,-1,-3,3,-3,-1,-3,-1,3,-1,-1,-1,-1,-3,-1,3,3,1,-1,1,3,3,3,-1,1,1,-3,1,3,-1,-3,3,-3,-3,3,1,3,1,-3,3,1,3,1,1,3,3,-1,-1,-3,1,-3,-1,3,1,1,3,-1,-1,1,-3,1,3,-3,1,-1,-3,-1,3,1,3,1,-1,-3,-3,-1,-1,-3,-3,-3,-1,-1,-3,3,-1,-1,-1,-1,1,1,-3,3,1,3,3,1,-1,1,-3,1,-3,1,1,-3,-1,1,3,-1,3,3,-1,-3,1,-1,-3,3,3,3,-1,1,1,3,-1,-3,-1,3,-1,-1,-1,1,1,1,1,1,-1,3,-1,-3,1,1,3,-3,1,-3,-1,1,1,-3,-3,3,1,1,-3,1,3,3,1,-1,-3,3,-1,3,3,3,-3,1,-1,1,-1,-3,-1,1,3,-1,3,-3,-3,-1,-3,3,-3,-3,-3,-1,-1,-3,-1,-3,3,1,3,-3,-1,3,-1,1,-1,3,-3,1,-1,-3,-3,1,1,-1,1,-1,1,-1,3,1,-3,-1,1,-1,1,-1,-1,3,3,-3,-1,1,-3,-3,-1,-3,3,1,-1,-3,-1,-3,-3,3,-3,3,-3,-1,1,3,1,-3,1,3,3,-1,-3,-1,-1,-1,-1,3,3,3,1,3,3,-3,1,3,-1,3,-1,3,3,-3,3,1,-1,3,3,1,-1,3,3,-1,-3,3,-3,-1,-1,3,-1,3,-1,-1,1,1,1,1,-1,-1,-3,-1,3,1,-1,1,-1,3,-1,3,1,1,-1,-1,-3,1,1,-3,1,3,-3,1,1,-3,-3,-1,-1,-3,-1,1,3,1,1,-3,-1,-1,-3,3,-3,3,1,-3,3,-3,1,-1,1,-3,1,1,1,-1,-3,3,3,1,1,3,-1,-3,-1,-1,-1,3,1,-3,-3,-1,3,-3,-1,-3,-1,-3,-1,-1,-3,-1,-1,1,-3,-1,-1,1,-1,-3,1,1,-3,1,-3,-3,3,1,1,-1,3,-1,-1,1,1,-1,-1,-3,-1,3,-1,3,-1,1,3,1,-1,3,1,3,-3,-3,1,-1,-1,1,3
};
void generate_ul_ref_sigs(void)
@@ -127,7 +129,7 @@ void generate_ul_ref_sigs_rx(void)
for (u=0; u<30; u++) {
for (v=0; v<2; v++) {
qbar = ref_primes[Msc_RS] * (u+1)/(double)31;
ul_ref_sigs_rx[u][v][Msc_RS] = (int16_t*)malloc16(4*sizeof(int16_t)*dftsizes[Msc_RS]);
ul_ref_sigs_rx[u][v][Msc_RS] = (int16_t*)malloc16(2*sizeof(int16_t)*dftsizes[Msc_RS]);
if ((((int)floor(2*qbar))&1) == 0)
q = (int)(floor(qbar+.5)) - v;
@@ -163,7 +165,7 @@ void generate_ul_ref_sigs_rx(void)
// These are the sequences for RB 1
for (u=0; u<30; u++) {
ul_ref_sigs_rx[u][0][0] = (int16_t*)malloc16(4*sizeof(int16_t)*dftsizes[0]);
ul_ref_sigs_rx[u][0][0] = (int16_t*)malloc16(2*sizeof(int16_t)*dftsizes[0]);
for (n=0; n<dftsizes[0]; n++) {
ul_ref_sigs_rx[u][0][0][n<<1] = (int16_t)(floor(32767*cos(M_PI*ref12[(u*12) + n]/4)));
@@ -173,13 +175,11 @@ void generate_ul_ref_sigs_rx(void)
// These are the sequences for RB 2
for (u=0; u<30; u++) {
ul_ref_sigs_rx[u][0][1] = (int16_t*)malloc16(4*sizeof(int16_t)*dftsizes[1]);
ul_ref_sigs_rx[u][0][1] = (int16_t*)malloc16(2*sizeof(int16_t)*dftsizes[1]);
for (n=0; n<dftsizes[1]; n++) {
ul_ref_sigs_rx[u][0][1][n<<1] = (int16_t)(floor(32767*cos(M_PI*ref24[(u*24) + n]/4)));
ul_ref_sigs_rx[u][0][1][1+(n<<1)]= (int16_t)(floor(32767*sin(M_PI*ref24[(u*24) + n]/4)));
ul_ref_sigs_rx[u][0][1][2+(n<<2)]=-(int16_t)(floor(32767*sin(M_PI*ref24[(u*24) + n]/4)));
ul_ref_sigs_rx[u][0][1][3+(n<<2)]= (int16_t)(floor(32767*cos(M_PI*ref24[(u*24) + n]/4)));
}
}
+8 -49
View File
@@ -1126,12 +1126,8 @@ int generate_eNB_dlsch_params_from_dci(int frame,
dlsch[0]->harq_ids[subframe] = harq_pid;
if (dlsch0_harq->round == 0) {
/* necessary test? */
if (dlsch0_harq->status == SCH_IDLE)
remove_harq_pid_from_freelist(dlsch[0], harq_pid);
if (dlsch0_harq->round == 0)
dlsch0_harq->status = ACTIVE;
}
break;
@@ -1265,9 +1261,6 @@ int generate_eNB_dlsch_params_from_dci(int frame,
if (dlsch0_harq->round == 0) {
/* necessary test? */
if (dlsch0_harq->status == SCH_IDLE)
remove_harq_pid_from_freelist(dlsch[0], harq_pid);
dlsch0_harq->status = ACTIVE;
// printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
// MCS and TBS don't change across HARQ rounds
@@ -1635,19 +1628,11 @@ int generate_eNB_dlsch_params_from_dci(int frame,
}
// reset HARQ process if this is the first transmission
if (dlsch0_harq->round == 0) {
/* necessary test? */
if (dlsch0_harq->status == SCH_IDLE)
remove_harq_pid_from_freelist(dlsch0, harq_pid);
if (dlsch0_harq->round == 0)
dlsch0_harq->status = ACTIVE;
}
if (dlsch1_harq->round == 0) {
/* necessary test? */
if (dlsch1_harq->status == SCH_IDLE)
remove_harq_pid_from_freelist(dlsch1, harq_pid);
if (dlsch1_harq->round == 0)
dlsch1_harq->status = ACTIVE;
}
dlsch0->rnti = rnti;
dlsch1->rnti = rnti;
@@ -2022,19 +2007,11 @@ int generate_eNB_dlsch_params_from_dci(int frame,
}
// reset HARQ process if this is the first transmission
if ((dlsch0->active==1) && (dlsch0_harq->round == 0)) {
/* necessary test? */
if (dlsch0_harq->status == SCH_IDLE)
remove_harq_pid_from_freelist(dlsch0, harq_pid);
if ((dlsch0->active==1) && (dlsch0_harq->round == 0))
dlsch0_harq->status = ACTIVE;
}
if ((dlsch1->active==1) && (dlsch1_harq->round == 0)) {
/* necessary test? */
if (dlsch1_harq->status == SCH_IDLE)
remove_harq_pid_from_freelist(dlsch1, harq_pid);
if ((dlsch1->active==1) && (dlsch1_harq->round == 0))
dlsch1_harq->status = ACTIVE;
}
dlsch0->rnti = rnti;
dlsch1->rnti = rnti;
@@ -2174,23 +2151,16 @@ int generate_eNB_dlsch_params_from_dci(int frame,
// check if either TB is disabled (see 36-213 V8.6 p. 26)
if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
LOG_W(PHY, "what to do with respect to remove_harq_pid_from_freelist?\n");
if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0))
dlsch0_harq->status = DISABLED;
}
if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
LOG_W(PHY, "what to do with respect to remove_harq_pid_from_freelist?\n");
if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0))
dlsch1_harq->status = DISABLED;
}
dlsch0_harq->Nl = 1;
if (dlsch0_harq->round == 0) {
/* necessary test? */
if (dlsch0_harq->status == SCH_IDLE)
remove_harq_pid_from_freelist(dlsch0, harq_pid);
dlsch0_harq->status = ACTIVE;
// printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
}
@@ -2355,17 +2325,11 @@ int generate_eNB_dlsch_params_from_dci(int frame,
if ((dlsch0_harq->round == 0) && (dlsch0->active == 1) ) {
/* necessary test? */
if (dlsch0_harq->status == SCH_IDLE)
remove_harq_pid_from_freelist(dlsch0, harq_pid);
dlsch0_harq->status = ACTIVE;
dlsch0_harq->mcs = mcs1;
}
if ((dlsch1_harq->round == 0) && (dlsch1->active == 1) ) {
/* necessary test? */
if (dlsch1_harq->status == SCH_IDLE)
remove_harq_pid_from_freelist(dlsch1, harq_pid);
dlsch1_harq->status = ACTIVE;
dlsch1_harq->mcs = mcs2;
}
@@ -2529,9 +2493,6 @@ int generate_eNB_dlsch_params_from_dci(int frame,
if (dlsch0_harq->round == 0) {
/* necessary test? */
if (dlsch0_harq->status == SCH_IDLE)
remove_harq_pid_from_freelist(dlsch0, harq_pid);
dlsch0_harq->status = ACTIVE;
// printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
}
@@ -2661,9 +2622,6 @@ int generate_eNB_dlsch_params_from_dci(int frame,
// dlsch0_harq->Ndi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi;
if (dlsch0_harq->round == 0) {
/* necessary test? */
if (dlsch0_harq->status == SCH_IDLE)
remove_harq_pid_from_freelist(dlsch0, harq_pid);
dlsch0_harq->status = ACTIVE;
// printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
}
@@ -6431,6 +6389,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
if (ulsch->harq_processes[harq_pid]->first_tx==1) {
// ulsch->harq_processes[harq_pid]->Ndi = 1;
ulsch->harq_processes[harq_pid]->first_tx=0;
ulsch->harq_processes[harq_pid]->DCINdi= ndi;
ulsch->harq_processes[harq_pid]->round = 0;
} else {
if (ulsch->harq_processes[harq_pid]->DCINdi!=ndi) { // new SDU opportunity
-7
View File
@@ -258,13 +258,6 @@ typedef struct {
uint8_t error_threshold;
/// Pointers to 8 HARQ processes for the DLSCH
LTE_DL_eNB_HARQ_t *harq_processes[8];
/// circular list of free harq PIDs (the oldest come first)
/// (10 is arbitrary value, must be > to max number of DL HARQ processes in LTE)
int harq_pid_freelist[10];
/// the head position of the free list (if list is free then head=tail)
int head_freelist;
/// the tail position of the free list
int tail_freelist;
/// Number of soft channel bits
uint32_t G;
/// Codebook index for this dlsch (0,1,2,3)
@@ -156,9 +156,6 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
for (i=0; i<10; i++)
dlsch->harq_ids[i] = Mdlharq;
dlsch->head_freelist = 0;
dlsch->tail_freelist = 0;
for (i=0; i<Mdlharq; i++) {
dlsch->harq_processes[i] = (LTE_DL_eNB_HARQ_t *)malloc16(sizeof(LTE_DL_eNB_HARQ_t));
LOG_T(PHY, "Required mem size %d (bw scaling %d), dlsch->harq_processes[%d] %p\n",
@@ -199,8 +196,6 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
msg("Can't get harq_p %d\n",i);
exit_flag=3;
}
put_harq_pid_in_freelist(dlsch, i);
}
if (exit_flag==0) {
@@ -1842,6 +1842,7 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
T(T_ENB_PHY_PUSCH_IQ, T_INT(eNB_id), T_INT(UE_id), T_INT(phy_vars_eNB->proc[sched_subframe].frame_rx),
T_INT(subframe), T_INT(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb),
T_INT(frame_parms->N_RB_UL), T_INT(frame_parms->symbols_per_tti),
T_BUFFER(eNB_pusch_vars->rxdataF_comp[eNB_id][0],
2 * /* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */ frame_parms->N_RB_UL *12*frame_parms->symbols_per_tti*2));
+1 -1
View File
@@ -55,7 +55,7 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
unsigned int rx_offset;
void (*dft)(int16_t *,int16_t *, int);
int tmp_dft_in[2048]; // This is for misalignment issues for 6 and 15 PRBs
int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs
switch (frame_parms->ofdm_symbol_size) {
case 128:
-3
View File
@@ -400,9 +400,6 @@ uint32_t pdcch_alloc2ul_frame(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, ui
uint16_t get_Np(uint8_t N_RB_DL,uint8_t nCCE,uint8_t plus1);
void put_harq_pid_in_freelist(LTE_eNB_DLSCH_t *DLSCH_ptr, int harq_pid);
void remove_harq_pid_from_freelist(LTE_eNB_DLSCH_t *DLSCH_ptr, int harq_pid);
int8_t find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rnti);
+25 -25
View File
@@ -155,10 +155,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->type = 1;
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0;
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(50,10,3);
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = subframe / 5;
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1;
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1;
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = subframe % 5;
((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_10MHz_TDD_1_6_t));
}
@@ -233,10 +233,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(25,10,3);
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = subframe % 5;
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
//((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
//((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = subframe / 5;
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rah = 0;
@@ -266,10 +266,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(25,10,3);
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->TPC = 0;
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->dai = 0;
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = subframe % 5;
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
//((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
//((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = subframe / 5;
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv = 0;
((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rah = 0;
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t));
@@ -304,10 +304,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(50,10,3);
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = subframe % 5;
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
//((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
//((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = subframe / 5;
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0;
((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rah = 0;
@@ -338,10 +338,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(50,10,3);
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->TPC = 0;
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->dai = 0;
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = subframe % 5;
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
//((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
//((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = subframe / 5;
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv = 0;
((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rah = 0;
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t));
@@ -375,10 +375,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(100,10,3);
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = subframe % 5;
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
//((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
//((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = subframe / 5;
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0;
((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rah = 0;
@@ -409,10 +409,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(100,10,3);
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->TPC = 0;
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->dai = 0;
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = subframe % 5;
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
//((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
//((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = subframe / 5;
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv = 0;
((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rah = 0;
memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_TDD_t));
@@ -451,13 +451,13 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tpmi = 0;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv1 = 0;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = subframe / 5;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = openair_daq_vars.target_ue_dl_mcs;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv2 = 0;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = subframe / 5;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = openair_daq_vars.target_ue_dl_mcs;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tb_swap = 0;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->harq_pid = subframe % 5;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->TPC = 0;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc = openair_daq_vars.ue_dl_rb_alloc;
((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rah = 0;
@@ -473,13 +473,13 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback
DLSCH_alloc_pdu1E.rv = 0;
DLSCH_alloc_pdu1E.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
DLSCH_alloc_pdu1E.ndi = subframe / 5;
//DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]];
//DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28);
DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs;
//DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
DLSCH_alloc_pdu1E.harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
DLSCH_alloc_pdu1E.harq_pid = subframe % 5;
DLSCH_alloc_pdu1E.dai = 0;
DLSCH_alloc_pdu1E.TPC = 0;
DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc;
+11 -68
View File
@@ -133,30 +133,6 @@ uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t sched_su
return(0);
}
void put_harq_pid_in_freelist(LTE_eNB_DLSCH_t *DLSCH_ptr, int harq_pid)
{
DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->tail_freelist] = harq_pid;
DLSCH_ptr->tail_freelist = (DLSCH_ptr->tail_freelist + 1) % 10;
}
void remove_harq_pid_from_freelist(LTE_eNB_DLSCH_t *DLSCH_ptr, int harq_pid)
{
if (DLSCH_ptr->head_freelist == DLSCH_ptr->tail_freelist) {
LOG_E(PHY, "%s:%d: you cannot read this!\n", __FILE__, __LINE__);
abort();
}
/* basic check, in case several threads deal with the free list at the same time
* in normal situations it should not happen, that's also why we don't use any
* locking mechanism to protect the free list
* to be refined in case things don't work properly
*/
if (harq_pid != DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist]) {
LOG_E(PHY, "%s:%d: critical error, get in touch with the authors\n", __FILE__, __LINE__);
abort();
}
DLSCH_ptr->head_freelist = (DLSCH_ptr->head_freelist + 1) % 10;
}
int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB)
{
uint8_t i;
@@ -221,12 +197,6 @@ int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) {
memset(&phy_vars_eNB->eNB_UE_stats[i],0,sizeof(LTE_eNB_UE_stats));
// mac_exit_wrapper("Removing UE");
/* clear the harq pid freelist */
phy_vars_eNB->dlsch_eNB[i][0]->head_freelist = 0;
phy_vars_eNB->dlsch_eNB[i][0]->tail_freelist = 0;
for (j = 0; j < 8; j++)
put_harq_pid_in_freelist(phy_vars_eNB->dlsch_eNB[i][0], j);
return(i);
}
}
@@ -258,9 +228,8 @@ int get_ue_active_harq_pid(const uint8_t Mod_id,const uint8_t CC_id,const uint16
LTE_eNB_DLSCH_t *DLSCH_ptr;
LTE_eNB_ULSCH_t *ULSCH_ptr;
uint8_t ulsch_subframe,ulsch_frame;
uint8_t i;
int i;
int8_t UE_id = find_ue(rnti,PHY_vars_eNB_g[Mod_id][CC_id]);
int sf1=(10*frame)+subframe,sf2,sfdiff,sfdiff_max=7;
if (UE_id==-1) {
LOG_D(PHY,"Cannot find UE with rnti %x (Mod_id %d, CC_id %d)\n",rnti, Mod_id, CC_id);
@@ -271,40 +240,19 @@ int get_ue_active_harq_pid(const uint8_t Mod_id,const uint8_t CC_id,const uint16
if (ul_flag == 0) {// this is a DL request
DLSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_id]->dlsch_eNB[(uint32_t)UE_id][0];
// set to no available process first
*harq_pid = -1;
/* let's go synchronous for the moment - maybe we can change at some point */
i = (frame * 10 + subframe) % 8;
for (i=0; i<DLSCH_ptr->Mdlharq; i++) {
if (DLSCH_ptr->harq_processes[i]!=NULL) {
if (DLSCH_ptr->harq_processes[i]->status == ACTIVE) {
sf2 = (DLSCH_ptr->harq_processes[i]->frame*10) + DLSCH_ptr->harq_processes[i]->subframe;
if (sf2<=sf1)
sfdiff = sf1-sf2;
else // this happens when wrapping around 1024 frame barrier
sfdiff = 10240 + sf1-sf2;
LOG_D(PHY,"process %d is active, round %d (waiting %d)\n",i,DLSCH_ptr->harq_processes[i]->round,sfdiff);
if (sfdiff>sfdiff_max) { // this is an active process that is waiting longer than the others (and longer than 7 ms)
sfdiff_max = sfdiff;
*harq_pid = i;
*round = DLSCH_ptr->harq_processes[i]->round;
}
}
} else { // a process is not defined
LOG_E(PHY,"[eNB %d] DLSCH process %d for rnti %x (UE_id %d) not allocated\n",Mod_id,i,rnti,UE_id);
return(-1);
}
}
/* if no active harq pid, get the oldest in the freelist, if any */
if (*harq_pid == 255 && DLSCH_ptr->head_freelist != DLSCH_ptr->tail_freelist) {
*harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
if (DLSCH_ptr->harq_processes[i]->status == ACTIVE) {
*harq_pid = i;
*round = DLSCH_ptr->harq_processes[i]->round;
} else if (DLSCH_ptr->harq_processes[i]->status == SCH_IDLE) {
*harq_pid = i;
*round = 0;
LOG_D(PHY,"process %d is first free process\n", *harq_pid);
} else {
printf("%s:%d: bad state for harq process - PLEASE REPORT!!\n", __FILE__, __LINE__);
abort();
}
LOG_D(PHY,"get_ue_active_harq_pid DL => Frame %d, Subframe %d : harq_pid %d\n",
frame,subframe,*harq_pid);
} else { // This is a UL request
ULSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_id]->ulsch_eNB[(uint32_t)UE_id];
@@ -1906,7 +1854,6 @@ void process_HARQ_feedback(uint8_t UE_id,
dlsch_harq_proc->round = 0;
ue_stats->dlsch_l2_errors[dl_harq_pid[m]]++;
dlsch_harq_proc->status = SCH_IDLE;
put_harq_pid_in_freelist(dlsch, dl_harq_pid[m]);
dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq;
}
} else {
@@ -1923,7 +1870,6 @@ void process_HARQ_feedback(uint8_t UE_id,
// Received ACK so set round to 0 and set dlsch_harq_pid IDLE
dlsch_harq_proc->round = 0;
dlsch_harq_proc->status = SCH_IDLE;
put_harq_pid_in_freelist(dlsch, dl_harq_pid[m]);
dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq;
ue_stats->total_TBS = ue_stats->total_TBS +
@@ -2345,9 +2291,6 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
phy_vars_eNB->eNB_UE_stats[UE_id].sr_received++;
if (phy_vars_eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4
/* is this test necessary? */
if (phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status != SCH_IDLE)
put_harq_pid_in_freelist(phy_vars_eNB->dlsch_eNB[UE_id][0], 0);
phy_vars_eNB->first_sr[UE_id] = 0;
phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->round=0;
phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status=SCH_IDLE;
+4
View File
@@ -68,6 +68,7 @@
#include "SIMULATION/TOOLS/defs.h" // for taus
#include "T.h"
void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,unsigned char Msg3_subframe)
{
@@ -644,6 +645,9 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un
&eNB->common_channels[CC_id].CCCH_pdu.payload[0],
rrc_sdu_length);
T(T_ENB_MAC_UE_DL_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), T_INT(RA_template->rnti), T_INT(frameP), T_INT(subframeP),
T_INT(0 /*harq_pid always 0?*/), T_BUFFER(&eNB->UE_list.DLSCH_pdu[CC_id][0][UE_id].payload[0], TBsize));
if (opt_enabled==1) {
trace_pdu(1, (uint8_t *)eNB->UE_list.DLSCH_pdu[CC_id][0][(unsigned char)UE_id].payload[0],
rrc_sdu_length, UE_id, 3, UE_RNTI(module_idP, UE_id),
@@ -1110,6 +1110,9 @@ schedule_ue_spec(
module_idP, CC_id, frameP, UE_RNTI(module_idP,UE_id), TBS);
}
T(T_ENB_MAC_UE_DL_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP), T_INT(subframeP),
T_INT(harq_pid), T_BUFFER(UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], TBS));
aggregation = process_ue_cqi(module_idP,UE_id);
UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid] = nb_rb;
@@ -298,6 +298,12 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP)
int UE_id = find_UE_id(mod_idP,rntiP);
int pCC_id = UE_PCCID(mod_idP,UE_id);
if (UE_id == -1) {
LOG_W(MAC,"rrc_mac_remove_ue: UE %x not found\n", rntiP);
mac_phy_remove_ue(mod_idP,rntiP);
return 0;
}
LOG_I(MAC,"Removing UE %d from Primary CC_id %d (rnti %x)\n",UE_id,pCC_id, rntiP);
dump_ue_list(UE_list,0);
@@ -320,7 +326,6 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP)
for (i=UE_list->head; i>=0; i=UE_list->next[i]) {
if (i == UE_id) {
// link prev to next in Active list
//if (prev==UE_list->head)
if (i==UE_list->head) {
UE_list->head = UE_list->next[i];
} else {
@@ -345,7 +350,7 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP)
for (i=UE_list->head_ul; i>=0; i=UE_list->next_ul[i]) {
if (i == UE_id) {
// link prev to next in Active list
if (prev==UE_list->head_ul) {
if (i==UE_list->head_ul) {
UE_list->head_ul = UE_list->next_ul[i];
} else {
UE_list->next_ul[prev] = UE_list->next_ul[i];
@@ -130,6 +130,8 @@ void rx_sdu(
T(T_ENB_MAC_UE_UL_PDU, T_INT(enb_mod_idP), T_INT(CC_idP), T_INT(rntiP), T_INT(frameP), T_INT(subframeP),
T_INT(harq_pidP), T_INT(sdu_lenP), T_INT(num_ce), T_INT(num_sdu));
T(T_ENB_MAC_UE_UL_PDU_WITH_DATA, T_INT(enb_mod_idP), T_INT(CC_idP), T_INT(rntiP), T_INT(frameP), T_INT(subframeP),
T_INT(harq_pidP), T_INT(sdu_lenP), T_INT(num_ce), T_INT(num_sdu), T_BUFFER(sduP, sdu_lenP));
eNB->eNB_stats[CC_idP].ulsch_bytes_rx=sdu_lenP;
eNB->eNB_stats[CC_idP].total_ulsch_bytes_rx+=sdu_lenP;
@@ -313,6 +315,8 @@ void rx_sdu(
T(T_ENB_MAC_UE_UL_SDU, T_INT(enb_mod_idP), T_INT(CC_idP), T_INT(rntiP), T_INT(frameP), T_INT(subframeP),
T_INT(rx_lcids[i]), T_INT(rx_lengths[i]));
T(T_ENB_MAC_UE_UL_SDU_WITH_DATA, T_INT(enb_mod_idP), T_INT(CC_idP), T_INT(rntiP), T_INT(frameP), T_INT(subframeP),
T_INT(rx_lcids[i]), T_INT(rx_lengths[i]), T_BUFFER(payload_ptr, rx_lengths[i]));
switch (rx_lcids[i]) {
case CCCH :
+1 -1
View File
@@ -103,7 +103,7 @@ rlc_am_get_buffer_occupancy_in_bytes (
}
#endif
return rlc_pP->status_buffer_occupancy + rlc_pP->retransmission_buffer_occupancy + rlc_pP->sdu_buffer_occupancy + max_li_overhead + header_overhead;
return rlc_pP->status_buffer_occupancy + rlc_pP->retrans_num_bytes_to_retransmit + rlc_pP->sdu_buffer_occupancy + max_li_overhead + header_overhead;
}
//-----------------------------------------------------------------------------
void
+14 -18
View File
@@ -719,12 +719,12 @@ mac_eNB_get_rrc_status(
}
}
void mac_eNB_rrc_ul_failure(const module_id_t Mod_instP,
const int CC_idP,
void mac_eNB_rrc_ul_failure(const module_id_t Mod_instP,
const int CC_idP,
const frame_t frameP,
const sub_frame_t subframeP,
const rnti_t rntiP) {
const rnti_t rntiP)
{
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
ue_context_p = rrc_eNB_get_ue_context(
&eNB_rrc_inst[Mod_instP],
@@ -735,34 +735,30 @@ void mac_eNB_rrc_ul_failure(const module_id_t Mod_instP,
ue_context_p->ue_context.ul_failure_timer=1;
}
else {
LOG_W(RRC,"Frame %d, Subframe %d: UE %x unknown \n",frameP,subframeP,rntiP);
rrc_mac_remove_ue(Mod_instP,rntiP);
LOG_W(RRC,"Frame %d, Subframe %d: UL failure: UE %x unknown \n",frameP,subframeP,rntiP);
}
rrc_mac_remove_ue(Mod_instP,rntiP);
}
void mac_eNB_rrc_ul_in_sync(const module_id_t Mod_instP,
const int CC_idP,
const frame_t frameP,
const sub_frame_t subframeP,
const rnti_t rntiP) {
const rnti_t rntiP)
{
struct rrc_eNB_ue_context_s* ue_context_p = NULL;
ue_context_p = rrc_eNB_get_ue_context(
&eNB_rrc_inst[Mod_instP],
rntiP);
if (ue_context_p != NULL) {
LOG_I(RRC,"Frame %d, Subframe %d: UE %x to UL in synch\n",rntiP);
ue_context_p->ue_context.ul_failure_timer=0;
LOG_I(RRC,"Frame %d, Subframe %d: UE %x to UL in synch\n",
frameP, subframeP, rntiP);
ue_context_p->ue_context.ul_failure_timer = 0;
} else {
LOG_E(RRC,"Frame %d, Subframe %d: UE %x unknown \n",
frameP, subframeP, rntiP);
}
else {
LOG_E(RRC,"Frame %d, Subframe %d: UE %x unknown \n",rntiP);
}
return;
}
//------------------------------------------------------------------------------
int
+18 -3
View File
@@ -3790,14 +3790,29 @@ rrc_eNB_decode_ccch(
//#warning "TODO: stmsi_exist: remove UE from MAC/PHY (how?)"
LOG_I(RRC," S-TMSI exists, ue_context_p %p\n",ue_context_p);
stmsi_received=1;
/* replace rnti in the context */
/* for that, remove the context from the RB tree */
RB_REMOVE(rrc_ue_tree_s, &eNB_rrc_inst[ctxt_pP->module_id].rrc_ue_head, ue_context_p);
/* and insert again, after changing rnti everywhere it has to be changed */
ue_context_p->ue_id_rnti = ctxt_pP->rnti;
ue_context_p->ue_context.rnti = ctxt_pP->rnti;
RB_INSERT(rrc_ue_tree_s, &eNB_rrc_inst[ctxt_pP->module_id].rrc_ue_head, ue_context_p);
/* reset timers */
ue_context_p->ue_context.ul_failure_timer = 0;
ue_context_p->ue_context.ue_release_timer = 0;
// AssertFatal(0 == 1, "TODO: remove UE from MAC/PHY (how?)");
// ue_context_p = NULL;
} else {
ue_context_p = rrc_eNB_get_next_free_ue_context(ctxt_pP, NOT_A_RANDOM_UE_IDENTITY);
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;
if (ue_context_p == NULL)
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.mme_code = mme_code;
ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi = m_tmsi;
} else {
break;
}
}
MSC_LOG_RX_MESSAGE(
+2
View File
@@ -377,6 +377,8 @@ extern int ouput_vcd;
#if T_TRACER
#include "T.h"
#define VCD_SIGNAL_DUMPER_INIT(x) /* nothing */
#define VCD_SIGNAL_DUMPER_CLOSE() /* nothing */
#define VCD_SIGNAL_DUMPER_CREATE_HEADER() /* nothing */
+52 -89
View File
@@ -137,27 +137,15 @@ typedef guint8 gboolean;
//static unsigned char g_PDUBuffer[1600];
//static unsigned int g_PDUOffset;
#ifdef JUMBO_FRAME
static unsigned char g_frameBuffer[9000];
#else
static unsigned char g_frameBuffer[1600];
#endif
//static unsigned char g_fileBuffer[1600];
static unsigned int g_frameOffset;
char in_ip[40];
char in_path[100];
static uint16_t in_port;
FILE *file_fd = NULL;
trace_mode_t opt_type = OPT_NONE;
static radio_type_t radio_type;
static unsigned int subframesSinceCaptureStart;
// double timing_perf[250];
// clock_t timing_in[250];
// clock_t timing_out[250];
int test=0;
int init_value=0;
static int g_socksd = -1;/* UDP socket used for sending frames */
static struct sockaddr_in g_serv_addr;
@@ -277,66 +265,73 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType,
guint8 oob_event, guint8 oob_event_value,
uint8_t *pdu_buffer, unsigned int pdu_buffer_size)
{
#ifdef JUMBO_FRAME
static unsigned char frameBuffer[9000];
#else
static unsigned char frameBuffer[1600];
#endif
static unsigned int frameOffset;
ssize_t bytesSent;
g_frameOffset = 0;
frameOffset = 0;
uint16_t tmp16;
/********************************************************************/
/* Fixed start to each frame (allowing heuristic dissector to work) */
/* Not NULL terminated */
memset(g_frameBuffer+g_frameOffset, 0, sizeof(mac_lte_info)+pdu_buffer_size + 8);
memset(frameBuffer+frameOffset, 0, sizeof(mac_lte_info)+pdu_buffer_size + 8);
memcpy(g_frameBuffer+g_frameOffset, MAC_LTE_START_STRING,
memcpy(frameBuffer+frameOffset, MAC_LTE_START_STRING,
strlen(MAC_LTE_START_STRING));
g_frameOffset += strlen(MAC_LTE_START_STRING);
frameOffset += strlen(MAC_LTE_START_STRING);
/******************************************************************************/
/* Now write out fixed fields (the mandatory elements of struct mac_lte_info) */
g_frameBuffer[g_frameOffset++] = radioType;
g_frameBuffer[g_frameOffset++] = direction;
g_frameBuffer[g_frameOffset++] = rntiType;
frameBuffer[frameOffset++] = radioType;
frameBuffer[frameOffset++] = direction;
frameBuffer[frameOffset++] = rntiType;
/*************************************/
/* Now optional fields */
/* RNTI */
g_frameBuffer[g_frameOffset++] = MAC_LTE_RNTI_TAG;
frameBuffer[frameOffset++] = MAC_LTE_RNTI_TAG;
tmp16 = htons(rnti);
memcpy(g_frameBuffer+g_frameOffset, &tmp16, 2);
g_frameOffset += 2;
memcpy(frameBuffer+frameOffset, &tmp16, 2);
frameOffset += 2;
/* UEId */
g_frameBuffer[g_frameOffset++] = MAC_LTE_UEID_TAG;
frameBuffer[frameOffset++] = MAC_LTE_UEID_TAG;
tmp16 = htons(ueid);
memcpy(g_frameBuffer+g_frameOffset, &tmp16, 2);
g_frameOffset += 2;
memcpy(frameBuffer+frameOffset, &tmp16, 2);
frameOffset += 2;
/* Subframe number */
g_frameBuffer[g_frameOffset++] = MAC_LTE_SUBFRAME_TAG;
frameBuffer[frameOffset++] = MAC_LTE_SUBFRAME_TAG;
tmp16 = htons(subframeNumber); // frame counter : this will give an expert info as wireshark expects SF and not F
memcpy(g_frameBuffer+g_frameOffset, &tmp16, 2);
g_frameOffset += 2;
memcpy(frameBuffer+frameOffset, &tmp16, 2);
frameOffset += 2;
g_frameBuffer[g_frameOffset++] = MAC_LTE_CRC_STATUS_TAG;
g_frameBuffer[g_frameOffset++] = crcStatus;
frameBuffer[frameOffset++] = MAC_LTE_CRC_STATUS_TAG;
frameBuffer[frameOffset++] = crcStatus;
#ifdef WIRESHARK_DEV
g_frameOffset += 2;
frameOffset += 2;
tmp16 = htons(subframeNumber); // subframe
memcpy(g_frameBuffer+g_frameOffset, &tmp16, 2);
g_frameOffset += 2;
memcpy(frameBuffer+frameOffset, &tmp16, 2);
frameOffset += 2;
#endif
/***********************************************************/
/* For these optional fields, no need to encode if value is default */
if (!isPredefinedData) {
g_frameBuffer[g_frameOffset++] = MAC_LTE_PREDEFINED_DATA_TAG;
g_frameBuffer[g_frameOffset++] = isPredefinedData;
frameBuffer[frameOffset++] = MAC_LTE_PREDEFINED_DATA_TAG;
frameBuffer[frameOffset++] = isPredefinedData;
}
if (retx != 0) {
g_frameBuffer[g_frameOffset++] = MAC_LTE_RETX_TAG;
g_frameBuffer[g_frameOffset++] = retx;
frameBuffer[frameOffset++] = MAC_LTE_RETX_TAG;
frameBuffer[frameOffset++] = retx;
}
#ifdef WIRESHARK_DEV
@@ -347,19 +342,19 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType,
switch (oob_event) {
case ltemac_send_preamble :
LOG_D(OPT,"oob event %d %d\n",ltemac_send_preamble );
//g_frameBuffer[g_frameOffset++]=0;
//g_frameBuffer[g_frameOffset++]=0;
//g_frameBuffer[g_frameOffset++]=0;
g_frameBuffer[g_frameOffset++] = MAC_LTE_OOB_EVENT_TAG;
g_frameBuffer[g_frameOffset++]=ltemac_send_preamble;
g_frameBuffer[g_frameOffset++]=rnti; // is the preamble
g_frameBuffer[g_frameOffset++]=oob_event_value;
//frameBuffer[frameOffset++]=0;
//frameBuffer[frameOffset++]=0;
//frameBuffer[frameOffset++]=0;
frameBuffer[frameOffset++] = MAC_LTE_OOB_EVENT_TAG;
frameBuffer[frameOffset++]=ltemac_send_preamble;
frameBuffer[frameOffset++]=rnti; // is the preamble
frameBuffer[frameOffset++]=oob_event_value;
break;
case ltemac_send_sr:
g_frameBuffer[g_frameOffset++]=ltemac_send_sr;
g_frameOffset+=2;
g_frameBuffer[g_frameOffset++]=oob_event_value;
frameBuffer[frameOffset++]=ltemac_send_sr;
frameOffset+=2;
frameBuffer[frameOffset++]=oob_event_value;
break;
case ltemac_sr_failure:
@@ -372,23 +367,23 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType,
#endif
/***************************************/
/* Now write the MAC PDU */
g_frameBuffer[g_frameOffset++] = MAC_LTE_PAYLOAD_TAG;
frameBuffer[frameOffset++] = MAC_LTE_PAYLOAD_TAG;
/* Append actual PDU */
//memcpy(g_frameBuffer+g_frameOffset, g_PDUBuffer, g_PDUOffset);
//g_frameOffset += g_PDUOffset;
//memcpy(frameBuffer+frameOffset, g_PDUBuffer, g_PDUOffset);
//frameOffset += g_PDUOffset;
if (pdu_buffer != NULL) {
memcpy(g_frameBuffer+g_frameOffset, (void*)pdu_buffer, pdu_buffer_size);
g_frameOffset += pdu_buffer_size;
memcpy(frameBuffer+frameOffset, (void*)pdu_buffer, pdu_buffer_size);
frameOffset += pdu_buffer_size;
}
/* Send out the data over the UDP socket */
bytesSent = sendto(g_socksd, g_frameBuffer, g_frameOffset, 0,
bytesSent = sendto(g_socksd, frameBuffer, frameOffset, 0,
(const struct sockaddr *)&g_serv_addr, sizeof(g_serv_addr));
if (bytesSent != g_frameOffset) {
if (bytesSent != frameOffset) {
LOG_W(OPT, "sendto() failed (not a thread-safe func)- expected %d bytes, got %d (errno=%d)\n",
g_frameOffset, bytesSent, errno);
frameOffset, bytesSent, errno);
//exit(1);
}
}
@@ -509,6 +504,7 @@ void trace_pdu(int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size,
/*---------------------------------------------------*/
int init_opt(char *path, char *ip, char *port, radio_type_t radio_type_p)
{
uint16_t in_port;
subframesSinceCaptureStart = 0;
if (path != NULL) {
@@ -612,37 +608,4 @@ void terminate_opt(void)
break;
}
}
/*
double *timing_analyzer(int index, int direction ){
//
int i;
if (direction==0)// in
{
timing_in[index]=clock();
//if(timing_out[index+100]>timing_in[index+100]);
//timing_perf[index+100] +=(double)((double)(timing_out[index+100]-timing_in[index+100])/(double)CLOCKS_PER_SEC);
}
else
{
timing_out[index]=clock();
if(index==5)timing_perf[index]=0;
timing_perf[index] +=(double)((double)(timing_out[index]-timing_in[index])/(((double)CLOCKS_PER_SEC)/1000000));
//LOG_I(OPT,"timing_analyser index %d =%f\n",index,timing_perf[index]);
init_value++;
if(init_value==500)
{
for(i=0;i<6;i++)
{
LOG_I(OPT,"timing_analyser index %d =%f\n",i,timing_perf[i]);
}
init_value=0;
}
return(&timing_perf[0]);
}
}
*/
@@ -14,14 +14,15 @@ typedef struct
int16_t q;
} complex16_t;
typedef struct
class SamplesPacket
{
public:
uint64_t timestamp; //timestamp of the packet
uint16_t first; //index of first unused sample in samples[]
uint16_t last; //end index of samples
static const uint16_t samplesCount = 1024; //maximum number of samples in packet
complex16_t samples[samplesCount]; //must be power of two
} SamplesPacket;
};
complex16_t operator &=(complex16_t & other1, const complex16_t & other) // copy assignment
{
@@ -30,4 +31,4 @@ complex16_t operator &=(complex16_t & other1, const complex16_t & other) // copy
return other1;
}
#endif
#endif
+11 -1
View File
@@ -490,6 +490,7 @@ void help (void) {
#if T_TRACER
printf(" --T_port [port] use given port\n");
printf(" --T_nowait don't wait for tracer, start immediately\n");
printf(" --T_dont_fork to ease debugging with gdb\n");
#endif
printf(RESET);
fflush(stdout);
@@ -2332,6 +2333,7 @@ static void get_options (int argc, char **argv)
#if T_TRACER
LONG_OPTION_T_PORT,
LONG_OPTION_T_NOWAIT,
LONG_OPTION_T_DONT_FORK,
#endif
};
@@ -2355,6 +2357,7 @@ static void get_options (int argc, char **argv)
#if T_TRACER
{"T_port", required_argument, 0, LONG_OPTION_T_PORT},
{"T_nowait", no_argument, 0, LONG_OPTION_T_NOWAIT},
{"T_dont_fork", no_argument, 0, LONG_OPTION_T_DONT_FORK},
#endif
{NULL, 0, NULL, 0}
@@ -2457,6 +2460,12 @@ static void get_options (int argc, char **argv)
T_wait = 0;
break;
}
case LONG_OPTION_T_DONT_FORK: {
extern int T_dont_fork;
T_dont_fork = 1;
break;
}
#endif
case 'A':
@@ -2822,6 +2831,7 @@ static void get_options (int argc, char **argv)
#if T_TRACER
int T_wait = 1; /* by default we wait for the tracer */
int T_port = 2021; /* default port to listen to to wait for the tracer */
int T_dont_fork = 0; /* default is to fork, see 'T_init' to understand */
#endif
int main( int argc, char **argv )
@@ -2894,7 +2904,7 @@ int main( int argc, char **argv )
openair0_cfg[0].configFilename = rf_config_file;
#if T_TRACER
T_init(T_port, T_wait);
T_init(T_port, T_wait, T_dont_fork);
#endif
// initialize the log (see log.h for details)
+3 -1
View File
@@ -250,6 +250,7 @@ help (void)
#if T_TRACER
printf ("--T_port [port] use given port\n");
printf ("--T_nowait don't wait for tracer, start immediately\n");
printf ("--T_dont_fork to ease debugging with gdb\n");
#endif
}
@@ -1258,6 +1259,7 @@ l2l1_task (void *args_p)
#if T_TRACER
int T_wait = 1; /* by default we wait for the tracer */
int T_port = 2021; /* default port to listen to to wait for the tracer */
int T_dont_fork = 0; /* default is to fork, see 'T_init' to understand */
#endif
/*------------------------------------------------------------------------------*/
@@ -1294,7 +1296,7 @@ main (int argc, char **argv)
get_simulation_options (argc, argv); //Command-line options
#if T_TRACER
T_init(T_port, T_wait);
T_init(T_port, T_wait, T_dont_fork);
#endif
// Initialize VCD LOG module
+8
View File
@@ -216,6 +216,7 @@ void get_simulation_options(int argc, char *argv[])
#if T_TRACER
LONG_OPTION_T_PORT,
LONG_OPTION_T_NOWAIT,
LONG_OPTION_T_DONT_FORK,
#endif
};
@@ -254,6 +255,7 @@ void get_simulation_options(int argc, char *argv[])
#if T_TRACER
{"T_port", required_argument, 0, LONG_OPTION_T_PORT},
{"T_nowait", no_argument, 0, LONG_OPTION_T_NOWAIT},
{"T_dont_fork", no_argument, 0, LONG_OPTION_T_DONT_FORK},
#endif
{NULL, 0, NULL, 0}
@@ -436,6 +438,12 @@ void get_simulation_options(int argc, char *argv[])
T_wait = 0;
break;
}
case LONG_OPTION_T_DONT_FORK: {
extern int T_dont_fork;
T_dont_fork = 1;
break;
}
#endif
case 'a':
+46 -40
View File
@@ -49,15 +49,16 @@ NUM_eNB=1
NUM_TRIALS=3
PRB=[25,50,100]
MCS=[0,4,9,10,13,16,17,22,27]
MCS=[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28]
#MCS=[0,4,9,10,13,16,17,22,27]
#PRB=[100]
#MCS=[16]
ANT_TX=1 # 2
ANT_TX=2 # 2
ANT_RX=2 # 2
CHANNEL=["N"]
#CHANNEL=["C","E","F","G","H","I","L","M"] # A,B,C,D,E,F,
TX_MODE=2 # 2,
MIN_SNR=0
MIN_SNR=10
MAX_SNR=40
PERF=75
OPT="-L"
@@ -69,9 +70,9 @@ FRAME=2000
def execute(oai, user, pw, host,logfile,logdir,debug,cpu):
case = '10'
oai.send('cd $OPENAIR1_DIR;')
oai.send('cd SIMULATION/LTE_PHY;')
oai.send('cd $OPENAIR_TARGETS;')
oai.send('cd bin;')
oai.send('cp ./ulsim.Rel10 ./ulsim.Rel10.'+host)
try:
log.start()
test = '300'
@@ -80,13 +81,13 @@ def execute(oai, user, pw, host,logfile,logdir,debug,cpu):
diag = 'ulsim is not running normally (Segmentation fault / Exiting / FATAL), debugging might be needed'
trace = logdir + '/log_' + host + case + test + '_1.txt;'
tee = ' 2>&1 | tee ' + trace
oai.send_expect_false('./ulsim.rel8.'+ host + ' ' + conf + tee, 'Segmentation fault', 30)
oai.send_expect_false('./ulsim.Rel10.'+ host + ' ' + conf + tee, 'Segmentation fault', 30)
trace = logdir + '/log_' + host + case + test + '_2.txt;'
tee = ' 2>&1 | tee ' + trace
oai.send_expect_false('./ulsim.rel8.'+ host + ' ' + conf + tee, 'Exiting', 30)
oai.send_expect_false('./ulsim.Rel10.'+ host + ' ' + conf + tee, 'Exiting', 30)
trace = logdir + '/log_' + host + case + test + '_3.txt;'
tee = ' 2>&1 | tee ' + trace
oai.send_expect_false('./ulsim.rel8.'+ host + ' ' + conf + tee, 'FATAL', 30)
oai.send_expect_false('./ulsim.Rel10.'+ host + ' ' + conf + tee, 'FATAL', 30)
except log.err, e:
log.fail(case, test, name, conf, e.value, diag, logfile,trace)
@@ -100,42 +101,47 @@ def execute(oai, user, pw, host,logfile,logdir,debug,cpu):
diag = 'no diagnostic is available, check the log file'
for i in range(len(PRB)):
for o in range(len(CHANNEL)):
MIN_SNR=0
MIN_SNR=10
for j in range(len(MCS)):
for m in range (1,ANT_RX):
for p in range(1,TX_MODE):
for q in range(MIN_SNR,MAX_SNR):
#if if PRB[i] :
for r in range(5,PRB[i]):
for q in range(MIN_SNR,MAX_SNR):
if r ==7 or r ==11 or r ==14 or r == 17 or r==19 or r == 21 or r == 23 or r == 26 or r == 28 :
continue
conf = '-B' + str(PRB[i]) + ' -m'+str(MCS[j]) + ' -y'+str(m) + ' -g'+str(CHANNEL[o]) + ' -x'+str(p) + ' -s'+str(q) + ' -w1.0 -e.1 -P -n'+str(FRAME)+' -O'+str(PERF)+' '+ OPT
trace = logdir + '/time_meas' + '_prb'+str(PRB[i])+'_mcs'+ str(MCS[j])+ '_antrx' + str(m) + '_channel' +str(CHANNEL[o]) + '_tx' +str(p) + '_snr' +str(q)+'.'+case+str(test)+ '.log'
tee = ' 2>&1 | tee ' + trace
if cpu > -1 :
cmd = 'taskset -c ' + str(cpu) + ' ./ulsim.rel8.'+ host + ' ' + conf + tee
else :
cmd = './ulsim.rel8.'+ host + ' ' + conf + tee
if debug :
print cmd
# match = oai.send_expect_re(cmd, 'passed', 0, 1000)
match =1
if match :
log.ok(case, str(test), name, conf, '', logfile)
MIN_SNR = q - 1 # just to speed up the test
test+=1
break # found the smallest snr
else :
if q == MAX_SNR -1 :
log.skip(case,str(test), name, conf,'','',logfile)
conf = '-B' + str(PRB[i]) + ' -r'+str(r) + ' -m'+str(MCS[j]) + ' -y'+str(m) + ' -g'+str(CHANNEL[o]) + ' -x'+str(p) + ' -s'+str(q) + ' -w1.0 -e.1 -P -n'+str(FRAME)+' -O'+str(PERF)+' '+ OPT
trace = logdir + '/time_meas' + '_prb'+str(PRB[i])+ '_rb'+str(r)+'_mcs'+ str(MCS[j])+ '_antrx' + str(m) + '_channel' +str(CHANNEL[o]) + '_tx' +str(p) + '_snr' +str(q)+'.'+case+str(test)+ '.log'
tee = ' 2>&1 | tee ' + trace
if cpu > -1 :
cmd = 'taskset -c ' + str(cpu) + ' ./ulsim.Rel10.'+ host + ' ' + conf + tee
else :
cmd = './ulsim.Rel10.'+ host + ' ' + conf + tee
if debug :
print cmd
match = oai.send_expect_re(cmd, 'passed', 0, 1000)
#match =1
if match :
log.ok(case, str(test), name, conf, '', logfile)
MIN_SNR = q - 1 # just to speed up the test
test+=1
break
try:
if os.path.isfile(trace) :
os.remove(trace)
except OSError, e: ## if failed, report it back to the user ##
print ("Error: %s - %s." % (e.filename,e.strerror))
break # found the smallest snr
else :
if q == MAX_SNR -1 :
log.skip(case,str(test), name, conf,'','',logfile)
test+=1
break
try:
if os.path.isfile(trace) :
os.remove(trace)
except OSError, e: ## if failed, report it back to the user ##
print ("Error: %s - %s." % (e.filename,e.strerror))
except log.err, e: